@snapback/cli 1.1.12 → 1.1.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/README.md +9 -9
  2. package/dist/{analysis-Z53F5FT2.js → analysis-C6XVLBAL.js} +3 -3
  3. package/dist/{analysis-Z53F5FT2.js.map → analysis-C6XVLBAL.js.map} +1 -1
  4. package/dist/{chunk-KPETDXQO.js → chunk-2TOJVUVJ.js} +296 -33
  5. package/dist/chunk-2TOJVUVJ.js.map +1 -0
  6. package/dist/chunk-5EQLSU5B.js +385 -0
  7. package/dist/chunk-5EQLSU5B.js.map +1 -0
  8. package/dist/{chunk-YOVA65PS.js → chunk-A3TUM7U4.js} +320 -63
  9. package/dist/chunk-A3TUM7U4.js.map +1 -0
  10. package/dist/{chunk-ISVRGBWT.js → chunk-LEXNOXPV.js} +6030 -632
  11. package/dist/chunk-LEXNOXPV.js.map +1 -0
  12. package/dist/{chunk-G7QXHNGB.js → chunk-OJNDAPC2.js} +41 -15
  13. package/dist/chunk-OJNDAPC2.js.map +1 -0
  14. package/dist/{chunk-NKBZIXCN.js → chunk-Q5XZ3DCB.js} +5 -5
  15. package/dist/{chunk-NKBZIXCN.js.map → chunk-Q5XZ3DCB.js.map} +1 -1
  16. package/dist/chunk-QLCHTUT5.js +1067 -0
  17. package/dist/chunk-QLCHTUT5.js.map +1 -0
  18. package/dist/dist-D2SHOZMS.js +8 -0
  19. package/dist/{dist-7UKXVKH3.js.map → dist-D2SHOZMS.js.map} +1 -1
  20. package/dist/{dist-7UKXVKH3.js → dist-L76VXYJ5.js} +3 -3
  21. package/dist/{dist-VDK7WEF4.js.map → dist-L76VXYJ5.js.map} +1 -1
  22. package/dist/dist-RPM72FHJ.js +5 -0
  23. package/dist/{dist-WKLJSPJT.js.map → dist-RPM72FHJ.js.map} +1 -1
  24. package/dist/index.js +38672 -24130
  25. package/dist/index.js.map +1 -1
  26. package/dist/learning-pruner-YSZSOOOC.js +7 -0
  27. package/dist/learning-pruner-YSZSOOOC.js.map +1 -0
  28. package/dist/{secure-credentials-6UMEU22H.js → secure-credentials-A4QHHOE2.js} +14 -6
  29. package/dist/secure-credentials-A4QHHOE2.js.map +1 -0
  30. package/dist/{snapback-dir-T3CRQRY6.js → snapback-dir-6QUSO6Y3.js} +3 -3
  31. package/dist/{snapback-dir-T3CRQRY6.js.map → snapback-dir-6QUSO6Y3.js.map} +1 -1
  32. package/dist/storage-H366UNAR.js +6 -0
  33. package/dist/storage-H366UNAR.js.map +1 -0
  34. package/package.json +8 -9
  35. package/dist/chunk-G7QXHNGB.js.map +0 -1
  36. package/dist/chunk-ISVRGBWT.js.map +0 -1
  37. package/dist/chunk-KPETDXQO.js.map +0 -1
  38. package/dist/chunk-YOVA65PS.js.map +0 -1
  39. package/dist/dist-VDK7WEF4.js +0 -5
  40. package/dist/dist-WKLJSPJT.js +0 -8
  41. package/dist/secure-credentials-6UMEU22H.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../packages/contracts/dist/auth/errors.js","../../../packages/contracts/dist/auth/session.js","../../../packages/contracts/dist/auth/api.js","../../../packages/contracts/dist/eventBus.emitter.js","../../../packages/contracts/dist/types/analysis.js","../../../packages/contracts/dist/events/core.js","../../../packages/contracts/dist/events/accountability.js","../../../packages/contracts/dist/logger.js","../../../packages/contracts/dist/feature-manager.js","../../../packages/contracts/dist/observability/types.js","../../../packages/contracts/dist/schemas.js","../../../packages/contracts/dist/types/billing.js","../../../packages/contracts/dist/session.js","../../../packages/contracts/dist/session/file-modification.js","../../../packages/contracts/dist/signals/index.js","../../../packages/contracts/dist/types/config.js","../../../packages/contracts/dist/types/learning.js","../../../packages/contracts/dist/types/protection.js","../../../packages/contracts/dist/types/snapshot.js","../../../packages/contracts/dist/dashboard/metrics.js","../../../packages/core/dist/utils/confidence.js","../../../packages/intelligence/src/knowledge/query-classifier.ts","../../../packages/intelligence/src/types/advisory.ts","../../../packages/intelligence/src/utils/logger.ts","../../../packages/intelligence/src/advisory/rules/ConsecutiveModificationRule.ts","../../../packages/intelligence/src/advisory/rules/FragileFileRule.ts","../../../packages/intelligence/src/advisory/rules/GenericSuggestionsRule.ts","../../../packages/intelligence/src/advisory/rules/LoopDetectionRule.ts","../../../packages/intelligence/src/advisory/rules/SkippedTestRule.ts","../../../packages/intelligence/src/advisory/rules/ViolationHistoryRule.ts","../../../packages/intelligence/src/advisory/AdvisoryEngine.ts","../../../packages/intelligence/src/analysis/AnalysisMetadataStore.ts","../../../packages/intelligence/src/calibration/ConfidenceEngine.ts","../../../packages/intelligence/src/integrations/context7/client.ts","../../../packages/intelligence/src/integrations/context7/risk-factors.ts","../../../packages/intelligence/src/integrations/github/client.ts","../../../packages/intelligence/src/integrations/github/risk-factors.ts","../../../packages/intelligence/src/integrations/sentry/client.ts","../../../packages/intelligence/src/integrations/sentry/risk-factors.ts","../../../packages/intelligence/src/aggregator/service.ts","../../../packages/intelligence/src/algorithms/RestoreSuggestion.ts","../../../packages/intelligence/src/types/integrations.ts","../../../packages/intelligence/src/engine/risk-engine.ts","../../../packages/intelligence/src/storage/ConfigStore.ts","../../../packages/intelligence/src/storage/JsonlStore.ts","../../../packages/intelligence/src/types/intent.ts","../../../packages/intelligence/src/storage/StateStore.ts","../../../packages/intelligence/src/sync/YjsAdapter.ts","../../../packages/intelligence/src/sync/SyncWorker.ts","../../../packages/intelligence/src/embeddings/types.ts","../../../packages/intelligence/src/embeddings/errors.ts","../../../packages/intelligence/src/embeddings/pipeline.ts","../../../packages/intelligence/src/embeddings/embedding.ts","../../../packages/intelligence/src/embeddings/similarity.ts","../../../packages/intelligence/src/embeddings/batch.ts","../../../packages/intelligence/src/cache/service.ts","../../../packages/intelligence/src/composer/types.ts","../../../packages/intelligence/src/composer/budget.ts","../../../packages/intelligence/src/composer/allocation.ts","../../../packages/intelligence/src/composer/cache.ts","../../../packages/intelligence/src/composer/constraints.ts","../../../packages/intelligence/src/composer/determinism.ts","../../../packages/intelligence/src/composer/scoring.ts","../../../packages/intelligence/src/composer/explainability.ts","../../../packages/intelligence/src/composer/fingerprint.ts","../../../packages/intelligence/src/composer/rendering.ts","../../../packages/intelligence/src/composer/replay.ts","../../../packages/intelligence/src/composer/selection.ts","../../../packages/intelligence/src/composer/Composer.ts","../../../packages/intelligence/src/confidence/ConfidenceCalculator.ts","../../../packages/intelligence/src/context/ContextEngine.ts","../../../packages/intelligence/src/context/SemanticRetriever.ts","../../../packages/intelligence/src/domain/bundles/api.ts","../../../packages/intelligence/src/domain/bundles/auth.ts","../../../packages/intelligence/src/domain/bundles/daemon.ts","../../../packages/intelligence/src/knowledge/frameworks/astro.ts","../../../packages/intelligence/src/knowledge/frameworks/express.ts","../../../packages/intelligence/src/knowledge/frameworks/nestjs.ts","../../../packages/intelligence/src/knowledge/frameworks/nextjs.ts","../../../packages/intelligence/src/knowledge/frameworks/react-vite.ts","../../../packages/intelligence/src/knowledge/registry.ts","../../../packages/intelligence/src/patterns/GapAnalyzer.ts","../../../packages/intelligence/src/patterns/matchers/error-handling.ts","../../../packages/intelligence/src/patterns/matchers/performance.ts","../../../packages/intelligence/src/patterns/matchers/security.ts","../../../packages/intelligence/src/patterns/matchers/testing.ts","../../../packages/intelligence/src/patterns/matchers/index.ts","../../../packages/intelligence/src/patterns/PatternDetector.ts","../../../packages/intelligence/src/fingerprint/WorkspaceProfiler.ts","../../../packages/intelligence/src/types/learning.ts","../../../packages/intelligence/src/learning/LearningEngine.ts","../../../packages/intelligence/src/learning/ViolationTracker.ts","../../../packages/intelligence/src/types/session.ts","../../../packages/intelligence/src/session/LoopDetector.ts","../../../packages/intelligence/src/session/SessionManager.ts","../../../packages/intelligence/src/types/config.ts","../../../packages/intelligence/src/types/validation.ts","../../../packages/intelligence/src/validation/DynamicConfidenceCalculator.ts","../../../packages/intelligence/src/policy/detectors/SecretDetector.ts","../../../packages/intelligence/src/validation/layers/BiomeLayer.ts","../../../packages/intelligence/src/validation/layers/TypeScriptCompilerLayer.ts","../../../packages/intelligence/src/validation/layers/index.ts","../../../packages/intelligence/src/validation/ValidationPipeline.ts","../../../packages/intelligence/src/vitals/BehaviorTracker.ts","../../../packages/intelligence/src/vitals/constants.ts","../../../packages/intelligence/src/vitals/learning/PhaseDetector.ts","../../../packages/intelligence/src/types/vitals-learning.ts","../../../packages/intelligence/src/vitals/learning/ThresholdCalibrator.ts","../../../packages/intelligence/src/vitals/learning/TrajectoryPredictor.ts","../../../packages/intelligence/src/vitals/learning/UserBehaviorLearner.ts","../../../packages/intelligence/src/vitals/OxygenSensor.ts","../../../packages/intelligence/src/vitals/PressureGauge.ts","../../../packages/intelligence/src/vitals/PulseTracker.ts","../../../packages/intelligence/src/vitals/TemperatureMonitor.ts","../../../packages/intelligence/src/vitals/WorkspaceVitals.ts","../../../packages/intelligence/src/Intelligence.ts","../../../packages/intelligence/src/knowledge/confidence.ts","../../../packages/intelligence/src/knowledge/embeddings.ts","../../../packages/intelligence/src/knowledge/retriever.ts","../../../packages/intelligence/src/knowledge/store.ts","../../../packages/intelligence/src/learning/LearningMatcher.ts","../../../packages/intelligence/src/policy/detectors/MockDetector.ts","../../../packages/intelligence/src/policy/detectors/PhantomDependencyDetector.ts","../../../packages/intelligence/src/policy/PolicyEngine.ts","../../../packages/intelligence/src/policy/SarifFormatter.ts","../../../packages/intelligence/src/policy/index.ts","../../../packages/intelligence/src/query/pattern-engine.ts","../../../packages/intelligence/src/types/fragility.ts"],"names":["AuthErrorCodeSchema","z","enum","AuthErrorSchema","object","code","message","string","details","record","unknown","optional","UserRoleSchema","nullable","AuthUserSchema","id","email","name","image","url","emailVerified","boolean","createdAt","coerce","date","updatedAt","role","SessionSchema","userId","expiresAt","userAgent","ipAddress","SessionWithUserSchema","session","user","discriminatedUnion","status","literal","PasswordSchema","min","regex","EmailSchema","toLowerCase","trim","password","max","success","error","rememberMe","default","union","null","currentPassword","newPassword","provider","callbackURL","SnapBackEvent","QoSLevel","process","env","MCP_QUIET","SeveritySchema","RiskSeveritySchema","ValidationSeveritySchema","BaseIssueSchema","severity","type","line","number","fix","extend","file","column","snippet","rule","passed","issues","array","duration","CircuitBreakerStateEnumSchema","state","failures","threshold","lastFailure","cooldownMs","extendZodWithOpenApi","EVENT_VERSION","BaseEventSchema","event_version","openapi","example","timestamp","Date","now","SaveAttemptSchema","event","properties","protection","description","file_kind","reason","ai_present","ai_burst","outcome","SnapshotCreatedSchema","session_id","snapshot_id","bytes_original","bytes_stored","dedup_hit","latency_ms","SessionFinalizedSchema","files","triggers","duration_ms","highest_severity","ai_assist_level","ai_confidence_score","ai_provider","ai_large_insert_count","int","ai_total_chars","context","any","IssueCreatedSchema","issue_id","recommendation","IssueResolvedSchema","resolution","SessionRestoredSchema","files_restored","time_to_restore_ms","PolicyChangedSchema","pattern","from","to","source","AuthProviderSelectedSchema","trigger","AuthBrowserOpenedSchema","method","AuthCodeEntrySchema","code_format","time_to_enter_ms","attempts","code_length","AuthApprovalReceivedSchema","polling_attempts","total_wait_ms","device_code_expired","WelcomeFeatureViewedSchema","feature","position","WelcomeActionTriggeredSchema","action","time_viewed_ms","PerceivedHelpSchema","ActualChangesSchema","files_modified","lines_added","lines_removed","snapshots_used","PreventedIssuesSchema","rollbacks_avoided","pattern_violations_caught","skipped_tests_flagged","TierSchema","session_duration_ms","perceived_help","actual_changes","prevented_issues","tier","_loggerFactory","getLoggerFactory","LogLevel","createLogger","options","level","INFO","timestamps","formatMessage","levelStr","prefix","toISOString","formatMeta","meta","Error","stack","JSON","stringify","debug","messageOrObj","metaOrMsg","DEBUG","console","info","warn","WARN","ERROR","SpanStatusCode","SpanKind","DiffChangeSchema","added","removed","value","count","RiskScoreSchema","score","factors","metrics","trends","insights","snapshotRecommendations","shouldCreateSnapshot","urgency","suggestedTiming","risk","content","changes","before","after","RetrySchema","retries","factor","jitter","CircuitSchema","enabled","errorThresholdPercentage","volumeThreshold","timeoutMs","resetMs","rollingCountMs","rollingCountBuckets","maxConcurrent","retry","circuit","batch","size","maxWaitMs","debounceMs","awaitWriteFinish","stabilityThreshold","pollInterval","ignored","PurchaseTypeEnum","organizationId","customerId","subscriptionId","productId","SessionSchemaVersion","ChangeOpSchema","EOLTypeSchema","SessionTriggerSchema","SessionChangeSchema","p","op","hOld","hNew","sizeBefore","nonnegative","sizeAfter","mtimeBefore","mtimeAfter","modeBefore","modeAfter","eolBefore","eolAfter","schema","sessionId","startedAt","datetime","endedAt","workspaceUri","changeCount","filesChanged","snapshots","activeOnly","finalizedOnly","limit","positive","offset","idleMs","flushBatchSize","flushIntervalMs","useVSCodeWatcher","ignorePatterns","consent","ModificationSourceSchema","ModificationTypeSchema","path","linesChanged","aiAttributed","aiTool","fromIntelligenceFileModification","mod","extensionIds","velocity","charCount","AiDetectionOutputSchema","tool","confidence","indicators","ThreatPatternSchema","ThreatDetectionOutputSchema","threatCount","patterns","filePath","BurstDetectionOutputSchema","isBurst","ComplexityFileInputSchema","lineCount","ComplexityAnalysisOutputSchema","avgComplexity","maxComplexity","highComplexityFiles","fileCount","signal","triggered","signals","ai","threats","burst","complexity","overallRisk","riskLevel","triggeredSignals","processingTimeMs","SignalTypeSchema","ConfigFileTypeSchema","SupportedLanguageSchema","FileBaselineSchema","hash","language","critical","baseline","valid","metadata","errors","warnings","autoDetect","watchChanges","autoProtect","customPatterns","includePatterns","excludePatterns","LearningTypeSchema","LearningIntentSchema","WarnSeveritySchema","AddFlagPayloadSchema","flag","describe","SetEnvPayloadSchema","key","InjectValidationPayloadSchema","validationType","targetFile","WarnPayloadSchema","SuggestFilePayloadSchema","LearningTriggerSchema","commands","intent","filePatterns","flags","LearningActionSchema","payload","LearningSchema","created","lastUsed","usageCount","tags","archived","omit","workspaceId","lastCommandAt","appliedLearnings","HIGH_VALUE_COMMANDS","NEVER_EVALUATE_COMMANDS","commandName","args","filesOrPaths","SelectedLearningSchema","title","selectedLearnings","evaluatedCount","durationMs","skippedReason","calculateRecencyDecay","maxAgeDays","ageMs","ageDays","decay","Math","calculateLearningScore","learning","recencyDecay","ProtectionLevelSchema","icon","label","color","themeColor","ProtectedFileSchema","addedAt","PatternRuleSchema","ProtectionConfigSchema","defaultLevel","autoProtectConfigs","config","persistRegistry","registryPath","isProtected","__rewriteRelativeImportExtension","preserveJsx","test","replace","m","tsx","d","ext","cm","SnapshotTriggerSchema","SnapshotOriginSchema","SnapshotReasonCodeSchema","CheckpointTypeSchema","SnapshotSchema","version","fileContents","FileStateSchema","encrypted","iv","tag","algorithm","SnapshotFileRefV2Schema","blobHash","fileStates","iconColor","protected","origin","timeSinceLastChangeMs","FileDiffSchema","operation","linesAdded","linesRemoved","preview","currentChecksum","snapshotChecksum","DiffPreviewSchema","totalFiles","filesCreated","filesModified","filesDeleted","totalLinesAdded","totalLinesRemoved","diffs","ConflictReportSchema","restoredFiles","diffPreview","conflicts","verification","allVerified","results","verified","checksum","expected","enableDeduplication","namingStrategy","maxSnapshots","lastModified","totalSize","riskScore","seq","parentSeq","parentId","anchorFile","compressionRatio","storageSizeBytes","reasons","aiDetection","detected","taskId","schemaVersion","blob","newBlobsWritten","dedupedFiles","dedupRatio","bytesWritten","originalSize","bytesSaved","calculateDedupRatio","newBlobs","createStorageMetrics","blobResults","length","filter","r","isNew","reduce","sum","period","start","end","fileStats","total","byLanguage","byRisk","snapshotStats","frequency","averageSize","activity","createSnapshotStorage","basePath","StorageBrokerAdapter","storage","initialize","create","data","snapshot","random","toString","slice","save","retrieve","get","list","restore","_targetPath","dryRun","String","PROTECTION_STATUSES","RECENT_ACTIVITY_ACTIONS","AI_TOOLS","RecentActivitySchema","ai_tool","AIActivityBreakdownSchema","copilot","cursor","claude","windsurf","DashboardMetricsSchema","protection_status","total_snapshots","total_recoveries","files_protected","ai_detection_rate","recent_activity","ai_breakdown","DashboardMetricsErrorSchema","calculateWeightedScore","weights","totalWeight","weightedSum","Object","entries","weight","applyPenalties","penalties","acc","penalty","applyAdditivePenalties","totalPenalty","clampScore","normalizedQuery","query","WEIGHT_CONFIGS","factual","calculateFactualScore","conceptual","calculateConceptualScore","exploratory","calculateExploratoryScore","a","b","winningType","winningScore","secondScore","margin","calculateComplexity","buildReason","lowerQuery","PATTERNS","indicatorCount","words","hasComparison","includes","acronymCount","hasCodeIdentifier","match","scoreStr","scores","map","s","complexityStr","semantic","abs","wordCount","complexityScore","hasMultipleClauses","hasConditional","questionCount","hasSequence","hasPossessive","isSimpleLookup","isSingleEntity","shouldRetrieve","topK","useReranking","useExpansion","synonyms","term","synonym","expanded","push","keyword","prefixes","classifyQuery","getWeightsForType","validateWeights","getRetrievalStrategy","CODE_SYNONYMS","expandQuery","maxWarnings","maxSuggestions","maxRelatedFiles","includeSessionContext","includeFileHistory","priority","ctx","generate","__name","suggestion","fragility","FRAGILITY_THRESHOLDS","MODERATE","isTestFile","isCodeFile","GenericSuggestionsRule","suggestions","category","loopsDetected","SkippedTestRule","allSkipped","filesWithSkipped","result","parsed","skipped","totalSkipped","recentViolations","violationsByFile","existing","violation","uniqueTypes","types","rules","DEFAULT_ADVISORY_CONFIG","ConsecutiveModificationRule","registerRule","FragileFileRule","LoopDetectionRule","ViolationHistoryRule","right","left","floor","mid","summary","relatedFiles","fileHistory","logger","ruleId","limitedSuggestions","sort","limitedRelatedFiles","generateFileHistory","generateSummary","sessionContext","toolCallCount","undefined","modificationsThisSession","fragilityScore","maxModFile","maxMods","fragilityLevel","modificationsToday","rollbacksThisWeek","lastModifiedBy","cache","changedFiles","currentIndexVersion","set","Array","stale","changedDeps","newFilesIndexed","filePaths","add","staleness","checkStaleness","validity","delete","pruned","FILE_NOT_FOUND_SCORE","INCOMPLETE_ANALYSIS_SCORE","GRAPH_COVERAGE_THRESHOLD","evidence","clarity","historical","conflictingLearnings","vagueTask","high","medium","low","trivial","small","large","massive","clear","ambiguous","vague","fileExists","evidenceScore","graphCoverage","learningRelevance","historicalScore","similarTaskSuccessRate","userTrustScore","hasConflictingLearnings","buildExplanation","ambiguityScore","AMBIGUITY_SCORES","scopeScore","SCOPE_SCORES","scopeSize","LEVEL_THRESHOLDS","percentage","parts","taskAmbiguity","msg","mcpClient","apiKey","connected","SSEClientTransport","transport","requestInit","Authorization","capabilities","imports","importResults","all","arguments","pkg","package","latestVersion","isDeprecated","deprecationMessage","packages","apiUsage","alternative","packageName","importRegex","pkgName","requireRegex","parseLibraryDocs","Boolean","parseApiUsage","isArray","item","isValid","issue","docsUrl","parsePatterns","isRecommended","extractToolResult","textContent","text","createContext7MCPClient","deprecatedImports","invalidApis","api","antiPatterns","outdatedImports","recommendedPatterns","extractDocsRiskFactors","calculateContext7RiskScore","validation","getImprovementSuggestions","StdioClientTransport","command","GITHUB_PERSONAL_ACCESS_TOKEN","commitsResult","owner","repo","per_page","prsResult","callTool","issuesResult","recentCommits","activePR","relatedIssues","changeFrequency","calculateChangeFrequency","sha","ref","commitObj","commit","authorObj","author","commitAuthor","statsObj","stats","login","additions","Number","deletions","parseSingleCommit","findPRForFile","body","pr","labels","reviewStatus","mapReviewStatus","reviewDecision","decision","parseIssues","items","thirtyDaysAgo","commits","c","token","SNAPBACK_GITHUB_OWNER","SNAPBACK_GITHUB_REPO","createGitHubMCPClient","hasBlockingLabel","hasRiskLabel","bugIssues","largeCommits","uniqueAuthors","securityIssues","extractGitHubRiskFactors","calculateGitHubRiskScore","errorsResult","organization","project","filename","statsPeriod","errorTrend","recentReleaseHealth","similarIssues","errorId","culprit","userCount","firstSeen","lastSeen","isRegression","parseErrorLevel","parseSingleError","parseTrend","trend","parseReleaseHealth","crashFreeRate","sessionsCount","sessions_count","hasRegressions","parseSimilarIssues","similarity","authToken","SENTRY_PROJECT","createSentryMCPClient","activeErrors","totalUsers","fatalErrors","regressions","highImpactErrors","resolved","frequentErrors","oneDayAgo","recentErrors","extractSentryRiskFactors","calculateSentryRiskScore","fatalCount","errorCount","e","warningCount","healthStatus","rate","totalErrors","getErrorSummary","githubClient","context7Client","sentryClient","github","context7","sentry","connections","startTime","githubContext","docsValidation","withTimeout","getFileContext","riskFactors","factorCount","gatheredAt","sources","sentryContext","integrations","disconnect","promise","resolve","createContextAggregator","createContextAggregatorFromEnv","githubToken","SNAPBACK_GITHUB_ENABLED","DEFAULT_CONFIG","recency","maxScore","halfLifeHours","fileOverlap","exactMatch","sameDirectory","relatedFile","errorContext","minKeywordLength","cfg","snapshotTime","getTime","hoursSince","decayConstant","exp","round","scoreRecency","scoreFileOverlap","errorDir","dirname","errorFile","errorBasename","basename","totalScore","seenDirs","fileDir","fileBasename","normalizedRisk","scoreRiskLevel","scoreErrorContext","errorKeywords","commitKeywords","extractKeywords","commitMessage","keywordOverlap","k","ck","stackFiles","extractFilePaths","snapshotPaths","f","stackFile","scored","calculateConfidence","reasoning","generateReasoning","scoreSnapshots","minLength","word","paths","factorsSummary","STOP_WORDS","GitHubPRSchema","GitHubIssueSchema","APIUsageSchema","PatternValidationSchema","SimilarIssueSchema","thresholds","block","local","ai_detection","performance","contextTimeoutMs","cacheEnabled","cacheTtlMs","DEFAULT_RISK_WEIGHTS","localFactors","analyzeLocalChanges","previousContent","allFactors","adjustedScore","scoreToLevel","levelToRecommendation","explanation","generateExplanation","scoreSnapshotForRollback","snapshotId","normalizedScore","newLines","diff","prevLines","sourceCount","topFactors","levelText","restoreSnapshot","errorMatch","manualBonus","generateRollbackReasoning","formatAge","ageHours","hours","days","emoji","assessment","output","sign","formatRiskAssessment","createRiskEngine","ConfigStore","join","architecture","existsSync","archPath","readFileSync","constraints","constraintsPath","patternsPath","resolvePath","loadConstraints","loadPatterns","_cache_control","contextFiles","filepath","loadJsonl","appendJsonl","dir","fs","mkdirSync","recursive","appendFileSync","appendJsonlAsync","writeFile","writeJsonl","records","writeFileSync","generateId","contractsGenerateId","maxResults","minScore","intentWeight","componentWeight","fileAffinityWeight","keywordWeight","includeRelated","normalized","split","pop","endsWith","inferComponentType","generateFileAffinityPatterns","Set","startsWith","regexPattern","RegExp","matchGlob","MAGIC_BYTES","Buffer","HEADER_SIZE","CURRENT_VERSION","FLAG_ENCRYPTED","createEmptyState","learnings","violations","sessions","pendingSync","syncVersion","syncStatus","StateStore","statePath","encrypt","encryptionKey","dirty","deserialize","raw","serialized","promises","mkdir","tempPath","rename","addLearning","newLearning","accessCount","appliedCount","relevanceScore","updateLearning","index","updates","archivedAt","fullConfig","DEFAULT_INTENT_CONFIG","learningId","matchReasons","expandWithRelated","l","componentTypes","fileAffinities","intentMetadata","intents","existingMeta","relatedLearnings","intentSuccessCount","learning1","learning2","find","learningId2","learningId1","intentMatch","componentMatch","fileAffinityMatch","keywordMatch","relationshipMatch","matchCount","keywords","kw","counts","toAdd","visited","relatedId","recordViolation","newViolation","addPattern","newPattern","saveSession","assign","lastCheckpoint","taskDescription","newSession","learningIds","projectContext","setProjectContext","queuedAt","retryCount","newItem","ids","idSet","lastSynced","lastSyncError","json","jsonBuffer","compressed","gzipSync","encryptPayload","copy","header","writeUInt8","concat","magic","equals","readUInt8","parse","cipher","createCipheriv","final","authTag","decryptPayload","subarray","decipher","createDecipheriv","update","migrated","learningFiles","learningsDir","lines","legacy","domain","violationsPath","whyItHappened","prevention","doc","store","getState","getArray","v","getMap","currentState","yjsLearnings","toArray","yjsLearning","yjsPattern","yjsPatterns","yjsViolation","yjsViolations","yjsSyncVersion","incrementSyncVersion","encodeStateAsUpdate","Y","applyUpdate","encodeStateVector","adapter","queue","queuePath","syncInterval","isSyncing","snapbackDir","maxRetries","baseDelay","maxDelay","apiUrl","loadQueue","syncIfDirty","clearInterval","persistQueue","emit","sync","isDirty","attempt","delay","calculateBackoff","Promise","setTimeout","syncWithRetry","exponential","encodeState","syncToStateStore","encodeStateDiff","stop","removeAllListeners","cause","captureStackTrace","loadPromise","currentModel","loadError","modelLoadStartTime","disposePipeline","pipeline","pipelineObj","getEmbeddingPipeline","model","EMBEDDING_DEFAULTS","timeout","loadTimeout","transformers","PipelineLoadError","pipelineOptions","quantized","onProgress","progress_callback","_","reject","PipelineTimeoutError","onMetrics","modelLoadTimeMs","isPipelineReady","getCurrentModel","getLoadError","preloadPipeline","resetPipeline","originalLength","truncationOccurred","truncationMethod","truncatedLength","pipe","pipelineRaw","pipeWithTokenizer","processedText","tokenizer","tokenCount","encoded","encode","tokens","tokenize","callableTokenizer","input_ids","truncatedTokens","MAX_TOKENS","decode","skip_special_tokens","pooling","normalize","embedding","DimensionMismatchError","DIMENSION","embeddingTimeMs","textLengthChars","getEmbedding","getEmbeddingDimension","VectorDimensionError","i","dotProduct","magnitude","mag","Float32Array","cosineSimilarity","skipNormalizationCheck","magA","magB","aIsNormalized","bIsNormalized","tolerance","magProduct","dot","euclideanDistance","manhattanDistance","running","next","batchSize","BATCH_SIZE","concurrency","texts","semaphore","Semaphore","completed","batchStart","batchEnd","batchIndices","acquire","batchEmbeddings","streamEmbeddings","CONCURRENCY","pending","race","resultIndex","findIndex","misses","evictions","ttlMs","maxSize","existed","oldest","expiry","has","getStats","hits","hitRate","githubCache","docsCache","sentryCache","TrackedCache","normalizePath","contentHash","docs","totalHits","totalMisses","overall","createIntelligenceCache","policy","structure","retrieved","history","constraint","rule_doc","local_diff","recent_edit","symbol_context","dependency_graph","test_context","semantic_match","session_history","defaultTokenCounter","totalTokens","lanes","sumMins","lane","validateBudgetConfig","getLanesByPriority","byLane","candidates","candidate","groupByLane","sumTokenEstimates","allocateMinBudgets","allocation","shortfalls","pool","laneCandidates","available","laneMin","allocated","requested","selectWithinBudget","alreadySelected","selected","rejected","usage","tokenEstimate","totalUsed","laneMax","COMPOSER_VERSION","CACHE_TTL_MS","computeCacheKey","inputs","digest","computeCandidateDigest","sorted","createHash","computeConstraintsDigest","mustInclude","mustExclude","pinned","laneRequirements","computeBudgetConfigDigest","SelectionCache","entry","workspaceFingerprint","triggerEvent","commitish","candidateDigest","rulesDigest","budgetConfigDigest","constraintsDigest","composerVersion","buildCacheKeyInputs","artifact","matcher","matches","findMatchingConstraint","getPath","isExcluded","isPinned","isMustInclude","quantizeRelevance","clamped","RELEVANCE_PRECISION","lanePriorityA","LANE_PRIORITIES","lanePriorityB","kindPriorityB","KIND_PRIORITIES","kind","kindPriorityA","tieBreaker","normalizedRecency","SCORING_WEIGHTS","computeScore","scoreAndSort","validateScoringWeights","keys","laneBreakdown","laneSelected","laneConfig","selectedCount","budgetUsed","laneUsage","budgetMax","topArtifacts","totalCandidates","rejections","summaryParts","topRejections","detail","pinnedCount","mustIncludeCount","constraintCounts","excludedCount","excluded","candidateCount","cacheHit","withCacheHit","generateWorkspaceSecret","randomUUID","hashObject","renderArtifact","exactTokenCount","countTokens","shrunk","renderArtifacts","refs","rendered","getTotalTokens","targetTokens","current","stratA","stratB","SHRINK_STRATEGIES","overflow","newTarget","saved","shrunkArtifact","shrinkToFit","applyShrinkStrategy","strategy","startIndex","remaining","newContent","originalTokenCount","shrinkStrategy","truncateOldest","keepSignatures","signatures","inBody","braceDepth","trimmed","openBraces","closeBraces","collapseSummary","itemCount","summaryNote","totalItems","currentEntry","entryContent","entryTokens","kept","unshift","droppedNote","droppedCount","dropEntries","generateLogId","emitDecisionLog","budgetConfig","selectedArtifacts","budgetAllocation","totalTokensUsed","actualTokens","rankings","cacheKey","toRef","selectArtifacts","selectedIds","afterExclude","exclusion","pinConstraint","mustIncludeConstraint","allocationDetails","eligible","budgetResult","computeSelectionCacheKey","components","str","char","charCodeAt","resolveConfig","cacheKeyInputs","cached","selection","tokenCounter","actualTotal","finalRendered","selectedCandidates","rejectionReason","generateCandidates","tempSource","workspaceSecret","allCandidates","emitDecisionLogs","createComposer","ANALYZER_WEIGHTS","syntax","security","biome","completeness","dependencies","noAST","noSecurity","noCompleteness","noArchitecture","full","autoMerge","quickReview","breakdown","analyzer","SEVERITY_PENALTIES","maxPossibleConfidence","calculateMaxConfidence","coverage","hasCriticalIssues","RECOMMENDATION_THRESHOLDS","COVERAGE_CAPS","astParsed","maxConfidence","gaps","criticalIssues","flatMap","highIssues","totalIssues","avgCoverage","securityChecked","analyzerIds","completenessChecked","architectureChecked","filesCoverage","configStore","initialized","effectiveKeywords","loadArchitecture","contextSections","filterRelevantSections","hardRules","extractHardRules","getRecentViolations","relevantLearnings","getRelevantLearnings","task","hint","stopWords","lowerKeywords","relevantSections","sections","section","some","lowerSection","hardRulesMatch","learningsPath","violationCount","learningCount","embedder","db","rootDir","dbPath","DEFAULT_CONTEXT_FILES","SQL","initSqlJs","fileBuffer","Database","_err","buffer","indexed","fullPath","splitIntoSections","stmt","bind","row","existingContent","estimateTokens","embeddingBlob","Uint8Array","step","getAsObject","tokensUsed","sectionsIncluded","embeddingArray","byteOffset","totalDbTokens","normA","normB","denominator","currentHeader","currentContent","sectionContent","ceil","totalSections","countStmt","cnt","filesStmt","saveDb","close","required","detectWith","astPattern","failureMessage","fixSuggestion","applicableTo","createIssueId","idx","findLine","daemonPatterns","detect","isDaemon","hasSIGINT","hasSIGTERM","hasUnixSocket","setsPermissions","readsData","hasLimit","isDaemonStart","hasLock","hasUncaughtHandler","isHttpServer","hasHealthEndpoint","hasServer","hasGracefulShutdown","importance","detection","requiredDocumentation","purpose","expectedSections","directories","template","nextjsConfig","reactViteConfig","expressConfig","nestjsConfig","astroConfig","FRAMEWORK_CONFIGS","getAllFrameworks","FRAMEWORK_MAP","getFramework","getFrameworksByCategory","isValidFramework","detectFrameworks","detectedFrameworks","evaluateFramework","detectPrimaryFramework","frameworks","matchedWeight","matchedIndicators","detectedVersion","indicator","matched","checkIndicator","packageJson","devDependencies","scripts","values","script","checkFileContent","coverageThreshold","includeOptional","frameworkConfig","expectedPatterns","relevantExpected","identifyGaps","detectionResult","strengths","isPositive","foundPatterns","calculateScore","recommendations","generateRecommendations","totalExpected","patternsFound","patternsMissing","antiPatternsFound","criticalGaps","g","recommendedGaps","optionalGaps","profile","locations","loc","strength","missingPatterns","scannedFiles","found","patternId","patternName","getRecommendation","effort","estimateEffort","autoFixable","affectedFiles","importanceToSeverity","criticalPenalty","highPenalty","antiPatternPenalty","coverageScore","gap","patternCategoryToRecommendationCategory","actions","target","autoApply","healthImpact","antiPattern","estimatedTime","effortToTime","beforeMatch","regexMatch","createMatch","errorBoundaryMatcher","thenPattern","afterMatch","tryCatchMatcher","expressErrorMiddlewareMatcher","nestjsExceptionFilterMatcher","unhandledPromiseMatcher","globalErrorHandlerMatcher","reactMemoMatcher","lazyLoadingMatcher","imageOptimizationMatcher","largeBundleMatcher","cachingMatcher","asyncInLoopMatcher","compressionMatcher","helmetMatcher","corsMatcher","rateLimitMatcher","sqlInjectionMatcher","xssMatcher","hardcodedSecretsMatcher","inputValidationMatcher","authGuardMatcher","unitTestMatcher","vagueAssertionMatcher","integrationTestMatcher","reactTestingLibraryMatcher","e2eTestMatcher","mockingMatcher","coverageConfigMatcher","errorHandlingMatchers","securityMatchers","testingMatchers","performanceMatchers","createBuiltInMatchers","matchers","workspaceRoot","include","useAst","fileTimeout","matchersToRun","matcherIds","Map","relative","checkedPatterns","matcherAppliesToFile","fastGlob","ignore","exclude","absolute","onlyFiles","AbortController","controller","encoding","clearTimeout","allMatches","relativePath","globToRegex","escaped","calculateStrength","uniqueFiles","avgConfidence","findMissingPatterns","foundIds","detectPatterns","maxFilesForLanguageDetection","skipDirectories","readPackageJson","getFilePaths","detectPackageManager","analyzeExistingContext","languages","analyzeLanguages","analyzeStructure","detectedPatterns","GapAnalyzer","root","framework","packageManager","existingContext","healthScore","packageJsonPath","cwd","lockfile","extensionToLanguage","extname","languageMap","extensions","sourceDirectories","testDirectories","configFiles","isMonorepo","monorepoTool","firstDir","totalLinesEstimate","codeFiles","hasContextDirectory","contextDirs","contextPath","qualityScore","fullContextPath","stat","readFile","quality","assessFileQuality","extractSections","headingPattern","hasPlaceholders","calculateContextQuality","good","outdated","empty","PatternDetector","maxFiles","calculateHealthScore","patternScore","highGaps","authentication","PROMOTE_TO_PATTERN","ADD_AUTOMATION","interactionsPath","goldenPath","interaction","interactions","updated","addedToGolden","feedback","correct","addToGoldenDataset","classifyQueryType","goldenExample","queryType","contextUsed","checkGoldenPromotion","forType","solution","input","golden","withFeedback","humanFeedback","queryTypeBreakdown","totalInteractions","feedbackReceived","correctRate","goldenExamples","shouldPromote","shouldAutomate","automatedAt","PROMOTION_THRESHOLDS","promotedAt","whatHappened","wrongExample","correctExample","byType","readyForAutomation","readyForPromotion","maxToolCalls","maxConsecutiveSameTool","maxFileModifications","maxConsecutiveSameFile","sessionTimeoutMs","maxTurns","circuitBreakerThreshold","circuitBreakerCooldownMs","SEMANTIC_THRESHOLD","CONFIDENCE_THRESHOLD_HALT","CONFIDENCE_THRESHOLD_WARN","semanticResult","detectSemanticLoop","structuralResult","maxConsecutive","maxTool","sequence","isAlternating","toolCalls","maxSimilarity","recentCalls","j","call1","call2","args1","str2","args2","str1","tokens2","intersection","tokens1","limits","loopDetector","persistencePath","autosaveEnabled","DEFAULT_SESSION_LIMITS","autosave","loadSessions","catch","lastActivity","turnCount","fileModifications","consecutiveModifications","loopDetection","dedupKeys","consecutiveSameTool","semanticCache","circuitBreakers","riskReasons","getSession","ToolCallSchema","breaker","cooldownExpired","cooldownRemaining","consecutive","shift","call","toolNames","FileModificationSchema","consecutiveCount","updateRiskLevel","toolCallRate","fileModCount","loopResult","circuitBreakerTrips","previousLevel","newLevel","toolCounts","mostCalledTool","uniqueTools","currentLoopResult","timedOut","halted","totalToolCalls","filesTouched","peakRiskLevel","analytics","age","toolName","fromEntries","jsonl","loaded","patternsDir","constraintsFile","violationsFile","embeddingsDb","enableSemanticSearch","enhancedValidation","enableLearningLoop","enableAutoPromotion","sessionLimits","sessionPersistence","advisoryConfig","AUTO_MERGE","QUICK_REVIEW","FULL_REVIEW","warning","DEFAULT_WEIGHTS","customWeights","layers","layer","layerWeight","severityWeight","getSeverityWeight","layerName","findings","cleanedLines","removeMultiLineComments","SECRET_PATTERNS","lineNum","originalLine","matchAll","isInSingleLineComment","entropy","calculateEntropy","calculateRiskScore","freq","len","log2","stringPattern","substring","testPatterns","inComment","cleanedLine","endIndex","beforePosition","finding","severityWeights","tempDir","mkdtemp","tempFile","execBiome","parseBiomeOutput","force","stdout","stderr","spawn","shell","stdio","proc","err","err2","diagnostics","diagnosticToIssue","diag","mapSeverity","location","span","beforeOffset","noUnusedImports","noUnusedVariables","noNonNullAssertion","noExplicitAny","useBlockStatements","noConsole","fileName","execTsc","parseTscOutput","tsCode","parseInt","getSuggestedFix","codeMatch","TS2322","TS2339","TS2345","TS2304","TS2531","TS2532","TS7006","TS2307","TS2341","TS2551","TS2769","SyntaxLayer","validate","closeBrackets","openBrackets","closeParens","openParens","anyMatches","nonNullMatches","hasSadPath","hasEdgeCase","hasErrorCase","hasHappyPath","secretDetector","checkUnsafeFunctions","checkPrivacyViolations","checkEvalUsage","secretResult","adaptSecretFinding","findLineForMatch","unsafe","SecurityLayer","UNSAFE_FUNCTION_PATTERNS","lastIndex","toUpperCase","checkSyncFileIO","checkAwaitInLoop","checkNestedLoops","checkMemoryLeaks","checkReDoS","checkSpawnShellOption","forAwaitPattern","nestedForPattern","forWithForEachPattern","nestedForEachPattern","PerformanceLayer","spawnShellPattern","ok","ValidationError","confidenceCalculator","useDynamicConfidence","opts","customLayers","TypeLayer","TestLayer","ArchitectureLayer","DependencyLayer","BiomeLayer","TypeScriptCompilerLayer","layerResults","focusPoints","failFast","CriticalValidationError","layerResult","allCriticalIssues","CONFIDENCE_THRESHOLDS","ValidationPipeline","flattenIssues","sessionStart","edits","tests","aiSuggestions","fileSaves","initialTime","linesDeleted","accepted","sessionDuration","totalSuggestions","acceptedSuggestions","rejectedSuggestions","aiAcceptanceRate","totalLinesChanged","sessionMinutes","churnRate","totalTests","passedTests","testPassRate","avgTimeBetweenEdits","intervals","fileSaveCount","aiSuggestionsShown","aiSuggestionsAccepted","aiSuggestionsRejected","saves","TRAJECTORY_THRESHOLDS","hotfix","intervalMultiplier","maxLinesBeforeSnapshot","riskMultiplier","recommendedIntervalMinutes","aiAdjustedIntervalMinutes","refactor","release","cachedPhase","lastBranch","override","phase","branchName","matchedPattern","PHASE_THRESHOLDS","inferredPhase","detectPhase","expiryMinutes","overrides","clearCache","getOverride","active","pulseMultiplier","temperatureMultiplier","pressureMultiplier","oxygenMultiplier","clamp","ThresholdCalibrator","learner","observationCount","thresholdAdjustments","DEFAULT_THRESHOLD_ADJUSTMENTS","riskTolerance","typicalPulseLevel","snapshotFrequency","lastCalibratedAt","observations","getObservations","totalObservations","calculateStatus","calculateRiskTolerance","calculateTypicalPulseLevel","calculateAdjustments","CALIBRATION_THRESHOLDS","aggressiveRatio","lateSnapshots","earlyRatio","countConfidence","behaviors","earlySnapshots","alignedSnapshots","missedRecommendations","consistency","maxBehavior","entropyPenalty","baseMultiplier","clampedMultiplier","reset","TrajectoryPredictor","maxHistory","createDefaultForecast","getCurrentTrajectory","calculateTrend","in5Minutes","predictTrajectoryAt","in10Minutes","timeToStateChange","calculateTimeToStateChange","recentHistory","pressureRate","oxygenRate","temperatureTrend","pulseTrend","calculateRate","oxygen","calculateTemperatureTrend","calculatePulseTrend","last","valueDelta","getValue","timeDeltaMinutes","first","delta","recent","recentRate","currentPressure","pressure","projectedPressure","targetPressure","timeMinutes","pressureDelta","generateId2","UserBehaviorLearner","classifyTiming","calculateUrgency","observation","vitals","userCreatedSnapshot","vitalsRecommended","urgencyAtTime","timing","trajectory","riskProfile","avgPressureAtSnapshot","avgOxygenAtSnapshot","early","o","late","missed","snapshotObs","avgPressure","avgOxygen","inferRiskProfile","aligned","missedRatio","lateRatio","staleMinutes","criticalWeight","DEFAULT_OXYGEN_CONFIG","modifiedFiles","recordSnapshot","staleThreshold","covered","isCritical","isCriticalFile","coveragePercentage","staleSnapshots","modified","CRITICAL_FILE_PATTERNS","baseRate","criticalMultiplier","decayOnSnapshot","maxPressure","changeBasedPressure","unsnapshotedChanges","lastSnapshotTime","criticalFilesTouched","DEFAULT_PRESSURE_CONFIG","increment","multiplier","minutesSinceSnapshot","timePressure","totalPressure","timeSinceLastSnapshot","shouldSnapshot","educational","criticalFiles","primary","elevated","racing","windowSeconds","DEFAULT_PULSE_CONFIG","pruneOld","changesPerMinute","cutoff","warm","hot","burning","decaySeconds","aiEvents","humanEvents","DEFAULT_TEMPERATURE_CONFIG","aiPercentage","detectedTool","human","t","pulse","temperature","calibrator","predictor","phaseDetector","currentBranch","DEFAULT_VITALS_CONFIG","TemperatureMonitor","PressureGauge","OxygenSensor","PhaseDetector","behaviorTracker","BehaviorTracker","for","instance","WorkspaceVitals","instances","recordChange","recordModification","isAI","checkAndEmit","recordAIActivity","pulseData","tempData","getLevel","pressureData","oxygenData","should","snapshotDecision","blockedOps","safeOps","snapshotReason","riskyFiles","safeOperations","blockedOperations","getSuggestion","tempMultiplier","cold","recordObservation","recordSnapshots","getAdjustedThresholds","recordEdit","recordTest","recordAISuggestion","getMetadata","getThresholdMultiplier","requiresFrequentSnapshots","phaseMultiplier","getPhaseThresholdMultiplier","criticalPressure","latestPressure","earliestPressure","pressureTrend","contextEngine","validationPipeline","learningEngine","violationTracker","sessionManager","advisoryEngine","ContextEngine","enhanced","ViolationTracker","SessionManager","quickCheck","report","recordFeedback","interactionId","getAgentGuidance","recordBehavior","tryGet","getCalibratedThresholds","getForecast","getBehaviorStats","getCalibrationProfile","resetLearning","recordFileSave","getBehavioralMetadata","startSession","recordToolCall","recordFileModification","getAnalytics","getFileModifications","IntelligenceConfigSchema","retrieval","calculateRetrievalConfidence","calculateHistoricalConfidence","calculateActionConfidence","crossAgreement","semanticSimilarity","retrievalFactors","successRate","recentUsage","contextMatch","bestRank","getOutcomeStats","chunkId","testFail","successes","hasRecentOutcome","chunk","chunkText","taskType","fileMatches","violationMatches","testPass","violationPrevented","lastOutcome","outcome_type","latestDate","last_at","prepare","run","outcomeType","adr","deprecated","superseded","calculateMetadataBoost","sourceWeight","SOURCE_TYPE_WEIGHTS","authorityScore","authority","statusPenalty","STATUS_PENALTIES","statusFactor","updatedDate","daysSinceUpdate","recencyFactor","LN2","RECENCY_HALF_LIFE_DAYS","boost","calculateHistoricalBoost","usageBonus","recentSuccess","recentOutcomes","recentRatio","baseScore","historicalSignals","retrievalComponent","historicalComponent","metadataComponent","combined","calculateRerankingScore","originalScore","rerankScore","batchRerankingScores","getConfidenceLevel","_emitDeprecationWarning","deprecationWarned","semanticWeight","minConfidence","candidateMultiplier","candidateLimit","semanticResults","keywordResults","semanticSearch","keywordSearch","withConfidence","filtered","elapsed","classification","originalWeights","semanticCandidates","keywordCandidates","fusedCount","latencyMs","searchSemantic","rank","rrfScore","getChunk","historicalConfidence","actionConfidence","retrievalConfidence","inBoth","sim","loadBetterSqlite3","BetterSqlite3","KnowledgeStore","dbOrConfig","inMemory","pragma","initSchema","exec","chunk_id","embeddedStmt","totalStmt","withEmbedding","missing","queryEmbedding","allEmbeddings","getAllEmbeddings","topIds","totalChunks","source_type","created_at","countMap","totalCount","successCount","recentStmt","recentRows","chunkIds","getHistoricalSignals","chunkCounts","chunkMap","isSuccess","newAuthority","baseAuthority","includeArchived","fuzzyThreshold","stateStore","storedLearnings","stored","convertToLearning","matchScore","finalScore","topCandidates","lastAccessed","allKeywords","fuse","cmd","matchesPattern","matchesFlag","flagName","argKeys","descriptionMatch","fuzzyMatchDescription","matchedFactors","descLower","normalizedFile","normalizedPattern","getLearnings","mode","activeSession","getActiveSession","appliedInSession","filteredLearnings","allLearnings","recordMatch","TIMEOUT_MS","recentSession","isTestOrConfigFile","detectTestImports","detectMockPatterns","importPattern","importPath","testLib","TEST_IMPORTS","isLargeStructure","allowedPatterns","usageReport","phantomDeps","totalDeps","allDeps","dep","declaredIn","extractPackageName","exceptions","deps","ratio","detector","mockDetector","phantomDependencyDetector","MockDetector","PhantomDependencyDetector","defaultAction","totalFindings","isDetectorEnabled","determineAction","events","byDetector","secret","mock","highestAction","hasSeverity","getHigherAction","watch","toolVersion","toolUri","addRulesForEvent","sarifResult","convertFindingToResult","$schema","runs","driver","informationUri","deduplicateRules","shortDescription","defaultConfiguration","helpUri","convertSecretFinding","convertMockFinding","convertPhantomDependencyFinding","mapSeverityToLevel","artifactLocation","region","startLine","startColumn","seen","deduplicated","sarif","formatter","SarifFormatter","toSarif","log","require","blockOn","pathRules","POLICY_ETAG","effectiveConfig","DEFAULT_POLICY","effectiveBlockOn","matchesGlob","glob","effectiveThresholds","implicitBlockOn","issueCounts","getSeverity","rulesHit","rules_hit","policyVersion","etag","evaluate","criticalRatio","highRatio","mediumRatio","lowRatio","thresholdProximity","loadPolicyConfig","configPath","configContent","makePatternKey","relevance","indexPattern","scoreMin","scoreMax","dateFrom","dateTo","searchLower","searchScore","sortOrder","comparison","sortBy","allPatterns","fileExt","daysSinceLastSeen","matchingKeywords","calculateSimilarity","related","findRelatedPatterns","byFile","topViolations","usageScore","recencyScore","keywordLower","sourceSimilarity","scoreDiff","scoreSimilarity","textSimilarity","calculateTextSimilarity","totalSimilarity","words2","text2","overlap","PatternQueryEngine","createPatternQueryEngine","rollbackWindowDays","minRollbacksForFragile","coChangeThreshold","quickRollbackThresholdMs","scoreDecayRate"],"mappings":"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","file":"chunk-LEXNOXPV.js","sourcesContent":["/**\n * Authentication Error Types\n *\n * Standardized error codes and schemas for authentication flows.\n * Maps Better Auth errors to our application-specific error codes.\n */\nimport { z } from \"zod\";\n/**\n * Standard authentication error codes\n *\n * These codes provide a consistent error interface across\n * all authentication operations, regardless of the underlying\n * authentication provider (Better Auth, OAuth, etc.)\n */\nexport const AuthErrorCodeSchema = z.enum([\n \"INVALID_CREDENTIALS\",\n \"USER_NOT_FOUND\",\n \"EMAIL_NOT_VERIFIED\",\n \"SESSION_EXPIRED\",\n \"UNAUTHORIZED\",\n \"RATE_LIMITED\",\n \"INVALID_TOKEN\",\n \"USER_ALREADY_EXISTS\",\n \"WEAK_PASSWORD\",\n \"INVALID_EMAIL\",\n \"OAUTH_ERROR\",\n \"NETWORK_ERROR\",\n \"UNKNOWN_ERROR\",\n]);\n/**\n * Authentication error schema\n *\n * Provides structured error information for frontend display\n * and logging purposes.\n *\n * @example\n * ```typescript\n * const result = await signIn(email, password);\n * if (result.error) {\n * console.error(`Auth failed: ${result.error.message}`);\n * if (result.error.code === 'INVALID_CREDENTIALS') {\n * showToast('Invalid email or password');\n * }\n * }\n * ```\n */\nexport const AuthErrorSchema = z.object({\n code: AuthErrorCodeSchema,\n message: z.string(),\n details: z.record(z.string(), z.unknown()).optional(),\n});\n/**\n * Map Better Auth error messages to our error codes\n *\n * Better Auth returns string error messages. This map translates\n * them to our standardized error codes for consistent handling.\n */\nexport const BETTER_AUTH_ERROR_MAP = {\n // Sign in errors\n INVALID_PASSWORD: \"INVALID_CREDENTIALS\",\n USER_NOT_FOUND: \"USER_NOT_FOUND\",\n INVALID_EMAIL: \"INVALID_EMAIL\",\n // Sign up errors\n USER_ALREADY_EXISTS: \"USER_ALREADY_EXISTS\",\n EMAIL_ALREADY_IN_USE: \"USER_ALREADY_EXISTS\",\n WEAK_PASSWORD: \"WEAK_PASSWORD\",\n // Session errors\n SESSION_EXPIRED: \"SESSION_EXPIRED\",\n SESSION_NOT_FOUND: \"SESSION_EXPIRED\",\n INVALID_SESSION: \"SESSION_EXPIRED\",\n // Verification errors\n EMAIL_NOT_VERIFIED: \"EMAIL_NOT_VERIFIED\",\n // Token errors\n INVALID_TOKEN: \"INVALID_TOKEN\",\n TOKEN_EXPIRED: \"INVALID_TOKEN\",\n // Rate limiting\n RATE_LIMIT_EXCEEDED: \"RATE_LIMITED\",\n TOO_MANY_REQUESTS: \"RATE_LIMITED\",\n // OAuth errors\n OAUTH_ERROR: \"OAUTH_ERROR\",\n OAUTH_CALLBACK_ERROR: \"OAUTH_ERROR\",\n PROVIDER_ERROR: \"OAUTH_ERROR\",\n};\n/**\n * Helper function to map Better Auth errors to our error codes\n *\n * @param betterAuthError - Error message or code from Better Auth\n * @returns Mapped error code or UNKNOWN_ERROR\n *\n * @example\n * ```typescript\n * const errorCode = mapBetterAuthError('INVALID_PASSWORD');\n * // Returns: 'INVALID_CREDENTIALS'\n * ```\n */\nexport function mapBetterAuthError(betterAuthError) {\n return BETTER_AUTH_ERROR_MAP[betterAuthError] || \"UNKNOWN_ERROR\";\n}\n/**\n * Create a standardized auth error\n *\n * @param code - Error code\n * @param message - User-friendly error message\n * @param details - Optional additional error details\n * @returns AuthError object\n *\n * @example\n * ```typescript\n * throw createAuthError(\n * 'INVALID_CREDENTIALS',\n * 'The email or password you entered is incorrect',\n * { attempts: 3 }\n * );\n * ```\n */\nexport function createAuthError(code, message, details) {\n return {\n code,\n message,\n ...(details && { details }),\n };\n}\n/**\n * User-friendly error messages for each error code\n *\n * These messages are safe to display to end users and provide\n * actionable guidance.\n */\nexport const AUTH_ERROR_MESSAGES = {\n INVALID_CREDENTIALS: \"The email or password you entered is incorrect\",\n USER_NOT_FOUND: \"No account found with this email address\",\n EMAIL_NOT_VERIFIED: \"Please verify your email address before signing in\",\n SESSION_EXPIRED: \"Your session has expired. Please sign in again\",\n UNAUTHORIZED: \"You do not have permission to perform this action\",\n RATE_LIMITED: \"Too many attempts. Please try again later\",\n INVALID_TOKEN: \"Invalid or expired verification token\",\n USER_ALREADY_EXISTS: \"An account with this email already exists\",\n WEAK_PASSWORD: \"Password does not meet security requirements\",\n INVALID_EMAIL: \"Please enter a valid email address\",\n OAUTH_ERROR: \"Authentication with this provider failed. Please try again\",\n NETWORK_ERROR: \"Network error. Please check your connection and try again\",\n UNKNOWN_ERROR: \"An unexpected error occurred. Please try again\",\n};\n/**\n * Get user-friendly message for an error code\n *\n * @param code - Error code\n * @returns User-friendly error message\n */\nexport function getErrorMessage(code) {\n return AUTH_ERROR_MESSAGES[code];\n}\n","/**\n * Authentication Session Types\n *\n * Core types and schemas for user authentication and session management.\n * These contracts are shared between frontend and backend to ensure type safety.\n */\nimport { z } from \"zod\";\n/**\n * User role type - matches database schema and Better Auth admin plugin\n */\nexport const UserRoleSchema = z.enum([\"admin\", \"user\", \"viewer\"]).nullable();\n/**\n * Core user schema - minimal fields needed for authentication\n *\n * This represents the authenticated user object as returned by Better Auth\n * and used throughout the application.\n */\nexport const AuthUserSchema = z.object({\n id: z.string(),\n email: z.string().email(),\n name: z.string().nullable(),\n image: z.string().url().nullable().optional(),\n emailVerified: z.boolean(),\n createdAt: z.coerce.date(),\n updatedAt: z.coerce.date(),\n // Role field from database - nullable as not all users have a role assigned\n role: UserRoleSchema.optional(),\n});\n/**\n * Session schema - represents an active authentication session\n *\n * Sessions are stored in the database and include metadata about\n * the device and location for security purposes.\n */\nexport const SessionSchema = z.object({\n id: z.string(),\n userId: z.string(),\n expiresAt: z.coerce.date(),\n createdAt: z.coerce.date(),\n updatedAt: z.coerce.date(),\n // Better Auth session metadata\n userAgent: z.string().nullable().optional(),\n ipAddress: z.string().nullable().optional(),\n});\n/**\n * Combined session + user for convenience\n *\n * This is the most common data structure used in the frontend,\n * representing a fully authenticated state with both session and user data.\n *\n * @example\n * ```typescript\n * const session = await getSession();\n * if (session) {\n * console.log(session.user.email); // Access user data\n * console.log(session.session.expiresAt); // Access session data\n * }\n * ```\n */\nexport const SessionWithUserSchema = z.object({\n session: SessionSchema,\n user: AuthUserSchema,\n});\n/**\n * Authentication state for UI components\n *\n * Discriminated union representing the three possible auth states:\n * - authenticated: User is logged in with valid session\n * - unauthenticated: No valid session exists\n * - loading: Session check in progress\n *\n * @example\n * ```typescript\n * function MyComponent() {\n * const { state } = useAuth();\n *\n * if (state.status === 'loading') {\n * return <Spinner />;\n * }\n *\n * if (state.status === 'unauthenticated') {\n * return <LoginPrompt />;\n * }\n *\n * // TypeScript knows state.user exists here\n * return <div>Welcome, {state.user.name}</div>;\n * }\n * ```\n */\nexport const AuthStateSchema = z.discriminatedUnion(\"status\", [\n z.object({\n status: z.literal(\"authenticated\"),\n user: AuthUserSchema,\n session: SessionSchema,\n }),\n z.object({\n status: z.literal(\"unauthenticated\"),\n }),\n z.object({\n status: z.literal(\"loading\"),\n }),\n]);\n/**\n * Type guards for auth state\n */\nexport function isAuthenticated(state) {\n return state.status === \"authenticated\";\n}\nexport function isUnauthenticated(state) {\n return state.status === \"unauthenticated\";\n}\nexport function isLoading(state) {\n return state.status === \"loading\";\n}\n","// ESM imports fixed for Node.js v22+\n/**\n * Authentication API Contracts\n *\n * Request and response schemas for all authentication endpoints.\n * These schemas ensure type safety and runtime validation across\n * the frontend/backend boundary.\n */\nimport { z } from \"zod\";\nimport { AuthErrorSchema } from \"./errors.js\";\nimport { AuthUserSchema, SessionWithUserSchema } from \"./session.js\";\n/**\n * Password validation schema\n *\n * Enforces security requirements:\n * - Minimum 8 characters\n * - At least one uppercase letter\n * - At least one lowercase letter\n * - At least one number\n */\nexport const PasswordSchema = z\n .string()\n .min(8, \"Password must be at least 8 characters\")\n .regex(/[A-Z]/, \"Password must contain at least one uppercase letter\")\n .regex(/[a-z]/, \"Password must contain at least one lowercase letter\")\n .regex(/[0-9]/, \"Password must contain at least one number\");\n/**\n * Email validation schema\n *\n * Validates email format and normalizes to lowercase\n */\nexport const EmailSchema = z.string().email(\"Invalid email address\").toLowerCase().trim();\n/**\n * Sign up request schema\n *\n * @example\n * ```typescript\n * const signupData: SignUpRequest = {\n * email: 'user@example.com',\n * password: 'SecurePass123',\n * name: 'John Doe'\n * };\n * ```\n */\nexport const SignUpRequestSchema = z.object({\n email: EmailSchema,\n password: PasswordSchema,\n name: z.string().min(1, \"Name is required\").max(100, \"Name is too long\").trim(),\n});\n/**\n * Sign up response schema\n *\n * Uses discriminated union for type-safe success/error handling\n *\n * @example\n * ```typescript\n * const response = await signUp(data);\n * if (response.success) {\n * console.log('User created:', response.user.email);\n * } else {\n * console.error('Signup failed:', response.error.message);\n * }\n * ```\n */\nexport const SignUpResponseSchema = z.discriminatedUnion(\"success\", [\n z.object({\n success: z.literal(true),\n user: AuthUserSchema,\n }),\n z.object({\n success: z.literal(false),\n error: AuthErrorSchema,\n }),\n]);\n/**\n * Sign in request schema\n *\n * Includes optional `rememberMe` field to control session duration:\n * - true (default): 7-day session\n * - false: 24-hour session\n *\n * @example\n * ```typescript\n * const signinData: SignInRequest = {\n * email: 'user@example.com',\n * password: 'SecurePass123',\n * rememberMe: true // Optional, defaults to false\n * };\n * ```\n */\nexport const SignInRequestSchema = z.object({\n email: EmailSchema,\n password: z.string().min(1, \"Password is required\"),\n rememberMe: z.boolean().optional().default(false),\n});\n/**\n * Sign in response schema\n *\n * Returns user and session information on success\n *\n * @example\n * ```typescript\n * const response = await signIn(data);\n * if (response.success) {\n * console.log('Logged in:', response.user.email);\n * console.log('Session expires:', response.session.expiresAt);\n * } else {\n * console.error('Login failed:', response.error.message);\n * }\n * ```\n */\nexport const SignInResponseSchema = z.discriminatedUnion(\"success\", [\n z.object({\n success: z.literal(true),\n user: AuthUserSchema,\n session: z.object({\n id: z.string(),\n expiresAt: z.coerce.date(),\n }),\n }),\n z.object({\n success: z.literal(false),\n error: AuthErrorSchema,\n }),\n]);\n/**\n * Get session response schema\n *\n * Returns session with user data if authenticated, null otherwise\n *\n * @example\n * ```typescript\n * const session = await getSession();\n * if (session) {\n * console.log('Authenticated as:', session.user.email);\n * } else {\n * console.log('Not authenticated');\n * }\n * ```\n */\nexport const GetSessionResponseSchema = z.union([SessionWithUserSchema, z.null()]);\n/**\n * Sign out response schema\n *\n * Simple success/error response for logout operations\n */\nexport const SignOutResponseSchema = z.discriminatedUnion(\"success\", [\n z.object({\n success: z.literal(true),\n }),\n z.object({\n success: z.literal(false),\n error: AuthErrorSchema,\n }),\n]);\n/**\n * Update user profile request schema\n *\n * All fields are optional - only provided fields will be updated\n *\n * @example\n * ```typescript\n * const updates: UpdateProfileRequest = {\n * name: 'Jane Doe',\n * // image not provided, won't be updated\n * };\n * ```\n */\nexport const UpdateProfileRequestSchema = z.object({\n name: z.string().min(1).max(100).trim().optional(),\n image: z.string().url().optional(),\n});\n/**\n * Update user profile response schema\n */\nexport const UpdateProfileResponseSchema = z.discriminatedUnion(\"success\", [\n z.object({\n success: z.literal(true),\n user: AuthUserSchema,\n }),\n z.object({\n success: z.literal(false),\n error: AuthErrorSchema,\n }),\n]);\n/**\n * Change password request schema\n *\n * Requires current password for security\n */\nexport const ChangePasswordRequestSchema = z.object({\n currentPassword: z.string().min(1, \"Current password is required\"),\n newPassword: PasswordSchema,\n});\n/**\n * Change password response schema\n */\nexport const ChangePasswordResponseSchema = z.discriminatedUnion(\"success\", [\n z.object({\n success: z.literal(true),\n }),\n z.object({\n success: z.literal(false),\n error: AuthErrorSchema,\n }),\n]);\n/**\n * OAuth sign-in request schema\n *\n * Supports GitHub, Google, and other OAuth providers\n */\nexport const OAuthSignInRequestSchema = z.object({\n provider: z.enum([\"github\", \"google\"]),\n callbackURL: z.string().url().optional(),\n});\n","/**\n * @snapback/contracts - EventBus Emitter Implementation\n *\n * This file contains the EventBus implementation using EventEmitter2.\n * Consolidated from @snapback/events package.\n */\nimport { randomUUID } from \"node:crypto\";\nimport EventEmitter2 from \"eventemitter2\";\n// Define the event types\nexport var SnapBackEvent;\n(function (SnapBackEvent) {\n SnapBackEvent[\"SNAPSHOT_CREATED\"] = \"snapshot:created\";\n SnapBackEvent[\"SNAPSHOT_DELETED\"] = \"snapshot:deleted\";\n SnapBackEvent[\"SNAPSHOT_RESTORED\"] = \"snapshot:restored\";\n SnapBackEvent[\"RESTORE_STARTED\"] = \"snapshot:restore_started\";\n SnapBackEvent[\"PROTECTION_CHANGED\"] = \"protection:changed\";\n SnapBackEvent[\"FILE_PROTECTED\"] = \"file:protected\";\n SnapBackEvent[\"FILE_UNPROTECTED\"] = \"file:unprotected\";\n SnapBackEvent[\"ANALYSIS_REQUESTED\"] = \"analysis:requested\";\n SnapBackEvent[\"ANALYSIS_COMPLETED\"] = \"analysis:completed\";\n})(SnapBackEvent || (SnapBackEvent = {}));\n// QoS levels for event delivery guarantees\nexport var QoSLevel;\n(function (QoSLevel) {\n QoSLevel[QoSLevel[\"BEST_EFFORT\"] = 0] = \"BEST_EFFORT\";\n QoSLevel[QoSLevel[\"AT_LEAST_ONCE\"] = 1] = \"AT_LEAST_ONCE\";\n QoSLevel[QoSLevel[\"EXACTLY_ONCE\"] = 2] = \"EXACTLY_ONCE\";\n})(QoSLevel || (QoSLevel = {}));\n// Check if running in MCP quiet mode (suppress all non-error output for MCP stdio)\nconst MCP_QUIET = process.env.MCP_QUIET === \"1\" || process.env.MCP_QUIET === \"true\";\n// Simple logger implementation - uses stderr to avoid polluting stdout (important for MCP stdio transport)\n// When MCP_QUIET=1, only errors are logged to avoid corrupting MCP protocol\nconst logger = {\n info: MCP_QUIET ? () => { } : console.error,\n warn: MCP_QUIET ? () => { } : console.error,\n error: console.error,\n debug: MCP_QUIET ? () => { } : console.error,\n};\n// Simple in-memory storage for events (replaces the persistence manager)\nclass InMemoryEventStorage {\n events = new Map();\n async storeEvent(event) {\n this.events.set(event.id, event);\n }\n async getEvent(eventId) {\n return this.events.get(eventId) || null;\n }\n async listEvents(filters) {\n let events = Array.from(this.events.values());\n // Apply filters\n if (filters?.type) {\n events = events.filter((event) => event.type === filters.type);\n }\n if (filters?.qosLevel !== undefined) {\n events = events.filter((event) => event.qosLevel === filters.qosLevel);\n }\n if (filters?.status) {\n events = events.filter((event) => event.status === filters.status);\n }\n // Apply limit and offset\n if (filters?.offset) {\n events = events.slice(filters.offset);\n }\n if (filters?.limit) {\n events = events.slice(0, filters.limit);\n }\n return events;\n }\n async updateEventStatus(eventId, status) {\n const event = this.events.get(eventId);\n if (event) {\n event.status = status;\n this.events.set(eventId, event);\n }\n }\n close() {\n this.events.clear();\n }\n}\nexport class SnapBackEventBusEventEmitter2 {\n emitter;\n storage;\n requestHandlers = new Map();\n pendingRequests = new Map();\n constructor() {\n // Initialize with wildcard support to match the old EventBus functionality\n this.emitter = new EventEmitter2({\n wildcard: true,\n delimiter: \":\",\n newListener: false,\n removeListener: false,\n });\n // Initialize in-memory storage\n this.storage = new InMemoryEventStorage();\n }\n async initialize() {\n // No initialization needed for EventEmitter2\n logger.info(\"EventEmitter2 EventBus initialized\");\n }\n // EventEmitter2 methods\n on(event, listener) {\n this.emitter.on(event, listener);\n return this;\n }\n once(event, listener) {\n this.emitter.once(event, listener);\n return this;\n }\n off(event, listener) {\n this.emitter.off(event, listener);\n return this;\n }\n emit(event, ...values) {\n return this.emitter.emit(event, ...values);\n }\n // Request/response pattern\n onRequest(event, handler) {\n this.requestHandlers.set(event, handler);\n }\n async request(event, data, timeoutMs = 5000) {\n return new Promise((resolve, reject) => {\n const id = `${Date.now()}-${Math.random()}`;\n const timeout = setTimeout(() => {\n this.pendingRequests.delete(id);\n reject(new Error(`Request timeout: ${event}`));\n }, timeoutMs);\n this.pendingRequests.set(id, { resolve: resolve, reject, timeout });\n // In a real implementation, we would need to handle the request/response\n // For now, we'll just resolve with a mock response\n const handler = this.requestHandlers.get(event);\n if (handler) {\n handler(data).then((result) => {\n clearTimeout(timeout);\n this.pendingRequests.delete(id);\n resolve(result);\n }, (error) => {\n clearTimeout(timeout);\n this.pendingRequests.delete(id);\n reject(error instanceof Error ? error : new Error(String(error)));\n });\n }\n else {\n clearTimeout(timeout);\n this.pendingRequests.delete(id);\n reject(new Error(`No handler for request: ${event}`));\n }\n });\n }\n /**\n * Publish an event with QoS guarantees\n * @param eventType The type of event to publish\n * @param payload The event payload\n * @param qosLevel The QoS level for this event\n * @param correlationId Optional correlation ID for related events\n */\n async publishQoS(eventType, payload, qosLevel = QoSLevel.BEST_EFFORT, correlationId) {\n const eventId = randomUUID();\n const timestamp = Date.now();\n // Create enhanced event with QoS support\n const event = {\n id: eventId,\n type: eventType,\n payload,\n timestamp,\n qosLevel,\n correlationId,\n retries: 0,\n status: \"pending\",\n };\n // Store event if QoS level requires it\n if (qosLevel > QoSLevel.BEST_EFFORT) {\n try {\n await this.storage.storeEvent(event);\n }\n catch (error) {\n logger.error(\"Failed to store event\", error);\n }\n }\n // Emit the event\n this.emitter.emit(eventType, payload);\n // For AT_LEAST_ONCE and EXACTLY_ONCE, update status to processed\n if (qosLevel >= QoSLevel.AT_LEAST_ONCE) {\n try {\n await this.storage.updateEventStatus(eventId, \"processed\");\n }\n catch (error) {\n logger.error(\"Failed to update event status\", error);\n }\n // Return event ID for tracking\n return eventId;\n }\n }\n publish(eventType, payload) {\n // Emit the event\n this.emitter.emit(eventType, payload);\n }\n close() {\n // Cancel all pending requests\n for (const [_id, pending] of this.pendingRequests) {\n clearTimeout(pending.timeout);\n pending.reject(new Error(\"EventBus closed\"));\n }\n this.pendingRequests.clear();\n // Close storage\n this.storage.close();\n // Remove all listeners\n this.emitter.removeAllListeners();\n }\n /**\n * Replay events within a time range\n */\n async replayEvents(startTime, endTime, eventType) {\n try {\n const events = await this.storage.listEvents({\n type: eventType,\n });\n // Filter events by time range\n const filteredEvents = events.filter((event) => event.timestamp >= startTime && event.timestamp <= endTime);\n // Replay events in order\n for (const event of filteredEvents) {\n this.emitter.emit(event.type, event.payload);\n }\n }\n catch (error) {\n logger.error(\"Failed to replay events\", error);\n throw error;\n }\n }\n /**\n * Get event by ID\n */\n async getEvent(eventId) {\n return this.storage.getEvent(eventId);\n }\n /**\n * List events with filters\n */\n async listEvents(filters) {\n return this.storage.listEvents(filters);\n }\n}\n// Alias for backward compatibility\nexport { SnapBackEventBusEventEmitter2 as SnapBackEventBus };\n","/**\n * Analysis Types\n *\n * Common type definitions for code analysis across SnapBack packages.\n * Used by @snapback/core, @snapback/intelligence, and other analysis tools.\n *\n * @module types/analysis\n */\nimport { z } from \"zod\";\n/**\n * Issue severity levels (comprehensive) - Zod schema\n * - critical: Security vulnerabilities, data loss risks\n * - high: Significant bugs, performance issues\n * - medium: Code quality issues, potential bugs\n * - low: Minor issues, style violations\n * - info: Informational messages, suggestions\n */\nexport const SeveritySchema = z.enum([\"critical\", \"high\", \"medium\", \"low\", \"info\"]);\n/**\n * Risk/Urgency severity (4-level, action-oriented) - Zod schema\n * Used for risk scores, urgency levels, and event severity where \"info\" doesn't apply.\n * Order: critical > high > medium > low\n */\nexport const RiskSeveritySchema = z.enum([\"critical\", \"high\", \"medium\", \"low\"]);\n/**\n * Simplified severity for validation contexts - Zod schema\n * Maps to Severity: critical->critical, warning->medium, info->info\n */\nexport const ValidationSeveritySchema = z.enum([\"critical\", \"warning\", \"info\"]);\n/**\n * Convert ValidationSeverity to Severity\n */\nexport function toSeverity(validationSeverity) {\n switch (validationSeverity) {\n case \"critical\":\n return \"critical\";\n case \"warning\":\n return \"medium\";\n case \"info\":\n return \"info\";\n }\n}\n/**\n * Convert Severity to ValidationSeverity\n */\nexport function toValidationSeverity(severity) {\n switch (severity) {\n case \"critical\":\n case \"high\":\n return \"critical\";\n case \"medium\":\n case \"low\":\n return \"warning\";\n case \"info\":\n return \"info\";\n }\n}\n/**\n * Base issue schema for all analysis/validation contexts\n */\nexport const BaseIssueSchema = z.object({\n /** Severity level */\n severity: z.union([SeveritySchema, ValidationSeveritySchema]),\n /** Issue type code (e.g., UNSAFE_EVAL, PATH_TRAVERSAL) */\n type: z.string(),\n /** Human-readable message */\n message: z.string(),\n /** Line number (1-indexed) */\n line: z.number().optional(),\n /** Suggested fix */\n fix: z.string().optional(),\n});\n/**\n * Issue detected during validation (simple form) - Zod schema\n * Used by intelligence package validation layers\n */\nexport const ValidationIssueSchema = BaseIssueSchema.extend({\n severity: ValidationSeveritySchema,\n});\n/**\n * Issue detected during analysis (detailed form) - Zod schema\n * Used by core package analyzers\n */\nexport const AnalysisIssueSchema = BaseIssueSchema.extend({\n /** Unique identifier for deduplication: analyzer/type/file/line */\n id: z.string(),\n /** Severity level */\n severity: SeveritySchema,\n /** File path where issue was found */\n file: z.string().optional(),\n /** Column number (1-indexed) */\n column: z.number().optional(),\n /** Code snippet showing the issue */\n snippet: z.string().optional(),\n /** Rule ID if from a lint tool */\n rule: z.string().optional(),\n});\n/**\n * Basic validation result - Zod schema\n */\nexport const ValidationResultSchema = z.object({\n /** Whether validation passed */\n passed: z.boolean(),\n /** Issues found */\n issues: z.array(BaseIssueSchema),\n /** Duration in milliseconds */\n duration: z.number().optional(),\n});\n/**\n * Circuit breaker state enum - Zod schema\n */\nexport const CircuitBreakerStateEnumSchema = z.enum([\"closed\", \"open\", \"half-open\"]);\n/**\n * Circuit breaker state - Zod schema\n * Used for resilience patterns across packages\n */\nexport const CircuitBreakerStateSchema = z.object({\n /** Current state */\n state: CircuitBreakerStateEnumSchema,\n /** Failure count */\n failures: z.number(),\n /** Failure threshold */\n threshold: z.number(),\n /** Last failure timestamp */\n lastFailure: z.number().optional(),\n /** Cooldown period in ms */\n cooldownMs: z.number(),\n});\n","// Extend Zod with OpenAPI functionality\nimport { extendZodWithOpenApi } from \"@asteasolutions/zod-to-openapi\";\nimport { z } from \"zod\";\nimport { RiskSeveritySchema } from \"../types/analysis.js\";\nextendZodWithOpenApi(z);\n// Event version constant\nexport const EVENT_VERSION = \"1.0.0\";\n// Base event schema with version\nexport const BaseEventSchema = z.object({\n event_version: z.string().default(EVENT_VERSION).openapi({ example: \"1.0.0\" }),\n timestamp: z\n .number()\n .default(() => Date.now())\n .openapi({ example: 1620000000000 }),\n});\n// 1. save_attempt event\nexport const SaveAttemptSchema = BaseEventSchema.extend({\n event: z.literal(\"save_attempt\"),\n properties: z.object({\n protection: z.enum([\"watch\", \"warn\", \"block\"]).openapi({ description: \"Protection level applied to the file\" }),\n severity: z\n .enum([\"low\", \"medium\", \"high\", \"critical\"])\n .openapi({ description: \"Severity of the risk detected\" }),\n file_kind: z.string().openapi({ description: \"Type of file being protected\", example: \"typescript\" }),\n reason: z.string().openapi({\n description: \"Reason for the save attempt\",\n example: \"User tried to save a file with a secret\",\n }),\n ai_present: z.boolean().openapi({ description: \"Whether AI was involved in the decision\" }),\n ai_burst: z.boolean().openapi({ description: \"Whether this was part of an AI burst operation\" }),\n outcome: z.enum([\"saved\", \"canceled\", \"blocked\"]).openapi({ description: \"Outcome of the save attempt\" }),\n }),\n}).openapi(\"SaveAttemptEvent\");\n// 2. snapshot_created event\nexport const SnapshotCreatedSchema = BaseEventSchema.extend({\n event: z.literal(\"snapshot_created\"),\n properties: z.object({\n session_id: z.string().openapi({ description: \"Unique identifier for the session\", example: \"sess_12345\" }),\n snapshot_id: z.string().openapi({ description: \"Unique identifier for the snapshot\", example: \"snap_67890\" }),\n bytes_original: z.number().openapi({ description: \"Original size of the file in bytes\", example: 1024 }),\n bytes_stored: z.number().openapi({ description: \"Size of the stored snapshot in bytes\", example: 512 }),\n dedup_hit: z.boolean().openapi({ description: \"Whether deduplication was applied\" }),\n latency_ms: z\n .number()\n .openapi({ description: \"Time taken to create the snapshot in milliseconds\", example: 45 }),\n }),\n}).openapi(\"SnapshotCreatedEvent\");\n// 3. session_finalized event\nexport const SessionFinalizedSchema = BaseEventSchema.extend({\n event: z.literal(\"session_finalized\"),\n properties: z.object({\n session_id: z.string().openapi({ description: \"Unique identifier for the session\", example: \"sess_12345\" }),\n files: z\n .array(z.string())\n .openapi({ description: \"List of files in the session\", example: [\"src/index.ts\", \"package.json\"] }),\n triggers: z.array(z.string()).openapi({\n description: \"List of triggers that activated during the session\",\n example: [\"save_attempt\", \"risk_detected\"],\n }),\n duration_ms: z.number().openapi({ description: \"Duration of the session in milliseconds\", example: 120000 }),\n ai_present: z.boolean().openapi({ description: \"Whether AI was involved in the session\" }),\n ai_burst: z.boolean().openapi({ description: \"Whether this was part of an AI burst operation\" }),\n highest_severity: z\n .enum([\"info\", \"low\", \"medium\", \"high\", \"critical\"])\n .openapi({ description: \"Highest severity of issues in the session\" }),\n // AI detection v1 fields\n ai_assist_level: z\n .enum([\"none\", \"light\", \"medium\", \"heavy\", \"unknown\"])\n .optional()\n .openapi({ description: \"AI assistance level inferred from change patterns\", example: \"medium\" }),\n ai_confidence_score: z\n .number()\n .min(0)\n .max(10)\n .optional()\n .openapi({ description: \"Confidence score for AI detection (0-10)\", example: 7.5 }),\n ai_provider: z\n .enum([\"cursor\", \"claude\", \"unknown\", \"none\"])\n .optional()\n .openapi({ description: \"Detected AI tool/provider\", example: \"cursor\" }),\n ai_large_insert_count: z\n .number()\n .int()\n .min(0)\n .optional()\n .openapi({ description: \"Count of large insertions detected\", example: 5 }),\n ai_total_chars: z\n .number()\n .int()\n .min(0)\n .optional()\n .openapi({ description: \"Total characters in large insertions\", example: 2000 }),\n context: z\n .record(z.string(), z.any())\n .optional()\n .openapi({ description: \"Additional context for the session\" }),\n }),\n}).openapi(\"SessionFinalizedEvent\");\n// 4. issue_created event\nexport const IssueCreatedSchema = BaseEventSchema.extend({\n event: z.literal(\"issue_created\"),\n properties: z.object({\n issue_id: z.string().openapi({ description: \"Unique identifier for the issue\", example: \"issue_12345\" }),\n session_id: z.string().openapi({ description: \"Unique identifier for the session\", example: \"sess_12345\" }),\n file_kind: z\n .string()\n .openapi({ description: \"Type of file where the issue was detected\", example: \"typescript\" }),\n type: z.enum([\"secret\", \"mock\", \"phantom\"]).openapi({ description: \"Type of issue detected\" }),\n severity: RiskSeveritySchema.openapi({ description: \"Severity of the issue\" }),\n recommendation: z.string().openapi({\n description: \"Recommendation for resolving the issue\",\n example: \"Remove the secret from the file\",\n }),\n context: z.record(z.string(), z.any()).optional().openapi({ description: \"Additional context for the issue\" }),\n }),\n}).openapi(\"IssueCreatedEvent\");\n// 5. issue_resolved event\nexport const IssueResolvedSchema = BaseEventSchema.extend({\n event: z.literal(\"issue_resolved\"),\n properties: z.object({\n issue_id: z.string().openapi({ description: \"Unique identifier for the issue\", example: \"issue_12345\" }),\n resolution: z.enum([\"fixed\", \"ignored\", \"allowlisted\"]).openapi({ description: \"How the issue was resolved\" }),\n }),\n}).openapi(\"IssueResolvedEvent\");\n// 6. session_restored event\nexport const SessionRestoredSchema = BaseEventSchema.extend({\n event: z.literal(\"session_restored\"),\n properties: z.object({\n session_id: z.string().openapi({ description: \"Unique identifier for the session\", example: \"sess_12345\" }),\n files_restored: z\n .array(z.string())\n .openapi({ description: \"List of files that were restored\", example: [\"src/index.ts\", \"package.json\"] }),\n time_to_restore_ms: z\n .number()\n .openapi({ description: \"Time taken to restore the session in milliseconds\", example: 2500 }),\n reason: z\n .string()\n .openapi({ description: \"Reason for the session restoration\", example: \"User requested rollback\" }),\n }),\n}).openapi(\"SessionRestoredEvent\");\n// 7. policy_changed event\nexport const PolicyChangedSchema = BaseEventSchema.extend({\n event: z.literal(\"policy_changed\"),\n properties: z.object({\n pattern: z.string().openapi({ description: \"File pattern that the policy applies to\", example: \"*.env\" }),\n from: z\n .enum([\"watch\", \"warn\", \"block\", \"unprotected\", \"unauthenticated\", \"unaware\"])\n .openapi({ description: \"Previous protection level\" }),\n to: z\n .enum([\"watch\", \"warn\", \"block\", \"unprotected\", \"authenticated\", \"aware\"])\n .openapi({ description: \"New protection level\" }),\n source: z.string().openapi({ description: \"Source of the policy change\", example: \"cli\" }),\n context: z\n .record(z.string(), z.any())\n .optional()\n .openapi({ description: \"Additional context for the policy change\" }),\n }),\n}).openapi(\"PolicyChangedEvent\");\n// ============================================================================\n// DIAGNOSTIC TELEMETRY EVENTS (Auth Flow & Welcome Panel Instrumentation)\n// ============================================================================\n// 8. auth.provider.selected event - Track OAuth vs Device flow choice\nexport const AuthProviderSelectedSchema = BaseEventSchema.extend({\n event: z.literal(\"auth.provider.selected\"),\n properties: z.object({\n provider: z.enum([\"oauth\", \"device_flow\"]).openapi({ description: \"Authentication provider selected\" }),\n trigger: z\n .enum([\"user_selected\", \"fallback\", \"auto\"])\n .openapi({ description: \"How the provider was selected\" }),\n }),\n}).openapi(\"AuthProviderSelectedEvent\");\n// 9. auth.browser.opened event - Track browser launch success\nexport const AuthBrowserOpenedSchema = BaseEventSchema.extend({\n event: z.literal(\"auth.browser.opened\"),\n properties: z.object({\n method: z\n .enum([\"external_command\", \"clipboard\", \"error\"])\n .openapi({ description: \"Method used to open browser\" }),\n success: z.boolean().openapi({ description: \"Whether browser was successfully opened\" }),\n error: z.string().optional().openapi({ description: \"Error message if browser opening failed\" }),\n }),\n}).openapi(\"AuthBrowserOpenedEvent\");\n// 10. auth.code.entry event - Track device code entry in browser\nexport const AuthCodeEntrySchema = BaseEventSchema.extend({\n event: z.literal(\"auth.code.entry\"),\n properties: z.object({\n code_format: z\n .enum([\"valid\", \"invalid_chars\", \"wrong_length\"])\n .openapi({ description: \"Validity of the entered code format\" }),\n time_to_enter_ms: z.number().openapi({ description: \"Time taken to enter the code in milliseconds\" }),\n attempts: z.number().int().min(1).openapi({ description: \"Number of attempts to enter the code correctly\" }),\n code_length: z.number().int().optional().openapi({ description: \"Length of the entered code\" }),\n }),\n}).openapi(\"AuthCodeEntryEvent\");\n// 11. auth.approval.received event - Track successful device code approval\nexport const AuthApprovalReceivedSchema = BaseEventSchema.extend({\n event: z.literal(\"auth.approval.received\"),\n properties: z.object({\n polling_attempts: z\n .number()\n .int()\n .min(1)\n .openapi({ description: \"Number of polling attempts before approval\" }),\n total_wait_ms: z.number().openapi({ description: \"Total time waited for approval in milliseconds\" }),\n device_code_expired: z.boolean().openapi({ description: \"Whether the device code had expired\" }),\n }),\n}).openapi(\"AuthApprovalReceivedEvent\");\n// 12. welcome.feature.viewed event - Track feature discovery in welcome panel\nexport const WelcomeFeatureViewedSchema = BaseEventSchema.extend({\n event: z.literal(\"welcome.feature.viewed\"),\n properties: z.object({\n feature: z.string().openapi({ description: \"Feature name shown in welcome panel\", example: \"ai_detection\" }),\n position: z.number().int().min(0).openapi({ description: \"Position in feature carousel\", example: 0 }),\n trigger: z\n .enum([\"onboarding\", \"nudge\", \"manual\"])\n .openapi({ description: \"How the welcome panel was triggered\" }),\n }),\n}).openapi(\"WelcomeFeatureViewedEvent\");\n// 13. welcome.action.triggered event - Track feature adoption from welcome panel\nexport const WelcomeActionTriggeredSchema = BaseEventSchema.extend({\n event: z.literal(\"welcome.action.triggered\"),\n properties: z.object({\n action: z.string().openapi({ description: \"Action triggered by user\", example: \"try_now\" }),\n feature: z.string().openapi({ description: \"Feature associated with the action\", example: \"ai_detection\" }),\n time_viewed_ms: z\n .number()\n .openapi({ description: \"How long the feature was viewed before action\", example: 2500 }),\n }),\n}).openapi(\"WelcomeActionTriggeredEvent\");\n// Zod schema for validating any core event (including diagnostic events)\nexport const CoreEventSchema = z.discriminatedUnion(\"event\", [\n SaveAttemptSchema,\n SnapshotCreatedSchema,\n SessionFinalizedSchema,\n IssueCreatedSchema,\n IssueResolvedSchema,\n SessionRestoredSchema,\n PolicyChangedSchema,\n AuthProviderSelectedSchema,\n AuthBrowserOpenedSchema,\n AuthCodeEntrySchema,\n AuthApprovalReceivedSchema,\n WelcomeFeatureViewedSchema,\n WelcomeActionTriggeredSchema,\n]);\n// Event name enum for compile-time checking (including diagnostic events)\nexport const CORE_TELEMETRY_EVENTS = {\n // Core events (7)\n SAVE_ATTEMPT: \"save_attempt\",\n SNAPSHOT_CREATED: \"snapshot_created\",\n SESSION_FINALIZED: \"session_finalized\",\n ISSUE_CREATED: \"issue_created\",\n ISSUE_RESOLVED: \"issue_resolved\",\n SESSION_RESTORED: \"session_restored\",\n POLICY_CHANGED: \"policy_changed\",\n // Diagnostic events (6)\n AUTH_PROVIDER_SELECTED: \"auth.provider.selected\",\n AUTH_BROWSER_OPENED: \"auth.browser.opened\",\n AUTH_CODE_ENTRY: \"auth.code.entry\",\n AUTH_APPROVAL_RECEIVED: \"auth.approval.received\",\n WELCOME_FEATURE_VIEWED: \"welcome.feature.viewed\",\n WELCOME_ACTION_TRIGGERED: \"welcome.action.triggered\",\n};\n// Helper function to validate core telemetry events\nexport function validateCoreTelemetryEvent(event) {\n const result = CoreEventSchema.safeParse(event);\n return result.success;\n}\n// Helper function to get validation errors\nexport function getCoreEventValidationError(event) {\n const result = CoreEventSchema.safeParse(event);\n if (result.success) {\n return null;\n }\n return result.error.message;\n}\n","// ESM imports fixed for Node.js v22+\n/**\n * Accountability Effect Event Schema\n *\n * Tracks user perception vs reality of SnapBack's value in a session.\n * Used for session feedback implementation to measure accountability.\n *\n * Privacy guarantees (per ARCHITECTURE.md):\n * - ❌ No file paths\n * - ❌ No path hashes\n * - ❌ No workspace identifiers\n * - ✅ Counts only (files_modified, lines_added, etc.)\n * - ✅ Durations (session_duration_ms)\n * - ✅ Enums (perceived_help, tier)\n *\n * @module events/accountability\n */\nimport { extendZodWithOpenApi } from \"@asteasolutions/zod-to-openapi\";\nimport { z } from \"zod\";\nimport { BaseEventSchema } from \"./core.js\";\nextendZodWithOpenApi(z);\n// ============================================================================\n// Accountability Effect Event\n// ============================================================================\n/**\n * Schema for tracking user's perception of how much SnapBack helped\n */\nexport const PerceivedHelpSchema = z\n .enum([\"significantly\", \"somewhat\", \"not_really\", \"blocked\"])\n .openapi({ description: \"User's perception of how much SnapBack helped\" });\n/**\n * Type guard for PerceivedHelp values\n */\nexport function isPerceivedHelp(value) {\n return PerceivedHelpSchema.safeParse(value).success;\n}\n/**\n * Schema for actual changes made during the session (counts only, no paths)\n */\nconst ActualChangesSchema = z\n .object({\n files_modified: z\n .number()\n .int()\n .min(0)\n .openapi({ description: \"Number of files modified during session\", example: 5 }),\n lines_added: z.number().int().min(0).openapi({ description: \"Total lines added\", example: 150 }),\n lines_removed: z.number().int().min(0).openapi({ description: \"Total lines removed\", example: 30 }),\n snapshots_used: z\n .number()\n .int()\n .min(0)\n .openapi({ description: \"Number of snapshots created or restored\", example: 2 }),\n})\n .openapi(\"ActualChanges\");\n/**\n * Schema for issues prevented by SnapBack during the session\n */\nconst PreventedIssuesSchema = z\n .object({\n rollbacks_avoided: z\n .number()\n .int()\n .min(0)\n .openapi({ description: \"Rollbacks avoided due to snapshots\", example: 1 }),\n pattern_violations_caught: z\n .number()\n .int()\n .min(0)\n .openapi({ description: \"Pattern violations caught before commit\", example: 3 }),\n skipped_tests_flagged: z\n .number()\n .int()\n .min(0)\n .openapi({ description: \"Skipped tests flagged for attention\", example: 2 }),\n})\n .openapi(\"PreventedIssues\");\n/**\n * Schema for user tier\n */\nconst TierSchema = z.enum([\"free\", \"solo\", \"team\", \"enterprise\"]).openapi({ description: \"User's subscription tier\" });\n/**\n * Accountability Effect Event Schema\n *\n * Tracks the perception vs reality of SnapBack's value in a session.\n * Follows BaseEventSchema pattern from core.ts for consistency.\n */\nexport const AccountabilityEffectSchema = BaseEventSchema.extend({\n event: z.literal(\"session:feedback_submitted\"),\n properties: z.object({\n // Session identification\n session_id: z.string().openapi({ description: \"Unique session identifier\", example: \"sess_12345\" }),\n session_duration_ms: z\n .number()\n .int()\n .min(0)\n .openapi({ description: \"Session duration in milliseconds\", example: 3600000 }),\n // User perception\n perceived_help: PerceivedHelpSchema,\n // Reality metrics (counts only, no PII)\n actual_changes: ActualChangesSchema,\n prevented_issues: PreventedIssuesSchema,\n // Tier for consent checking\n tier: TierSchema,\n }),\n}).openapi(\"AccountabilityEffectEvent\");\n// ============================================================================\n// Validation Helpers\n// ============================================================================\n/**\n * Validate an accountability effect event\n */\nexport function validateAccountabilityEvent(event) {\n const result = AccountabilityEffectSchema.safeParse(event);\n return result.success;\n}\n/**\n * Get validation error for an accountability event\n */\nexport function getAccountabilityEventValidationError(event) {\n const result = AccountabilityEffectSchema.safeParse(event);\n if (result.success) {\n return null;\n }\n return result.error.message;\n}\n// ============================================================================\n// Event Constants\n// ============================================================================\n/**\n * Accountability event name constants\n * Uses PostHog category:object_action naming convention\n */\nexport const ACCOUNTABILITY_EVENTS = {\n SESSION_FEEDBACK_SUBMITTED: \"session:feedback_submitted\",\n};\n","/**\n * Minimal logging interface for public packages\n *\n * This interface allows public packages (@snapback/sdk, @snapback/core, @snapback/mcp-server)\n * to log without depending on the private @snapback/infrastructure package.\n *\n * Browser-safe: No dynamic requires, no node:fs dependencies\n * Server packages can enhance this with infrastructure logger via DI using registerLoggerFactory()\n *\n * Private packages can use the full @snapback/infrastructure implementation,\n * which provides advanced features like structured logging, log levels, etc.\n */\n// Global logger factory registry for server-side enhancement\nlet _loggerFactory = null;\n/**\n * Register an enhanced logger factory (called by server packages)\n * This allows @snapback/infrastructure to enhance logging without\n * being a compile-time dependency.\n *\n * @example\n * ```typescript\n * // In @snapback/infrastructure/src/index.ts\n * import { registerLoggerFactory } from '@snapback/contracts'\n * registerLoggerFactory((options) => createPinoLogger(options))\n * ```\n */\nexport function registerLoggerFactory(factory) {\n _loggerFactory = factory;\n}\n/**\n * Get the registered logger factory, if any\n * @internal\n */\nfunction getLoggerFactory() {\n return _loggerFactory;\n}\n/**\n * Log levels\n */\nexport var LogLevel;\n(function (LogLevel) {\n LogLevel[LogLevel[\"DEBUG\"] = 0] = \"DEBUG\";\n LogLevel[LogLevel[\"INFO\"] = 1] = \"INFO\";\n LogLevel[LogLevel[\"WARN\"] = 2] = \"WARN\";\n LogLevel[LogLevel[\"ERROR\"] = 3] = \"ERROR\";\n LogLevel[LogLevel[\"SILENT\"] = 4] = \"SILENT\";\n})(LogLevel || (LogLevel = {}));\n/**\n * Enhanced logger that uses registered factory when available,\n * otherwise falls back to minimal console-based implementation\n *\n * @example\n * ```typescript\n * import { createLogger } from '@snapback/contracts'\n *\n * const logger = createLogger({ name: 'sdk' })\n * logger.info('SDK initialized')\n * logger.error('Failed to create snapshot', { error: err })\n * ```\n */\nexport function createLogger(options) {\n // If a logger factory has been registered (by @snapback/infrastructure), use it\n const factory = getLoggerFactory();\n if (factory) {\n return factory(options);\n }\n // Fallback to minimal console implementation\n const { name, level = LogLevel.INFO, timestamps = false } = options;\n const formatMessage = (levelStr, message) => {\n const prefix = timestamps ? `[${new Date().toISOString()}] ` : \"\";\n return `${prefix}[${name}] ${levelStr}: ${message}`;\n };\n const formatMeta = (meta) => {\n if (!meta) {\n return \"\";\n }\n if (meta instanceof Error) {\n return `\\n Error: ${meta.message}\\n Stack: ${meta.stack}`;\n }\n try {\n return `\n ${JSON.stringify(meta, null, 2)}`;\n }\n catch {\n return \"\\n [Circular or non-serializable metadata]\";\n }\n };\n return {\n debug(messageOrObj, metaOrMsg) {\n if (level <= LogLevel.DEBUG) {\n if (typeof messageOrObj === \"string\" && (!metaOrMsg || typeof metaOrMsg === \"object\")) {\n // Pattern: (\"message\") or (\"message\", { meta })\n console.debug(formatMessage(\"DEBUG\", messageOrObj) + formatMeta(metaOrMsg));\n }\n else if (typeof messageOrObj === \"object\" && typeof metaOrMsg === \"string\") {\n // Pattern: ({ meta }, \"message\")\n console.debug(formatMessage(\"DEBUG\", metaOrMsg) + formatMeta(messageOrObj));\n }\n }\n },\n info(messageOrObj, metaOrMsg) {\n if (level <= LogLevel.INFO) {\n if (typeof messageOrObj === \"string\" && (!metaOrMsg || typeof metaOrMsg === \"object\")) {\n // Pattern: (\"message\") or (\"message\", { meta })\n console.info(formatMessage(\"INFO\", messageOrObj) + formatMeta(metaOrMsg));\n }\n else if (typeof messageOrObj === \"object\" && typeof metaOrMsg === \"string\") {\n // Pattern: ({ meta }, \"message\")\n console.info(formatMessage(\"INFO\", metaOrMsg) + formatMeta(messageOrObj));\n }\n }\n },\n warn(messageOrObj, metaOrMsg) {\n if (level <= LogLevel.WARN) {\n if (typeof messageOrObj === \"string\" && (!metaOrMsg || typeof metaOrMsg === \"object\")) {\n // Pattern: (\"message\") or (\"message\", { meta })\n console.warn(formatMessage(\"WARN\", messageOrObj) + formatMeta(metaOrMsg));\n }\n else if (typeof messageOrObj === \"object\" && typeof metaOrMsg === \"string\") {\n // Pattern: ({ meta }, \"message\")\n console.warn(formatMessage(\"WARN\", metaOrMsg) + formatMeta(messageOrObj));\n }\n }\n },\n error(messageOrObj, metaOrMsg) {\n if (level <= LogLevel.ERROR) {\n if (typeof messageOrObj === \"string\" && (!metaOrMsg || typeof metaOrMsg !== \"string\")) {\n // Pattern: (\"message\") or (\"message\", { meta }) or (\"message\", error)\n console.error(formatMessage(\"ERROR\", messageOrObj) + formatMeta(metaOrMsg));\n }\n else if (typeof messageOrObj === \"object\" && typeof metaOrMsg === \"string\") {\n // Pattern: ({ meta }, \"message\") or (error, \"message\")\n console.error(formatMessage(\"ERROR\", metaOrMsg) + formatMeta(messageOrObj));\n }\n }\n },\n };\n}\n/**\n * No-op logger (silences all logs)\n *\n * Useful for testing or when logs should be completely disabled.\n */\nexport function createSilentLogger() {\n return {\n debug: () => { },\n info: () => { },\n warn: () => { },\n error: () => { },\n };\n}\n","// ESM imports fixed for Node.js v22+\nimport { FEATURE_FLAGS } from \"./index.js\";\nimport { createLogger, LogLevel } from \"./logger.js\";\n// Environment variables should be loaded by the application entry point (e.g. Next.js, or dotenv/config in scripts)\nconst logger = createLogger({ name: \"feature-manager\", level: LogLevel.INFO });\nexport class FeatureManager {\n static instance;\n flags = new Map();\n posthogClient = null;\n constructor() {\n // Initialize with default values\n for (const [key, value] of Object.entries(FEATURE_FLAGS)) {\n this.flags.set(key, value);\n }\n // Override with environment variables\n this.loadEnvironmentOverrides();\n }\n static getInstance() {\n if (!FeatureManager.instance) {\n FeatureManager.instance = new FeatureManager();\n }\n return FeatureManager.instance;\n }\n isEnabled(flag) {\n const value = this.flags.get(flag) ?? FEATURE_FLAGS[flag];\n // For sampling rate flags, compare with random value\n if (flag === \"telemetry.sampling_rate\" && typeof value === \"number\") {\n return Math.random() < value;\n }\n return Boolean(value);\n }\n getValue(flag) {\n return this.flags.get(flag);\n }\n setFlag(flag, value) {\n this.flags.set(flag, value);\n }\n /**\n * Set PostHog client for dynamic feature flag evaluation\n */\n setPostHogClient(client) {\n this.posthogClient = client;\n if (client) {\n logger.info(\"PostHog client configured\");\n }\n else {\n logger.info(\"PostHog client cleared, falling back to static config\");\n }\n }\n /**\n * Asynchronously check if feature is enabled (with PostHog fallback)\n * @param flag - Feature flag name\n * @param userId - User ID for targeting rules (optional)\n * @param context - Additional context for PostHog targeting (optional)\n * @returns Promise<boolean> - True if feature is enabled\n */\n async isEnabledAsync(flag, userId, context) {\n // If PostHog is configured and we have a userId, try to use it\n if (this.posthogClient && userId) {\n try {\n const defaultSubscriptionTier = process.env.SNAPBACK_DEFAULT_SUBSCRIPTION_TIER || \"free\";\n const posthogContext = {\n subscriptionTier: defaultSubscriptionTier,\n ...context,\n };\n const result = await this.posthogClient.isFeatureEnabled(flag, userId, posthogContext);\n // If PostHog returns a value, use it. Otherwise fall back to static config\n if (result !== null && result !== undefined) {\n logger.info(\"Feature flag evaluated via PostHog\", {\n flag,\n userId,\n enabled: result,\n });\n return result;\n }\n }\n catch (error) {\n logger.warn(\"PostHog feature flag check failed, falling back to static config\", {\n flag,\n userId,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n // Fall back to static configuration\n return this.isEnabled(flag);\n }\n loadEnvironmentOverrides() {\n // Check for environment variable overrides\n for (const flag of Object.keys(FEATURE_FLAGS)) {\n const envVar = `SNAPBACK_${flag.replace(/\\./g, \"_\").toUpperCase()}`;\n const envValue = process.env[envVar];\n if (envValue !== undefined) {\n // Parse boolean values\n if (envValue === \"true\" || envValue === \"false\") {\n this.flags.set(flag, envValue === \"true\");\n }\n // Parse numeric values\n else if (!Number.isNaN(Number(envValue))) {\n this.flags.set(flag, Number(envValue));\n }\n // Keep as string for other values (though we don't expect string flags)\n }\n }\n }\n reset() {\n this.flags.clear();\n this.posthogClient = null;\n for (const [key, value] of Object.entries(FEATURE_FLAGS)) {\n this.flags.set(key, value);\n }\n this.loadEnvironmentOverrides();\n }\n}\n","/**\n * Core Observability Types\n *\n * Vendor-neutral abstractions for instrumentation.\n * These types enable swapping implementations (OTel, Datadog, custom)\n * without changing business logic.\n */\n/**\n * Span status codes (aligned with OpenTelemetry)\n * @see https://github.com/open-telemetry/opentelemetry-js/blob/main/api/src/trace/status.ts\n */\nexport var SpanStatusCode;\n(function (SpanStatusCode) {\n /** The default status */\n SpanStatusCode[SpanStatusCode[\"UNSET\"] = 0] = \"UNSET\";\n /** The operation completed successfully */\n SpanStatusCode[SpanStatusCode[\"OK\"] = 1] = \"OK\";\n /** The operation contains an error */\n SpanStatusCode[SpanStatusCode[\"ERROR\"] = 2] = \"ERROR\";\n})(SpanStatusCode || (SpanStatusCode = {}));\n/**\n * Span kinds aligned with OpenTelemetry\n */\nexport var SpanKind;\n(function (SpanKind) {\n SpanKind[SpanKind[\"INTERNAL\"] = 0] = \"INTERNAL\";\n SpanKind[SpanKind[\"SERVER\"] = 1] = \"SERVER\";\n SpanKind[SpanKind[\"CLIENT\"] = 2] = \"CLIENT\";\n SpanKind[SpanKind[\"PRODUCER\"] = 3] = \"PRODUCER\";\n SpanKind[SpanKind[\"CONSUMER\"] = 4] = \"CONSUMER\";\n})(SpanKind || (SpanKind = {}));\n","import { z } from \"zod\";\nimport { RiskSeveritySchema } from \"./types/analysis.js\";\nexport const DiffChangeSchema = z.object({\n added: z.boolean().optional().default(false),\n removed: z.boolean().optional().default(false),\n value: z.string(),\n count: z.number().optional(),\n});\n/**\n * Risk score schema using standardized 0-10 scale\n *\n * This is the canonical risk scoring schema used across all SnapBack components.\n * The 0-10 scale provides:\n * - Intuitive 1-10 rating (familiar to users)\n * - Better granularity than 0-1\n * - More practical than 0-100\n * - Aligns with industry standards (CVE scores use 0-10)\n * - Matches THRESHOLDS configuration (risk.blockingThreshold: 8.0, etc.)\n *\n * Severity mappings:\n * - low: 0 - 2.9\n * - medium: 3.0 - 4.9\n * - high: 5.0 - 6.9\n * - critical: 7.0 - 10.0\n *\n * For backward compatibility with 0-1 scale, use conversion utilities from risk-conversion.ts\n */\nexport const RiskScoreSchema = z.object({\n score: z.number().min(0).max(10),\n factors: z.array(z.string()),\n severity: RiskSeveritySchema,\n});\n// =============================================================================\n// ADR-004: Snapshot types consolidated in types/snapshot.ts\n// The following canonical types are now exported from types/snapshot.ts:\n// - SnapshotSchema, Snapshot, SnapshotInput\n// - FileMetadataSchema, FileMetadata\n// - SnapshotMetadataSchema, SnapshotMetadata\n// Import from @snapback/contracts for these types.\n// =============================================================================\nexport const AnalyticsResponseSchema = z.object({\n metrics: z.record(z.string(), z.number()),\n trends: z.record(z.string(), z.array(z.number())),\n insights: z.array(z.string()),\n timestamp: z.number(),\n snapshotRecommendations: z\n .object({\n shouldCreateSnapshot: z.boolean(),\n reason: z.string(),\n urgency: RiskSeveritySchema,\n suggestedTiming: z.string(),\n })\n .optional(),\n});\nexport const CreateSnapshotArgsSchema = z.object({\n trigger: z.string().default(\"manual\"),\n risk: z.number().min(0).max(10).optional(),\n content: z.string().optional(),\n files: z.array(z.string()).optional(),\n});\nexport const CreateCheckpointArgsSchema = z.object({\n trigger: z.string().default(\"manual\"),\n risk: z.number().min(0).max(10).optional(),\n content: z.string().optional(),\n});\nexport const CheckpointSchema = z.object({\n id: z.string(),\n timestamp: z.number(),\n meta: z\n .object({\n trigger: z.string().optional(),\n risk: z.number().optional(),\n })\n .optional(),\n});\nexport const AnalyzeRiskArgsSchema = z.object({\n changes: z.array(DiffChangeSchema),\n});\nexport const DepQuickArgsSchema = z.object({\n before: z.record(z.string(), z.any()),\n after: z.record(z.string(), z.any()),\n});\nexport const CommonErrorSchema = z.object({\n message: z.string(),\n code: z.string().optional(),\n details: z.any().optional(),\n});\n// MCP Configuration Schemas\nexport const RetrySchema = z.object({\n retries: z.number().int().min(0).default(2),\n factor: z.number().min(1).default(2),\n min: z.number().int().default(250),\n max: z.number().int().default(1500),\n jitter: z.boolean().default(true),\n});\nexport const CircuitSchema = z.object({\n enabled: z.boolean().default(true),\n errorThresholdPercentage: z.number().int().min(1).max(100).default(50),\n volumeThreshold: z.number().int().min(1).default(10),\n timeoutMs: z.number().int().default(5000),\n resetMs: z.number().int().default(30000),\n rollingCountMs: z.number().int().default(60000),\n rollingCountBuckets: z.number().int().default(6),\n});\nexport const McpSchema = z.object({\n timeoutMs: z.number().int().default(5000),\n maxConcurrent: z.number().int().min(1).default(4),\n retry: RetrySchema,\n circuit: CircuitSchema,\n batch: z.object({\n size: z.number().int().min(1).default(5),\n maxWaitMs: z.number().int().default(150),\n }),\n});\nexport const WatcherSchema = z.object({\n debounceMs: z.number().int().default(120),\n awaitWriteFinish: z.object({\n stabilityThreshold: z.number().int().default(200),\n pollInterval: z.number().int().default(50),\n }),\n ignored: z.array(z.string()).default([\"**/{node_modules,.git,.vscode,dist,.next,.nuxt,coverage}/**\"]),\n});\n","import { z } from \"zod\";\n/**\n * Purchase types for billing and subscription management\n *\n * These represent the contract interface for purchases across the application.\n * For database operations, use the Drizzle schema types from @snapback/platform.\n */\nexport const PurchaseTypeEnum = z.enum([\"ONE_TIME\", \"SUBSCRIPTION\", \"addon\"]);\nexport const PurchaseSchema = z.object({\n id: z.string(),\n organizationId: z.string().nullable().optional(),\n userId: z.string().nullable().optional(),\n type: PurchaseTypeEnum,\n customerId: z.string(),\n subscriptionId: z.string().nullable().optional(),\n productId: z.string(),\n status: z.string().nullable().optional(),\n createdAt: z.date(),\n updatedAt: z.date().nullable().optional(),\n});\n","import { z } from \"zod\";\n/**\n * Session Layer Contracts\n *\n * Sessions are metadata overlays on the snapshot infrastructure that provide:\n * - Contextual grouping of file changes during logical work periods\n * - Selective rollback capabilities for session-scoped changes\n * - Privacy-safe analytics without exposing file contents\n *\n * Design Principles:\n * - Sessions reference Content-Addressable Storage (CAS) blobs via SHA-256 hashes\n * - No duplicate storage - all file content lives in CAS\n * - POSIX path normalization for cross-platform compatibility\n * - Lazy hash computation for <50ms tracking performance\n */\n/**\n * Session schema version for backward compatibility\n */\nexport const SessionSchemaVersion = \"sb.session.v1\";\n/**\n * File change operation types\n */\nexport const ChangeOpSchema = z.enum([\"created\", \"modified\", \"deleted\", \"renamed\"]);\n/**\n * Line ending types for cross-platform consistency\n */\nexport const EOLTypeSchema = z.enum([\"lf\", \"crlf\"]);\n/**\n * Session trigger sources for analytics\n */\nexport const SessionTriggerSchema = z.enum([\"filewatch\", \"pre-commit\", \"manual\", \"idle-finalize\"]);\n/**\n * Individual file change within a session\n *\n * Captures metadata and CAS references for efficient storage.\n * Hashes (hOld/hNew) are computed lazily during session finalization.\n *\n * Path normalization:\n * - Always relative to workspace root\n * - Always POSIX-style (forward slashes) even on Windows\n * - Example: \"src/auth/login.ts\" (not \"src\\\\auth\\\\login.ts\")\n */\nexport const SessionChangeSchema = z.object({\n /** Relative POSIX path from workspace root */\n p: z.string(),\n /** Operation type */\n op: ChangeOpSchema,\n /** Prior relative path (for rename operations only) */\n from: z.string().optional(),\n /** SHA-256 hash before change (CAS reference) - computed on finalize */\n hOld: z.string().optional(),\n /** SHA-256 hash after change (CAS reference) - computed on finalize */\n hNew: z.string().optional(),\n /** File size before change (bytes) */\n sizeBefore: z.number().int().nonnegative().optional(),\n /** File size after change (bytes) */\n sizeAfter: z.number().int().nonnegative().optional(),\n /** Modification time before change (Unix epoch ms) */\n mtimeBefore: z.number().int().nonnegative().optional(),\n /** Modification time after change (Unix epoch ms) */\n mtimeAfter: z.number().int().nonnegative().optional(),\n /** File permissions before change (Unix mode) */\n modeBefore: z.number().int().nonnegative().optional(),\n /** File permissions after change (Unix mode) */\n modeAfter: z.number().int().nonnegative().optional(),\n /** Line ending style before change */\n eolBefore: EOLTypeSchema.optional(),\n /** Line ending style after change */\n eolAfter: EOLTypeSchema.optional(),\n});\n/**\n * Complete session manifest with all metadata and changes\n *\n * Sessions track logical work periods and link to snapshots created during\n * that period. The `name` field is generated offline (never transmitted) and\n * used only for UI display.\n *\n * Privacy guarantees:\n * - workspaceUri is stored locally only (never transmitted)\n * - name is generated offline (never transmitted)\n * - Only changeCount and triggers are sent to analytics (no file paths)\n */\nexport const SessionManifestV1Schema = z.object({\n /** Schema version for backward compatibility */\n schema: z.literal(SessionSchemaVersion),\n /** Unique session identifier (CUID) */\n sessionId: z.string(),\n /** Session start timestamp (ISO 8601) */\n startedAt: z.string().datetime(),\n /** Session end timestamp (ISO 8601) - undefined if active */\n endedAt: z.string().datetime().optional(),\n /** VS Code workspace folder URI (multi-root workspace safe) */\n workspaceUri: z.string(),\n /** Offline-generated semantic label (never transmitted) */\n name: z.string().optional(),\n /** Trigger sources for this session */\n triggers: z.array(SessionTriggerSchema),\n /** Total number of file changes in this session */\n changeCount: z.number().int().nonnegative(),\n /** Chronological list of file changes */\n filesChanged: z.array(SessionChangeSchema),\n /** Array of snapshot IDs created during this session */\n snapshots: z.array(z.string()).optional(),\n});\n/**\n * Minimal session data for list views\n */\nexport const SessionSummarySchema = z.object({\n sessionId: z.string(),\n startedAt: z.string().datetime(),\n endedAt: z.string().datetime().optional(),\n name: z.string().optional(),\n changeCount: z.number().int().nonnegative(),\n triggers: z.array(SessionTriggerSchema),\n});\n/**\n * Session filters for querying\n */\nexport const SessionFiltersSchema = z.object({\n /** Only return sessions for this workspace URI */\n workspaceUri: z.string().optional(),\n /** Only return active sessions (endedAt is null) */\n activeOnly: z.boolean().optional(),\n /** Only return finalized sessions (endedAt is not null) */\n finalizedOnly: z.boolean().optional(),\n /** Return sessions that started after this timestamp */\n after: z.date().optional(),\n /** Return sessions that started before this timestamp */\n before: z.date().optional(),\n /** Maximum number of results */\n limit: z.number().int().positive().optional(),\n /** Offset for pagination */\n offset: z.number().int().nonnegative().optional(),\n});\n/**\n * Session creation options\n */\nexport const CreateSessionOptionsSchema = z.object({\n /** VS Code workspace folder URI */\n workspaceUri: z.string(),\n /** Initial trigger sources */\n triggers: z.array(SessionTriggerSchema).default([\"filewatch\"]),\n /** Optional semantic name (generated offline) */\n name: z.string().optional(),\n});\n/**\n * Session manager configuration\n */\nexport const SessionManagerConfigSchema = z.object({\n /** VS Code workspace folder URI (multi-root safe) */\n workspaceUri: z.string(),\n /** Idle timeout in milliseconds (default: 15 minutes) */\n idleMs: z\n .number()\n .int()\n .positive()\n .default(15 * 60_000),\n /** Batch size for flushing changes to database (default: 50) */\n flushBatchSize: z.number().int().positive().default(50),\n /** Flush interval in milliseconds (default: 5 seconds) */\n flushIntervalMs: z.number().int().positive().default(5000),\n /** Use VS Code file system watcher (default: true) */\n useVSCodeWatcher: z.boolean().default(true),\n /** Patterns to ignore (.snapbackignore) */\n ignorePatterns: z\n .array(z.string())\n .default([\n \"node_modules/**\",\n \".next/**\",\n \"dist/**\",\n \"build/**\",\n \"coverage/**\",\n \".git/**\",\n \"*.log\",\n \"*.tmp\",\n \"*.swp\",\n \".DS_Store\",\n ]),\n /** @enterprise User tier (for analytics) */\n tier: z.enum([\"free\", \"solo\"]).default(\"free\"),\n /** @enterprise Analytics consent (Solo tier only) */\n consent: z.boolean().default(false),\n});\n/**\n * Trigger bitmask encoding for database storage\n *\n * Bit 0 (1): filewatch\n * Bit 1 (2): pre-commit\n * Bit 2 (4): manual\n * Bit 3 (8): idle-finalize\n *\n * Example: bitmask = 5 → filewatch (1) + manual (4)\n */\nexport function encodeTriggerBitmask(triggers) {\n let mask = 0;\n for (const trigger of triggers) {\n switch (trigger) {\n case \"filewatch\":\n mask |= 1;\n break;\n case \"pre-commit\":\n mask |= 2;\n break;\n case \"manual\":\n mask |= 4;\n break;\n case \"idle-finalize\":\n mask |= 8;\n break;\n }\n }\n return mask;\n}\n/**\n * Decode trigger bitmask to array of trigger types\n */\nexport function decodeTriggerBitmask(mask) {\n const triggers = [];\n if (mask & 1) {\n triggers.push(\"filewatch\");\n }\n if (mask & 2) {\n triggers.push(\"pre-commit\");\n }\n if (mask & 4) {\n triggers.push(\"manual\");\n }\n if (mask & 8) {\n triggers.push(\"idle-finalize\");\n }\n return triggers;\n}\n","/**\n * File Modification Contracts\n *\n * Canonical type for real-time file modification tracking across all surfaces:\n * - VS Code Extension (records modifications on save)\n * - MCP Server (queries modifications for what_changed)\n * - CLI Daemon (receives modifications from extension)\n * - Intelligence package (stores and queries modifications)\n *\n * Design Decisions:\n * - 'path' (not 'file') - consistent with Node.js/VS Code conventions\n * - 'update' (not 'modified') - matches VS Code file system events\n * - 'source' required - enables debugging cross-surface issues\n * - AI attribution optional - graceful when detection unavailable\n */\nimport { z } from \"zod\";\n/**\n * Source surfaces that can record file modifications\n */\nexport const ModificationSourceSchema = z.enum([\"extension\", \"mcp\", \"daemon\", \"cli\"]);\n/**\n * File modification operation types\n * - create: New file created\n * - update: Existing file modified\n * - delete: File deleted\n */\nexport const ModificationTypeSchema = z.enum([\"create\", \"update\", \"delete\"]);\n/**\n * Canonical file modification type used across all surfaces.\n *\n * All fields with sensible defaults to minimize required data at recording time.\n */\nexport const FileModificationSchema = z.object({\n /** Absolute path to the modified file */\n path: z.string().min(1, \"Path cannot be empty\"),\n /** Modification timestamp (ms since epoch) */\n timestamp: z.number().positive(\"Timestamp must be positive\"),\n /** Type of modification */\n type: ModificationTypeSchema,\n /** Lines changed (0 if unknown or delete) */\n linesChanged: z.number().int().nonnegative().default(0),\n /** Whether this change was AI-attributed (detected by AIPresenceDetector) */\n aiAttributed: z.boolean().default(false),\n /** Which AI tool made the change, if detected (e.g., 'copilot', 'cursor', 'claude') */\n aiTool: z.string().nullable().default(null),\n /** Source surface that recorded this modification */\n source: ModificationSourceSchema,\n});\n/**\n * Parse and validate a FileModification input\n */\nexport function parseFileModification(input) {\n return FileModificationSchema.parse(input);\n}\n/**\n * Convert MCP's FileChange to canonical FileModification\n */\nexport function fromMCPFileChange(change) {\n return {\n path: change.file,\n timestamp: change.timestamp,\n type: change.type === \"created\" ? \"create\" : change.type === \"deleted\" ? \"delete\" : \"update\",\n linesChanged: change.linesChanged,\n aiAttributed: change.aiAttributed,\n aiTool: null, // MCP doesn't track specific AI tool\n source: \"mcp\",\n };\n}\n/**\n * Convert canonical FileModification to MCP's FileChange\n */\nexport function toMCPFileChange(mod) {\n return {\n file: mod.path,\n type: mod.type === \"create\" ? \"created\" : mod.type === \"delete\" ? \"deleted\" : \"modified\",\n timestamp: mod.timestamp,\n aiAttributed: mod.aiAttributed,\n linesChanged: mod.linesChanged,\n };\n}\n/**\n * Convert Intelligence's FileModification to canonical FileModification\n */\nexport function fromIntelligenceFileModification(mod, source = \"extension\") {\n return {\n path: mod.path,\n timestamp: mod.timestamp,\n type: mod.type,\n linesChanged: mod.linesChanged ?? 0,\n aiAttributed: false, // Intelligence doesn't track this currently\n aiTool: null,\n source,\n };\n}\n/**\n * Convert canonical FileModification to Intelligence's format\n * (for backwards compatibility during migration)\n */\nexport function toIntelligenceFileModification(mod) {\n return {\n path: mod.path,\n timestamp: mod.timestamp,\n type: mod.type,\n linesChanged: mod.linesChanged,\n };\n}\n// =============================================================================\n// UTILITY FUNCTIONS\n// =============================================================================\n/**\n * Filter modifications to only those after a given timestamp\n */\nexport function filterModificationsSince(mods, since) {\n return mods.filter((m) => m.timestamp >= since);\n}\n/**\n * Get unique file paths from modifications\n */\nexport function getUniqueModifiedPaths(mods) {\n return [...new Set(mods.map((m) => m.path))];\n}\n/**\n * Count AI-attributed modifications\n */\nexport function countAIAttributedModifications(mods) {\n return mods.filter((m) => m.aiAttributed).length;\n}\n/**\n * Get total lines changed across all modifications\n */\nexport function getTotalLinesChanged(mods) {\n return mods.reduce((sum, m) => sum + m.linesChanged, 0);\n}\n/**\n * Group modifications by AI tool\n */\nexport function groupByAITool(mods) {\n const groups = new Map();\n for (const mod of mods) {\n const tool = mod.aiTool;\n if (!groups.has(tool)) {\n groups.set(tool, []);\n }\n groups.get(tool)?.push(mod);\n }\n return groups;\n}\n","/**\n * Signal API Schemas\n *\n * Zod schemas for signal analysis API endpoints.\n * These are the HTTP transport schemas, separate from engine types.\n *\n * Design principles:\n * - HTTP-friendly inputs (strings, primitives)\n * - Rich output types for client consumption\n * - Adapter layer bridges these to engine internals\n */\nimport { z } from \"zod\";\n// =============================================================================\n// AI Detection Schemas\n// =============================================================================\n/**\n * AI Detection Input\n *\n * Detects AI tool presence and code generation patterns.\n */\nexport const AiDetectionInputSchema = z.object({\n /** Active extension IDs in the IDE environment */\n extensionIds: z.array(z.string()).default([]),\n /** Optional file content to analyze for AI signatures */\n content: z.string().optional(),\n /** Character velocity (chars/ms) from burst detection */\n velocity: z.number().nonnegative().optional(),\n /** Total characters changed in the operation */\n charCount: z.number().int().nonnegative().optional(),\n});\n/**\n * AI Detection Output\n */\nexport const AiDetectionOutputSchema = z.object({\n /** Detected AI tool name, or null if none detected */\n tool: z.string().nullable(),\n /** Confidence score (0-1) */\n confidence: z.number().min(0).max(1),\n /** Detection method that triggered */\n method: z.enum([\"extension\", \"velocity\", \"pattern\", \"combined\"]).nullable(),\n /** Indicators that contributed to detection */\n indicators: z.array(z.string()).optional(),\n});\n// =============================================================================\n// Threat Detection Schemas\n// =============================================================================\n/**\n * Threat Detection Input\n *\n * Scans code content for security threat patterns.\n */\nexport const ThreatDetectionInputSchema = z.object({\n /** Code content to scan for threats */\n content: z.string(),\n});\n/**\n * Individual threat pattern match\n */\nexport const ThreatPatternSchema = z.object({\n /** Description of the threat pattern */\n description: z.string(),\n /** Severity score (0-1), where 1 is most critical */\n severity: z.number().min(0).max(1),\n});\n/**\n * Threat Detection Output\n */\nexport const ThreatDetectionOutputSchema = z.object({\n /** Total number of threats detected */\n threatCount: z.number().int().nonnegative(),\n /** List of detected threat patterns */\n patterns: z.array(ThreatPatternSchema),\n /** Overall severity level */\n severity: z.enum([\"none\", \"low\", \"medium\", \"high\", \"critical\"]),\n /** Aggregated threat score (0-10) */\n score: z.number().min(0).max(10),\n});\n// =============================================================================\n// Burst Detection Schemas\n// =============================================================================\n/**\n * Burst Detection Input\n *\n * Analyzes edit velocity to detect rapid code changes (AI paste detection).\n */\nexport const BurstDetectionInputSchema = z.object({\n /** File path being analyzed */\n filePath: z.string(),\n /** Number of characters changed */\n charCount: z.number().int().nonnegative(),\n /** Timestamp of the change (ms since epoch) */\n timestamp: z.number().int().positive().optional(),\n});\n/**\n * Burst Detection Output\n */\nexport const BurstDetectionOutputSchema = z.object({\n /** Whether a burst was detected */\n isBurst: z.boolean(),\n /** Character velocity (chars/ms) */\n velocity: z.number().nonnegative(),\n /** File path analyzed */\n filePath: z.string(),\n /** Total characters in the change */\n charCount: z.number().int().nonnegative(),\n /** Timestamp of detection */\n timestamp: z.number().int().positive(),\n});\n// =============================================================================\n// Complexity Analysis Schemas\n// =============================================================================\n/**\n * File input for complexity analysis\n */\nexport const ComplexityFileInputSchema = z.object({\n /** File path */\n path: z.string(),\n /** File content */\n content: z.string(),\n /** Line count of the file */\n lineCount: z.number().int().nonnegative(),\n});\n/**\n * Complexity Analysis Input\n */\nexport const ComplexityAnalysisInputSchema = z.object({\n /** Files to analyze */\n files: z.array(ComplexityFileInputSchema),\n});\n/**\n * Complexity Analysis Output\n */\nexport const ComplexityAnalysisOutputSchema = z.object({\n /** Average complexity score across all files (0-1) */\n avgComplexity: z.number().min(0).max(1),\n /** Maximum complexity score of any single file (0-1) */\n maxComplexity: z.number().min(0).max(1),\n /** List of files with complexity > 0.7 */\n highComplexityFiles: z.array(z.string()),\n /** Number of files analyzed */\n fileCount: z.number().int().nonnegative(),\n /** Overall complexity value (same as avgComplexity) */\n value: z.number().min(0).max(1),\n});\n// =============================================================================\n// Comprehensive Signal Analysis Schemas\n// =============================================================================\n/**\n * Comprehensive Signal Analysis Input\n *\n * Runs all signals in parallel and computes overall risk score.\n */\nexport const ComprehensiveSignalInputSchema = z.object({\n /** Extension IDs for AI detection */\n extensionIds: z.array(z.string()).default([]),\n /** Content to analyze (for threats, AI patterns, complexity) */\n content: z.string(),\n /** File path being analyzed */\n filePath: z.string(),\n /** Line count (for complexity calculation) */\n lineCount: z.number().int().nonnegative().optional(),\n /** Character count (for burst detection) */\n charCount: z.number().int().nonnegative().optional(),\n /** Velocity (for AI detection) */\n velocity: z.number().nonnegative().optional(),\n /** Timestamp (for burst detection) */\n timestamp: z.number().int().positive().optional(),\n});\n/**\n * Individual signal result in comprehensive output\n */\nexport const SignalResultSchema = z.object({\n /** Signal name */\n signal: z.enum([\"ai\", \"threats\", \"burst\", \"complexity\"]),\n /** Signal-specific score/value */\n value: z.number(),\n /** Whether this signal is considered \"triggered\" */\n triggered: z.boolean(),\n});\n/**\n * Comprehensive Signal Analysis Output\n */\nexport const ComprehensiveSignalOutputSchema = z.object({\n /** Individual signal results */\n signals: z.object({\n ai: AiDetectionOutputSchema,\n threats: ThreatDetectionOutputSchema,\n burst: BurstDetectionOutputSchema.optional(),\n complexity: ComplexityAnalysisOutputSchema,\n }),\n /** Overall risk score (0-1), weighted combination of all signals */\n overallRisk: z.number().min(0).max(1),\n /** Risk level classification */\n riskLevel: z.enum([\"low\", \"medium\", \"high\", \"critical\"]),\n /** Summary of triggered signals */\n triggeredSignals: z.array(z.enum([\"ai\", \"threats\", \"burst\", \"complexity\"])),\n /** Processing time in milliseconds */\n processingTimeMs: z.number().nonnegative(),\n});\n// =============================================================================\n// Shared Types\n// =============================================================================\n/**\n * Signal type enumeration\n */\nexport const SignalTypeSchema = z.enum([\"ai\", \"threats\", \"burst\", \"complexity\", \"comprehensive\"]);\n/**\n * Common error response for signal endpoints\n */\nexport const SignalErrorSchema = z.object({\n /** Error code */\n code: z.string(),\n /** Human-readable error message */\n message: z.string(),\n /** Signal type that failed */\n signal: SignalTypeSchema.optional(),\n});\n","import { z } from \"zod\";\n/**\n * Configuration file types\n */\nexport const ConfigFileTypeSchema = z.enum([\n \"package\",\n \"typescript\",\n \"linting\",\n \"build\",\n \"environment\",\n \"testing\",\n \"framework\",\n \"database\",\n \"ci\",\n]);\n/**\n * Supported programming languages\n */\nexport const SupportedLanguageSchema = z.enum([\"javascript\", \"typescript\", \"python\", \"universal\"]);\n/**\n * File baseline information for config files\n */\nexport const FileBaselineSchema = z.object({\n path: z.string(),\n hash: z.string(),\n timestamp: z.number(),\n size: z.number(),\n});\n/**\n * Base configuration file interface\n */\nexport const ConfigFileSchema = z.object({\n path: z.string(),\n type: ConfigFileTypeSchema,\n language: SupportedLanguageSchema,\n critical: z.boolean().default(false),\n baseline: FileBaselineSchema.optional(),\n});\n/**\n * Detected configuration file\n */\nexport const DetectedConfigFileSchema = z.object({\n type: z.string(),\n path: z.string(),\n name: z.string(),\n critical: z.boolean().default(false),\n});\n/**\n * Config parse result\n */\nexport const ConfigParseResultSchema = z.object({\n content: z.any(),\n valid: z.boolean(),\n error: z.string().optional(),\n metadata: z.record(z.string(), z.any()).optional(),\n});\n/**\n * Config validation result\n */\nexport const ConfigValidationResultSchema = z.object({\n valid: z.boolean(),\n errors: z.array(z.string()).default([]),\n warnings: z.array(z.string()).default([]),\n});\n/**\n * Config file change\n */\nexport const ConfigChangeSchema = z.object({\n type: z.enum([\"added\", \"modified\", \"deleted\"]),\n file: z.string(),\n timestamp: z.number(),\n baseline: FileBaselineSchema.optional(),\n});\n/**\n * Config manager options\n */\nexport const ConfigManagerOptionsSchema = z.object({\n autoDetect: z.boolean().default(true),\n watchChanges: z.boolean().default(true),\n autoProtect: z.boolean().default(true),\n customPatterns: z.array(z.any()).optional(),\n});\n/**\n * Selective snapshot configuration\n */\nexport const SelectiveSnapshotConfigSchema = z.object({\n enabled: z.boolean(),\n patterns: z.array(z.string()).optional(),\n threshold: z.number().optional(),\n includePatterns: z.array(z.string()).optional(),\n excludePatterns: z.array(z.string()).optional(),\n});\n","import { z } from \"zod\";\n// =============================================================================\n// LEARNING DATA MODEL (Phase 0 - Proactive Learning System)\n// =============================================================================\n/**\n * Learning types - categorical classification of captured learnings\n * - pattern: Reusable code/workflow patterns\n * - pitfall: Anti-patterns and bugs to avoid\n * - efficiency: Performance/optimization insights\n * - workflow: Process/tooling improvements\n * - discovery: New capabilities/features found\n */\nexport const LearningTypeSchema = z.enum([\"pattern\", \"pitfall\", \"efficiency\", \"workflow\", \"discovery\"]);\n/**\n * Intent classification for command context matching\n */\nexport const LearningIntentSchema = z.enum([\"implement\", \"debug\", \"refactor\", \"review\"]);\n/**\n * Action types - concrete, deterministic operations\n * Each learning maps to exactly one executable action\n */\nexport const LearningActionTypeSchema = z.enum([\"add-flag\", \"set-env\", \"inject-validation\", \"warn\", \"suggest-file\"]);\n/**\n * Warning severity levels\n */\nexport const WarnSeveritySchema = z.enum([\"info\", \"warning\", \"error\"]);\n// =============================================================================\n// ACTION PAYLOAD SCHEMAS\n// =============================================================================\n/**\n * Payload for add-flag action\n * Adds CLI flag to command invocation\n */\nexport const AddFlagPayloadSchema = z.object({\n flag: z.string().min(1).describe(\"CLI flag to add, e.g. '--validate-expiry'\"),\n value: z.union([z.string(), z.boolean()]).optional().describe(\"Flag value if applicable\"),\n reason: z.string().min(1).describe(\"Human-readable reason shown in verbose mode\"),\n});\n/**\n * Payload for set-env action\n * Sets environment variable for command execution\n */\nexport const SetEnvPayloadSchema = z.object({\n key: z\n .string()\n .min(1)\n .regex(/^[A-Z_][A-Z0-9_]*$/, \"Must be valid env var name\"),\n value: z.string().describe(\"Environment variable value\"),\n reason: z.string().min(1).describe(\"Human-readable reason shown in verbose mode\"),\n});\n/**\n * Payload for inject-validation action\n * Triggers validation logic during command execution\n */\nexport const InjectValidationPayloadSchema = z.object({\n validationType: z.string().min(1).describe(\"Validation type identifier, e.g. 'jwt-expiry', 'silent-catch'\"),\n targetFile: z.string().optional().describe(\"Optional file to target for validation\"),\n reason: z.string().min(1).describe(\"Human-readable reason shown in verbose mode\"),\n});\n/**\n * Payload for warn action\n * Displays warning/info message to user\n */\nexport const WarnPayloadSchema = z.object({\n message: z.string().min(1).describe(\"Warning message to display\"),\n severity: WarnSeveritySchema.describe(\"Severity level affects display styling\"),\n});\n/**\n * Payload for suggest-file action\n * Suggests file creation based on established patterns\n */\nexport const SuggestFilePayloadSchema = z.object({\n filePath: z.string().min(1).describe(\"Suggested file path, may contain {feature} placeholder\"),\n reason: z.string().min(1).describe(\"Human-readable reason for suggestion\"),\n});\n// =============================================================================\n// TRIGGER SCHEMA\n// =============================================================================\n/**\n * LearningTrigger - defines when a learning should be matched\n * All fields are optional; matching uses OR logic across populated fields\n */\nexport const LearningTriggerSchema = z.object({\n commands: z\n .array(z.string())\n .optional()\n .describe(\"Command names that trigger this learning, e.g. ['auth', 'deploy']\"),\n intent: z.array(LearningIntentSchema).optional().describe(\"Intent types that trigger this learning\"),\n filePatterns: z.array(z.string()).optional().describe(\"Glob patterns for file matching, e.g. ['**/*auth*.ts']\"),\n flags: z.array(z.string()).optional().describe(\"CLI flags that trigger this learning, e.g. ['--provider']\"),\n description: z.string().min(1).describe(\"Human-readable description for fuzzy matching\"),\n});\n// =============================================================================\n// ACTION SCHEMA (DISCRIMINATED UNION)\n// =============================================================================\n/**\n * LearningAction - concrete action to execute when learning is applied\n * Discriminated union ensures type-safe payload access\n */\nexport const LearningActionSchema = z.discriminatedUnion(\"type\", [\n z.object({\n type: z.literal(\"add-flag\"),\n payload: AddFlagPayloadSchema,\n }),\n z.object({\n type: z.literal(\"set-env\"),\n payload: SetEnvPayloadSchema,\n }),\n z.object({\n type: z.literal(\"inject-validation\"),\n payload: InjectValidationPayloadSchema,\n }),\n z.object({\n type: z.literal(\"warn\"),\n payload: WarnPayloadSchema,\n }),\n z.object({\n type: z.literal(\"suggest-file\"),\n payload: SuggestFilePayloadSchema,\n }),\n]);\n// =============================================================================\n// MAIN LEARNING SCHEMA\n// =============================================================================\n/**\n * Learning - core data model for proactive learning system\n * Each learning represents a captured insight that can be applied to future commands\n */\nexport const LearningSchema = z.object({\n id: z.string().min(1).describe(\"Unique identifier for this learning\"),\n type: LearningTypeSchema.describe(\"Categorical classification\"),\n trigger: LearningTriggerSchema.describe(\"Conditions that activate this learning\"),\n action: LearningActionSchema.describe(\"Concrete action to execute\"),\n confidence: z.number().min(0).max(1).describe(\"Confidence score (0.0-1.0), static at creation\"),\n created: z.number().int().positive().describe(\"Creation timestamp (ms since epoch)\"),\n lastUsed: z.number().int().positive().optional().describe(\"Last usage timestamp (ms since epoch)\"),\n usageCount: z.number().int().nonnegative().default(0).describe(\"Number of times this learning was applied\"),\n tags: z.array(z.string()).default([]).describe(\"Searchable tags for categorization\"),\n archived: z.boolean().default(false).describe(\"Whether this learning is archived (excluded from matching)\"),\n});\n/**\n * Input type for creating new learnings\n * Omits auto-generated fields (id, created, lastUsed, usageCount)\n */\nexport const LearningInputSchema = LearningSchema.omit({\n id: true,\n created: true,\n lastUsed: true,\n usageCount: true,\n archived: true,\n}).extend({\n tags: z.array(z.string()).optional().default([]),\n archived: z.boolean().optional(),\n});\n// =============================================================================\n// LEARNING MODE & SESSION\n// =============================================================================\n/**\n * Learning evaluation modes - phased rollout support\n * - observe: Log matches only, no modification (Phase 1)\n * - warn: Apply warn-type actions only (Phase 2)\n * - apply-safe: Apply add-flag and warn only (Phase 3)\n * - apply-all: Apply all action types (opt-in)\n * - off: Skip evaluation entirely\n */\nexport const LearningModeSchema = z.enum([\"observe\", \"warn\", \"apply-safe\", \"apply-all\", \"off\"]);\n/**\n * LearningSession - daemon-tracked session for repetition avoidance\n */\nexport const LearningSessionSchema = z.object({\n workspaceId: z.string().min(1),\n startedAt: z.number().int().positive(),\n lastCommandAt: z.number().int().positive(),\n appliedLearnings: z.array(z.string()).describe(\"Learning IDs applied in this session\"),\n});\n// =============================================================================\n// COMMAND TRIGGER SCOPE\n// =============================================================================\n/**\n * HIGH_VALUE_COMMANDS - commands that trigger learning evaluation by default\n */\nexport const HIGH_VALUE_COMMANDS = [\"auth\", \"deploy\", \"verify\", \"migrate\", \"validate\"];\n/**\n * NEVER_EVALUATE_COMMANDS - commands that never trigger learning evaluation\n */\nexport const NEVER_EVALUATE_COMMANDS = [\"help\", \"version\", \"status\", \"list\"];\n// =============================================================================\n// EVALUATION TYPES\n// =============================================================================\n/**\n * Input for learning evaluation\n */\nexport const LearningEvaluationInputSchema = z.object({\n workspaceId: z.string().min(1),\n commandName: z.string().min(1),\n args: z.record(z.unknown()).optional().describe(\"Parsed command arguments/flags\"),\n filesOrPaths: z.array(z.string()).optional().describe(\"Files involved in command\"),\n intent: LearningIntentSchema.optional().describe(\"User intent if known\"),\n});\n/**\n * Selected learning with score for evaluation result\n */\nexport const SelectedLearningSchema = z.object({\n id: z.string(),\n title: z.string().describe(\"Human-readable title derived from trigger.description\"),\n type: LearningTypeSchema,\n score: z.number().min(0).max(1),\n action: LearningActionSchema,\n tags: z.array(z.string()),\n});\n/**\n * Result of learning evaluation\n */\nexport const LearningEvaluationResultSchema = z.object({\n selectedLearnings: z.array(SelectedLearningSchema),\n debug: z\n .object({\n evaluatedCount: z.number().int().nonnegative(),\n durationMs: z.number().nonnegative(),\n skippedReason: z.string().optional(),\n })\n .optional(),\n});\n// =============================================================================\n// SENSITIVE DATA PATTERNS (for validation)\n// =============================================================================\n/**\n * Patterns that indicate sensitive data - learnings must not contain these\n */\nexport const SENSITIVE_DATA_PATTERNS = [\n /api[_-]?key/i,\n /secret/i,\n /password/i,\n /token/i,\n /credential/i,\n /private[_-]?key/i,\n /auth[_-]?token/i,\n /bearer/i,\n /ssh[_-]?key/i,\n /aws[_-]?access/i,\n /database[_-]?url/i,\n /connection[_-]?string/i,\n];\n/**\n * Check if a string contains sensitive data patterns\n */\nexport function containsSensitiveData(text) {\n return SENSITIVE_DATA_PATTERNS.some((pattern) => pattern.test(text));\n}\n// =============================================================================\n// VALIDATION UTILITIES\n// =============================================================================\n/**\n * Validate a learning for sensitive data\n * Returns array of field paths containing sensitive data\n */\nexport function validateLearningForSensitiveData(learning) {\n const violations = [];\n // Check trigger description\n if (containsSensitiveData(learning.trigger.description)) {\n violations.push(\"trigger.description\");\n }\n // Check trigger file patterns\n learning.trigger.filePatterns?.forEach((pattern, i) => {\n if (containsSensitiveData(pattern)) {\n violations.push(`trigger.filePatterns[${i}]`);\n }\n });\n // Check action payload reason fields\n const payload = learning.action.payload;\n if (\"reason\" in payload && typeof payload.reason === \"string\" && containsSensitiveData(payload.reason)) {\n violations.push(\"action.payload.reason\");\n }\n if (\"message\" in payload && typeof payload.message === \"string\" && containsSensitiveData(payload.message)) {\n violations.push(\"action.payload.message\");\n }\n if (\"filePath\" in payload && typeof payload.filePath === \"string\" && containsSensitiveData(payload.filePath)) {\n violations.push(\"action.payload.filePath\");\n }\n // Check tags\n learning.tags?.forEach((tag, i) => {\n if (containsSensitiveData(tag)) {\n violations.push(`tags[${i}]`);\n }\n });\n return violations;\n}\n/**\n * Safe learning creation with validation\n * Throws if learning contains sensitive data\n */\nexport function createLearning(input, idGenerator) {\n // Validate input schema\n const parsed = LearningInputSchema.parse(input);\n // Check for sensitive data\n const violations = validateLearningForSensitiveData(parsed);\n if (violations.length > 0) {\n throw new Error(`Learning contains sensitive data in: ${violations.join(\", \")}`);\n }\n // Create full learning\n return {\n ...parsed,\n id: idGenerator(),\n created: Date.now(),\n usageCount: 0,\n archived: parsed.archived ?? false,\n };\n}\n// =============================================================================\n// SCORING UTILITIES\n// =============================================================================\n/**\n * Calculate recency decay factor (0.5-1.0)\n * Newer learnings get higher scores\n * @param lastUsed - Last usage timestamp (ms)\n * @param maxAgeDays - Age at which decay reaches minimum (default 90 days)\n */\nexport function calculateRecencyDecay(lastUsed, maxAgeDays = 90) {\n if (!lastUsed) {\n return 0.5; // Never used = minimum multiplier\n }\n const ageMs = Date.now() - lastUsed;\n const ageDays = ageMs / (1000 * 60 * 60 * 24);\n const decay = 1 - (ageDays / maxAgeDays) * 0.5;\n return Math.max(0.5, Math.min(1, decay));\n}\n/**\n * Calculate learning score for ranking\n * Simple formula: confidence × recency_decay\n */\nexport function calculateLearningScore(learning) {\n const recencyDecay = calculateRecencyDecay(learning.lastUsed);\n return learning.confidence * recencyDecay;\n}\n","import { z } from \"zod\";\n/**\n * Protection levels for files\n * - watch: Silent auto-snapshot on save (green)\n * - warn: Show notification before save (yellow/orange)\n * - block: Require explicit snapshot or override (red)\n */\nexport const ProtectionLevelSchema = z.enum([\"watch\", \"warn\", \"block\"]);\n/**\n * UI metadata for protection levels\n */\nexport const ProtectionLevelMetadataSchema = z.object({\n level: ProtectionLevelSchema,\n icon: z.string(),\n label: z.string(),\n description: z.string(),\n color: z.string(),\n themeColor: z.string().optional(),\n});\n/**\n * Protection level configurations with UI metadata\n */\nexport const PROTECTION_LEVELS = {\n watch: {\n level: \"watch\",\n icon: \"🟢\",\n label: \"Watch\",\n description: \"Silent auto-snapshot on save\",\n color: \"#10B981\",\n themeColor: \"charts.green\",\n },\n warn: {\n level: \"warn\",\n icon: \"🟡\",\n label: \"Warn\",\n description: \"Notify before save with options\",\n color: \"#FF6B35\",\n themeColor: \"charts.orange\",\n },\n block: {\n level: \"block\",\n icon: \"🔴\",\n label: \"Block\",\n description: \"Require snapshot or explicit override\",\n color: \"#EF4444\",\n themeColor: \"charts.red\",\n },\n};\n/**\n * Protected file entry\n */\nexport const ProtectedFileSchema = z.object({\n path: z.string(),\n level: ProtectionLevelSchema,\n reason: z.string().optional(),\n addedAt: z.date(),\n pattern: z.string().optional(), // If added via pattern match\n});\n/**\n * Pattern rule for automatic protection\n */\nexport const PatternRuleSchema = z.object({\n pattern: z.string(),\n level: ProtectionLevelSchema,\n reason: z.string().optional(),\n enabled: z.boolean().default(true),\n});\n/**\n * Protection configuration\n */\nexport const ProtectionConfigSchema = z.object({\n patterns: z.array(PatternRuleSchema).default([]),\n defaultLevel: ProtectionLevelSchema.default(\"watch\"),\n enabled: z.boolean().default(true),\n autoProtectConfigs: z.boolean().default(true),\n});\n/**\n * Protection manager options\n */\nexport const ProtectionManagerOptionsSchema = z.object({\n config: ProtectionConfigSchema.optional(),\n persistRegistry: z.boolean().default(true),\n registryPath: z.string().optional(),\n});\n/**\n * Protection check result\n */\nexport const ProtectionCheckResultSchema = z.object({\n isProtected: z.boolean(),\n level: ProtectionLevelSchema.optional(),\n reason: z.string().optional(),\n file: ProtectedFileSchema.optional(),\n});\n","var __rewriteRelativeImportExtension = (this && this.__rewriteRelativeImportExtension) || function (path, preserveJsx) {\n if (typeof path === \"string\" && /^\\.\\.?\\//.test(path)) {\n return path.replace(/\\.(tsx)$|((?:\\.d)?)((?:\\.[^./]+?)?)\\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {\n return tsx ? preserveJsx ? \".jsx\" : \".js\" : d && (!ext || !cm) ? m : (d + ext + \".\" + cm.toLowerCase() + \"js\");\n });\n }\n return path;\n};\nimport { z } from \"zod\";\nimport { RiskScoreSchema } from \"../schemas.js\";\nimport { RiskSeveritySchema } from \"./analysis.js\";\n// =============================================================================\n// SNAPSHOT TRIGGER & ORIGIN TYPES (ADR-004 Consolidated)\n// =============================================================================\n/**\n * Snapshot trigger sources - canonical enum for all surfaces\n * Consolidates triggers from VSCode, MCP, CLI, and API\n */\nexport const SnapshotTriggerSchema = z.enum([\n \"manual\",\n \"auto\",\n \"auto_save\",\n \"ai_detected\",\n \"ai-detected\", // Legacy alias\n \"pre_save\",\n \"pre-save\", // Legacy alias\n \"session_start\",\n \"session_end\",\n \"mcp_snap_start\",\n \"cli_protect\",\n \"api_request\",\n \"engine_internal\",\n \"recovery\",\n]);\n/**\n * Snapshot origin classification for DORA metrics\n * Distinguishes user-initiated vs automated snapshots\n */\nexport const SnapshotOriginSchema = z.enum([\"manual\", \"auto\", \"ai-detected\", \"recovery\", \"INTERACTIVE\", \"AUTOMATED\"]);\n/**\n * Reason codes for snapshot creation (from VSCode ManifestV2)\n * Used for explainability and debugging\n */\nexport const SnapshotReasonCodeSchema = z.enum([\n \"AI_DETECTED\",\n \"MANUAL_CHECKPOINT\",\n \"CRITICAL_FILE\",\n \"HIGH_RISK\",\n \"SESSION_START\",\n \"SESSION_END\",\n \"PRE_ROLLBACK\",\n \"BURST_MODE\",\n \"IDLE_FINALIZE\",\n]);\n/**\n * Checkpoint type for V2 manifests\n * PRE = pointer-only (marks start of risky operation)\n * POST = contains actual file content\n * PRE_ROLLBACK = pointer before rollback operation\n */\nexport const CheckpointTypeSchema = z.enum([\"PRE\", \"POST\", \"PRE_ROLLBACK\"]);\n/**\n * Base Snapshot interface\n * This is the core data structure for snapshots across all SnapBack clients\n *\n * Session Linkage (Non-Breaking Extension):\n * Snapshots can optionally link to a parent session via meta.sessionId.\n * This enables:\n * - Displaying snapshots within session tree view\n * - Understanding snapshot creation context\n * - Grouping snapshots by logical work period\n *\n * Example meta object:\n * {\n * name: \"Pre-refactor checkpoint\",\n * protected: true,\n * sessionId: \"clx1a2b3c4d5e6f7g8h9\" // Optional link to session\n * }\n *\n * Version Compatibility:\n * - version: Snapshot format version (default: \"1.0\")\n * - Compatible versions: [\"1.0\"]\n */\nexport const SnapshotSchema = z.object({\n id: z.string(),\n timestamp: z.number(),\n version: z.string().optional().default(\"1.0\"),\n meta: z.record(z.string(), z.any()).optional(),\n files: z.array(z.string()).optional(),\n fileContents: z.record(z.string(), z.string()).optional(),\n});\n/**\n * File state at a specific snapshot\n * Used for deduplication and change tracking\n * Enhanced per ADR-004 with encryption support\n *\n * Note: `hash` is optional to support:\n * - Files being added before hashing\n * - Encrypted content where hash is computed separately\n */\nexport const FileStateSchema = z.object({\n path: z.string(),\n content: z.string(),\n /** SHA-256 hash of content (optional, computed for dedup) */\n hash: z.string().optional(),\n /** File size in bytes */\n size: z.number().optional(),\n /** Encrypted data (for sensitive files - VSCode format) */\n encrypted: z\n .object({\n /** Initialization vector */\n iv: z.string(),\n /** Authentication tag */\n tag: z.string(),\n /** Optional: algorithm used (default: aes-256-gcm) */\n algorithm: z.string().optional(),\n })\n .optional(),\n});\n/**\n * V2 File reference for content-addressable storage\n * Used in SnapshotManifestV2 - references blobs by hash\n */\nexport const SnapshotFileRefV2Schema = z.object({\n /** SHA-256 hash of file content (CAS reference) */\n blobHash: z.string(),\n /** File size in bytes */\n size: z.number(),\n});\n/**\n * Complete snapshot state for deduplication\n */\nexport const SnapshotStateSchema = z.object({\n id: z.string(),\n timestamp: z.number(),\n files: z.array(FileStateSchema),\n});\n/**\n * Rich Snapshot with UI metadata\n * Used by VS Code extension and other clients with UI\n */\nexport const RichSnapshotSchema = SnapshotSchema.extend({\n name: z.string(),\n fileStates: z.array(FileStateSchema).optional(),\n isProtected: z.boolean(),\n icon: z.string().optional(),\n iconColor: z.string().optional(),\n});\n/**\n * Minimal snapshot for deletion operations\n */\nexport const MinimalSnapshotSchema = z.object({\n id: z.string(),\n name: z.string(),\n timestamp: z.number(),\n isProtected: z.boolean(),\n});\n/**\n * File input for snapshot creation\n */\nexport const FileInputSchema = z.object({\n path: z.string(),\n content: z.string(),\n action: z.enum([\"add\", \"modify\", \"delete\"]),\n});\n/**\n * Snapshot creation options\n * Enhanced per ADR-004 with DORA metric extensions from VSCode\n */\nexport const CreateSnapshotOptionsSchema = z.object({\n /** Description/reason for the snapshot */\n description: z.string().optional(),\n /** Whether to protect from auto-deletion */\n protected: z.boolean().optional(),\n /** What triggered the snapshot */\n trigger: SnapshotTriggerSchema.optional(),\n /** Origin classification for DORA metrics */\n origin: SnapshotOriginSchema.optional(),\n /** Time since last file change in ms (DORA lead time metric) */\n timeSinceLastChangeMs: z.number().optional(),\n});\n/**\n * Snapshot filters for querying\n */\nexport const SnapshotFiltersSchema = z.object({\n filePath: z.string().optional(),\n before: z.date().optional(),\n after: z.date().optional(),\n protected: z.boolean().optional(),\n limit: z.number().int().positive().optional(),\n offset: z.number().int().nonnegative().optional(),\n});\n/**\n * File diff for restore preview\n */\nexport const FileDiffSchema = z.object({\n path: z.string(),\n operation: z.enum([\"create\", \"modify\", \"delete\"]),\n linesAdded: z.number(),\n linesRemoved: z.number(),\n preview: z.string(),\n currentChecksum: z.string().optional(),\n snapshotChecksum: z.string().optional(),\n});\n/**\n * Diff preview for restore operations\n */\nexport const DiffPreviewSchema = z.object({\n totalFiles: z.number(),\n filesCreated: z.number(),\n filesModified: z.number(),\n filesDeleted: z.number(),\n totalLinesAdded: z.number(),\n totalLinesRemoved: z.number(),\n diffs: z.array(FileDiffSchema),\n});\n/**\n * Conflict report for restore operations\n */\nexport const ConflictReportSchema = z.object({\n path: z.string(),\n reason: z.string(),\n currentChecksum: z.string(),\n snapshotChecksum: z.string(),\n});\n/**\n * Snapshot restore result (enhanced with diff previews and conflicts)\n */\nexport const SnapshotRestoreResultSchema = z.object({\n success: z.boolean(),\n restoredFiles: z.array(z.string()),\n errors: z.array(z.string()).optional(),\n diffPreview: DiffPreviewSchema.optional(),\n conflicts: z.array(ConflictReportSchema).optional(),\n verification: z\n .object({\n allVerified: z.boolean(),\n results: z.array(z.object({\n path: z.string(),\n verified: z.boolean(),\n checksum: z.string(),\n expected: z.string(),\n })),\n })\n .optional(),\n});\n/**\n * Snapshot manager configuration\n */\nexport const SnapshotManagerConfigSchema = z.object({\n enableDeduplication: z.boolean().default(true),\n namingStrategy: z.enum([\"git\", \"semantic\", \"timestamp\", \"custom\"]).default(\"semantic\"),\n autoProtect: z.boolean().default(false),\n maxSnapshots: z.number().int().positive().optional(),\n});\n/**\n * File metadata for analytics and tracking\n *\n * Note: Uses canonical RiskScoreSchema from schemas.ts (0-10 scale)\n */\nexport const FileMetadataSchema = z.object({\n id: z.string(),\n path: z.string(),\n hash: z.string().optional(),\n size: z.number().optional(),\n language: z.string().optional(),\n risk: RiskScoreSchema.optional(),\n lastModified: z.number().optional(),\n createdAt: z.number().optional(),\n});\n/**\n * Snapshot metadata for analytics (Enhanced per ADR-004)\n * Includes VSCode ManifestV2 fields for full surface parity\n */\nexport const SnapshotMetadataSchema = z.object({\n // Core fields (required)\n id: z.string(),\n timestamp: z.number(),\n fileCount: z.number(),\n // Analytics fields (optional)\n totalSize: z.number().optional(),\n riskScore: RiskScoreSchema.optional(),\n tags: z.array(z.string()).optional(),\n // V2 Hierarchy fields (from VSCode ManifestV2)\n /** Sequential snapshot number (1-based, monotonic) */\n seq: z.number().int().positive().optional(),\n /** Parent snapshot seq (null for root) */\n parentSeq: z.number().int().positive().nullable().optional(),\n /** Parent snapshot ID */\n parentId: z.string().nullable().optional(),\n /** Checkpoint type */\n type: CheckpointTypeSchema.optional(),\n /** Main file that triggered this snapshot */\n anchorFile: z.string().optional(),\n // DORA Metrics fields\n /** Time since last file change in ms (for lead time metric) */\n timeSinceLastChangeMs: z.number().optional(),\n /** Compression ratio achieved (for storage efficiency) */\n compressionRatio: z.number().optional(),\n /** Storage size in bytes (after compression) */\n storageSizeBytes: z.number().optional(),\n // Origin & Classification\n /** Origin classification for analytics */\n origin: SnapshotOriginSchema.optional(),\n /** Reason codes for explainability */\n reasons: z.array(SnapshotReasonCodeSchema).optional(),\n // AI Detection\n aiDetection: z\n .object({\n detected: z.boolean(),\n tool: z.string().optional(),\n confidence: z.number().min(0).max(1).optional(),\n })\n .optional(),\n // Session linkage\n /** SnapBack session ID */\n sessionId: z.string().optional(),\n /** External task ID (from LLM agent) */\n taskId: z.string().optional(),\n // UI fields\n name: z.string().optional(),\n icon: z.string().optional(),\n});\n// =============================================================================\n// SNAPSHOT MANIFEST V2 (ADR-004 - Canonical Definition)\n// =============================================================================\n/**\n * V2 Snapshot Manifest - Canonical definition from VSCode extension\n * This is the SINGLE SOURCE OF TRUTH for V2 manifest structure.\n *\n * Features:\n * - Sequential numbering (seq) for ordering\n * - Parent chain (parentSeq, parentId) for history\n * - Checkpoint types (PRE/POST/PRE_ROLLBACK)\n * - Content-addressable file storage via blobHash\n * - Rich metadata for analytics and DORA metrics\n */\nexport const SnapshotManifestV2Schema = z.object({\n /** Schema version - always 2 for V2 */\n schemaVersion: z.literal(2),\n /** Unique ID: snap-{timestamp}-{random} */\n id: z.string(),\n /** Sequential snapshot number (1-based, monotonic) */\n seq: z.number().int().positive(),\n /** Parent snapshot seq (null for root) */\n parentSeq: z.number().int().positive().nullable(),\n /** Parent snapshot ID (null for root) */\n parentId: z.string().nullable(),\n /** Unix timestamp (ms) */\n timestamp: z.number(),\n /** Human-readable name */\n name: z.string(),\n /** Checkpoint type */\n type: CheckpointTypeSchema,\n /** The main file that triggered this snapshot */\n anchorFile: z.string(),\n /** Files in snapshot (path → ref). Empty for PRE checkpoints. */\n files: z.record(z.string(), SnapshotFileRefV2Schema),\n /** Optional metadata */\n metadata: z\n .object({\n /** Risk score 0-1 */\n riskScore: z.number().min(0).max(1).optional(),\n /** Origin classification */\n origin: SnapshotOriginSchema.optional(),\n /** Stable reason codes */\n reasons: z.array(SnapshotReasonCodeSchema).optional(),\n /** AI detection info */\n aiDetection: z\n .object({\n detected: z.boolean(),\n tool: z.string().optional(),\n confidence: z.number().optional(),\n })\n .optional(),\n /** SnapBack session ID */\n sessionId: z.string().optional(),\n /** External task ID */\n taskId: z.string().optional(),\n /** DORA: Time since last change */\n timeSinceLastChangeMs: z.number().optional(),\n })\n .optional(),\n});\n/**\n * V1 Snapshot Manifest - Legacy format for backward compatibility\n */\nexport const SnapshotManifestV1Schema = z.object({\n /** Unique ID */\n id: z.string(),\n /** Unix timestamp (ms) */\n timestamp: z.number(),\n /** Human-readable name */\n name: z.string(),\n /** Trigger reason */\n trigger: z.enum([\"auto\", \"manual\", \"ai-detected\", \"pre-save\"]),\n /** Main file that triggered snapshot */\n anchorFile: z.string(),\n /** Files in snapshot (path → ref) */\n files: z.record(z.string(), z.object({\n blob: z.string(),\n size: z.number(),\n })),\n /** Optional metadata */\n metadata: z\n .object({\n riskScore: z.number().optional(),\n aiDetection: z\n .object({\n detected: z.boolean(),\n tool: z.string().optional(),\n confidence: z.number().optional(),\n })\n .optional(),\n sessionId: z.string().optional(),\n taskId: z.string().optional(),\n })\n .optional(),\n});\n/**\n * Type guard for V2 manifests\n */\nexport function isSnapshotManifestV2(manifest) {\n return (typeof manifest === \"object\" &&\n manifest !== null &&\n \"schemaVersion\" in manifest &&\n manifest.schemaVersion === 2);\n}\n/**\n * Type guard for POST checkpoints (have content)\n */\nexport function isPostCheckpoint(manifest) {\n if (!isSnapshotManifestV2(manifest)) {\n return true; // V1 manifests always have content\n }\n return manifest.type === \"POST\";\n}\n/**\n * Type guard for pointer checkpoints (PRE, PRE_ROLLBACK)\n */\nexport function isPointerCheckpoint(manifest) {\n if (!isSnapshotManifestV2(manifest)) {\n return false;\n }\n return manifest.type === \"PRE\" || manifest.type === \"PRE_ROLLBACK\";\n}\n// =============================================================================\n// STORAGE METRICS (For Deduplication Transparency)\n// =============================================================================\n/**\n * Storage metrics from snapshot creation\n *\n * Provides transparency into CAS (Content-Addressable Storage) efficiency:\n * - How many files were actually written vs deduplicated\n * - Actual storage impact vs logical file count\n * - Deduplication ratio for user-facing display\n *\n * UI Display Example:\n * \"Snapshot created: 847 files (23 new, 824 deduplicated) | 94% storage saved\"\n *\n * @example\n * {\n * totalFiles: 847,\n * newBlobsWritten: 23,\n * dedupedFiles: 824,\n * dedupRatio: 0.97,\n * bytesWritten: 145920,\n * originalSize: 4832000,\n * bytesSaved: 4686080\n * }\n */\nexport const StorageMetricsSchema = z.object({\n /** Total files in snapshot */\n totalFiles: z.number().int().nonnegative(),\n /** New blobs written to storage (not deduplicated) */\n newBlobsWritten: z.number().int().nonnegative(),\n /** Files that were deduplicated (already existed in CAS) */\n dedupedFiles: z.number().int().nonnegative(),\n /** Deduplication ratio (0-1) - higher means more storage saved */\n dedupRatio: z.number().min(0).max(1),\n /** Actual bytes written to storage */\n bytesWritten: z.number().int().nonnegative(),\n /** Original size of all files (before dedup) */\n originalSize: z.number().int().nonnegative(),\n /** Storage savings in bytes (originalSize - bytesWritten) */\n bytesSaved: z.number().int().nonnegative(),\n});\n/**\n * Helper to calculate dedup ratio from metrics\n * Returns 0 if no files, avoiding division by zero\n */\nexport function calculateDedupRatio(newBlobs, totalFiles) {\n if (totalFiles === 0) {\n return 0;\n }\n return 1 - newBlobs / totalFiles;\n}\n/**\n * Create StorageMetrics from blob store results\n * Aggregates per-file isNew flags into summary metrics\n *\n * @param blobResults - Array of { size, isNew } from blob store operations\n * @returns Complete StorageMetrics object\n */\nexport function createStorageMetrics(blobResults) {\n const totalFiles = blobResults.length;\n const newBlobsWritten = blobResults.filter((r) => r.isNew).length;\n const dedupedFiles = totalFiles - newBlobsWritten;\n const originalSize = blobResults.reduce((sum, r) => sum + r.size, 0);\n const bytesWritten = blobResults.filter((r) => r.isNew).reduce((sum, r) => sum + r.size, 0);\n const bytesSaved = originalSize - bytesWritten;\n const dedupRatio = calculateDedupRatio(newBlobsWritten, totalFiles);\n return {\n totalFiles,\n newBlobsWritten,\n dedupedFiles,\n dedupRatio,\n bytesWritten,\n originalSize,\n bytesSaved,\n };\n}\n/**\n * Analytics response structure\n */\nexport const AnalyticsResponseSchema = z.object({\n workspaceId: z.string(),\n period: z.object({\n start: z.number(),\n end: z.number(),\n }),\n risk: RiskScoreSchema,\n fileStats: z.object({\n total: z.number(),\n byLanguage: z.record(z.string(), z.number()),\n byRisk: z.record(z.string(), z.number()),\n }),\n snapshotStats: z.object({\n total: z.number(),\n frequency: z.number(),\n averageSize: z.number().optional(),\n }),\n snapshotRecommendations: z.object({\n shouldCreateSnapshot: z.boolean(),\n reason: z.string(),\n urgency: RiskSeveritySchema,\n suggestedTiming: z.string(),\n }),\n trends: z.object({\n risk: z.array(z.object({\n timestamp: z.number(),\n score: z.number(),\n })),\n activity: z.array(z.object({\n timestamp: z.number(),\n count: z.number(),\n })),\n }),\n});\n/**\n * Factory function to create a snapshot storage instance\n * This allows public packages to create storage instances without\n * directly depending on the private @snapback/storage package.\n *\n * @param basePath The base path for storage operations\n * @returns A SnapshotStorage instance\n */\nexport async function createSnapshotStorage(basePath) {\n // Dynamically import the storage package to avoid circular dependencies\n // The import path is resolved at runtime after both packages are built\n try {\n const { StorageBrokerAdapter } = await import(__rewriteRelativeImportExtension(\"@snapback/sdk/storage\"));\n // Use the standard workspace database path\n const storage = new StorageBrokerAdapter(`${basePath}/.snapback/snapback.db`);\n await storage.initialize();\n return {\n create: async (data) => {\n const snapshot = {\n id: `snap-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`,\n timestamp: Date.now(),\n version: \"1.0\",\n meta: {\n ...data,\n protected: data.protected || false,\n description: data.description || \"\",\n },\n };\n await storage.save(snapshot);\n return snapshot;\n },\n retrieve: async (id) => {\n return await storage.get(id);\n },\n list: async () => {\n return await storage.list();\n },\n restore: async (id, _targetPath, options) => {\n // Note: Full restore implementation requires file system operations\n // This is a simplified version - real implementation in storage package\n const snapshot = await storage.get(id);\n if (!snapshot) {\n return {\n success: false,\n restoredFiles: [],\n errors: [`Snapshot ${id} not found`],\n };\n }\n if (options?.dryRun) {\n return {\n success: true,\n restoredFiles: snapshot.files || [],\n errors: [],\n };\n }\n return {\n success: true,\n restoredFiles: snapshot.files || [],\n errors: [],\n };\n },\n };\n }\n catch (error) {\n throw new Error(`Failed to initialize snapshot storage: ${error instanceof Error ? error.message : String(error)}. ` +\n \"Ensure @snapback/sdk is installed and storage path is writable.\");\n }\n}\n","import { z } from \"zod\";\n/**\n * Dashboard Metrics Contracts\n *\n * Type definitions for dashboard home page metrics display.\n * Uses discriminated unions for type safety and exhaustive pattern matching.\n *\n * Follows SnapBack TypeScript patterns:\n * - Discriminated unions (protection_status, action)\n * - Const assertions for readonly values\n * - Zod schemas for runtime validation\n */\n/**\n * Protection status discriminated union\n * Enables type-safe rendering of status-specific UI\n */\nexport const PROTECTION_STATUSES = [\"active\", \"inactive\"];\n/**\n * Recent activity action discriminated union\n * Enables type-safe handling of different activity types\n */\nexport const RECENT_ACTIVITY_ACTIONS = [\"snapshot_created\", \"recovery_performed\", \"ai_detected\"];\n/**\n * AI tool names for activity tracking\n */\nexport const AI_TOOLS = [\"copilot\", \"cursor\", \"claude\", \"windsurf\"];\n/**\n * Recent activity entry schema\n * Represents a single action in the activity feed\n *\n * Example:\n * {\n * timestamp: 1701676000000,\n * action: \"recovery_performed\",\n * file: \"src/utils/api.ts\",\n * ai_tool: \"copilot\"\n * }\n */\nexport const RecentActivitySchema = z.object({\n timestamp: z.number().int().positive(),\n action: z.enum(RECENT_ACTIVITY_ACTIONS),\n file: z.string().min(1),\n ai_tool: z.enum(AI_TOOLS).optional(),\n});\n/**\n * AI activity breakdown by tool\n * Shows how many interactions detected per AI tool\n *\n * Example:\n * {\n * copilot: 847,\n * cursor: 412,\n * claude: 183,\n * windsurf: 0\n * }\n */\nexport const AIActivityBreakdownSchema = z.object({\n copilot: z.number().int().nonnegative(),\n cursor: z.number().int().nonnegative(),\n claude: z.number().int().nonnegative(),\n windsurf: z.number().int().nonnegative().optional(),\n});\n/**\n * Dashboard metrics response\n * Complete metrics for dashboard home page display\n *\n * Properties:\n * - protection_status: Current protection state (active/inactive)\n * - total_snapshots: Lifetime snapshots created\n * - total_recoveries: Times user recovered from AI errors\n * - files_protected: Unique files with checkpoints\n * - ai_detection_rate: Percentage (0-100) of changes recognized as AI\n * - recent_activity: Last 10 actions (for activity feed)\n * - ai_breakdown: Detection count per AI tool\n *\n * Example response:\n * {\n * protection_status: \"active\",\n * total_snapshots: 1247,\n * total_recoveries: 23,\n * files_protected: 3892,\n * ai_detection_rate: 94,\n * recent_activity: [\n * {\n * timestamp: 1701676000000,\n * action: \"snapshot_created\",\n * file: \"src/utils/api.ts\",\n * ai_tool: \"copilot\"\n * }\n * ],\n * ai_breakdown: {\n * copilot: 847,\n * cursor: 412,\n * claude: 183\n * }\n * }\n */\nexport const DashboardMetricsSchema = z.object({\n protection_status: z.enum(PROTECTION_STATUSES),\n total_snapshots: z.number().int().nonnegative(),\n total_recoveries: z.number().int().nonnegative(),\n files_protected: z.number().int().nonnegative(),\n ai_detection_rate: z.number().min(0).max(100),\n recent_activity: z.array(RecentActivitySchema).max(10),\n ai_breakdown: AIActivityBreakdownSchema,\n});\n/**\n * Error response for dashboard metrics endpoint\n * Discriminated union for safe error handling\n */\nexport const DashboardMetricsErrorSchema = z.object({\n error: z.literal(true),\n code: z.enum([\"UNAUTHORIZED\", \"NOT_FOUND\", \"INTERNAL_ERROR\"]),\n message: z.string(),\n});\n/**\n * Dashboard API response (success | error)\n * Type guard helpers for pattern matching\n */\nexport const DashboardMetricsResponseSchema = z.union([DashboardMetricsSchema, DashboardMetricsErrorSchema]);\n/**\n * Type guards for discriminated unions\n * Enables safe pattern matching in UI components\n */\nexport function isDashboardMetrics(response) {\n return !(\"error\" in response) || response.error !== true;\n}\nexport function isDashboardMetricsError(response) {\n return \"error\" in response && response.error === true;\n}\nexport function isProtectionActive(metrics) {\n return metrics.protection_status === \"active\";\n}\nexport function isProtectionInactive(metrics) {\n return metrics.protection_status === \"inactive\";\n}\n","/**\n * Shared Confidence Calculation Utilities\n *\n * Common utilities extracted from 4 confidence calculators to eliminate duplication.\n * Used by: ConfidenceEngine, ConfidenceCalculator, knowledge/confidence, DynamicConfidenceCalculator\n *\n * @module utils/confidence\n */\n/**\n * Calculate weighted score from signals\n *\n * @param signals - Map of signal name to value (0-1)\n * @param weights - Map of signal name to weight (0-1)\n * @returns Weighted score (0-1)\n *\n * @example\n * ```typescript\n * const score = calculateWeightedScore(\n * { coverage: 0.8, relevance: 0.6 },\n * { coverage: 0.5, relevance: 0.5 }\n * ); // Returns 0.7\n * ```\n */\nexport function calculateWeightedScore(signals, weights) {\n let totalWeight = 0;\n let weightedSum = 0;\n for (const [key, value] of Object.entries(signals)) {\n const weight = weights[key] ?? 0;\n totalWeight += weight;\n weightedSum += value * weight;\n }\n return totalWeight > 0 ? weightedSum / totalWeight : 0;\n}\n/**\n * Apply multiplicative penalties to a score\n *\n * @param score - Initial score (0-1)\n * @param penalties - Array of penalty multipliers (0-1, where 1 = no penalty)\n * @returns Score after penalties applied\n *\n * @example\n * ```typescript\n * const score = applyPenalties(0.8, [0.9, 0.8]); // Returns 0.576 (0.8 * 0.9 * 0.8)\n * ```\n */\nexport function applyPenalties(score, penalties) {\n return penalties.reduce((acc, penalty) => acc * penalty, score);\n}\n/**\n * Apply additive penalties to a score\n *\n * @param score - Initial score (0-1)\n * @param penalties - Array of penalty amounts to subtract\n * @param min - Minimum score floor (default: 0)\n * @returns Score after penalties applied, clamped to min\n *\n * @example\n * ```typescript\n * const score = applyAdditivePenalties(0.8, [0.1, 0.05], 0.1); // Returns 0.65\n * ```\n */\nexport function applyAdditivePenalties(score, penalties, min = 0) {\n const totalPenalty = penalties.reduce((sum, p) => sum + p, 0);\n return Math.max(min, score - totalPenalty);\n}\n/**\n * Convert numeric score to categorical level\n *\n * @param score - Numeric score (0-1)\n * @param thresholds - Map of level name to minimum score\n * @returns Level name for the score\n *\n * @example\n * ```typescript\n * const level = scoreToLevel(0.75, { high: 0.8, medium: 0.5, low: 0.25 });\n * // Returns \"medium\"\n * ```\n */\nexport function scoreToLevel(score, thresholds) {\n // Sort thresholds descending\n const sorted = Object.entries(thresholds).sort(([, a], [, b]) => b - a);\n // Find first threshold that score meets or exceeds\n for (const [level, threshold] of sorted) {\n if (score >= threshold) {\n return level;\n }\n }\n // Return lowest level if no threshold met\n return sorted[sorted.length - 1][0];\n}\n/**\n * Clamp score to valid range\n *\n * @param score - Score to clamp\n * @param min - Minimum value (default: 0)\n * @param max - Maximum value (default: 1)\n * @returns Clamped score\n *\n * @example\n * ```typescript\n * clampScore(1.5) // Returns 1.0\n * clampScore(-0.2) // Returns 0.0\n * clampScore(0.5, 0.1, 0.9) // Returns 0.5\n * ```\n */\nexport function clampScore(score, min = 0, max = 1) {\n return Math.max(min, Math.min(max, score));\n}\n/**\n * Calculate exponential decay factor for recency\n *\n * @param ageInDays - Age in days\n * @param halfLifeDays - Half-life in days (default: 30)\n * @returns Decay factor (0-1)\n *\n * @example\n * ```typescript\n * recencyDecay(0) // Returns 1.0 (today)\n * recencyDecay(30) // Returns 0.5 (half-life)\n * recencyDecay(60) // Returns 0.25 (two half-lives)\n * ```\n */\nexport function recencyDecay(ageInDays, halfLifeDays = 30) {\n return 0.5 ** (ageInDays / halfLifeDays);\n}\n/**\n * Calculate success rate with Laplace smoothing\n *\n * @param successes - Number of successes\n * @param total - Total attempts\n * @param smoothing - Smoothing factor (default: 2)\n * @returns Smoothed success rate (0-1)\n *\n * @example\n * ```typescript\n * successRate(10, 10) // Returns 0.917 (not 1.0 due to smoothing)\n * successRate(0, 0) // Returns 0.5 (unknown -> neutral)\n * successRate(5, 10) // Returns 0.5\n * ```\n */\nexport function successRate(successes, total, smoothing = 2) {\n // Laplace smoothing: (successes + α) / (total + 2α)\n // where α = smoothing / 2\n const alpha = smoothing / 2;\n return (successes + alpha) / (total + 2 * alpha);\n}\n/**\n * Calculate exponentially weighted moving average (EWMA)\n *\n * @param currentValue - Current EWMA value\n * @param newSample - New sample to incorporate\n * @param alpha - Smoothing factor (0-1, default: 0.2)\n * @returns Updated EWMA value\n *\n * @example\n * ```typescript\n * let ewma = 0.5;\n * ewma = calculateEWMA(ewma, 0.8, 0.2); // Returns 0.56\n * ewma = calculateEWMA(ewma, 0.9, 0.2); // Returns 0.628\n * ```\n */\nexport function calculateEWMA(currentValue, newSample, alpha = 0.2) {\n return alpha * newSample + (1 - alpha) * currentValue;\n}\n/**\n * Combine multiple scores with geometric mean\n *\n * @param scores - Array of scores (0-1)\n * @returns Geometric mean of scores\n *\n * @example\n * ```typescript\n * geometricMean([0.8, 0.6, 0.9]) // Returns 0.759\n * geometricMean([0.9, 0.9, 0.1]) // Returns 0.437 (heavily penalized by low score)\n * ```\n */\nexport function geometricMean(scores) {\n if (scores.length === 0) {\n return 0;\n }\n const product = scores.reduce((acc, score) => acc * score, 1);\n return product ** (1 / scores.length);\n}\n/**\n * Calculate confidence interval bounds\n *\n * @param score - Point estimate (0-1)\n * @param sampleSize - Number of samples\n * @param confidenceLevel - Confidence level (default: 0.95)\n * @returns Lower and upper bounds\n *\n * @example\n * ```typescript\n * const bounds = confidenceInterval(0.7, 100, 0.95);\n * // Returns { lower: 0.61, upper: 0.79 }\n * ```\n */\nexport function confidenceInterval(score, sampleSize, confidenceLevel = 0.95) {\n if (sampleSize === 0) {\n return { lower: 0, upper: 1 };\n }\n // Wilson score interval (more accurate than normal approximation)\n const z = confidenceLevel === 0.95 ? 1.96 : 2.58; // 95% or 99%\n const p = score;\n const n = sampleSize;\n const denominator = 1 + (z * z) / n;\n const center = p + (z * z) / (2 * n);\n const margin = z * Math.sqrt((p * (1 - p)) / n + (z * z) / (4 * n * n));\n return {\n lower: clampScore((center - margin) / denominator),\n upper: clampScore((center + margin) / denominator),\n };\n}\n","/**\n * Query Classifier for Adaptive Retrieval\n *\n * Classifies queries into types and returns optimal RRF weights.\n * Based on 2025 Adaptive RAG research:\n * - Factual queries benefit from keyword-heavy retrieval (exact matching)\n * - Conceptual queries benefit from semantic-heavy retrieval (understanding)\n * - Exploratory queries use balanced weights\n *\n * @see https://www.meilisearch.com/blog/adaptive-rag\n * @see https://superlinked.com/vectorhub/articles/optimizing-rag-with-hybrid-search-reranking\n */\n\nexport type QueryType = \"factual\" | \"conceptual\" | \"exploratory\";\n\n/**\n * Query complexity level for retrieval strategy selection\n * @see https://arxiv.org/abs/2501.07391 - Adaptive RAG complexity classification\n */\nexport type QueryComplexity = \"simple\" | \"moderate\" | \"complex\";\n\nexport interface QueryClassification {\n\t/** The classified query type */\n\ttype: QueryType;\n\t/** Query complexity for retrieval strategy */\n\tcomplexity: QueryComplexity;\n\t/** Classification confidence (0-1) */\n\tconfidence: number;\n\t/** Adaptive RRF weights for this query type */\n\tweights: {\n\t\tsemantic: number;\n\t\tkeyword: number;\n\t};\n\t/** Reasoning for classification (for debugging) */\n\treason: string;\n}\n\n/**\n * Retrieval strategy based on query complexity\n * @see https://medium.com/@tuhinsharma121/understanding-adaptive-rag\n */\nexport interface RetrievalStrategy {\n\t/** Whether to perform retrieval at all */\n\tshouldRetrieve: boolean;\n\t/** Number of results to retrieve */\n\ttopK: number;\n\t/** Whether to apply reranking */\n\tuseReranking: boolean;\n\t/** Whether to expand query with synonyms */\n\tuseExpansion: boolean;\n}\n\n/**\n * Weight configurations per query type\n * Based on research: factual needs keyword=0.7, conceptual needs semantic=0.7\n */\nconst WEIGHT_CONFIGS: Record<QueryType, { semantic: number; keyword: number }> = {\n\tfactual: { semantic: 0.3, keyword: 0.7 },\n\tconceptual: { semantic: 0.7, keyword: 0.3 },\n\texploratory: { semantic: 0.5, keyword: 0.5 },\n};\n\n/**\n * Pattern sets for query classification\n */\nconst PATTERNS = {\n\t// Factual: specific lookups, exact terms, \"what is\", \"how to\"\n\tfactual: {\n\t\tprefixes: [\n\t\t\t/^what\\s+is\\s+/i,\n\t\t\t/^what's\\s+/i,\n\t\t\t/^where\\s+is\\s+/i,\n\t\t\t/^where\\s+/i, // \"where is the X defined?\"\n\t\t\t/^which\\s+/i,\n\t\t\t/^how\\s+to\\s+/i,\n\t\t\t/^how\\s+do\\s+(?:i|you|we)\\s+/i,\n\t\t\t/^show\\s+me\\s+/i,\n\t\t\t/^find\\s+/i,\n\t\t\t/^get\\s+/i,\n\t\t\t/^list\\s+/i,\n\t\t],\n\t\t// Specific technical terms, paths, function names\n\t\tindicators: [\n\t\t\t/\\b[A-Z][a-z]+[A-Z]\\w+\\b/, // CamelCase (class names)\n\t\t\t/\\b[a-z]+_[a-z]+\\b/, // snake_case (variables)\n\t\t\t/\\b\\w+\\.\\w+\\b/, // dot notation (file.ext, obj.prop)\n\t\t\t/\\b(?:import|export|from|require)\\b/, // import statements\n\t\t\t/['\"`][\\w./]+['\"`]/, // quoted strings (paths, names)\n\t\t\t/\\b(?:function|class|const|let|var|type|interface)\\s+\\w+/, // declarations\n\t\t\t/\\b\\d+\\.\\d+(?:\\.\\d+)?\\b/, // version numbers\n\t\t\t/\\b[A-Z_]{2,}\\b/, // CONSTANTS\n\t\t\t/\\b\\w+\\/\\w+/, // file paths with slashes\n\t\t\t/\\.(?:ts|tsx|js|jsx|py|go|rs|java|cpp|c|h)(?:\\b|$)/i, // file extensions\n\t\t\t/=>|->|\\(\\)|{}|\\[\\]/, // code syntax patterns\n\t\t\t/\\b(?:TypeError|Error|Exception|undefined|null)\\b/, // error types\n\t\t],\n\t\t// Weight boost for exact match signals\n\t\texactMatchBoost: [\n\t\t\t/\\bexact\\b/i,\n\t\t\t/\\bspecific\\b/i,\n\t\t\t/\\bpath\\b/i,\n\t\t\t/\\bfile\\b/i,\n\t\t\t/\\bfunction\\b/i,\n\t\t\t/\\bclass\\b/i,\n\t\t\t/\\bimport\\b/i,\n\t\t\t/\\berror\\b/i,\n\t\t\t/\\bfix\\b/i,\n\t\t\t/\\bbug\\b/i,\n\t\t\t/\\bdefined\\b/i,\n\t\t\t/\\blocated\\b/i,\n\t\t\t/\\bmiddleware\\b/i,\n\t\t\t/\\bsocket\\b/i,\n\t\t\t/\\bIPC\\b/i,\n\t\t\t/\\bdaemon\\b/i,\n\t\t\t/\\btrigger\\b/i,\n\t\t\t/\\btest(?:s|ing)?\\b/i,\n\t\t],\n\t},\n\n\t// Conceptual: understanding, reasoning, \"why\", \"explain\"\n\tconceptual: {\n\t\tprefixes: [\n\t\t\t/^why\\s+/i,\n\t\t\t/^explain\\s+/i,\n\t\t\t/^what\\s+(?:does|do|is\\s+the\\s+purpose|is\\s+the\\s+difference|are\\s+the\\s+best)\\s+/i,\n\t\t\t/^how\\s+does\\s+/i,\n\t\t\t/^understand\\s+/i,\n\t\t\t/^describe\\s+/i,\n\t\t\t/^compare\\s+/i,\n\t\t\t/^when\\s+should\\s+/i,\n\t\t],\n\t\tindicators: [\n\t\t\t/\\b(?:concept|pattern|principle|approach|strategy|architecture)\\b/i,\n\t\t\t/\\b(?:best\\s+practice|trade-?off|pros?\\s+and\\s+cons?)\\b/i,\n\t\t\t/\\b(?:difference\\s+between|versus|vs\\.?)\\b/i,\n\t\t\t/\\b(?:should\\s+i|when\\s+to|when\\s+should)\\b/i,\n\t\t\t/\\b(?:better|worse|prefer|recommend)\\b/i,\n\t\t\t/\\b(?:design|philosophy|reasoning|rationale)\\b/i,\n\t\t\t/\\b(?:purpose\\s+of|purpose)\\b/i,\n\t\t\t/\\b(?:authentication|authorization)\\s+work/i,\n\t\t\t/\\bSSR\\b.*\\bCSR\\b|\\bCSR\\b.*\\bSSR\\b/i, // SSR vs CSR comparison\n\t\t],\n\t},\n\n\t// Exploratory: open-ended, general browsing (NOT \"how does X work\")\n\texploratory: {\n\t\tprefixes: [/^tell\\s+me\\s+about\\s+/i, /^can\\s+(?:i|you|we)\\s+/i, /^is\\s+(?:it|there)\\s+/i],\n\t\tindicators: [\n\t\t\t/\\b(?:overview|general|introduction|getting\\s+started)\\b/i,\n\t\t\t/\\b(?:example|sample|demo|tutorial)\\b/i,\n\t\t\t/\\?$/, // Questions without specific type\n\t\t],\n\t},\n};\n\n/**\n * Classify a query to determine optimal retrieval weights\n *\n * @param query - The user's query string\n * @returns Classification with type, confidence, and adaptive weights\n *\n * @example\n * ```typescript\n * const result = classifyQuery(\"What is the import path for RuntimeRouter?\");\n * // { type: \"factual\", confidence: 0.9, weights: { semantic: 0.3, keyword: 0.7 } }\n *\n * const result2 = classifyQuery(\"Why should I use dependency injection?\");\n * // { type: \"conceptual\", confidence: 0.85, weights: { semantic: 0.7, keyword: 0.3 } }\n * ```\n */\nexport function classifyQuery(query: string): QueryClassification {\n\tconst normalizedQuery = query.trim();\n\n\tif (!normalizedQuery) {\n\t\treturn {\n\t\t\ttype: \"exploratory\",\n\t\t\tcomplexity: \"simple\",\n\t\t\tconfidence: 0.5,\n\t\t\tweights: WEIGHT_CONFIGS.exploratory,\n\t\t\treason: \"Empty query, defaulting to exploratory [simple]\",\n\t\t};\n\t}\n\n\t// Calculate scores for each type\n\tconst scores = {\n\t\tfactual: calculateFactualScore(normalizedQuery),\n\t\tconceptual: calculateConceptualScore(normalizedQuery),\n\t\texploratory: calculateExploratoryScore(normalizedQuery),\n\t};\n\n\t// Find the winning type\n\tconst entries = Object.entries(scores) as [QueryType, number][];\n\tentries.sort((a, b) => b[1] - a[1]);\n\n\tconst [winningType, winningScore] = entries[0];\n\tconst [, secondScore] = entries[1];\n\n\t// Calculate confidence based on margin\n\tconst margin = winningScore - secondScore;\n\tconst confidence = Math.min(0.95, 0.5 + margin * 0.5);\n\n\t// Calculate complexity for retrieval strategy\n\tconst complexity = calculateComplexity(normalizedQuery);\n\n\t// Build reason string\n\tconst reason = buildReason(winningType, normalizedQuery, scores, complexity);\n\n\treturn {\n\t\ttype: winningType,\n\t\tcomplexity,\n\t\tconfidence,\n\t\tweights: WEIGHT_CONFIGS[winningType],\n\t\treason,\n\t};\n}\n\n/**\n * Calculate factual score (specific lookups, exact terms)\n */\nfunction calculateFactualScore(query: string): number {\n\tlet score = 0;\n\tconst lowerQuery = query.toLowerCase();\n\n\t// Check prefixes (strong signal)\n\tfor (const pattern of PATTERNS.factual.prefixes) {\n\t\tif (pattern.test(query)) {\n\t\t\tscore += 0.45;\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t// Check indicators (moderate signal) - accumulate more aggressively\n\tlet indicatorCount = 0;\n\tfor (const pattern of PATTERNS.factual.indicators) {\n\t\tif (pattern.test(query)) {\n\t\t\tindicatorCount++;\n\t\t}\n\t}\n\t// First indicator worth more, diminishing returns\n\tif (indicatorCount > 0) {\n\t\tscore += 0.25 + Math.min(indicatorCount - 1, 3) * 0.1;\n\t}\n\n\t// Exact match boost\n\tfor (const pattern of PATTERNS.factual.exactMatchBoost) {\n\t\tif (pattern.test(query)) {\n\t\t\tscore += 0.12;\n\t\t}\n\t}\n\n\t// Short queries with specific terms are likely factual (2-5 words)\n\tconst words = query.split(/\\s+/);\n\tif (words.length >= 2 && words.length <= 5 && score > 0) {\n\t\tscore += 0.15;\n\t}\n\n\t// Acronyms and abbreviations boost (but NOT when comparing them)\n\tconst acronymCount = (query.match(/\\b[A-Z]{2,}\\b/g) || []).length;\n\tconst hasComparison =\n\t\tlowerQuery.includes(\"vs\") ||\n\t\tlowerQuery.includes(\"versus\") ||\n\t\tlowerQuery.includes(\"between\") ||\n\t\tlowerQuery.includes(\"trade-off\") ||\n\t\tlowerQuery.includes(\"tradeoff\") ||\n\t\tlowerQuery.includes(\"compare\");\n\t// Reduce acronym boost when comparing (likely conceptual)\n\tscore += acronymCount * (hasComparison ? 0.05 : 0.15);\n\n\t// Pure code snippet detection (no question words, just code)\n\tif (/^(?:const|let|var|function|class|import|export|async|await)\\s/.test(query)) {\n\t\tscore += 0.3;\n\t}\n\n\treturn Math.min(1.0, score);\n}\n\n/**\n * Calculate conceptual score (understanding, reasoning)\n */\nfunction calculateConceptualScore(query: string): number {\n\tlet score = 0;\n\tconst lowerQuery = query.toLowerCase();\n\n\t// Check prefixes (strong signal)\n\tfor (const pattern of PATTERNS.conceptual.prefixes) {\n\t\tif (pattern.test(query)) {\n\t\t\tscore += 0.55;\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t// Check indicators - accumulate\n\tlet indicatorCount = 0;\n\tfor (const pattern of PATTERNS.conceptual.indicators) {\n\t\tif (pattern.test(query)) {\n\t\t\tindicatorCount++;\n\t\t}\n\t}\n\tif (indicatorCount > 0) {\n\t\tscore += 0.25 + Math.min(indicatorCount - 1, 2) * 0.15;\n\t}\n\n\t// Longer queries tend to be more conceptual\n\tconst words = query.split(/\\s+/);\n\tif (words.length > 8) {\n\t\tscore += 0.15;\n\t}\n\n\t// \"What is the purpose\" pattern (strong conceptual signal)\n\tif (/what\\s+is\\s+the\\s+purpose/i.test(query)) {\n\t\tscore += 0.4;\n\t}\n\n\t// \"How does X work\" pattern (conceptual about understanding)\n\tif (/how\\s+does\\s+.*\\s+work/i.test(query)) {\n\t\tscore += 0.35;\n\t}\n\n\t// \"WHY\" anywhere in caps suggests emphasis on reasoning\n\tif (/\\bWHY\\b/.test(query)) {\n\t\tscore += 0.3;\n\t}\n\n\t// \"why does X\" with code identifiers is still conceptual (understanding behavior)\n\t// Boost to counter code identifier factual boost\n\tif (/^why\\s+does\\s+/i.test(query)) {\n\t\tconst hasCodeIdentifier = /\\b[A-Z][a-z]+[A-Z]\\w+\\b/.test(query) || /\\b[a-z]+_[a-z]+\\b/.test(query);\n\t\tif (hasCodeIdentifier) {\n\t\t\tscore += 0.35; // Extra boost to overcome code identifier factual score\n\t\t}\n\t}\n\n\t// \"best practices\" is conceptual\n\tif (lowerQuery.includes(\"best practice\")) {\n\t\tscore += 0.3;\n\t}\n\n\t// \"trade-off\" is explicitly conceptual (comparing approaches)\n\tif (lowerQuery.includes(\"trade-off\") || lowerQuery.includes(\"tradeoff\") || lowerQuery.includes(\"trade off\")) {\n\t\tscore += 0.55;\n\t}\n\n\t// Comparisons with acronyms are conceptual (e.g., \"JWT vs session\")\n\tconst hasComparison =\n\t\tlowerQuery.includes(\" vs \") ||\n\t\tlowerQuery.includes(\" versus \") ||\n\t\tlowerQuery.includes(\"difference between\") ||\n\t\tlowerQuery.includes(\"compare \");\n\tconst acronymCount = (query.match(/\\b[A-Z]{2,}\\b/g) || []).length;\n\tif (hasComparison && acronymCount > 0) {\n\t\tscore += 0.4; // Strong conceptual signal when comparing acronyms\n\t}\n\n\t// \"what is the difference\" pattern (explicitly conceptual)\n\tif (/what\\s+is\\s+the\\s+difference/i.test(query)) {\n\t\tscore += 0.45;\n\t}\n\n\treturn Math.min(1.0, score);\n}\n\n/**\n * Calculate exploratory score (general browsing, open-ended)\n */\nfunction calculateExploratoryScore(query: string): number {\n\tlet score = 0.15; // Lower base score - exploratory is fallback, not default\n\n\t// Check prefixes\n\tfor (const pattern of PATTERNS.exploratory.prefixes) {\n\t\tif (pattern.test(query)) {\n\t\t\tscore += 0.25;\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t// Check indicators\n\tfor (const pattern of PATTERNS.exploratory.indicators) {\n\t\tif (pattern.test(query)) {\n\t\t\tscore += 0.15;\n\t\t}\n\t}\n\n\t// Medium-length queries are often exploratory\n\tconst words = query.split(/\\s+/);\n\tif (words.length >= 4 && words.length <= 8) {\n\t\tscore += 0.1;\n\t}\n\n\t// Questions ending with \"?\" without strong signals elsewhere\n\tif (/\\?$/.test(query) && words.length <= 6) {\n\t\tscore += 0.1;\n\t}\n\n\treturn Math.min(1.0, score);\n}\n\n/**\n * Build a human-readable reason for the classification\n */\nfunction buildReason(\n\ttype: QueryType,\n\tquery: string,\n\tscores: Record<QueryType, number>,\n\tcomplexity: QueryComplexity,\n): string {\n\tconst scoreStr = Object.entries(scores)\n\t\t.map(([t, s]) => `${t}=${s.toFixed(2)}`)\n\t\t.join(\", \");\n\n\tconst complexityStr = `[${complexity}]`;\n\n\tswitch (type) {\n\t\tcase \"factual\":\n\t\t\tif (/\\b[A-Z][a-z]+[A-Z]\\w+\\b/.test(query)) {\n\t\t\t\treturn `CamelCase identifier detected ${complexityStr} (${scoreStr})`;\n\t\t\t}\n\t\t\tif (/^(?:what|where|which|how\\s+to)\\s+/i.test(query)) {\n\t\t\t\treturn `Factual prefix pattern ${complexityStr} (${scoreStr})`;\n\t\t\t}\n\t\t\treturn `Technical term patterns ${complexityStr} (${scoreStr})`;\n\n\t\tcase \"conceptual\":\n\t\t\tif (/^why\\s+/i.test(query)) {\n\t\t\t\treturn `\"Why\" question ${complexityStr} (${scoreStr})`;\n\t\t\t}\n\t\t\tif (/^explain\\s+/i.test(query)) {\n\t\t\t\treturn `Explanation request ${complexityStr} (${scoreStr})`;\n\t\t\t}\n\t\t\treturn `Conceptual indicators ${complexityStr} (${scoreStr})`;\n\n\t\tcase \"exploratory\":\n\t\t\treturn `General exploration ${complexityStr} (${scoreStr})`;\n\t}\n}\n\n/**\n * Get weight configuration for a specific query type\n */\nexport function getWeightsForType(type: QueryType): { semantic: number; keyword: number } {\n\treturn { ...WEIGHT_CONFIGS[type] };\n}\n\n/**\n * Validate that weights sum to 1.0\n */\nexport function validateWeights(weights: { semantic: number; keyword: number }): boolean {\n\tconst sum = weights.semantic + weights.keyword;\n\treturn Math.abs(sum - 1.0) < 0.01;\n}\n\n/**\n * Calculate query complexity for retrieval strategy selection\n *\n * @see https://arxiv.org/abs/2501.07391 - Adaptive RAG complexity classification\n *\n * Complexity levels:\n * - simple: Short queries, single entity lookups (skip or minimal retrieval)\n * - moderate: Standard queries (normal retrieval)\n * - complex: Multi-part questions, comparisons, conditionals (aggressive retrieval)\n */\nexport function calculateComplexity(query: string): QueryComplexity {\n\tconst words = query.split(/\\s+/).filter((w) => w.length > 0);\n\tconst wordCount = words.length;\n\n\tlet complexityScore = 0;\n\n\t// Word count impact - standard queries (5-10 words) get baseline boost\n\tif (wordCount < 4) {\n\t\tcomplexityScore -= 0.3;\n\t} else if (wordCount >= 5 && wordCount <= 10) {\n\t\tcomplexityScore += 0.1; // Standard queries baseline\n\t} else if (wordCount > 15) {\n\t\tcomplexityScore += 0.4;\n\t} else if (wordCount > 10) {\n\t\tcomplexityScore += 0.2;\n\t}\n\n\t// Multiple clauses indicate complexity\n\tconst hasMultipleClauses = /\\b(and|or|but|while|whereas|although)\\b/i.test(query);\n\tif (hasMultipleClauses) {\n\t\tcomplexityScore += 0.25;\n\t}\n\n\t// Comparisons add complexity\n\tconst hasComparison = /\\b(compare|vs\\.?|versus|difference\\s+between|better\\s+than|worse\\s+than)\\b/i.test(query);\n\tif (hasComparison) {\n\t\tcomplexityScore += 0.25;\n\t}\n\n\t// Conditionals add complexity\n\tconst hasConditional = /\\b(if|when|unless|whether|in\\s+case|depending)\\b/i.test(query);\n\tif (hasConditional) {\n\t\tcomplexityScore += 0.2;\n\t}\n\n\t// Multiple questions in one query\n\tconst questionCount = (query.match(/\\?/g) || []).length;\n\tif (questionCount > 1) {\n\t\tcomplexityScore += 0.3;\n\t}\n\n\t// Multi-part structure (e.g., \"first... then... finally\")\n\tconst hasSequence = /\\b(first|then|next|finally|also|additionally|furthermore)\\b/i.test(query);\n\tif (hasSequence) {\n\t\tcomplexityScore += 0.15;\n\t}\n\n\t// Nested concepts (e.g., \"how does X affect Y's Z\")\n\tconst hasPossessive = /'s\\s+\\w+/.test(query) || /\\bof\\s+the\\s+\\w+/.test(query);\n\tif (hasPossessive && wordCount > 6) {\n\t\tcomplexityScore += 0.1;\n\t}\n\n\t// Simple patterns that reduce complexity\n\tconst isSimpleLookup = /^(?:what\\s+is|where\\s+is|show\\s+me|find|get)\\s+\\w+$/i.test(query);\n\tif (isSimpleLookup) {\n\t\tcomplexityScore -= 0.4;\n\t}\n\n\t// Single entity lookup\n\tconst isSingleEntity = wordCount <= 3 && /^[A-Z]\\w+$/.test(words[0] || \"\");\n\tif (isSingleEntity) {\n\t\tcomplexityScore -= 0.3;\n\t}\n\n\t// Classify based on score\n\t// Thresholds calibrated for: simple (<0.1), moderate (0.1-0.35), complex (>0.35)\n\tif (complexityScore < 0.1) {\n\t\treturn \"simple\";\n\t}\n\tif (complexityScore <= 0.35) {\n\t\treturn \"moderate\";\n\t}\n\treturn \"complex\";\n}\n\n/**\n * Get retrieval strategy based on query complexity and type\n *\n * @see https://www.meilisearch.com/blog/adaptive-rag\n *\n * Strategies:\n * - simple + high confidence: skip retrieval or use k=3\n * - moderate: standard k=10 with reranking\n * - complex: aggressive k=20 with reranking and expansion\n */\nexport function getRetrievalStrategy(\n\tcomplexity: QueryComplexity,\n\ttype: QueryType,\n\tconfidence: number,\n): RetrievalStrategy {\n\t// Simple queries with high confidence can skip or minimize retrieval\n\tif (complexity === \"simple\" && confidence > 0.85) {\n\t\treturn {\n\t\t\tshouldRetrieve: false, // Skip retrieval - LLM can handle\n\t\t\ttopK: 0,\n\t\t\tuseReranking: false,\n\t\t\tuseExpansion: false,\n\t\t};\n\t}\n\n\tif (complexity === \"simple\") {\n\t\treturn {\n\t\t\tshouldRetrieve: true,\n\t\t\ttopK: 3, // Minimal retrieval\n\t\t\tuseReranking: false,\n\t\t\tuseExpansion: false,\n\t\t};\n\t}\n\n\t// Moderate complexity: standard retrieval with reranking\n\tif (complexity === \"moderate\") {\n\t\treturn {\n\t\t\tshouldRetrieve: true,\n\t\t\ttopK: 10,\n\t\t\tuseReranking: true,\n\t\t\tuseExpansion: type === \"factual\", // Expand factual queries\n\t\t};\n\t}\n\n\t// Complex queries: aggressive retrieval\n\treturn {\n\t\tshouldRetrieve: true,\n\t\ttopK: 20,\n\t\tuseReranking: true,\n\t\tuseExpansion: true,\n\t};\n}\n\n/**\n * Code-related synonyms for query expansion\n * Used for factual queries to improve recall\n */\nexport const CODE_SYNONYMS: Record<string, string[]> = {\n\tfunction: [\"method\", \"fn\", \"func\", \"handler\", \"callback\"],\n\tclass: [\"type\", \"interface\", \"struct\", \"model\"],\n\terror: [\"exception\", \"bug\", \"issue\", \"failure\", \"fault\"],\n\timport: [\"require\", \"include\", \"use\", \"dependency\"],\n\tconfig: [\"configuration\", \"settings\", \"options\", \"prefs\"],\n\tapi: [\"endpoint\", \"route\", \"service\", \"handler\"],\n\tdatabase: [\"db\", \"store\", \"persistence\", \"repository\"],\n\ttest: [\"spec\", \"unit test\", \"assertion\", \"check\"],\n\tcomponent: [\"widget\", \"element\", \"module\", \"part\"],\n\tstate: [\"data\", \"store\", \"context\", \"props\"],\n};\n\n/**\n * Expand query with code synonyms for better recall\n * Only expands factual queries to avoid noise\n *\n * @param query - Original query\n * @param type - Query type\n * @returns Array of query variants (original + expanded)\n */\nexport function expandQuery(query: string, type: QueryType): string[] {\n\t// Only expand factual queries\n\tif (type !== \"factual\") {\n\t\treturn [query];\n\t}\n\n\tconst expanded = [query];\n\tconst lowerQuery = query.toLowerCase();\n\n\tfor (const [term, synonyms] of Object.entries(CODE_SYNONYMS)) {\n\t\tif (lowerQuery.includes(term)) {\n\t\t\t// Add one synonym variant per term found\n\t\t\tconst synonym = synonyms[0]; // Use first synonym\n\t\t\tif (synonym) {\n\t\t\t\texpanded.push(query.replace(new RegExp(`\\\\b${term}\\\\b`, \"gi\"), synonym));\n\t\t\t}\n\t\t}\n\t}\n\n\t// Limit to 3 variants to avoid over-expansion\n\treturn expanded.slice(0, 3);\n}\n","/**\n * Advisory Context Types\n *\n * Structured warnings, suggestions, and contextual guidance for LLMs.\n *\n * Based on research:\n * - GitHub Copilot Autofix - structured feedback model\n * - CodeGuard security framework - layered warnings\n * - Context Engineering patterns - proactive guidance\n */\n\n/**\n * Warning severity levels\n */\nexport type WarningSeverity = \"error\" | \"warning\" | \"info\";\n\n/**\n * Structured warning with code reference\n */\nexport interface AdvisoryWarning {\n\t/** Severity level */\n\tlevel: WarningSeverity;\n\t/** Warning code (e.g., 'FRAGILE_FILE', 'LOOP_DETECTED') */\n\tcode: string;\n\t/** Human-readable message */\n\tmessage: string;\n\t/** File path (if applicable) */\n\tfile?: string;\n\t/** Line number (if applicable) */\n\tline?: number;\n\t/** Related files */\n\trelatedFiles?: string[];\n\t/** Suggested action */\n\tsuggestion?: string;\n\t/** Documentation link */\n\tdocUrl?: string;\n}\n\n/**\n * File history context\n */\nexport interface FileHistory {\n\t/** File path */\n\tpath: string;\n\t/** Modifications today */\n\tmodificationsToday: number;\n\t/** Modifications this session */\n\tmodificationsThisSession: number;\n\t/** Rollbacks this week */\n\trollbacksThisWeek: number;\n\t/** Last modified by (user/agent) */\n\tlastModifiedBy: string;\n\t/** Last modified timestamp */\n\tlastModified: number;\n\t/** Fragility score (0-1, 1 = very fragile) */\n\tfragilityScore: number;\n\t/** Average time to rollback (ms) */\n\taverageTimeToRollback?: number;\n}\n\n/**\n * Related file suggestion\n */\nexport interface RelatedFile {\n\t/** File path */\n\tpath: string;\n\t/** Relationship reason */\n\treason: string;\n\t/** Co-change frequency (0-1) */\n\tcoChangeFrequency?: number;\n}\n\n/**\n * Proactive suggestion for LLM\n */\nexport interface ProactiveSuggestion {\n\t/** Suggestion text */\n\ttext: string;\n\t/** Priority (1 = highest) */\n\tpriority: number;\n\t/** Confidence (0-1) */\n\tconfidence: number;\n\t/** Category */\n\tcategory: \"testing\" | \"snapshot\" | \"validation\" | \"documentation\" | \"safety\";\n\t/** Relevant files */\n\tfiles?: string[];\n}\n\n/**\n * Advisory context enrichment\n * Injected into every tool response to guide LLM behavior\n */\nexport interface AdvisoryContext {\n\t/** Brief summary for LLM */\n\tsummary: string;\n\n\t/** Structured warnings */\n\twarnings: AdvisoryWarning[];\n\n\t/** Proactive suggestions (ranked by priority) */\n\tsuggestions: ProactiveSuggestion[];\n\n\t/** Related files to consider */\n\trelatedFiles: RelatedFile[];\n\n\t/** Historical context for relevant files */\n\tfileHistory: FileHistory[];\n\n\t/** Session-level context */\n\tsession?: {\n\t\t/** Current risk level */\n\t\triskLevel: \"low\" | \"medium\" | \"high\" | \"critical\";\n\t\t/** Tool calls so far */\n\t\ttoolCallCount: number;\n\t\t/** Files modified so far */\n\t\tfilesModified: number;\n\t\t/** Loops detected */\n\t\tloopsDetected: number;\n\t};\n\n\t/** Next recommended actions (for tool chaining) */\n\tnextActions?: string[];\n}\n\n/**\n * Advisory rule for generating context\n */\nexport interface AdvisoryRule {\n\t/** Rule ID */\n\tid: string;\n\t/** Trigger condition */\n\ttrigger: (context: AdvisoryTriggerContext) => boolean;\n\t/** Generate advisory content */\n\tgenerate: (context: AdvisoryTriggerContext) => Partial<AdvisoryContext>;\n\t/** Priority (1 = highest) */\n\tpriority: number;\n}\n\n/**\n * Context available to advisory rules\n */\nexport interface AdvisoryTriggerContext {\n\t/** Current tool call */\n\ttoolCall?: {\n\t\tname: string;\n\t\targs: Record<string, unknown>;\n\t};\n\t/** Target files */\n\tfiles: string[];\n\t/** Session state */\n\tsession: {\n\t\triskLevel: \"low\" | \"medium\" | \"high\" | \"critical\";\n\t\ttoolCallCount: number;\n\t\tfilesModified: number;\n\t\tloopsDetected: number;\n\t\tconsecutiveFileModifications: Map<string, number>;\n\t};\n\t/** File fragility scores */\n\tfragility: Map<string, number>;\n\t/** Recent violations */\n\trecentViolations: Array<{ type: string; file: string }>;\n}\n\n/**\n * Advisory engine configuration\n */\nexport interface AdvisoryConfig {\n\t/** Enable advisory enrichment */\n\tenabled: boolean;\n\t/** Max warnings per response */\n\tmaxWarnings: number;\n\t/** Max suggestions per response */\n\tmaxSuggestions: number;\n\t/** Max related files */\n\tmaxRelatedFiles: number;\n\t/** Include session context */\n\tincludeSessionContext: boolean;\n\t/** Include file history */\n\tincludeFileHistory: boolean;\n\t/** Custom advisory rules */\n\tcustomRules?: AdvisoryRule[];\n}\n\n/**\n * Default advisory configuration\n */\nexport const DEFAULT_ADVISORY_CONFIG: AdvisoryConfig = {\n\tenabled: true,\n\tmaxWarnings: 5,\n\tmaxSuggestions: 3,\n\tmaxRelatedFiles: 5,\n\tincludeSessionContext: true,\n\tincludeFileHistory: true,\n};\n","/**\n * Logger for Intelligence package\n *\n * Uses the contracts Logger interface for consistency across packages.\n * Wraps createLogger from @snapback/contracts with intelligence-specific configuration.\n */\n\nimport { createLogger, type Logger } from \"@snapback/contracts\";\n\n/**\n * Intelligence package logger instance\n * Uses contracts' createLogger for consistent logging interface\n */\nexport const logger: Logger = createLogger({\n\tname: \"intelligence\",\n\ttimestamps: process.env.NODE_ENV !== \"test\",\n});\n","/**\n * Consecutive Modification Rule\n *\n * Triggers warnings when files are modified repeatedly in session.\n * Indicates potential thrashing or uncertainty about implementation.\n */\n\nimport type { AdvisoryRule, AdvisoryWarning } from \"../../types/advisory.js\";\n\nexport const ConsecutiveModificationRule: AdvisoryRule = {\n\tid: \"consecutive-modification-warning\",\n\tpriority: 1,\n\ttrigger: (ctx) => {\n\t\tfor (const [_file, count] of ctx.session.consecutiveFileModifications.entries()) {\n\t\t\tif (count >= 3) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t},\n\tgenerate: (ctx) => {\n\t\tconst warnings: AdvisoryWarning[] = [];\n\n\t\tfor (const [file, count] of ctx.session.consecutiveFileModifications.entries()) {\n\t\t\tif (count >= 3) {\n\t\t\t\twarnings.push({\n\t\t\t\t\tlevel: \"warning\",\n\t\t\t\t\tcode: \"CONSECUTIVE_MODIFICATIONS\",\n\t\t\t\t\tmessage: `File modified ${count} times this session`,\n\t\t\t\t\tfile,\n\t\t\t\t\tsuggestion: \"Consider creating a snapshot before further modifications\",\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\treturn { warnings };\n\t},\n};\n","/**\n * Fragile File Rule\n *\n * Triggers warnings when files have high fragility scores.\n * Fragility indicates rollback risk based on historical patterns.\n */\n\nimport type { AdvisoryRule, AdvisoryWarning } from \"../../types/advisory.js\";\n\n/**\n * Fragility score thresholds (0-1 where 1 = very fragile)\n */\nconst FRAGILITY_THRESHOLDS = {\n\t/** Critical fragility - file very prone to rollbacks */\n\tHIGH: 0.7,\n\t/** Moderate fragility - file somewhat prone to issues */\n\tMODERATE: 0.5,\n} as const;\n\nexport const FragileFileRule: AdvisoryRule = {\n\tid: \"fragile-file-warning\",\n\tpriority: 2,\n\ttrigger: (ctx) => {\n\t\tfor (const [_file, score] of ctx.fragility.entries()) {\n\t\t\tif (score > FRAGILITY_THRESHOLDS.MODERATE) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t},\n\tgenerate: (ctx) => {\n\t\tconst warnings: AdvisoryWarning[] = [];\n\n\t\tfor (const [file, score] of ctx.fragility.entries()) {\n\t\t\tif (score > FRAGILITY_THRESHOLDS.HIGH) {\n\t\t\t\twarnings.push({\n\t\t\t\t\tlevel: \"error\",\n\t\t\t\t\tcode: \"FRAGILE_FILE\",\n\t\t\t\t\tmessage: `File has high fragility score (${(score * 100).toFixed(0)}%)`,\n\t\t\t\t\tfile,\n\t\t\t\t\tsuggestion: \"Create snapshot before modifying - high rollback risk\",\n\t\t\t\t});\n\t\t\t} else if (score > FRAGILITY_THRESHOLDS.MODERATE) {\n\t\t\t\twarnings.push({\n\t\t\t\t\tlevel: \"warning\",\n\t\t\t\t\tcode: \"FRAGILE_FILE\",\n\t\t\t\t\tmessage: `File has moderate fragility score (${(score * 100).toFixed(0)}%)`,\n\t\t\t\t\tfile,\n\t\t\t\t\tsuggestion: \"Proceed with caution - potential rollback risk\",\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\treturn { warnings };\n\t},\n};\n","/**\n * Generic Suggestions Rule\n *\n * Provides general best-practice suggestions based on session context.\n * Always applies - serves as baseline guidance.\n */\n\nimport type { AdvisoryRule, ProactiveSuggestion } from \"../../types/advisory.js\";\n\n/**\n * Session activity threshold for complexity warning\n */\nconst HIGH_TOOL_CALL_THRESHOLD = 20;\n\n/**\n * File type detection helpers\n */\nconst isTestFile = (file: string): boolean => /\\.(test|spec)\\.(ts|tsx|js|jsx)$/.test(file);\nconst isCodeFile = (file: string): boolean => /\\.(ts|tsx|js|jsx)$/.test(file);\n\nexport const GenericSuggestionsRule: AdvisoryRule = {\n\tid: \"generic-suggestions\",\n\tpriority: 10, // Low priority (runs last)\n\ttrigger: () => true, // Always applies\n\tgenerate: (ctx) => {\n\t\tconst suggestions: ProactiveSuggestion[] = [];\n\n\t\t// Snapshot suggestion for medium+ risk\n\t\tif (ctx.session.riskLevel === \"medium\" || ctx.session.riskLevel === \"high\") {\n\t\t\tsuggestions.push({\n\t\t\t\ttext: \"Create snapshot before continuing\",\n\t\t\t\tpriority: 1,\n\t\t\t\tconfidence: 0.8,\n\t\t\t\tcategory: \"snapshot\",\n\t\t\t\tfiles: ctx.files,\n\t\t\t});\n\t\t}\n\n\t\t// Testing suggestion for code changes\n\t\tif (ctx.files.some((f) => isCodeFile(f) && !isTestFile(f))) {\n\t\t\tsuggestions.push({\n\t\t\t\ttext: \"Run tests before committing\",\n\t\t\t\tpriority: 2,\n\t\t\t\tconfidence: 0.9,\n\t\t\t\tcategory: \"testing\",\n\t\t\t});\n\t\t}\n\n\t\t// Validation suggestion for high tool call count\n\t\tif (ctx.session.toolCallCount > HIGH_TOOL_CALL_THRESHOLD) {\n\t\t\tsuggestions.push({\n\t\t\t\ttext: \"Review changes - high tool call count may indicate complexity\",\n\t\t\t\tpriority: 3,\n\t\t\t\tconfidence: 0.7,\n\t\t\t\tcategory: \"validation\",\n\t\t\t});\n\t\t}\n\n\t\treturn { suggestions };\n\t},\n};\n","/**\n * Loop Detection Rule\n *\n * Triggers warnings when session loop detection indicates repeated operations.\n * Helps prevent infinite loops and wasted LLM cycles.\n */\n\nimport type { AdvisoryRule, AdvisoryWarning } from \"../../types/advisory.js\";\n\nexport const LoopDetectionRule: AdvisoryRule = {\n\tid: \"loop-detection-warning\",\n\tpriority: 1, // High priority - critical safety issue\n\ttrigger: (ctx) => {\n\t\treturn ctx.session.loopsDetected > 0;\n\t},\n\tgenerate: (ctx) => {\n\t\tconst warnings: AdvisoryWarning[] = [];\n\n\t\tif (ctx.session.loopsDetected > 0) {\n\t\t\twarnings.push({\n\t\t\t\tlevel: \"error\",\n\t\t\t\tcode: \"LOOP_DETECTED\",\n\t\t\t\tmessage: `${ctx.session.loopsDetected} loop${ctx.session.loopsDetected > 1 ? \"s\" : \"\"} detected in session`,\n\t\t\t\tsuggestion: \"Review recent tool calls - may be repeating same operations\",\n\t\t\t});\n\t\t}\n\n\t\treturn { warnings };\n\t},\n};\n","/**\n * Skipped Test Rule\n *\n * Advisory rule that detects skipped tests (describe.skip, it.skip, test.skip)\n * and generates proactive suggestions for AI agents.\n *\n * This enables the \"proactive pattern suggestions\" feature from the\n * Session Feedback Implementation spec.\n *\n * @module advisory/rules/SkippedTestRule\n */\n\nimport { detectSkippedTests, type SkippedTestResult } from \"@snapback/core/analysis\";\nimport type { AdvisoryRule, ProactiveSuggestion } from \"../../types/advisory.js\";\n\n/**\n * Check if a file is a test file\n */\nfunction isTestFile(filePath: string): boolean {\n\treturn filePath.includes(\".test.\") || filePath.includes(\".spec.\") || filePath.includes(\"__tests__\");\n}\n\n/**\n * SkippedTestRule - Detects skipped tests and generates suggestions\n *\n * Triggers when any test file is in the target files list.\n * Generates suggestions based on skipped test count:\n * - 1-2 skipped: priority 3 (low)\n * - 3-5 skipped: priority 2 (medium)\n * - 6+ skipped: priority 1 (high)\n */\nexport const SkippedTestRule: AdvisoryRule = {\n\tid: \"skipped-vitest-tests\",\n\tpriority: 2,\n\n\t/**\n\t * Trigger when any test file is in the target files\n\t */\n\ttrigger: (ctx) => {\n\t\treturn ctx.files.some(isTestFile);\n\t},\n\n\t/**\n\t * Generate suggestions based on skipped tests detected\n\t */\n\tgenerate: (ctx) => {\n\t\tconst suggestions: ProactiveSuggestion[] = [];\n\t\tconst allSkipped: SkippedTestResult[] = [];\n\t\tconst filesWithSkipped: string[] = [];\n\n\t\t// Analyze each test file\n\t\tfor (const file of ctx.files) {\n\t\t\tif (!isTestFile(file)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\t// Get code content - may come from context or need to be read\n\t\t\t\t// For now, we use detectSkippedTests which requires code content\n\t\t\t\t// The actual code reading happens in the facade that calls this rule\n\t\t\t\tconst code = (ctx as { code?: string }).code;\n\t\t\t\tif (!code) {\n\t\t\t\t\t// No code available, skip this file\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tconst result = detectSkippedTests(code, file);\n\t\t\t\tif (result.parsed && result.skipped.length > 0) {\n\t\t\t\t\tallSkipped.push(result);\n\t\t\t\t\tfilesWithSkipped.push(file);\n\t\t\t\t}\n\t\t\t} catch {}\n\t\t}\n\n\t\t// Calculate total skipped tests\n\t\tconst totalSkipped = allSkipped.reduce((sum, r) => sum + r.skipped.length, 0);\n\n\t\tif (totalSkipped === 0) {\n\t\t\treturn { suggestions: [] };\n\t\t}\n\n\t\t// Determine priority based on count\n\t\tlet priority: number;\n\t\tif (totalSkipped >= 6) {\n\t\t\tpriority = 1; // High priority\n\t\t} else if (totalSkipped >= 3) {\n\t\t\tpriority = 2; // Medium priority\n\t\t} else {\n\t\t\tpriority = 3; // Low priority\n\t\t}\n\n\t\t// Generate suggestion\n\t\tconst filesList =\n\t\t\tfilesWithSkipped.length <= 3 ? filesWithSkipped.join(\", \") : `${filesWithSkipped.length} files`;\n\n\t\tsuggestions.push({\n\t\t\ttext: `Found ${totalSkipped} skipped test${totalSkipped > 1 ? \"s\" : \"\"} in ${filesList}. Consider re-enabling these tests or removing if obsolete.`,\n\t\t\tpriority,\n\t\t\tconfidence: 0.9,\n\t\t\tcategory: \"testing\",\n\t\t\tfiles: filesWithSkipped,\n\t\t});\n\n\t\treturn { suggestions };\n\t},\n};\n","/**\n * Violation History Rule\n *\n * Surfaces past violations for files being modified.\n * Helps prevent repeating past mistakes.\n */\n\nimport type { AdvisoryRule, AdvisoryWarning } from \"../../types/advisory.js\";\n\nexport const ViolationHistoryRule: AdvisoryRule = {\n\tid: \"violation-history-warning\",\n\tpriority: 3,\n\ttrigger: (ctx) => {\n\t\treturn ctx.recentViolations.length > 0;\n\t},\n\tgenerate: (ctx) => {\n\t\tconst warnings: AdvisoryWarning[] = [];\n\n\t\t// Group violations by file\n\t\tconst violationsByFile = new Map<string, string[]>();\n\t\tfor (const violation of ctx.recentViolations) {\n\t\t\tconst existing = violationsByFile.get(violation.file) ?? [];\n\t\t\texisting.push(violation.type);\n\t\t\tviolationsByFile.set(violation.file, existing);\n\t\t}\n\n\t\t// Generate warnings\n\t\tfor (const [file, types] of violationsByFile.entries()) {\n\t\t\tconst uniqueTypes = [...new Set(types)];\n\t\t\twarnings.push({\n\t\t\t\tlevel: \"warning\",\n\t\t\t\tcode: \"VIOLATION_HISTORY\",\n\t\t\t\tmessage: `${uniqueTypes.length} past violation type${uniqueTypes.length > 1 ? \"s\" : \"\"}: ${uniqueTypes.join(\", \")}`,\n\t\t\t\tfile,\n\t\t\t\tsuggestion: \"Review past mistakes before modifying\",\n\t\t\t});\n\t\t}\n\n\t\treturn { warnings };\n\t},\n};\n","/**\n * Advisory Engine\n *\n * Generates structured warnings, suggestions, and contextual guidance for LLMs.\n * Enriches every tool response with actionable intelligence.\n *\n * Based on research:\n * - GitHub Copilot Autofix - structured feedback model\n * - CodeGuard security framework - layered warnings\n * - Context Engineering patterns - proactive guidance\n */\n\nimport type {\n\tAdvisoryConfig,\n\tAdvisoryContext,\n\tAdvisoryRule,\n\tAdvisoryTriggerContext,\n\tAdvisoryWarning,\n\tFileHistory,\n\tProactiveSuggestion,\n\tRelatedFile,\n} from \"../types/advisory.js\";\nimport { DEFAULT_ADVISORY_CONFIG } from \"../types/advisory.js\";\nimport { logger } from \"../utils/logger.js\";\nimport {\n\tConsecutiveModificationRule,\n\tFragileFileRule,\n\tGenericSuggestionsRule,\n\tLoopDetectionRule,\n\tViolationHistoryRule,\n} from \"./rules/index.js\";\n\n/**\n * Advisory Engine\n *\n * Orchestrates multiple advisory rules to generate contextual guidance.\n * Rules are executed by priority and results are merged with limit enforcement.\n */\nexport class AdvisoryEngine {\n\tprivate config: AdvisoryConfig;\n\tprivate rules: AdvisoryRule[] = [];\n\n\tconstructor(config: Partial<AdvisoryConfig> = {}) {\n\t\t// Validate configuration\n\t\tif (config.maxWarnings !== undefined && config.maxWarnings < 0) {\n\t\t\tthrow new Error(\"AdvisoryConfig.maxWarnings must be non-negative\");\n\t\t}\n\t\tif (config.maxSuggestions !== undefined && config.maxSuggestions < 0) {\n\t\t\tthrow new Error(\"AdvisoryConfig.maxSuggestions must be non-negative\");\n\t\t}\n\t\tif (config.maxRelatedFiles !== undefined && config.maxRelatedFiles < 0) {\n\t\t\tthrow new Error(\"AdvisoryConfig.maxRelatedFiles must be non-negative\");\n\t\t}\n\n\t\tthis.config = { ...DEFAULT_ADVISORY_CONFIG, ...config };\n\t\tthis.initializeBuiltInRules();\n\t}\n\n\t/**\n\t * Initialize built-in advisory rules\n\t */\n\tprivate initializeBuiltInRules(): void {\n\t\t// Register modular rules\n\t\tthis.registerRule(ConsecutiveModificationRule);\n\t\tthis.registerRule(FragileFileRule);\n\t\tthis.registerRule(LoopDetectionRule);\n\t\tthis.registerRule(ViolationHistoryRule);\n\t\tthis.registerRule(GenericSuggestionsRule);\n\t}\n\n\t/**\n\t * Register a custom advisory rule\n\t * Uses insertion sort for O(n) performance with small rule counts\n\t */\n\tregisterRule(rule: AdvisoryRule): void {\n\t\t// Find insertion point using binary search for O(log n)\n\t\tlet left = 0;\n\t\tlet right = this.rules.length;\n\n\t\twhile (left < right) {\n\t\t\tconst mid = Math.floor((left + right) / 2);\n\t\t\tif (this.rules[mid].priority < rule.priority) {\n\t\t\t\tleft = mid + 1;\n\t\t\t} else {\n\t\t\t\tright = mid;\n\t\t\t}\n\t\t}\n\n\t\t// Insert at correct position\n\t\tthis.rules.splice(left, 0, rule);\n\t}\n\n\t/**\n\t * Enrich context with advisory guidance\n\t */\n\tenrich(context: AdvisoryTriggerContext): AdvisoryContext {\n\t\t// Disabled check\n\t\tif (!this.config.enabled) {\n\t\t\treturn {\n\t\t\t\tsummary: \"Advisory system disabled\",\n\t\t\t\twarnings: [],\n\t\t\t\tsuggestions: [],\n\t\t\t\trelatedFiles: [],\n\t\t\t\tfileHistory: [],\n\t\t\t};\n\t\t}\n\n\t\t// Build advisory context\n\t\tconst warnings: AdvisoryWarning[] = [];\n\t\tconst suggestions: ProactiveSuggestion[] = [];\n\t\tconst relatedFiles: RelatedFile[] = [];\n\n\t\t// Execute triggered rules\n\t\tfor (const rule of this.rules) {\n\t\t\ttry {\n\t\t\t\tif (rule.trigger(context)) {\n\t\t\t\t\tconst result = rule.generate(context);\n\n\t\t\t\t\tif (result.warnings) {\n\t\t\t\t\t\twarnings.push(...result.warnings);\n\t\t\t\t\t}\n\t\t\t\t\tif (result.suggestions) {\n\t\t\t\t\t\tsuggestions.push(...result.suggestions);\n\t\t\t\t\t}\n\t\t\t\t\tif (result.relatedFiles) {\n\t\t\t\t\t\trelatedFiles.push(...result.relatedFiles);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tlogger.error(\"Advisory rule failed\", {\n\t\t\t\t\truleId: rule.id,\n\t\t\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\t// Enforce limits\n\t\tconst limitedWarnings = warnings.slice(0, this.config.maxWarnings);\n\t\tconst limitedSuggestions = suggestions\n\t\t\t.sort((a, b) => a.priority - b.priority)\n\t\t\t.slice(0, this.config.maxSuggestions);\n\t\tconst limitedRelatedFiles = relatedFiles.slice(0, this.config.maxRelatedFiles);\n\n\t\t// Generate file history\n\t\tconst fileHistory = this.config.includeFileHistory ? this.generateFileHistory(context) : [];\n\n\t\t// Generate summary\n\t\tconst summary = this.generateSummary(context);\n\n\t\t// Build session context\n\t\tconst sessionContext = this.config.includeSessionContext\n\t\t\t? {\n\t\t\t\t\triskLevel: context.session.riskLevel,\n\t\t\t\t\ttoolCallCount: context.session.toolCallCount,\n\t\t\t\t\tfilesModified: context.session.filesModified,\n\t\t\t\t\tloopsDetected: context.session.loopsDetected,\n\t\t\t\t}\n\t\t\t: undefined;\n\n\t\treturn {\n\t\t\tsummary,\n\t\t\twarnings: limitedWarnings,\n\t\t\tsuggestions: limitedSuggestions,\n\t\t\trelatedFiles: limitedRelatedFiles,\n\t\t\tfileHistory,\n\t\t\tsession: sessionContext,\n\t\t};\n\t}\n\n\t/**\n\t * Generate file history for target files\n\t */\n\tprivate generateFileHistory(context: AdvisoryTriggerContext): FileHistory[] {\n\t\treturn context.files.map((file) => {\n\t\t\tconst modificationsThisSession = context.session.consecutiveFileModifications.get(file) ?? 0;\n\t\t\tconst fragilityScore = context.fragility.get(file) ?? 0;\n\n\t\t\treturn {\n\t\t\t\tpath: file,\n\t\t\t\t// Phase 2 Enhancement (INT-010): Add persistent file modification tracking\n\t\t\t\t// TODO: Would need persistent tracking across sessions\n\t\t\t\tmodificationsToday: 0,\n\t\t\t\tmodificationsThisSession,\n\t\t\t\t// Phase 2 Enhancement (INT-011): Integrate with FragilityTracker\n\t\t\t\t// TODO: Would need fragility tracker with rollback event history\n\t\t\t\trollbacksThisWeek: 0,\n\t\t\t\t// Phase 2 Enhancement (INT-012): Add git integration for author tracking\n\t\t\t\t// TODO: Would need git blame/log integration\n\t\t\t\tlastModifiedBy: \"unknown\",\n\t\t\t\tlastModified: Date.now(),\n\t\t\t\tfragilityScore,\n\t\t\t};\n\t\t});\n\t}\n\n\t/**\n\t * Generate summary text\n\t */\n\tprivate generateSummary(context: AdvisoryTriggerContext): string {\n\t\tif (context.files.length === 0) {\n\t\t\treturn \"No specific files targeted\";\n\t\t}\n\n\t\t// Find most modified file\n\t\tlet maxMods = 0;\n\t\tlet maxModFile = \"\";\n\t\tfor (const [file, count] of context.session.consecutiveFileModifications.entries()) {\n\t\t\tif (count > maxMods) {\n\t\t\t\tmaxMods = count;\n\t\t\t\tmaxModFile = file;\n\t\t\t}\n\t\t}\n\n\t\tif (maxMods > 0) {\n\t\t\tconst fragility = context.fragility.get(maxModFile) ?? 0;\n\t\t\tconst fragilityLevel =\n\t\t\t\tfragility > 0.7 ? \"HIGH\" : fragility > 0.5 ? \"MODERATE\" : fragility > 0.3 ? \"LOW\" : \"STABLE\";\n\n\t\t\treturn `${maxModFile} has been modified ${maxMods} times this session (fragility: ${fragilityLevel})`;\n\t\t}\n\n\t\treturn `Analyzing ${context.files.length} file${context.files.length > 1 ? \"s\" : \"\"}`;\n\t}\n\n\t/**\n\t * Get file history (stub for future implementation)\n\t */\n\tgetFileHistory(file: string): FileHistory {\n\t\treturn {\n\t\t\tpath: file,\n\t\t\tmodificationsToday: 0,\n\t\t\tmodificationsThisSession: 0,\n\t\t\trollbacksThisWeek: 0,\n\t\t\tlastModifiedBy: \"unknown\",\n\t\t\tlastModified: Date.now(),\n\t\t\tfragilityScore: 0,\n\t\t};\n\t}\n}\n","/**\n * AnalysisMetadataStore - Intelligence Layer v2.0\n *\n * Tracks analysis results and their staleness for cache invalidation.\n * Per spec: Real-time staleness detection via index versioning and file watchers.\n *\n * Features:\n * - Store analysis metadata with createdAt, type, coverage\n * - Track validity (dependsOnFiles, indexVersion, expiresAt)\n * - Check staleness (files_changed, index_updated, expired, not_found)\n *\n * @module analysis/AnalysisMetadataStore\n */\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/** Analysis types supported by the store */\nexport type AnalysisType = \"breaking_change\" | \"dependency_chain\" | \"pattern_search\" | \"impact_analysis\";\n\n/** Reason why a file was skipped during analysis */\nexport type SkipReason = \"not_indexed\" | \"excluded\" | \"timeout\";\n\n/** Skipped file entry */\nexport interface SkippedFile {\n\tpath: string;\n\treason: SkipReason;\n}\n\n/** Coverage information for an analysis */\nexport interface AnalysisCoverage {\n\t/** Percentage of relevant files analyzed (0.0-1.0) */\n\tpercentage: number;\n\t/** Files that were successfully analyzed */\n\tfilesAnalyzed: string[];\n\t/** Files that were skipped with reasons */\n\tfilesSkipped: SkippedFile[];\n}\n\n/** Validity configuration for staleness tracking */\nexport interface AnalysisValidity {\n\t/** Files that, if changed, invalidate this analysis */\n\tdependsOnFiles: string[];\n\t/** Index version at time of analysis - invalidate if index grows */\n\tindexVersion: number;\n\t/** Hard TTL - always invalidate after this time */\n\texpiresAt: number;\n}\n\n/** Complete analysis metadata entry */\nexport interface AnalysisMetadata {\n\t/** Unique identifier for this analysis */\n\tid: string;\n\t/** Type of analysis performed */\n\ttype: AnalysisType;\n\t/** Timestamp when analysis was created */\n\tcreatedAt: number;\n\t/** Coverage information */\n\tcoverage: AnalysisCoverage;\n\t/** Validity configuration */\n\tvalidity: AnalysisValidity;\n\t/** Analysis results (type varies by analysis type) */\n\tresults: unknown;\n}\n\n/** Staleness check reason */\nexport type StalenessReason = \"files_changed\" | \"index_updated\" | \"expired\" | \"not_found\";\n\n/** Result of a staleness check */\nexport interface StalenessCheck {\n\t/** Whether the analysis is stale */\n\tstale: boolean;\n\t/** Reason why it's stale (if stale) */\n\treason?: StalenessReason;\n\t/** Files that changed (if reason is files_changed) */\n\tchangedFiles?: string[];\n\t/** New files indexed (if reason is index_updated) */\n\tnewFilesIndexed?: string[];\n\t/** User-facing suggestion */\n\tsuggestion?: string;\n}\n\n// =============================================================================\n// AnalysisMetadataStore Implementation\n// =============================================================================\n\n/**\n * AnalysisMetadataStore\n *\n * In-memory store for analysis metadata with staleness tracking.\n * Supports file change notifications and index version tracking.\n */\nexport class AnalysisMetadataStore {\n\tprivate cache = new Map<string, AnalysisMetadata>();\n\tprivate changedFiles = new Set<string>();\n\tprivate currentIndexVersion = 1;\n\n\t// =========================================================================\n\t// CRUD Operations\n\t// =========================================================================\n\n\t/**\n\t * Store analysis metadata\n\t */\n\tset(metadata: AnalysisMetadata): void {\n\t\tthis.cache.set(metadata.id, metadata);\n\t}\n\n\t/**\n\t * Retrieve analysis metadata by id\n\t */\n\tget(id: string): AnalysisMetadata | undefined {\n\t\treturn this.cache.get(id);\n\t}\n\n\t/**\n\t * Delete analysis metadata by id\n\t */\n\tdelete(id: string): boolean {\n\t\treturn this.cache.delete(id);\n\t}\n\n\t/**\n\t * Clear all metadata\n\t */\n\tclear(): void {\n\t\tthis.cache.clear();\n\t\tthis.changedFiles.clear();\n\t}\n\n\t/**\n\t * Get number of stored analyses\n\t */\n\tsize(): number {\n\t\treturn this.cache.size;\n\t}\n\n\t/**\n\t * List all analysis ids\n\t */\n\tlistIds(): string[] {\n\t\treturn Array.from(this.cache.keys());\n\t}\n\n\t// =========================================================================\n\t// Staleness Checking\n\t// =========================================================================\n\n\t/**\n\t * Check if an analysis is stale\n\t */\n\tasync checkStaleness(id: string): Promise<StalenessCheck> {\n\t\tconst meta = this.cache.get(id);\n\n\t\t// Check: Not found\n\t\tif (!meta) {\n\t\t\treturn { stale: true, reason: \"not_found\" };\n\t\t}\n\n\t\t// Check: Hard TTL expired\n\t\tif (Date.now() > meta.validity.expiresAt) {\n\t\t\treturn {\n\t\t\t\tstale: true,\n\t\t\t\treason: \"expired\",\n\t\t\t\tsuggestion: \"Analysis expired. Re-run for current results.\",\n\t\t\t};\n\t\t}\n\n\t\t// Check: File changes\n\t\tconst changedDeps = meta.validity.dependsOnFiles.filter((f) => this.changedFiles.has(f));\n\t\tif (changedDeps.length > 0) {\n\t\t\treturn {\n\t\t\t\tstale: true,\n\t\t\t\treason: \"files_changed\",\n\t\t\t\tchangedFiles: changedDeps,\n\t\t\t\tsuggestion: `${changedDeps.length} files changed. Re-run analysis?`,\n\t\t\t};\n\t\t}\n\n\t\t// Check: Index version growth\n\t\tif (this.currentIndexVersion > meta.validity.indexVersion) {\n\t\t\treturn {\n\t\t\t\tstale: true,\n\t\t\t\treason: \"index_updated\",\n\t\t\t\tnewFilesIndexed: [], // Could be populated by tracking new files\n\t\t\t\tsuggestion: `Index updated (${meta.validity.indexVersion} → ${this.currentIndexVersion}). New files may have been indexed. Results may be incomplete.`,\n\t\t\t};\n\t\t}\n\n\t\t// Analysis is fresh\n\t\treturn { stale: false };\n\t}\n\n\t// =========================================================================\n\t// Notification Methods\n\t// =========================================================================\n\n\t/**\n\t * Notify the store that a file has changed\n\t */\n\tnotifyFileChanged(filePath: string): void {\n\t\tthis.changedFiles.add(filePath);\n\t}\n\n\t/**\n\t * Notify the store of multiple file changes\n\t */\n\tnotifyFilesChanged(filePaths: string[]): void {\n\t\tfor (const path of filePaths) {\n\t\t\tthis.changedFiles.add(path);\n\t\t}\n\t}\n\n\t/**\n\t * Clear file change notifications\n\t */\n\tclearFileChanges(): void {\n\t\tthis.changedFiles.clear();\n\t}\n\n\t/**\n\t * Set current index version\n\t */\n\tsetCurrentIndexVersion(version: number): void {\n\t\tthis.currentIndexVersion = version;\n\t}\n\n\t/**\n\t * Get current index version\n\t */\n\tgetCurrentIndexVersion(): number {\n\t\treturn this.currentIndexVersion;\n\t}\n\n\t// =========================================================================\n\t// Utility Methods\n\t// =========================================================================\n\n\t/**\n\t * Get all stale analyses\n\t */\n\tasync getStaleAnalyses(): Promise<Array<{ id: string; staleness: StalenessCheck }>> {\n\t\tconst results: Array<{ id: string; staleness: StalenessCheck }> = [];\n\n\t\tfor (const id of this.cache.keys()) {\n\t\t\tconst staleness = await this.checkStaleness(id);\n\t\t\tif (staleness.stale) {\n\t\t\t\tresults.push({ id, staleness });\n\t\t\t}\n\t\t}\n\n\t\treturn results;\n\t}\n\n\t/**\n\t * Prune expired analyses\n\t */\n\tpruneExpired(): number {\n\t\tlet pruned = 0;\n\t\tconst now = Date.now();\n\n\t\tfor (const [id, meta] of this.cache.entries()) {\n\t\t\tif (now > meta.validity.expiresAt) {\n\t\t\t\tthis.cache.delete(id);\n\t\t\t\tpruned++;\n\t\t\t}\n\t\t}\n\n\t\treturn pruned;\n\t}\n}\n\n/**\n * Default instance for convenience\n */\nexport const defaultAnalysisMetadataStore = new AnalysisMetadataStore();\n","/**\n * ConfidenceEngine - Intelligence Layer v2.0\n *\n * Multi-signal confidence calculation with hard floors,\n * weighted combination, and calibrated output.\n *\n * Per snapback_effectiveness_impl.md spec:\n * - Layer 1: Evidence quality (graphCoverage, learningRelevance)\n * - Layer 2: Task clarity (taskAmbiguity, scopeSize)\n * - Layer 3: Historical (similarTaskSuccessRate, userTrustScore)\n *\n * @module calibration/ConfidenceEngine\n */\n\nimport { applyPenalties, calculateWeightedScore, clampScore } from \"@snapback/core\";\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/** Task ambiguity levels */\nexport type TaskAmbiguity = \"clear\" | \"ambiguous\" | \"vague\";\n\n/** Scope size categories */\nexport type ScopeSize = \"trivial\" | \"small\" | \"medium\" | \"large\" | \"massive\";\n\n/** Confidence levels for user-facing display */\nexport type ConfidenceLevel = \"high\" | \"medium\" | \"low\" | \"uncertain\";\n\n/**\n * Input signals for confidence calculation\n */\nexport interface ConfidenceSignals {\n\t// Layer 1: Evidence quality\n\t/** Whether the target file exists */\n\tfileExists: boolean;\n\t/** Percentage of relevant files indexed (0.0-1.0) */\n\tgraphCoverage: number;\n\t/** Semantic similarity of retrieved learnings (0.0-1.0) */\n\tlearningRelevance: number;\n\n\t// Layer 2: Task clarity\n\t/** How clear/ambiguous the task is */\n\ttaskAmbiguity: TaskAmbiguity;\n\t/** Size/scope of the change */\n\tscopeSize: ScopeSize;\n\t/** Whether retrieved learnings conflict */\n\thasConflictingLearnings: boolean;\n\n\t// Layer 3: Historical\n\t/** Success rate for similar tasks (0.0-1.0) */\n\tsimilarTaskSuccessRate: number;\n\t/** User trust score from EWMA (0.0-1.0) */\n\tuserTrustScore: number;\n}\n\n/**\n * Calibrated confidence result\n */\nexport interface CalibratedConfidence {\n\t/** Numeric confidence score (0.10-0.95) */\n\tscore: number;\n\t/** User-friendly confidence level */\n\tlevel: ConfidenceLevel;\n\t/** Human-readable explanation */\n\treason: string;\n}\n\n// =============================================================================\n// Constants\n// =============================================================================\n\n/** Hard floor thresholds */\nconst HARD_FLOORS = {\n\tFILE_NOT_FOUND_SCORE: 0.1,\n\tINCOMPLETE_ANALYSIS_SCORE: 0.25,\n\tGRAPH_COVERAGE_THRESHOLD: 0.3,\n};\n\n/** Weight configuration per layer */\nconst WEIGHTS = {\n\tevidence: 0.4, // 40% weight for evidence quality\n\tclarity: 0.35, // 35% weight for task clarity\n\thistorical: 0.25, // 25% weight for historical signals\n};\n\n/** Penalty multipliers */\nconst PENALTIES = {\n\tconflictingLearnings: 0.8, // 20% penalty for conflicting learnings\n\tvagueTask: 0.7, // 30% penalty for vague tasks\n};\n\n/** Score-to-level thresholds */\nconst LEVEL_THRESHOLDS = {\n\thigh: 0.8,\n\tmedium: 0.5,\n\tlow: 0.25,\n};\n\n/** Scope size scoring (higher = better clarity) */\nconst SCOPE_SCORES: Record<ScopeSize, number> = {\n\ttrivial: 1.0,\n\tsmall: 0.85,\n\tmedium: 0.65,\n\tlarge: 0.4,\n\tmassive: 0.2,\n};\n\n/** Ambiguity scoring */\nconst AMBIGUITY_SCORES: Record<TaskAmbiguity, number> = {\n\tclear: 1.0,\n\tambiguous: 0.5,\n\tvague: 0.2,\n};\n\n// =============================================================================\n// ConfidenceEngine Implementation\n// =============================================================================\n\n/**\n * ConfidenceEngine\n *\n * Calculates calibrated confidence scores using multi-signal analysis.\n * Implements the specification from snapback_effectiveness_impl.md.\n */\nexport class ConfidenceEngine {\n\t/**\n\t * Calculate confidence from input signals\n\t *\n\t * @param signals - Input signals across all three layers\n\t * @returns Calibrated confidence with score, level, and explanation\n\t */\n\tcalculate(signals: ConfidenceSignals): CalibratedConfidence {\n\t\t// Hard floor check: File doesn't exist\n\t\tif (!signals.fileExists) {\n\t\t\treturn {\n\t\t\t\tscore: HARD_FLOORS.FILE_NOT_FOUND_SCORE,\n\t\t\t\tlevel: \"uncertain\",\n\t\t\t\treason: \"File not found - unable to perform analysis\",\n\t\t\t};\n\t\t}\n\n\t\t// Hard floor check: Insufficient graph coverage\n\t\tif (signals.graphCoverage < HARD_FLOORS.GRAPH_COVERAGE_THRESHOLD) {\n\t\t\treturn {\n\t\t\t\tscore: HARD_FLOORS.INCOMPLETE_ANALYSIS_SCORE,\n\t\t\t\tlevel: \"low\",\n\t\t\t\treason: \"Incomplete analysis - less than 30% of dependency graph indexed\",\n\t\t\t};\n\t\t}\n\n\t\t// Calculate weighted combination using shared utilities\n\t\tconst base = 0.35;\n\n\t\t// Layer 1: Evidence score\n\t\tconst evidenceScore = calculateWeightedScore(\n\t\t\t{ graphCoverage: signals.graphCoverage, learningRelevance: signals.learningRelevance },\n\t\t\t{ graphCoverage: 0.5, learningRelevance: 0.5 },\n\t\t);\n\n\t\t// Layer 2: Clarity score\n\t\tconst clarityScore = this.calculateClarityScore(signals);\n\n\t\t// Layer 3: Historical score\n\t\tconst historicalScore = calculateWeightedScore(\n\t\t\t{ similarTaskSuccessRate: signals.similarTaskSuccessRate, userTrustScore: signals.userTrustScore },\n\t\t\t{ similarTaskSuccessRate: 0.7, userTrustScore: 0.3 },\n\t\t);\n\n\t\t// Weighted combination\n\t\tlet score =\n\t\t\tbase +\n\t\t\tevidenceScore * WEIGHTS.evidence +\n\t\t\tclarityScore * WEIGHTS.clarity +\n\t\t\thistoricalScore * WEIGHTS.historical;\n\n\t\t// Apply penalties using shared utility\n\t\tconst penalties: number[] = [];\n\t\tif (signals.hasConflictingLearnings) {\n\t\t\tpenalties.push(PENALTIES.conflictingLearnings);\n\t\t}\n\t\tif (signals.taskAmbiguity === \"vague\") {\n\t\t\tpenalties.push(PENALTIES.vagueTask);\n\t\t}\n\t\tscore = applyPenalties(score, penalties);\n\n\t\t// Clamp to valid range using shared utility\n\t\tscore = clampScore(score, 0.1, 0.95);\n\n\t\t// Build result\n\t\treturn {\n\t\t\tscore,\n\t\t\tlevel: this.scoreToLevel(score),\n\t\t\treason: this.buildExplanation(signals, score),\n\t\t};\n\t}\n\n\t/**\n\t * Calculate clarity score from ambiguity and scope\n\t */\n\tprivate calculateClarityScore(signals: ConfidenceSignals): number {\n\t\tconst ambiguityScore = AMBIGUITY_SCORES[signals.taskAmbiguity] ?? 0.5;\n\t\tconst scopeScore = SCOPE_SCORES[signals.scopeSize] ?? 0.5;\n\n\t\t// Weighted: 60% ambiguity, 40% scope\n\t\treturn ambiguityScore * 0.6 + scopeScore * 0.4;\n\t}\n\n\t/**\n\t * Convert numeric score to confidence level\n\t */\n\tprivate scoreToLevel(score: number): ConfidenceLevel {\n\t\tif (score >= LEVEL_THRESHOLDS.high) {\n\t\t\treturn \"high\";\n\t\t}\n\t\tif (score >= LEVEL_THRESHOLDS.medium) {\n\t\t\treturn \"medium\";\n\t\t}\n\t\tif (score >= LEVEL_THRESHOLDS.low) {\n\t\t\treturn \"low\";\n\t\t}\n\t\treturn \"uncertain\";\n\t}\n\n\t/**\n\t * Build human-readable explanation\n\t */\n\tprivate buildExplanation(signals: ConfidenceSignals, score: number): string {\n\t\tconst parts: string[] = [];\n\n\t\t// Overall assessment\n\t\tconst percentage = Math.round(score * 100);\n\t\tparts.push(`Confidence: ${percentage}%.`);\n\n\t\t// Evidence quality\n\t\tif (signals.graphCoverage < 0.5) {\n\t\t\tparts.push(`Partial coverage (${Math.round(signals.graphCoverage * 100)}% indexed).`);\n\t\t}\n\n\t\t// Task clarity\n\t\tif (signals.taskAmbiguity !== \"clear\") {\n\t\t\tparts.push(`Task is ${signals.taskAmbiguity}.`);\n\t\t}\n\t\tif (signals.scopeSize === \"large\" || signals.scopeSize === \"massive\") {\n\t\t\tparts.push(`Large scope (${signals.scopeSize}).`);\n\t\t}\n\n\t\t// Penalties applied\n\t\tif (signals.hasConflictingLearnings) {\n\t\t\tparts.push(\"Conflicting learnings detected.\");\n\t\t}\n\n\t\t// Historical signals\n\t\tif (signals.similarTaskSuccessRate < 0.5) {\n\t\t\tparts.push(\"Limited historical success.\");\n\t\t}\n\n\t\treturn parts.join(\" \");\n\t}\n}\n\n/**\n * Default instance for convenience\n */\nexport const defaultConfidenceEngine = new ConfidenceEngine();\n","/**\n * Context7 MCP Client\n *\n * Integrates with Context7 via MCP to validate code against\n * current documentation and API patterns.\n *\n * Provides:\n * - Import validation (deprecated packages)\n * - API usage validation\n * - Pattern recommendations\n */\n\nimport type { DocsValidation } from \"../../types/integrations.js\";\n\nexport interface Context7ClientOptions {\n\t/** Context7 API key */\n\tapiKey: string;\n\t/** Optional logger */\n\tlogger?: {\n\t\tdebug: (msg: string, data?: unknown) => void;\n\t\tinfo: (msg: string, data?: unknown) => void;\n\t\twarn: (msg: string, data?: unknown) => void;\n\t\terror: (msg: string, data?: unknown) => void;\n\t};\n}\n\n/**\n * Default logger that outputs to console\n */\nconst defaultLogger = {\n\tdebug: (msg: string, data?: unknown) => console.debug(`[context7-mcp] ${msg}`, data ?? \"\"),\n\tinfo: (msg: string, data?: unknown) => console.info(`[context7-mcp] ${msg}`, data ?? \"\"),\n\twarn: (msg: string, data?: unknown) => console.warn(`[context7-mcp] ${msg}`, data ?? \"\"),\n\terror: (msg: string, data?: unknown) => console.error(`[context7-mcp] ${msg}`, data ?? \"\"),\n};\n\n/**\n * Client for Context7 MCP server integration\n *\n * Validates code against documentation to identify:\n * - Deprecated packages\n * - Invalid API usage\n * - Anti-patterns\n */\nexport class Context7MCPClient {\n\tprivate mcpClient: unknown = null;\n\tprivate readonly apiKey: string;\n\tprivate readonly logger: Context7ClientOptions[\"logger\"];\n\tprivate connected = false;\n\n\tconstructor(options: Context7ClientOptions) {\n\t\tthis.apiKey = options.apiKey;\n\t\tthis.logger = options.logger ?? defaultLogger;\n\t}\n\n\t/**\n\t * Connect to the Context7 MCP server\n\t *\n\t * Uses dynamic import to avoid bundling issues.\n\t */\n\tasync connect(): Promise<void> {\n\t\tif (this.connected) {\n\t\t\treturn;\n\t\t}\n\n\t\ttry {\n\t\t\t// Dynamic import to avoid bundling issues\n\t\t\tconst { Client } = await import(\"@modelcontextprotocol/sdk/client/index.js\");\n\t\t\tconst { SSEClientTransport } = await import(\"@modelcontextprotocol/sdk/client/sse.js\");\n\n\t\t\tconst transport = new SSEClientTransport(new URL(\"https://mcp.context7.io/sse\"), {\n\t\t\t\trequestInit: {\n\t\t\t\t\theaders: {\n\t\t\t\t\t\tAuthorization: `Bearer ${this.apiKey}`,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t});\n\n\t\t\tthis.mcpClient = new Client({ name: \"snapback-intelligence\", version: \"1.0.0\" }, { capabilities: {} });\n\n\t\t\tawait (this.mcpClient as { connect: (t: unknown) => Promise<void> }).connect(transport);\n\t\t\tthis.connected = true;\n\t\t\tthis.logger?.info(\"Connected to Context7 MCP server\");\n\t\t} catch (error) {\n\t\t\tthis.logger?.error(\"Failed to connect to Context7 MCP server\", { error });\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\t/**\n\t * Validate a file against documentation\n\t *\n\t * Checks imports, API usage, and patterns against current docs.\n\t */\n\tasync validateFile(filePath: string, content: string, language: string): Promise<DocsValidation | null> {\n\t\tif (!this.mcpClient) {\n\t\t\tthis.logger?.warn(\"Context7 MCP client not connected\");\n\t\t\treturn null;\n\t\t}\n\n\t\ttry {\n\t\t\tconst client = this.mcpClient as {\n\t\t\t\tcallTool: (params: { name: string; arguments: Record<string, unknown> }) => Promise<unknown>;\n\t\t\t};\n\n\t\t\t// Extract imports from content\n\t\t\tconst imports = this.extractImports(content, language);\n\n\t\t\t// Validate each import\n\t\t\tconst importResults = await Promise.all(\n\t\t\t\timports.map(async (pkg) => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst result = await client.callTool({\n\t\t\t\t\t\t\tname: \"get_library_docs\",\n\t\t\t\t\t\t\targuments: { package: pkg, language },\n\t\t\t\t\t\t});\n\t\t\t\t\t\treturn this.parseLibraryDocs(pkg, result);\n\t\t\t\t\t} catch {\n\t\t\t\t\t\t// Return default for failed lookups\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tpackage: pkg,\n\t\t\t\t\t\t\tversion: null,\n\t\t\t\t\t\t\tlatestVersion: null,\n\t\t\t\t\t\t\tisDeprecated: false,\n\t\t\t\t\t\t\tdeprecationMessage: null,\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t}),\n\t\t\t);\n\n\t\t\t// Check API usage patterns\n\t\t\tlet apiUsage: DocsValidation[\"apiUsage\"] = [];\n\t\t\ttry {\n\t\t\t\tconst apiResult = await client.callTool({\n\t\t\t\t\tname: \"validate_api_usage\",\n\t\t\t\t\targuments: {\n\t\t\t\t\t\tcode: content,\n\t\t\t\t\t\tlanguage,\n\t\t\t\t\t\tpackages: imports,\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t\tapiUsage = this.parseApiUsage(apiResult);\n\t\t\t} catch {\n\t\t\t\t// API validation not available\n\t\t\t}\n\n\t\t\t// Get pattern recommendations\n\t\t\tlet patterns: DocsValidation[\"patterns\"] = [];\n\t\t\ttry {\n\t\t\t\tconst patternsResult = await client.callTool({\n\t\t\t\t\tname: \"get_patterns\",\n\t\t\t\t\targuments: {\n\t\t\t\t\t\tcode: content,\n\t\t\t\t\t\tlanguage,\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t\tpatterns = this.parsePatterns(patternsResult);\n\t\t\t} catch {\n\t\t\t\t// Pattern analysis not available\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tfile: filePath,\n\t\t\t\timports: importResults,\n\t\t\t\tapiUsage,\n\t\t\t\tpatterns,\n\t\t\t};\n\t\t} catch (error) {\n\t\t\tthis.logger?.error(\"Failed to validate with Context7\", { error, filePath });\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t/**\n\t * Check if a specific package is deprecated\n\t */\n\tasync checkDeprecation(packageName: string): Promise<{\n\t\tisDeprecated: boolean;\n\t\tmessage: string | null;\n\t\talternative: string | null;\n\t}> {\n\t\tif (!this.mcpClient) {\n\t\t\treturn { isDeprecated: false, message: null, alternative: null };\n\t\t}\n\n\t\ttry {\n\t\t\tconst client = this.mcpClient as {\n\t\t\t\tcallTool: (params: { name: string; arguments: Record<string, unknown> }) => Promise<unknown>;\n\t\t\t};\n\n\t\t\tconst result = await client.callTool({\n\t\t\t\tname: \"get_deprecations\",\n\t\t\t\targuments: { package: packageName },\n\t\t\t});\n\n\t\t\tconst data = this.extractToolResult(result) as Record<string, unknown>;\n\t\t\treturn {\n\t\t\t\tisDeprecated: Boolean(data?.isDeprecated),\n\t\t\t\tmessage: data?.message ? String(data.message) : null,\n\t\t\t\talternative: data?.alternative ? String(data.alternative) : null,\n\t\t\t};\n\t\t} catch {\n\t\t\treturn { isDeprecated: false, message: null, alternative: null };\n\t\t}\n\t}\n\n\t/**\n\t * Disconnect from the MCP server\n\t */\n\tasync disconnect(): Promise<void> {\n\t\tif (this.mcpClient && this.connected) {\n\t\t\ttry {\n\t\t\t\tawait (this.mcpClient as { close: () => Promise<void> }).close();\n\t\t\t} catch {\n\t\t\t\t// Ignore close errors\n\t\t\t}\n\t\t\tthis.mcpClient = null;\n\t\t\tthis.connected = false;\n\t\t}\n\t}\n\n\t// ---------------------------------------------------------------------------\n\t// Private Helpers\n\t// ---------------------------------------------------------------------------\n\n\t/**\n\t * Extract import statements from code\n\t */\n\tprivate extractImports(content: string, language: string): string[] {\n\t\tconst imports: string[] = [];\n\n\t\tif (language === \"typescript\" || language === \"javascript\") {\n\t\t\t// Match ES6 imports\n\t\t\tconst importRegex = /import\\s+(?:[\\s\\S]*?from\\s+)?['\"]([^'\"]+)['\"]/g;\n\t\t\tlet match;\n\t\t\twhile ((match = importRegex.exec(content)) !== null) {\n\t\t\t\tconst pkg = match[1];\n\t\t\t\tif (!pkg) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Skip relative imports\n\t\t\t\tif (pkg.startsWith(\".\") || pkg.startsWith(\"/\")) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Extract package name (handle scoped packages)\n\t\t\t\tconst pkgName = pkg.startsWith(\"@\") ? pkg.split(\"/\").slice(0, 2).join(\"/\") : pkg.split(\"/\")[0];\n\n\t\t\t\tif (pkgName && !imports.includes(pkgName)) {\n\t\t\t\t\timports.push(pkgName);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Match CommonJS requires\n\t\t\tconst requireRegex = /require\\s*\\(\\s*['\"]([^'\"]+)['\"]\\s*\\)/g;\n\t\t\twhile ((match = requireRegex.exec(content)) !== null) {\n\t\t\t\tconst pkg = match[1];\n\t\t\t\tif (!pkg) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tif (pkg.startsWith(\".\") || pkg.startsWith(\"/\")) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tconst pkgName = pkg.startsWith(\"@\") ? pkg.split(\"/\").slice(0, 2).join(\"/\") : pkg.split(\"/\")[0];\n\n\t\t\t\tif (pkgName && !imports.includes(pkgName)) {\n\t\t\t\t\timports.push(pkgName);\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (language === \"python\") {\n\t\t\t// Match Python imports\n\t\t\tconst importRegex = /(?:from\\s+(\\w+)|import\\s+(\\w+))/g;\n\t\t\tlet match;\n\t\t\twhile ((match = importRegex.exec(content)) !== null) {\n\t\t\t\tconst pkg = match[1] || match[2];\n\t\t\t\tif (pkg && !imports.includes(pkg)) {\n\t\t\t\t\timports.push(pkg);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn imports;\n\t}\n\n\tprivate parseLibraryDocs(pkg: string, result: unknown): DocsValidation[\"imports\"][0] {\n\t\ttry {\n\t\t\tconst data = this.extractToolResult(result) as Record<string, unknown>;\n\t\t\treturn {\n\t\t\t\tpackage: pkg,\n\t\t\t\tversion: data?.version ? String(data.version) : null,\n\t\t\t\tlatestVersion: data?.latestVersion ? String(data.latestVersion) : null,\n\t\t\t\tisDeprecated: Boolean(data?.isDeprecated),\n\t\t\t\tdeprecationMessage: data?.deprecationMessage ? String(data.deprecationMessage) : null,\n\t\t\t};\n\t\t} catch {\n\t\t\treturn {\n\t\t\t\tpackage: pkg,\n\t\t\t\tversion: null,\n\t\t\t\tlatestVersion: null,\n\t\t\t\tisDeprecated: false,\n\t\t\t\tdeprecationMessage: null,\n\t\t\t};\n\t\t}\n\t}\n\n\tprivate parseApiUsage(result: unknown): DocsValidation[\"apiUsage\"] {\n\t\ttry {\n\t\t\tconst data = this.extractToolResult(result);\n\t\t\tif (!Array.isArray(data)) {\n\t\t\t\treturn [];\n\t\t\t}\n\n\t\t\treturn data.map((item: Record<string, unknown>) => ({\n\t\t\t\tapi: String(item.api ?? \"\"),\n\t\t\t\tisValid: Boolean(item.isValid ?? true),\n\t\t\t\tissue: item.issue ? String(item.issue) : null,\n\t\t\t\tsuggestion: item.suggestion ? String(item.suggestion) : null,\n\t\t\t\tdocsUrl: item.docsUrl ? String(item.docsUrl) : null,\n\t\t\t}));\n\t\t} catch {\n\t\t\treturn [];\n\t\t}\n\t}\n\n\tprivate parsePatterns(result: unknown): DocsValidation[\"patterns\"] {\n\t\ttry {\n\t\t\tconst data = this.extractToolResult(result);\n\t\t\tif (!Array.isArray(data)) {\n\t\t\t\treturn [];\n\t\t\t}\n\n\t\t\treturn data.map((item: Record<string, unknown>) => ({\n\t\t\t\tpattern: String(item.pattern ?? \"\"),\n\t\t\t\tisRecommended: Boolean(item.isRecommended ?? true),\n\t\t\t\talternative: item.alternative ? String(item.alternative) : null,\n\t\t\t\treason: item.reason ? String(item.reason) : null,\n\t\t\t}));\n\t\t} catch {\n\t\t\treturn [];\n\t\t}\n\t}\n\n\tprivate extractToolResult(result: unknown): unknown {\n\t\t// MCP tool results typically come as { content: [{ type: 'text', text: '...' }] }\n\t\tif (\n\t\t\tresult &&\n\t\t\ttypeof result === \"object\" &&\n\t\t\t\"content\" in result &&\n\t\t\tArray.isArray((result as Record<string, unknown>).content)\n\t\t) {\n\t\t\tconst content = (result as { content: Array<{ type: string; text?: string }> }).content;\n\t\t\tconst textContent = content.find((c) => c.type === \"text\");\n\t\t\tif (textContent?.text) {\n\t\t\t\ttry {\n\t\t\t\t\treturn JSON.parse(textContent.text);\n\t\t\t\t} catch {\n\t\t\t\t\treturn textContent.text;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn result;\n\t}\n}\n\n/**\n * Create a Context7 MCP client from environment variables\n */\nexport function createContext7MCPClient(options?: Partial<Context7ClientOptions>): Context7MCPClient {\n\tconst apiKey = options?.apiKey ?? process.env.CONTEXT7_API_KEY;\n\n\tif (!apiKey) {\n\t\tthrow new Error(\"Context7 API key is required (CONTEXT7_API_KEY)\");\n\t}\n\n\treturn new Context7MCPClient({\n\t\tapiKey,\n\t\tlogger: options?.logger,\n\t});\n}\n","/**\n * Context7 Risk Factor Extraction\n *\n * Extracts risk factors from documentation validation\n * to contribute to overall risk assessment.\n */\n\nimport type { DocsValidation, RiskFactor } from \"../../types/integrations.js\";\n\n/**\n * Extract risk factors from Context7 validation\n *\n * Analyzes imports, API usage, and patterns against\n * current documentation.\n */\nexport function extractDocsRiskFactors(validation: DocsValidation): RiskFactor[] {\n\tconst factors: RiskFactor[] = [];\n\n\t// Factor: Deprecated packages\n\tconst deprecatedImports = validation.imports.filter((i) => i.isDeprecated);\n\tfor (const dep of deprecatedImports) {\n\t\tfactors.push({\n\t\t\tname: \"deprecated_package\",\n\t\t\tscore: 20,\n\t\t\tdescription: `${dep.package} is deprecated${dep.deprecationMessage ? `: ${dep.deprecationMessage}` : \"\"}`,\n\t\t\tsource: \"context7\",\n\t\t\tsuggestion: dep.deprecationMessage ?? \"Consider upgrading to a maintained alternative\",\n\t\t});\n\t}\n\n\t// Factor: Invalid API usage\n\tconst invalidApis = validation.apiUsage.filter((a) => !a.isValid);\n\tfor (const api of invalidApis) {\n\t\tfactors.push({\n\t\t\tname: \"invalid_api_usage\",\n\t\t\tscore: 30,\n\t\t\tdescription: `Invalid API: ${api.api}${api.issue ? ` - ${api.issue}` : \"\"}`,\n\t\t\tsource: \"context7\",\n\t\t\tsuggestion: api.suggestion ?? undefined,\n\t\t\tdocsUrl: api.docsUrl ?? undefined,\n\t\t});\n\t}\n\n\t// Factor: Non-recommended patterns (anti-patterns)\n\tconst antiPatterns = validation.patterns.filter((p) => !p.isRecommended);\n\tfor (const pattern of antiPatterns) {\n\t\tfactors.push({\n\t\t\tname: \"anti_pattern\",\n\t\t\tscore: 15,\n\t\t\tdescription: `Anti-pattern detected: ${pattern.pattern}${pattern.reason ? ` - ${pattern.reason}` : \"\"}`,\n\t\t\tsource: \"context7\",\n\t\t\tsuggestion: pattern.alternative ?? undefined,\n\t\t});\n\t}\n\n\t// Factor: Multiple outdated packages\n\tconst outdatedImports = validation.imports.filter(\n\t\t(i) => i.version && i.latestVersion && i.version !== i.latestVersion,\n\t);\n\n\tif (outdatedImports.length > 3) {\n\t\tfactors.push({\n\t\t\tname: \"multiple_outdated_deps\",\n\t\t\tscore: 10,\n\t\t\tdescription: `${outdatedImports.length} packages are outdated`,\n\t\t\tsource: \"context7\",\n\t\t\tsuggestion: \"Consider updating dependencies to latest versions\",\n\t\t});\n\t} else if (outdatedImports.length > 0) {\n\t\t// Individual minor warning for fewer outdated packages\n\t\tfactors.push({\n\t\t\tname: \"outdated_deps\",\n\t\t\tscore: 5,\n\t\t\tdescription: `${outdatedImports.length} package(s) have newer versions available`,\n\t\t\tsource: \"context7\",\n\t\t});\n\t}\n\n\t// Factor: Recommended patterns (positive signal)\n\tconst recommendedPatterns = validation.patterns.filter((p) => p.isRecommended);\n\tif (recommendedPatterns.length > 0) {\n\t\tfactors.push({\n\t\t\tname: \"follows_recommended_patterns\",\n\t\t\tscore: -5, // Negative = reduces risk\n\t\t\tdescription: `Code follows ${recommendedPatterns.length} recommended pattern(s)`,\n\t\t\tsource: \"context7\",\n\t\t});\n\t}\n\n\t// Factor: No deprecated packages (positive signal)\n\tif (validation.imports.length > 0 && deprecatedImports.length === 0) {\n\t\tfactors.push({\n\t\t\tname: \"no_deprecated_packages\",\n\t\t\tscore: -3,\n\t\t\tdescription: \"No deprecated packages detected\",\n\t\t\tsource: \"context7\",\n\t\t});\n\t}\n\n\t// Factor: All APIs valid (positive signal)\n\tif (validation.apiUsage.length > 0 && invalidApis.length === 0) {\n\t\tfactors.push({\n\t\t\tname: \"valid_api_usage\",\n\t\t\tscore: -3,\n\t\t\tdescription: \"All API usage validated against current documentation\",\n\t\t\tsource: \"context7\",\n\t\t});\n\t}\n\n\treturn factors;\n}\n\n/**\n * Calculate overall Context7 risk contribution\n */\nexport function calculateContext7RiskScore(validation: DocsValidation): number {\n\tconst factors = extractDocsRiskFactors(validation);\n\treturn factors.reduce((sum, factor) => sum + factor.score, 0);\n}\n\n/**\n * Get specific improvement suggestions from validation\n */\nexport function getImprovementSuggestions(\n\tvalidation: DocsValidation,\n): Array<{ type: string; message: string; priority: \"high\" | \"medium\" | \"low\" }> {\n\tconst suggestions: Array<{\n\t\ttype: string;\n\t\tmessage: string;\n\t\tpriority: \"high\" | \"medium\" | \"low\";\n\t}> = [];\n\n\t// Deprecated package suggestions\n\tfor (const dep of validation.imports.filter((i) => i.isDeprecated)) {\n\t\tsuggestions.push({\n\t\t\ttype: \"deprecated_package\",\n\t\t\tmessage: `Replace deprecated package: ${dep.package}${dep.deprecationMessage ? ` - ${dep.deprecationMessage}` : \"\"}`,\n\t\t\tpriority: \"high\",\n\t\t});\n\t}\n\n\t// Invalid API suggestions\n\tfor (const api of validation.apiUsage.filter((a) => !a.isValid)) {\n\t\tsuggestions.push({\n\t\t\ttype: \"invalid_api\",\n\t\t\tmessage: `Fix API usage: ${api.api}${api.suggestion ? ` - ${api.suggestion}` : \"\"}`,\n\t\t\tpriority: \"high\",\n\t\t});\n\t}\n\n\t// Anti-pattern suggestions\n\tfor (const pattern of validation.patterns.filter((p) => !p.isRecommended)) {\n\t\tsuggestions.push({\n\t\t\ttype: \"anti_pattern\",\n\t\t\tmessage: `Refactor: ${pattern.pattern}${pattern.alternative ? ` - Consider: ${pattern.alternative}` : \"\"}`,\n\t\t\tpriority: \"medium\",\n\t\t});\n\t}\n\n\t// Outdated package suggestions\n\tfor (const pkg of validation.imports.filter((i) => i.version && i.latestVersion && i.version !== i.latestVersion)) {\n\t\tsuggestions.push({\n\t\t\ttype: \"outdated_package\",\n\t\t\tmessage: `Update ${pkg.package} from ${pkg.version} to ${pkg.latestVersion}`,\n\t\t\tpriority: \"low\",\n\t\t});\n\t}\n\n\treturn suggestions;\n}\n","/**\n * GitHub MCP Client\n *\n * Integrates with GitHub via MCP to gather file context including:\n * - Recent commits\n * - Active PRs\n * - Related issues\n *\n * Uses the official @modelcontextprotocol/server-github MCP server.\n */\n\nimport type { GitHubContext } from \"../../types/integrations.js\";\n\nexport interface GitHubMCPClientOptions {\n\t/** GitHub personal access token */\n\ttoken: string;\n\t/** Repository owner */\n\towner: string;\n\t/** Repository name */\n\trepo: string;\n\t/** Optional logger */\n\tlogger?: {\n\t\tdebug: (msg: string, data?: unknown) => void;\n\t\tinfo: (msg: string, data?: unknown) => void;\n\t\twarn: (msg: string, data?: unknown) => void;\n\t\terror: (msg: string, data?: unknown) => void;\n\t};\n}\n\n/**\n * Default logger that outputs to console\n */\nconst defaultLogger = {\n\tdebug: (msg: string, data?: unknown) => console.debug(`[github-mcp] ${msg}`, data ?? \"\"),\n\tinfo: (msg: string, data?: unknown) => console.info(`[github-mcp] ${msg}`, data ?? \"\"),\n\twarn: (msg: string, data?: unknown) => console.warn(`[github-mcp] ${msg}`, data ?? \"\"),\n\terror: (msg: string, data?: unknown) => console.error(`[github-mcp] ${msg}`, data ?? \"\"),\n};\n\n/**\n * Client for GitHub MCP server integration\n *\n * Provides file context from GitHub including commit history,\n * PR status, and related issues.\n */\nexport class GitHubMCPClient {\n\tprivate mcpClient: unknown = null;\n\tprivate readonly config: GitHubMCPClientOptions;\n\tprivate readonly logger: GitHubMCPClientOptions[\"logger\"];\n\tprivate connected = false;\n\n\tconstructor(options: GitHubMCPClientOptions) {\n\t\tthis.config = options;\n\t\tthis.logger = options.logger ?? defaultLogger;\n\t}\n\n\t/**\n\t * Connect to the GitHub MCP server\n\t *\n\t * Uses dynamic import to avoid bundling issues with native modules.\n\t */\n\tasync connect(): Promise<void> {\n\t\tif (this.connected) {\n\t\t\treturn;\n\t\t}\n\n\t\ttry {\n\t\t\t// Dynamic import to avoid bundling issues\n\t\t\tconst { Client } = await import(\"@modelcontextprotocol/sdk/client/index.js\");\n\t\t\tconst { StdioClientTransport } = await import(\"@modelcontextprotocol/sdk/client/stdio.js\");\n\n\t\t\tconst transport = new StdioClientTransport({\n\t\t\t\tcommand: \"npx\",\n\t\t\t\targs: [\"-y\", \"@modelcontextprotocol/server-github\"],\n\t\t\t\tenv: {\n\t\t\t\t\t...process.env,\n\t\t\t\t\tGITHUB_PERSONAL_ACCESS_TOKEN: this.config.token,\n\t\t\t\t},\n\t\t\t});\n\n\t\t\tthis.mcpClient = new Client({ name: \"snapback-intelligence\", version: \"1.0.0\" }, { capabilities: {} });\n\n\t\t\tawait (this.mcpClient as { connect: (t: unknown) => Promise<void> }).connect(transport);\n\t\t\tthis.connected = true;\n\t\t\tthis.logger?.info(\"Connected to GitHub MCP server\");\n\t\t} catch (error) {\n\t\t\tthis.logger?.error(\"Failed to connect to GitHub MCP server\", { error });\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\t/**\n\t * Get file context from GitHub\n\t *\n\t * Gathers recent commits, active PRs, and related issues for a file.\n\t */\n\tasync getFileContext(filePath: string): Promise<GitHubContext | null> {\n\t\tif (!this.mcpClient) {\n\t\t\tthis.logger?.warn(\"GitHub MCP client not connected\");\n\t\t\treturn null;\n\t\t}\n\n\t\ttry {\n\t\t\tconst client = this.mcpClient as {\n\t\t\t\tcallTool: (params: { name: string; arguments: Record<string, unknown> }) => Promise<unknown>;\n\t\t\t};\n\n\t\t\t// Get recent commits for the file\n\t\t\tconst commitsResult = await client.callTool({\n\t\t\t\tname: \"get_file_commits\",\n\t\t\t\targuments: {\n\t\t\t\t\towner: this.config.owner,\n\t\t\t\t\trepo: this.config.repo,\n\t\t\t\t\tpath: filePath,\n\t\t\t\t\tper_page: 10,\n\t\t\t\t},\n\t\t\t});\n\n\t\t\tconst commits = this.parseCommits(commitsResult);\n\n\t\t\t// Check for active PRs\n\t\t\tconst prsResult = await client.callTool({\n\t\t\t\tname: \"list_pull_requests\",\n\t\t\t\targuments: {\n\t\t\t\t\towner: this.config.owner,\n\t\t\t\t\trepo: this.config.repo,\n\t\t\t\t\tstate: \"open\",\n\t\t\t\t},\n\t\t\t});\n\n\t\t\tconst activePR = this.findPRForFile(prsResult, filePath);\n\n\t\t\t// Search for related issues\n\t\t\tconst issuesResult = await client.callTool({\n\t\t\t\tname: \"search_issues\",\n\t\t\t\targuments: {\n\t\t\t\t\tquery: `repo:${this.config.owner}/${this.config.repo} ${filePath} in:body`,\n\t\t\t\t},\n\t\t\t});\n\n\t\t\tconst relatedIssues = this.parseIssues(issuesResult);\n\n\t\t\treturn {\n\t\t\t\tfile: filePath,\n\t\t\t\trecentCommits: commits,\n\t\t\t\tactivePR,\n\t\t\t\trelatedIssues,\n\t\t\t\tlastModifiedBy: commits[0]?.author ?? null,\n\t\t\t\tchangeFrequency: this.calculateChangeFrequency(commits),\n\t\t\t};\n\t\t} catch (error) {\n\t\t\tthis.logger?.error(\"Failed to get GitHub context\", { error, filePath });\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t/**\n\t * Get commit details by SHA\n\t */\n\tasync getCommit(sha: string): Promise<GitHubContext[\"recentCommits\"][0] | null> {\n\t\tif (!this.mcpClient) {\n\t\t\treturn null;\n\t\t}\n\n\t\ttry {\n\t\t\tconst client = this.mcpClient as {\n\t\t\t\tcallTool: (params: { name: string; arguments: Record<string, unknown> }) => Promise<unknown>;\n\t\t\t};\n\n\t\t\tconst result = await client.callTool({\n\t\t\t\tname: \"get_commit\",\n\t\t\t\targuments: {\n\t\t\t\t\towner: this.config.owner,\n\t\t\t\t\trepo: this.config.repo,\n\t\t\t\t\tref: sha,\n\t\t\t\t},\n\t\t\t});\n\n\t\t\treturn this.parseSingleCommit(result);\n\t\t} catch (error) {\n\t\t\tthis.logger?.error(\"Failed to get commit\", { error, sha });\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t/**\n\t * Disconnect from the MCP server\n\t */\n\tasync disconnect(): Promise<void> {\n\t\tif (this.mcpClient && this.connected) {\n\t\t\ttry {\n\t\t\t\tawait (this.mcpClient as { close: () => Promise<void> }).close();\n\t\t\t} catch {\n\t\t\t\t// Ignore close errors\n\t\t\t}\n\t\t\tthis.mcpClient = null;\n\t\t\tthis.connected = false;\n\t\t}\n\t}\n\n\t// ---------------------------------------------------------------------------\n\t// Private Helpers\n\t// ---------------------------------------------------------------------------\n\n\tprivate parseCommits(result: unknown): GitHubContext[\"recentCommits\"] {\n\t\ttry {\n\t\t\t// MCP tool result is typically { content: [{ type: 'text', text: '...' }] }\n\t\t\tconst data = this.extractToolResult(result);\n\t\t\tif (!Array.isArray(data)) {\n\t\t\t\treturn [];\n\t\t\t}\n\n\t\t\treturn data.slice(0, 10).map((commit: Record<string, unknown>) => {\n\t\t\t\tconst commitObj = commit.commit as Record<string, unknown> | undefined;\n\t\t\t\tconst authorObj = commit.author as Record<string, unknown> | undefined;\n\t\t\t\tconst commitAuthor = commitObj?.author as Record<string, unknown> | undefined;\n\t\t\t\tconst statsObj = commit.stats as Record<string, unknown> | undefined;\n\n\t\t\t\treturn {\n\t\t\t\t\tsha: String(commit.sha ?? \"\"),\n\t\t\t\t\tmessage: String(commit.message ?? commitObj?.message ?? \"\"),\n\t\t\t\t\tauthor: String(authorObj?.login ?? commitAuthor?.name ?? \"unknown\"),\n\t\t\t\t\tdate: String(commitAuthor?.date ?? new Date().toISOString()),\n\t\t\t\t\tadditions: Number(statsObj?.additions ?? 0),\n\t\t\t\t\tdeletions: Number(statsObj?.deletions ?? 0),\n\t\t\t\t};\n\t\t\t});\n\t\t} catch {\n\t\t\treturn [];\n\t\t}\n\t}\n\n\tprivate parseSingleCommit(result: unknown): GitHubContext[\"recentCommits\"][0] | null {\n\t\ttry {\n\t\t\tconst data = this.extractToolResult(result);\n\t\t\tif (!data || typeof data !== \"object\") {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tconst commit = data as Record<string, unknown>;\n\t\t\treturn {\n\t\t\t\tsha: String(commit.sha ?? \"\"),\n\t\t\t\tmessage: String(commit.message ?? (commit.commit as Record<string, unknown>)?.message ?? \"\"),\n\t\t\t\tauthor: String(\n\t\t\t\t\t(commit.author as Record<string, unknown>)?.login ??\n\t\t\t\t\t\t((commit.commit as Record<string, unknown>)?.author as Record<string, unknown>)?.name ??\n\t\t\t\t\t\t\"unknown\",\n\t\t\t\t),\n\t\t\t\tdate: String(\n\t\t\t\t\t((commit.commit as Record<string, unknown>)?.author as Record<string, unknown>)?.date ??\n\t\t\t\t\t\tnew Date().toISOString(),\n\t\t\t\t),\n\t\t\t\tadditions: Number((commit.stats as Record<string, unknown>)?.additions ?? 0),\n\t\t\t\tdeletions: Number((commit.stats as Record<string, unknown>)?.deletions ?? 0),\n\t\t\t};\n\t\t} catch {\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tprivate findPRForFile(result: unknown, filePath: string): GitHubContext[\"activePR\"] {\n\t\ttry {\n\t\t\tconst data = this.extractToolResult(result);\n\t\t\tif (!Array.isArray(data)) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\t// Find a PR that might include this file\n\t\t\t// In a real implementation, we'd check PR files\n\t\t\tconst pr = data.find((pr: Record<string, unknown>) => {\n\t\t\t\t// Check if PR body mentions the file\n\t\t\t\tconst body = String(pr.body ?? \"\").toLowerCase();\n\t\t\t\treturn body.includes(filePath.toLowerCase());\n\t\t\t});\n\n\t\t\tif (!pr) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tnumber: Number(pr.number),\n\t\t\t\ttitle: String(pr.title ?? \"\"),\n\t\t\t\tdescription: pr.body ? String(pr.body) : null,\n\t\t\t\tlabels: Array.isArray(pr.labels)\n\t\t\t\t\t? pr.labels.map((l: Record<string, unknown>) => String(l.name ?? \"\"))\n\t\t\t\t\t: [],\n\t\t\t\treviewStatus: this.mapReviewStatus(pr.reviewDecision),\n\t\t\t};\n\t\t} catch {\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tprivate mapReviewStatus(decision: unknown): \"pending\" | \"approved\" | \"changes_requested\" | \"none\" {\n\t\tswitch (String(decision ?? \"\").toUpperCase()) {\n\t\t\tcase \"APPROVED\":\n\t\t\t\treturn \"approved\";\n\t\t\tcase \"CHANGES_REQUESTED\":\n\t\t\t\treturn \"changes_requested\";\n\t\t\tcase \"REVIEW_REQUIRED\":\n\t\t\t\treturn \"pending\";\n\t\t\tdefault:\n\t\t\t\treturn \"none\";\n\t\t}\n\t}\n\n\tprivate parseIssues(result: unknown): GitHubContext[\"relatedIssues\"] {\n\t\ttry {\n\t\t\tconst data = this.extractToolResult(result) as Record<string, unknown> | unknown[];\n\t\t\tconst items = Array.isArray(data) ? data : ((data as Record<string, unknown>)?.items ?? []);\n\n\t\t\tif (!Array.isArray(items)) {\n\t\t\t\treturn [];\n\t\t\t}\n\n\t\t\treturn items.slice(0, 5).map((issue: Record<string, unknown>) => ({\n\t\t\t\tnumber: Number(issue.number),\n\t\t\t\ttitle: String(issue.title ?? \"\"),\n\t\t\t\tlabels: Array.isArray(issue.labels)\n\t\t\t\t\t? issue.labels.map((l: Record<string, unknown>) => String(l.name ?? \"\"))\n\t\t\t\t\t: [],\n\t\t\t\tstate:\n\t\t\t\t\tString(issue.state ?? \"open\").toLowerCase() === \"closed\" ? (\"closed\" as const) : (\"open\" as const),\n\t\t\t}));\n\t\t} catch {\n\t\t\treturn [];\n\t\t}\n\t}\n\n\tprivate calculateChangeFrequency(commits: GitHubContext[\"recentCommits\"]): GitHubContext[\"changeFrequency\"] {\n\t\tif (commits.length === 0) {\n\t\t\treturn \"stable\";\n\t\t}\n\n\t\tconst now = Date.now();\n\t\tconst thirtyDaysAgo = now - 30 * 24 * 60 * 60 * 1000;\n\t\tconst recentCommits = commits.filter((c) => new Date(c.date).getTime() > thirtyDaysAgo);\n\n\t\tif (recentCommits.length > 10) {\n\t\t\treturn \"volatile\";\n\t\t}\n\t\tif (recentCommits.length > 3) {\n\t\t\treturn \"moderate\";\n\t\t}\n\t\treturn \"stable\";\n\t}\n\n\tprivate extractToolResult(result: unknown): unknown {\n\t\t// MCP tool results typically come as { content: [{ type: 'text', text: '...' }] }\n\t\tif (\n\t\t\tresult &&\n\t\t\ttypeof result === \"object\" &&\n\t\t\t\"content\" in result &&\n\t\t\tArray.isArray((result as Record<string, unknown>).content)\n\t\t) {\n\t\t\tconst content = (result as { content: Array<{ type: string; text?: string }> }).content;\n\t\t\tconst textContent = content.find((c) => c.type === \"text\");\n\t\t\tif (textContent?.text) {\n\t\t\t\ttry {\n\t\t\t\t\treturn JSON.parse(textContent.text);\n\t\t\t\t} catch {\n\t\t\t\t\treturn textContent.text;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn result;\n\t}\n}\n\n/**\n * Create a GitHub MCP client from environment variables\n */\nexport function createGitHubMCPClient(options?: Partial<GitHubMCPClientOptions>): GitHubMCPClient {\n\tconst token = options?.token ?? process.env.GITHUB_PERSONAL_ACCESS_TOKEN ?? process.env.GITHUB_TOKEN;\n\tconst owner = options?.owner ?? process.env.SNAPBACK_GITHUB_OWNER;\n\tconst repo = options?.repo ?? process.env.SNAPBACK_GITHUB_REPO;\n\n\tif (!token) {\n\t\tthrow new Error(\"GitHub token is required (GITHUB_PERSONAL_ACCESS_TOKEN or GITHUB_TOKEN)\");\n\t}\n\n\tif (!owner || !repo) {\n\t\tthrow new Error(\"GitHub owner and repo are required (SNAPBACK_GITHUB_OWNER, SNAPBACK_GITHUB_REPO)\");\n\t}\n\n\treturn new GitHubMCPClient({\n\t\ttoken,\n\t\towner,\n\t\trepo,\n\t\tlogger: options?.logger,\n\t});\n}\n","/**\n * GitHub Risk Factor Extraction\n *\n * Extracts risk factors from GitHub context to contribute\n * to overall risk assessment.\n */\n\nimport type { GitHubContext, RiskFactor } from \"../../types/integrations.js\";\n\n/**\n * Extract risk factors from GitHub context\n *\n * Analyzes commit history, PR status, and related issues\n * to identify risk factors.\n */\nexport function extractGitHubRiskFactors(context: GitHubContext): RiskFactor[] {\n\tconst factors: RiskFactor[] = [];\n\n\t// Factor: File volatility (high churn)\n\tif (context.changeFrequency === \"volatile\") {\n\t\tfactors.push({\n\t\t\tname: \"high_churn_file\",\n\t\t\tscore: 15,\n\t\t\tdescription: \"File has been modified frequently (>10 commits in 30 days)\",\n\t\t\tsource: \"github\",\n\t\t});\n\t} else if (context.changeFrequency === \"moderate\") {\n\t\tfactors.push({\n\t\t\tname: \"moderate_churn_file\",\n\t\t\tscore: 5,\n\t\t\tdescription: \"File has moderate change frequency (3-10 commits in 30 days)\",\n\t\t\tsource: \"github\",\n\t\t});\n\t}\n\n\t// Factor: Active PR status\n\tif (context.activePR) {\n\t\tif (context.activePR.reviewStatus === \"changes_requested\") {\n\t\t\tfactors.push({\n\t\t\t\tname: \"pr_changes_requested\",\n\t\t\t\tscore: 25,\n\t\t\t\tdescription: `PR #${context.activePR.number} has requested changes`,\n\t\t\t\tsource: \"github\",\n\t\t\t\tsuggestion: \"Address PR feedback before making additional changes\",\n\t\t\t});\n\t\t} else if (context.activePR.reviewStatus === \"pending\") {\n\t\t\tfactors.push({\n\t\t\t\tname: \"pr_pending_review\",\n\t\t\t\tscore: 10,\n\t\t\t\tdescription: `PR #${context.activePR.number} is pending review`,\n\t\t\t\tsource: \"github\",\n\t\t\t});\n\t\t}\n\n\t\t// Check for blocking labels\n\t\tconst blockingLabels = [\"do-not-merge\", \"wip\", \"blocked\", \"on-hold\"];\n\t\tconst hasBlockingLabel = context.activePR.labels.some((label) => blockingLabels.includes(label.toLowerCase()));\n\n\t\tif (hasBlockingLabel) {\n\t\t\tfactors.push({\n\t\t\t\tname: \"pr_blocked\",\n\t\t\t\tscore: 40,\n\t\t\t\tdescription: \"PR is marked as blocked/do-not-merge\",\n\t\t\t\tsource: \"github\",\n\t\t\t\tsuggestion: \"Wait for blocking status to be resolved\",\n\t\t\t});\n\t\t}\n\n\t\t// Check for high-risk labels\n\t\tconst riskLabels = [\"breaking-change\", \"security\", \"critical\"];\n\t\tconst hasRiskLabel = context.activePR.labels.some((label) => riskLabels.includes(label.toLowerCase()));\n\n\t\tif (hasRiskLabel) {\n\t\t\tfactors.push({\n\t\t\t\tname: \"pr_high_risk_label\",\n\t\t\t\tscore: 20,\n\t\t\t\tdescription: \"PR has high-risk labels (breaking-change, security, critical)\",\n\t\t\t\tsource: \"github\",\n\t\t\t});\n\t\t}\n\t}\n\n\t// Factor: Related open bugs\n\tconst bugIssues = context.relatedIssues.filter(\n\t\t(issue) =>\n\t\t\tissue.labels.some((l) => [\"bug\", \"defect\", \"regression\"].includes(l.toLowerCase())) &&\n\t\t\tissue.state === \"open\",\n\t);\n\n\tif (bugIssues.length > 0) {\n\t\tfactors.push({\n\t\t\tname: \"open_bugs_related\",\n\t\t\tscore: Math.min(30, 10 * bugIssues.length),\n\t\t\tdescription: `${bugIssues.length} open bug(s) reference this file`,\n\t\t\tsource: \"github\",\n\t\t\tsuggestion: \"Consider fixing related bugs before making changes\",\n\t\t});\n\t}\n\n\t// Factor: Recent large changes\n\tconst largeCommits = context.recentCommits.filter((commit) => commit.additions + commit.deletions > 100);\n\n\tif (largeCommits.length > 0) {\n\t\tfactors.push({\n\t\t\tname: \"recent_large_changes\",\n\t\t\tscore: 10,\n\t\t\tdescription: \"File had large changes recently (may be unstable)\",\n\t\t\tsource: \"github\",\n\t\t});\n\t}\n\n\t// Factor: Multiple recent authors (coordination risk)\n\tconst uniqueAuthors = new Set(context.recentCommits.map((c) => c.author)).size;\n\n\tif (uniqueAuthors > 3) {\n\t\tfactors.push({\n\t\t\tname: \"multiple_authors\",\n\t\t\tscore: 8,\n\t\t\tdescription: `${uniqueAuthors} different authors modified this file recently`,\n\t\t\tsource: \"github\",\n\t\t\tsuggestion: \"Consider coordinating with other contributors\",\n\t\t});\n\t}\n\n\t// Factor: No recent activity (stale file)\n\tif (context.recentCommits.length === 0) {\n\t\tfactors.push({\n\t\t\tname: \"stale_file\",\n\t\t\tscore: -5, // Negative = reduces risk\n\t\t\tdescription: \"File has no recent commits (stable)\",\n\t\t\tsource: \"github\",\n\t\t});\n\t}\n\n\t// Factor: Security-related issues\n\tconst securityIssues = context.relatedIssues.filter((issue) =>\n\t\tissue.labels.some((l) => [\"security\", \"vulnerability\", \"cve\"].includes(l.toLowerCase())),\n\t);\n\n\tif (securityIssues.length > 0) {\n\t\tfactors.push({\n\t\t\tname: \"security_issues_related\",\n\t\t\tscore: 35,\n\t\t\tdescription: `${securityIssues.length} security-related issue(s) reference this file`,\n\t\t\tsource: \"github\",\n\t\t\tsuggestion: \"Review security implications carefully\",\n\t\t});\n\t}\n\n\treturn factors;\n}\n\n/**\n * Calculate overall GitHub risk contribution\n */\nexport function calculateGitHubRiskScore(context: GitHubContext): number {\n\tconst factors = extractGitHubRiskFactors(context);\n\treturn factors.reduce((sum, factor) => sum + factor.score, 0);\n}\n","/**\n * Sentry MCP Client\n *\n * Integrates with Sentry to gather production error context\n * for files being modified.\n *\n * Provides:\n * - Error history for files\n * - Error trends\n * - Release health\n * - Similar resolved issues\n */\n\nimport type { SentryContext } from \"../../types/integrations.js\";\n\nexport interface SentryMCPClientOptions {\n\t/** Sentry auth token */\n\tauthToken: string;\n\t/** Sentry organization slug */\n\torganization: string;\n\t/** Sentry project slug */\n\tproject: string;\n\t/** Optional logger */\n\tlogger?: {\n\t\tdebug: (msg: string, data?: unknown) => void;\n\t\tinfo: (msg: string, data?: unknown) => void;\n\t\twarn: (msg: string, data?: unknown) => void;\n\t\terror: (msg: string, data?: unknown) => void;\n\t};\n}\n\n/**\n * Default logger that outputs to console\n */\nconst defaultLogger = {\n\tdebug: (msg: string, data?: unknown) => console.debug(`[sentry-mcp] ${msg}`, data ?? \"\"),\n\tinfo: (msg: string, data?: unknown) => console.info(`[sentry-mcp] ${msg}`, data ?? \"\"),\n\twarn: (msg: string, data?: unknown) => console.warn(`[sentry-mcp] ${msg}`, data ?? \"\"),\n\terror: (msg: string, data?: unknown) => console.error(`[sentry-mcp] ${msg}`, data ?? \"\"),\n};\n\n/**\n * Client for Sentry MCP server integration\n *\n * Gathers production error context to inform risk assessment.\n */\nexport class SentryMCPClient {\n\tprivate mcpClient: unknown = null;\n\tprivate readonly config: SentryMCPClientOptions;\n\tprivate readonly logger: SentryMCPClientOptions[\"logger\"];\n\tprivate connected = false;\n\n\tconstructor(options: SentryMCPClientOptions) {\n\t\tthis.config = options;\n\t\tthis.logger = options.logger ?? defaultLogger;\n\t}\n\n\t/**\n\t * Connect to the Sentry MCP server\n\t *\n\t * Uses dynamic import to avoid bundling issues.\n\t */\n\tasync connect(): Promise<void> {\n\t\tif (this.connected) {\n\t\t\treturn;\n\t\t}\n\n\t\ttry {\n\t\t\t// Dynamic import to avoid bundling issues\n\t\t\tconst { Client } = await import(\"@modelcontextprotocol/sdk/client/index.js\");\n\t\t\tconst { SSEClientTransport } = await import(\"@modelcontextprotocol/sdk/client/sse.js\");\n\n\t\t\tconst transport = new SSEClientTransport(new URL(\"https://mcp.sentry.io/sse\"), {\n\t\t\t\trequestInit: {\n\t\t\t\t\theaders: {\n\t\t\t\t\t\tAuthorization: `Bearer ${this.config.authToken}`,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t});\n\n\t\t\tthis.mcpClient = new Client({ name: \"snapback-intelligence\", version: \"1.0.0\" }, { capabilities: {} });\n\n\t\t\tawait (this.mcpClient as { connect: (t: unknown) => Promise<void> }).connect(transport);\n\t\t\tthis.connected = true;\n\t\t\tthis.logger?.info(\"Connected to Sentry MCP server\");\n\t\t} catch (error) {\n\t\t\tthis.logger?.error(\"Failed to connect to Sentry MCP server\", { error });\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\t/**\n\t * Get file context from Sentry\n\t *\n\t * Gathers errors, trends, and release health for a file.\n\t */\n\tasync getFileContext(filePath: string): Promise<SentryContext | null> {\n\t\tif (!this.mcpClient) {\n\t\t\tthis.logger?.warn(\"Sentry MCP client not connected\");\n\t\t\treturn null;\n\t\t}\n\n\t\ttry {\n\t\t\tconst client = this.mcpClient as {\n\t\t\t\tcallTool: (params: { name: string; arguments: Record<string, unknown> }) => Promise<unknown>;\n\t\t\t};\n\n\t\t\t// Get errors for this file\n\t\t\tconst errorsResult = await client.callTool({\n\t\t\t\tname: \"get_file_errors\",\n\t\t\t\targuments: {\n\t\t\t\t\torganization: this.config.organization,\n\t\t\t\t\tproject: this.config.project,\n\t\t\t\t\tfilename: filePath,\n\t\t\t\t\tstatsPeriod: \"7d\",\n\t\t\t\t},\n\t\t\t});\n\n\t\t\tconst errors = this.parseErrors(errorsResult);\n\n\t\t\t// Get error trend\n\t\t\tlet errorTrend: SentryContext[\"errorTrend\"] = \"none\";\n\t\t\ttry {\n\t\t\t\tconst trendResult = await client.callTool({\n\t\t\t\t\tname: \"get_error_trend\",\n\t\t\t\t\targuments: {\n\t\t\t\t\t\torganization: this.config.organization,\n\t\t\t\t\t\tproject: this.config.project,\n\t\t\t\t\t\tfilename: filePath,\n\t\t\t\t\t\tstatsPeriod: \"14d\",\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t\terrorTrend = this.parseTrend(trendResult);\n\t\t\t} catch {\n\t\t\t\t// Trend analysis not available\n\t\t\t}\n\n\t\t\t// Get release health\n\t\t\tlet recentReleaseHealth: SentryContext[\"recentReleaseHealth\"] = null;\n\t\t\ttry {\n\t\t\t\tconst releaseResult = await client.callTool({\n\t\t\t\t\tname: \"get_release_health\",\n\t\t\t\t\targuments: {\n\t\t\t\t\t\torganization: this.config.organization,\n\t\t\t\t\t\tproject: this.config.project,\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t\trecentReleaseHealth = this.parseReleaseHealth(releaseResult);\n\t\t\t} catch {\n\t\t\t\t// Release health not available\n\t\t\t}\n\n\t\t\t// Find similar resolved issues\n\t\t\tlet similarIssues: SentryContext[\"similarIssues\"] = [];\n\t\t\ttry {\n\t\t\t\tconst similarResult = await client.callTool({\n\t\t\t\t\tname: \"get_similar_errors\",\n\t\t\t\t\targuments: {\n\t\t\t\t\t\torganization: this.config.organization,\n\t\t\t\t\t\tproject: this.config.project,\n\t\t\t\t\t\tfilename: filePath,\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t\tsimilarIssues = this.parseSimilarIssues(similarResult);\n\t\t\t} catch {\n\t\t\t\t// Similar issues not available\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tfile: filePath,\n\t\t\t\terrors,\n\t\t\t\terrorTrend,\n\t\t\t\trecentReleaseHealth,\n\t\t\t\tsimilarIssues,\n\t\t\t};\n\t\t} catch (error) {\n\t\t\tthis.logger?.error(\"Failed to get Sentry context\", { error, filePath });\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t/**\n\t * Get specific error details\n\t */\n\tasync getErrorDetails(errorId: string): Promise<SentryContext[\"errors\"][0] | null> {\n\t\tif (!this.mcpClient) {\n\t\t\treturn null;\n\t\t}\n\n\t\ttry {\n\t\t\tconst client = this.mcpClient as {\n\t\t\t\tcallTool: (params: { name: string; arguments: Record<string, unknown> }) => Promise<unknown>;\n\t\t\t};\n\n\t\t\tconst result = await client.callTool({\n\t\t\t\tname: \"get_issue\",\n\t\t\t\targuments: {\n\t\t\t\t\torganization: this.config.organization,\n\t\t\t\t\tissue_id: errorId,\n\t\t\t\t},\n\t\t\t});\n\n\t\t\treturn this.parseSingleError(result);\n\t\t} catch (error) {\n\t\t\tthis.logger?.error(\"Failed to get error details\", { error, errorId });\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t/**\n\t * Disconnect from the MCP server\n\t */\n\tasync disconnect(): Promise<void> {\n\t\tif (this.mcpClient && this.connected) {\n\t\t\ttry {\n\t\t\t\tawait (this.mcpClient as { close: () => Promise<void> }).close();\n\t\t\t} catch {\n\t\t\t\t// Ignore close errors\n\t\t\t}\n\t\t\tthis.mcpClient = null;\n\t\t\tthis.connected = false;\n\t\t}\n\t}\n\n\t// ---------------------------------------------------------------------------\n\t// Private Helpers\n\t// ---------------------------------------------------------------------------\n\n\tprivate parseErrors(result: unknown): SentryContext[\"errors\"] {\n\t\ttry {\n\t\t\tconst data = this.extractToolResult(result);\n\t\t\tif (!Array.isArray(data)) {\n\t\t\t\treturn [];\n\t\t\t}\n\n\t\t\treturn data.map((error: Record<string, unknown>) => ({\n\t\t\t\tid: String(error.id ?? \"\"),\n\t\t\t\ttitle: String(error.title ?? \"\"),\n\t\t\t\tculprit: String(error.culprit ?? \"\"),\n\t\t\t\tcount: Number(error.count ?? 0),\n\t\t\t\tuserCount: Number(error.userCount ?? 0),\n\t\t\t\tfirstSeen: String(error.firstSeen ?? new Date().toISOString()),\n\t\t\t\tlastSeen: String(error.lastSeen ?? new Date().toISOString()),\n\t\t\t\tisRegression: Boolean(error.isRegression),\n\t\t\t\tlevel: this.parseErrorLevel(error.level),\n\t\t\t}));\n\t\t} catch {\n\t\t\treturn [];\n\t\t}\n\t}\n\n\tprivate parseSingleError(result: unknown): SentryContext[\"errors\"][0] | null {\n\t\ttry {\n\t\t\tconst data = this.extractToolResult(result) as Record<string, unknown>;\n\t\t\tif (!data || typeof data !== \"object\") {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tid: String(data.id ?? \"\"),\n\t\t\t\ttitle: String(data.title ?? \"\"),\n\t\t\t\tculprit: String(data.culprit ?? \"\"),\n\t\t\t\tcount: Number(data.count ?? 0),\n\t\t\t\tuserCount: Number(data.userCount ?? 0),\n\t\t\t\tfirstSeen: String(data.firstSeen ?? new Date().toISOString()),\n\t\t\t\tlastSeen: String(data.lastSeen ?? new Date().toISOString()),\n\t\t\t\tisRegression: Boolean(data.isRegression),\n\t\t\t\tlevel: this.parseErrorLevel(data.level),\n\t\t\t};\n\t\t} catch {\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tprivate parseErrorLevel(level: unknown): SentryContext[\"errors\"][0][\"level\"] {\n\t\tconst levelStr = String(level ?? \"error\").toLowerCase();\n\t\tif (levelStr === \"fatal\") {\n\t\t\treturn \"fatal\";\n\t\t}\n\t\tif (levelStr === \"warning\") {\n\t\t\treturn \"warning\";\n\t\t}\n\t\tif (levelStr === \"info\") {\n\t\t\treturn \"info\";\n\t\t}\n\t\treturn \"error\";\n\t}\n\n\tprivate parseTrend(result: unknown): SentryContext[\"errorTrend\"] {\n\t\ttry {\n\t\t\tconst data = this.extractToolResult(result) as Record<string, unknown>;\n\t\t\tconst trend = String(data?.trend ?? \"none\").toLowerCase();\n\n\t\t\tif (trend === \"increasing\" || trend === \"up\") {\n\t\t\t\treturn \"increasing\";\n\t\t\t}\n\t\t\tif (trend === \"decreasing\" || trend === \"down\") {\n\t\t\t\treturn \"decreasing\";\n\t\t\t}\n\t\t\tif (trend === \"stable\" || trend === \"flat\") {\n\t\t\t\treturn \"stable\";\n\t\t\t}\n\t\t\treturn \"none\";\n\t\t} catch {\n\t\t\treturn \"none\";\n\t\t}\n\t}\n\n\tprivate parseReleaseHealth(result: unknown): SentryContext[\"recentReleaseHealth\"] {\n\t\ttry {\n\t\t\tconst data = this.extractToolResult(result) as Record<string, unknown>;\n\t\t\tif (!data) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tcrashFreeRate: Number(data.crashFreeRate ?? data.crash_free_rate ?? 100),\n\t\t\t\tsessionsCount: Number(data.sessionsCount ?? data.sessions_count ?? 0),\n\t\t\t\thasRegressions: Boolean(data.hasRegressions ?? data.has_regressions),\n\t\t\t};\n\t\t} catch {\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tprivate parseSimilarIssues(result: unknown): SentryContext[\"similarIssues\"] {\n\t\ttry {\n\t\t\tconst data = this.extractToolResult(result);\n\t\t\tif (!Array.isArray(data)) {\n\t\t\t\treturn [];\n\t\t\t}\n\n\t\t\treturn data.map((issue: Record<string, unknown>) => ({\n\t\t\t\tid: String(issue.id ?? \"\"),\n\t\t\t\ttitle: String(issue.title ?? \"\"),\n\t\t\t\tsimilarity: Number(issue.similarity ?? 0),\n\t\t\t\tresolution: issue.resolution ? String(issue.resolution) : null,\n\t\t\t}));\n\t\t} catch {\n\t\t\treturn [];\n\t\t}\n\t}\n\n\tprivate extractToolResult(result: unknown): unknown {\n\t\t// MCP tool results typically come as { content: [{ type: 'text', text: '...' }] }\n\t\tif (\n\t\t\tresult &&\n\t\t\ttypeof result === \"object\" &&\n\t\t\t\"content\" in result &&\n\t\t\tArray.isArray((result as Record<string, unknown>).content)\n\t\t) {\n\t\t\tconst content = (result as { content: Array<{ type: string; text?: string }> }).content;\n\t\t\tconst textContent = content.find((c) => c.type === \"text\");\n\t\t\tif (textContent?.text) {\n\t\t\t\ttry {\n\t\t\t\t\treturn JSON.parse(textContent.text);\n\t\t\t\t} catch {\n\t\t\t\t\treturn textContent.text;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn result;\n\t}\n}\n\n/**\n * Create a Sentry MCP client from environment variables\n */\nexport function createSentryMCPClient(options?: Partial<SentryMCPClientOptions>): SentryMCPClient {\n\tconst authToken = options?.authToken ?? process.env.SENTRY_AUTH_TOKEN;\n\tconst organization = options?.organization ?? process.env.SENTRY_ORG;\n\tconst project = options?.project ?? process.env.SENTRY_PROJECT;\n\n\tif (!authToken) {\n\t\tthrow new Error(\"Sentry auth token is required (SENTRY_AUTH_TOKEN)\");\n\t}\n\n\tif (!organization || !project) {\n\t\tthrow new Error(\"Sentry organization and project are required (SENTRY_ORG, SENTRY_PROJECT)\");\n\t}\n\n\treturn new SentryMCPClient({\n\t\tauthToken,\n\t\torganization,\n\t\tproject,\n\t\tlogger: options?.logger,\n\t});\n}\n","/**\n * Sentry Risk Factor Extraction\n *\n * Extracts risk factors from production error context\n * to contribute to overall risk assessment.\n */\n\nimport type { RiskFactor, SentryContext } from \"../../types/integrations.js\";\n\n/**\n * Extract risk factors from Sentry context\n *\n * Analyzes production errors, trends, and release health\n * to identify risk factors.\n */\nexport function extractSentryRiskFactors(context: SentryContext): RiskFactor[] {\n\tconst factors: RiskFactor[] = [];\n\n\t// Factor: Active errors in file\n\tconst activeErrors = context.errors.filter((e) => e.level === \"error\" || e.level === \"fatal\");\n\n\tif (activeErrors.length > 0) {\n\t\tconst totalUsers = activeErrors.reduce((sum, e) => sum + e.userCount, 0);\n\t\tfactors.push({\n\t\t\tname: \"active_production_errors\",\n\t\t\tscore: Math.min(40, 10 + activeErrors.length * 5),\n\t\t\tdescription: `${activeErrors.length} active error(s) affecting ${totalUsers} users`,\n\t\t\tsource: \"sentry\",\n\t\t\tsuggestion: \"Consider fixing production errors before making changes\",\n\t\t});\n\t}\n\n\t// Factor: Fatal errors (highest severity)\n\tconst fatalErrors = context.errors.filter((e) => e.level === \"fatal\");\n\tif (fatalErrors.length > 0) {\n\t\tfactors.push({\n\t\t\tname: \"fatal_errors_present\",\n\t\t\tscore: 35,\n\t\t\tdescription: `${fatalErrors.length} fatal error(s) detected in this file`,\n\t\t\tsource: \"sentry\",\n\t\t\tsuggestion: \"Critical: Address fatal errors immediately\",\n\t\t});\n\t}\n\n\t// Factor: Error trend\n\tif (context.errorTrend === \"increasing\") {\n\t\tfactors.push({\n\t\t\tname: \"error_trend_increasing\",\n\t\t\tscore: 20,\n\t\t\tdescription: \"Error rate has been increasing over the past 14 days\",\n\t\t\tsource: \"sentry\",\n\t\t\tsuggestion: \"Investigate cause of increasing errors before making changes\",\n\t\t});\n\t} else if (context.errorTrend === \"decreasing\") {\n\t\tfactors.push({\n\t\t\tname: \"error_trend_decreasing\",\n\t\t\tscore: -5, // Positive signal\n\t\t\tdescription: \"Error rate has been decreasing (improvements working)\",\n\t\t\tsource: \"sentry\",\n\t\t});\n\t}\n\n\t// Factor: Regressions\n\tconst regressions = context.errors.filter((e) => e.isRegression);\n\tif (regressions.length > 0) {\n\t\tfactors.push({\n\t\t\tname: \"has_regressions\",\n\t\t\tscore: 30,\n\t\t\tdescription: `${regressions.length} regression(s) detected in this file`,\n\t\t\tsource: \"sentry\",\n\t\t\tsuggestion: \"Recent changes caused these errors to reoccur\",\n\t\t});\n\t}\n\n\t// Factor: Release health\n\tif (context.recentReleaseHealth) {\n\t\tif (context.recentReleaseHealth.crashFreeRate < 95) {\n\t\t\tfactors.push({\n\t\t\t\tname: \"critical_crash_rate\",\n\t\t\t\tscore: 40,\n\t\t\t\tdescription: `Crash-free rate is critically low (${context.recentReleaseHealth.crashFreeRate.toFixed(1)}%)`,\n\t\t\t\tsource: \"sentry\",\n\t\t\t\tsuggestion: \"Address stability issues before adding new features\",\n\t\t\t});\n\t\t} else if (context.recentReleaseHealth.crashFreeRate < 99) {\n\t\t\tfactors.push({\n\t\t\t\tname: \"low_crash_free_rate\",\n\t\t\t\tscore: 25,\n\t\t\t\tdescription: `Crash-free rate is ${context.recentReleaseHealth.crashFreeRate.toFixed(1)}%`,\n\t\t\t\tsource: \"sentry\",\n\t\t\t});\n\t\t} else if (context.recentReleaseHealth.crashFreeRate >= 99.5) {\n\t\t\tfactors.push({\n\t\t\t\tname: \"high_crash_free_rate\",\n\t\t\t\tscore: -5, // Positive signal\n\t\t\t\tdescription: `Excellent crash-free rate (${context.recentReleaseHealth.crashFreeRate.toFixed(1)}%)`,\n\t\t\t\tsource: \"sentry\",\n\t\t\t});\n\t\t}\n\n\t\tif (context.recentReleaseHealth.hasRegressions) {\n\t\t\tfactors.push({\n\t\t\t\tname: \"release_has_regressions\",\n\t\t\t\tscore: 15,\n\t\t\t\tdescription: \"Current release has introduced regressions\",\n\t\t\t\tsource: \"sentry\",\n\t\t\t});\n\t\t}\n\t}\n\n\t// Factor: High user impact\n\tconst highImpactErrors = context.errors.filter((e) => e.userCount > 100);\n\tif (highImpactErrors.length > 0) {\n\t\tconst totalUsers = highImpactErrors.reduce((sum, e) => sum + e.userCount, 0);\n\t\tfactors.push({\n\t\t\tname: \"high_user_impact\",\n\t\t\tscore: 25,\n\t\t\tdescription: `Errors affecting ${totalUsers}+ users`,\n\t\t\tsource: \"sentry\",\n\t\t\tsuggestion: \"Changes to this file have wide user impact\",\n\t\t});\n\t}\n\n\t// Factor: Similar issues resolved (positive signal)\n\tconst resolved = context.similarIssues.filter((i) => i.resolution);\n\tif (resolved.length > 0) {\n\t\tfactors.push({\n\t\t\tname: \"similar_issues_resolved\",\n\t\t\tscore: -8, // Positive - we know how to fix similar issues\n\t\t\tdescription: `${resolved.length} similar issue(s) have been resolved before`,\n\t\t\tsource: \"sentry\",\n\t\t\tsuggestion: \"Check resolved issues for guidance on fixes\",\n\t\t});\n\t}\n\n\t// Factor: No production errors (excellent signal)\n\tif (context.errors.length === 0) {\n\t\tfactors.push({\n\t\t\tname: \"no_production_errors\",\n\t\t\tscore: -10,\n\t\t\tdescription: \"No production errors detected in this file\",\n\t\t\tsource: \"sentry\",\n\t\t});\n\t}\n\n\t// Factor: Frequent errors (many occurrences)\n\tconst frequentErrors = context.errors.filter((e) => e.count > 1000);\n\tif (frequentErrors.length > 0) {\n\t\tfactors.push({\n\t\t\tname: \"high_frequency_errors\",\n\t\t\tscore: 20,\n\t\t\tdescription: `${frequentErrors.length} error(s) occurring very frequently (>1000 events)`,\n\t\t\tsource: \"sentry\",\n\t\t});\n\t}\n\n\t// Factor: Recent errors (errors seen recently)\n\tconst now = Date.now();\n\tconst oneDayAgo = now - 24 * 60 * 60 * 1000;\n\tconst recentErrors = context.errors.filter((e) => new Date(e.lastSeen).getTime() > oneDayAgo);\n\n\tif (recentErrors.length > 0) {\n\t\tfactors.push({\n\t\t\tname: \"recent_errors\",\n\t\t\tscore: 10,\n\t\t\tdescription: `${recentErrors.length} error(s) seen in the last 24 hours`,\n\t\t\tsource: \"sentry\",\n\t\t});\n\t}\n\n\treturn factors;\n}\n\n/**\n * Calculate overall Sentry risk contribution\n */\nexport function calculateSentryRiskScore(context: SentryContext): number {\n\tconst factors = extractSentryRiskFactors(context);\n\treturn factors.reduce((sum, factor) => sum + factor.score, 0);\n}\n\n/**\n * Get error summary for display\n */\nexport function getErrorSummary(context: SentryContext): {\n\ttotalErrors: number;\n\tfatalCount: number;\n\terrorCount: number;\n\twarningCount: number;\n\ttotalUsers: number;\n\ttrend: string;\n\thealthStatus: string;\n} {\n\tconst fatalCount = context.errors.filter((e) => e.level === \"fatal\").length;\n\tconst errorCount = context.errors.filter((e) => e.level === \"error\").length;\n\tconst warningCount = context.errors.filter((e) => e.level === \"warning\").length;\n\tconst totalUsers = context.errors.reduce((sum, e) => sum + e.userCount, 0);\n\n\tlet healthStatus = \"unknown\";\n\tif (context.recentReleaseHealth) {\n\t\tconst rate = context.recentReleaseHealth.crashFreeRate;\n\t\tif (rate >= 99.5) {\n\t\t\thealthStatus = \"excellent\";\n\t\t} else if (rate >= 99) {\n\t\t\thealthStatus = \"good\";\n\t\t} else if (rate >= 95) {\n\t\t\thealthStatus = \"fair\";\n\t\t} else {\n\t\t\thealthStatus = \"poor\";\n\t\t}\n\t}\n\n\treturn {\n\t\ttotalErrors: context.errors.length,\n\t\tfatalCount,\n\t\terrorCount,\n\t\twarningCount,\n\t\ttotalUsers,\n\t\ttrend: context.errorTrend,\n\t\thealthStatus,\n\t};\n}\n","/**\n * Context Aggregator Service\n *\n * Gathers context from all configured external MCP integrations\n * in parallel and aggregates risk factors.\n */\n\nimport { Context7MCPClient } from \"../integrations/context7/client.js\";\nimport { extractDocsRiskFactors } from \"../integrations/context7/risk-factors.js\";\nimport { GitHubMCPClient } from \"../integrations/github/client.js\";\nimport { extractGitHubRiskFactors } from \"../integrations/github/risk-factors.js\";\nimport { SentryMCPClient } from \"../integrations/sentry/client.js\";\nimport { extractSentryRiskFactors } from \"../integrations/sentry/risk-factors.js\";\nimport type { AggregatedContext, IntegrationConfig, RiskFactor } from \"../types/integrations.js\";\n\nexport interface ContextAggregatorOptions {\n\t/** GitHub configuration */\n\tgithub?: {\n\t\ttoken: string;\n\t\towner: string;\n\t\trepo: string;\n\t};\n\t/** Context7 configuration */\n\tcontext7?: {\n\t\tapiKey: string;\n\t};\n\t/** Sentry configuration */\n\tsentry?: {\n\t\tauthToken: string;\n\t\torganization: string;\n\t\tproject: string;\n\t};\n\t/** Optional logger */\n\tlogger?: {\n\t\tdebug: (msg: string, data?: unknown) => void;\n\t\tinfo: (msg: string, data?: unknown) => void;\n\t\twarn: (msg: string, data?: unknown) => void;\n\t\terror: (msg: string, data?: unknown) => void;\n\t};\n\t/** Timeout for each integration in milliseconds */\n\ttimeoutMs?: number;\n}\n\n/**\n * Default logger\n */\nconst defaultLogger = {\n\tdebug: (msg: string, data?: unknown) => console.debug(`[context-aggregator] ${msg}`, data ?? \"\"),\n\tinfo: (msg: string, data?: unknown) => console.info(`[context-aggregator] ${msg}`, data ?? \"\"),\n\twarn: (msg: string, data?: unknown) => console.warn(`[context-aggregator] ${msg}`, data ?? \"\"),\n\terror: (msg: string, data?: unknown) => console.error(`[context-aggregator] ${msg}`, data ?? \"\"),\n};\n\n/**\n * Context Aggregator\n *\n * Orchestrates parallel context gathering from all configured\n * external MCP integrations.\n */\nexport class ContextAggregator {\n\tprivate githubClient?: GitHubMCPClient;\n\tprivate context7Client?: Context7MCPClient;\n\tprivate sentryClient?: SentryMCPClient;\n\tprivate readonly logger: ContextAggregatorOptions[\"logger\"];\n\tprivate readonly timeoutMs: number;\n\n\tconstructor(options: ContextAggregatorOptions) {\n\t\tthis.logger = options.logger ?? defaultLogger;\n\t\tthis.timeoutMs = options.timeoutMs ?? 5000;\n\n\t\tif (options.github) {\n\t\t\tthis.githubClient = new GitHubMCPClient({\n\t\t\t\t...options.github,\n\t\t\t\tlogger: this.logger,\n\t\t\t});\n\t\t}\n\n\t\tif (options.context7) {\n\t\t\tthis.context7Client = new Context7MCPClient({\n\t\t\t\t...options.context7,\n\t\t\t\tlogger: this.logger,\n\t\t\t});\n\t\t}\n\n\t\tif (options.sentry) {\n\t\t\tthis.sentryClient = new SentryMCPClient({\n\t\t\t\t...options.sentry,\n\t\t\t\tlogger: this.logger,\n\t\t\t});\n\t\t}\n\t}\n\n\t/**\n\t * Connect to all configured integrations\n\t */\n\tasync connect(): Promise<void> {\n\t\tconst connections: Promise<void>[] = [];\n\n\t\tif (this.githubClient) {\n\t\t\tconnections.push(\n\t\t\t\tthis.githubClient.connect().catch((e) => {\n\t\t\t\t\tthis.logger?.warn(\"Failed to connect GitHub MCP\", { error: e });\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\n\t\tif (this.context7Client) {\n\t\t\tconnections.push(\n\t\t\t\tthis.context7Client.connect().catch((e) => {\n\t\t\t\t\tthis.logger?.warn(\"Failed to connect Context7 MCP\", { error: e });\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\n\t\tif (this.sentryClient) {\n\t\t\tconnections.push(\n\t\t\t\tthis.sentryClient.connect().catch((e) => {\n\t\t\t\t\tthis.logger?.warn(\"Failed to connect Sentry MCP\", { error: e });\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\n\t\tawait Promise.all(connections);\n\t\tthis.logger?.info(\"Context aggregator connected\", {\n\t\t\tgithub: !!this.githubClient,\n\t\t\tcontext7: !!this.context7Client,\n\t\t\tsentry: !!this.sentryClient,\n\t\t});\n\t}\n\n\t/**\n\t * Aggregate context from all sources\n\t *\n\t * Gathers context in parallel with timeout protection.\n\t */\n\tasync aggregate(filePath: string, content: string, language: string): Promise<AggregatedContext> {\n\t\tconst startTime = Date.now();\n\n\t\t// Gather context in parallel with timeout\n\t\tconst [githubContext, docsValidation, sentryContext] = await Promise.all([\n\t\t\tthis.withTimeout(this.githubClient?.getFileContext(filePath), \"github\"),\n\t\t\tthis.withTimeout(this.context7Client?.validateFile(filePath, content, language), \"context7\"),\n\t\t\tthis.withTimeout(this.sentryClient?.getFileContext(filePath), \"sentry\"),\n\t\t]);\n\n\t\t// Extract risk factors from each source\n\t\tconst riskFactors: RiskFactor[] = [];\n\n\t\tif (githubContext) {\n\t\t\triskFactors.push(...extractGitHubRiskFactors(githubContext));\n\t\t}\n\n\t\tif (docsValidation) {\n\t\t\triskFactors.push(...extractDocsRiskFactors(docsValidation));\n\t\t}\n\n\t\tif (sentryContext) {\n\t\t\triskFactors.push(...extractSentryRiskFactors(sentryContext));\n\t\t}\n\n\t\tconst duration = Date.now() - startTime;\n\t\tthis.logger?.debug(\"Context aggregated\", {\n\t\t\tfilePath,\n\t\t\tduration,\n\t\t\tfactorCount: riskFactors.length,\n\t\t});\n\n\t\treturn {\n\t\t\tfile: filePath,\n\t\t\tgatheredAt: new Date().toISOString(),\n\t\t\tdurationMs: duration,\n\t\t\tsources: {\n\t\t\t\tgithub: githubContext ?? undefined,\n\t\t\t\tcontext7: docsValidation ?? undefined,\n\t\t\t\tsentry: sentryContext ?? undefined,\n\t\t\t},\n\t\t\triskFactors,\n\t\t};\n\t}\n\n\t/**\n\t * Aggregate context with local-only fallback\n\t *\n\t * When external integrations are unavailable, returns\n\t * empty context with zero risk factors.\n\t */\n\tasync aggregateWithFallback(filePath: string, content: string, language: string): Promise<AggregatedContext> {\n\t\ttry {\n\t\t\treturn await this.aggregate(filePath, content, language);\n\t\t} catch (error) {\n\t\t\tthis.logger?.warn(\"Context aggregation failed, using fallback\", { error });\n\t\t\treturn {\n\t\t\t\tfile: filePath,\n\t\t\t\tgatheredAt: new Date().toISOString(),\n\t\t\t\tdurationMs: 0,\n\t\t\t\tsources: {},\n\t\t\t\triskFactors: [],\n\t\t\t};\n\t\t}\n\t}\n\n\t/**\n\t * Check if any integrations are configured\n\t */\n\thasIntegrations(): boolean {\n\t\treturn !!(this.githubClient || this.context7Client || this.sentryClient);\n\t}\n\n\t/**\n\t * Get configured integration names\n\t */\n\tgetConfiguredIntegrations(): string[] {\n\t\tconst integrations: string[] = [];\n\t\tif (this.githubClient) {\n\t\t\tintegrations.push(\"github\");\n\t\t}\n\t\tif (this.context7Client) {\n\t\t\tintegrations.push(\"context7\");\n\t\t}\n\t\tif (this.sentryClient) {\n\t\t\tintegrations.push(\"sentry\");\n\t\t}\n\t\treturn integrations;\n\t}\n\n\t/**\n\t * Disconnect from all integrations\n\t */\n\tasync disconnect(): Promise<void> {\n\t\tawait Promise.all([\n\t\t\tthis.githubClient?.disconnect(),\n\t\t\tthis.context7Client?.disconnect(),\n\t\t\tthis.sentryClient?.disconnect(),\n\t\t]);\n\t}\n\n\t// ---------------------------------------------------------------------------\n\t// Private Helpers\n\t// ---------------------------------------------------------------------------\n\n\tprivate async withTimeout<T>(promise: Promise<T> | undefined, source: string): Promise<T | null> {\n\t\tif (!promise) {\n\t\t\treturn null;\n\t\t}\n\n\t\ttry {\n\t\t\treturn await Promise.race([\n\t\t\t\tpromise,\n\t\t\t\tnew Promise<null>((resolve) =>\n\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\tthis.logger?.warn(\"Context gathering timed out\", { source });\n\t\t\t\t\t\tresolve(null);\n\t\t\t\t\t}, this.timeoutMs),\n\t\t\t\t),\n\t\t\t]);\n\t\t} catch (error) {\n\t\t\tthis.logger?.error(\"Context gathering failed\", { error, source });\n\t\t\treturn null;\n\t\t}\n\t}\n}\n\n/**\n * Create a context aggregator from configuration\n */\nexport function createContextAggregator(config: IntegrationConfig): ContextAggregator {\n\tconst options: ContextAggregatorOptions = {\n\t\ttimeoutMs: config.performance?.contextTimeoutMs,\n\t};\n\n\tif (config.integrations?.github?.enabled && config.integrations.github.token) {\n\t\toptions.github = {\n\t\t\ttoken: config.integrations.github.token,\n\t\t\towner: config.integrations.github.owner ?? \"\",\n\t\t\trepo: config.integrations.github.repo ?? \"\",\n\t\t};\n\t}\n\n\tif (config.integrations?.context7?.enabled && config.integrations.context7.apiKey) {\n\t\toptions.context7 = {\n\t\t\tapiKey: config.integrations.context7.apiKey,\n\t\t};\n\t}\n\n\tif (config.integrations?.sentry?.enabled && config.integrations.sentry.authToken) {\n\t\toptions.sentry = {\n\t\t\tauthToken: config.integrations.sentry.authToken,\n\t\t\torganization: config.integrations.sentry.organization ?? \"\",\n\t\t\tproject: config.integrations.sentry.project ?? \"\",\n\t\t};\n\t}\n\n\treturn new ContextAggregator(options);\n}\n\n/**\n * Create a context aggregator from environment variables\n */\nexport function createContextAggregatorFromEnv(): ContextAggregator {\n\tconst options: ContextAggregatorOptions = {};\n\n\t// GitHub from env\n\tconst githubToken = process.env.GITHUB_PERSONAL_ACCESS_TOKEN ?? process.env.GITHUB_TOKEN;\n\tif (process.env.SNAPBACK_GITHUB_ENABLED === \"true\" && githubToken) {\n\t\toptions.github = {\n\t\t\ttoken: githubToken,\n\t\t\towner: process.env.SNAPBACK_GITHUB_OWNER ?? \"\",\n\t\t\trepo: process.env.SNAPBACK_GITHUB_REPO ?? \"\",\n\t\t};\n\t}\n\n\t// Context7 from env\n\tif (process.env.SNAPBACK_CONTEXT7_ENABLED === \"true\" && process.env.CONTEXT7_API_KEY) {\n\t\toptions.context7 = {\n\t\t\tapiKey: process.env.CONTEXT7_API_KEY,\n\t\t};\n\t}\n\n\t// Sentry from env\n\tif (process.env.SNAPBACK_SENTRY_ENABLED === \"true\" && process.env.SENTRY_AUTH_TOKEN) {\n\t\toptions.sentry = {\n\t\t\tauthToken: process.env.SENTRY_AUTH_TOKEN,\n\t\t\torganization: process.env.SENTRY_ORG ?? \"\",\n\t\t\tproject: process.env.SENTRY_PROJECT ?? \"\",\n\t\t};\n\t}\n\n\treturn new ContextAggregator(options);\n}\n","/**\n * RestoreSuggestion Algorithm\n *\n * Multi-factor scoring with exponential decay for intelligent snapshot restore suggestions.\n *\n * SCORING FACTORS (100 points total):\n * - Recency (40 pts): Exponential decay, half-life 6 hours\n * - File overlap (30 pts): Exact match + directory proximity\n * - Risk score (20 pts): High-risk changes more likely culprits\n * - Error context (10 pts): Semantic match to error message\n *\n * CONFIDENCE CALIBRATION:\n * Base 50%, boosted by strong signal matches.\n *\n * @see docs/implementation/intelligence/inteligence_new_platform/adendum.md A1\n * @module algorithms/RestoreSuggestion\n */\n\nimport { basename, dirname } from \"node:path\";\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface SnapshotFile {\n\tpath: string;\n\tcontent: string;\n\thash: string;\n}\n\nexport interface Snapshot {\n\tid: string;\n\tcreatedAt: Date;\n\tfiles: SnapshotFile[];\n\tmetadata?: {\n\t\triskScore?: number;\n\t\tcommitMessage?: string;\n\t\ttrigger?: string;\n\t\t[key: string]: unknown;\n\t};\n}\n\nexport interface ErrorContext {\n\tfile?: string;\n\tline?: number;\n\tmessage?: string;\n\tstack?: string;\n\ttimestamp?: string;\n}\n\nexport interface ScoringFactors {\n\trecency: number; // 0-40\n\tfileOverlap: number; // 0-30\n\triskScore: number; // 0-20\n\terrorContext: number; // 0-10\n}\n\nexport interface ScoredSnapshot {\n\tsnapshot: Snapshot;\n\tscore: number; // 0-100 total score\n\tconfidence: number; // 0-100 how sure we are\n\treasoning: string; // Human-readable explanation\n\tfactors: ScoringFactors;\n}\n\nexport interface RestoreSuggestionConfig {\n\trecency?: {\n\t\tmaxScore: number;\n\t\thalfLifeHours: number;\n\t};\n\tfileOverlap?: {\n\t\tmaxScore: number;\n\t\texactMatch: number;\n\t\tsameDirectory: number;\n\t\trelatedFile: number;\n\t};\n\triskScore?: {\n\t\tmaxScore: number;\n\t};\n\terrorContext?: {\n\t\tmaxScore: number;\n\t\tminKeywordLength: number;\n\t};\n}\n\n// =============================================================================\n// Default Configuration\n// =============================================================================\n\nconst DEFAULT_CONFIG: Required<RestoreSuggestionConfig> = {\n\trecency: {\n\t\tmaxScore: 40,\n\t\thalfLifeHours: 6, // Score halves every 6 hours\n\t},\n\tfileOverlap: {\n\t\tmaxScore: 30,\n\t\texactMatch: 15,\n\t\tsameDirectory: 10,\n\t\trelatedFile: 5,\n\t},\n\triskScore: {\n\t\tmaxScore: 20,\n\t},\n\terrorContext: {\n\t\tmaxScore: 10,\n\t\tminKeywordLength: 3,\n\t},\n};\n\n// =============================================================================\n// Recency Scoring\n// =============================================================================\n\n/**\n * Calculate recency score using exponential decay.\n *\n * Formula: maxScore * exp(-ln(2) * hoursSince / halfLifeHours)\n *\n * @param snapshot - The snapshot to score\n * @param now - Current timestamp (ms)\n * @param config - Optional custom configuration\n * @returns Score between 0 and maxScore\n */\nexport function scoreRecency(snapshot: Snapshot, now: number, config?: RestoreSuggestionConfig): number {\n\tconst cfg = config?.recency ?? DEFAULT_CONFIG.recency;\n\tconst snapshotTime = snapshot.createdAt.getTime();\n\tconst hoursSince = (now - snapshotTime) / (1000 * 60 * 60);\n\n\t// Exponential decay: score = max * e^(-λt) where λ = ln(2) / halfLife\n\tconst decayConstant = Math.LN2 / cfg.halfLifeHours;\n\tconst score = cfg.maxScore * Math.exp(-decayConstant * hoursSince);\n\n\treturn Math.max(0, Math.round(score * 10) / 10);\n}\n\n// =============================================================================\n// File Overlap Scoring\n// =============================================================================\n\n/**\n * Calculate file overlap score based on path matching.\n *\n * Scoring:\n * - Exact match: 15 points\n * - Same directory: 10 points\n * - Related file (test, index, types): 5 points\n *\n * @param snapshot - The snapshot to score\n * @param errorContext - Error context with file path\n * @param config - Optional custom configuration\n * @returns Score between 0 and maxScore\n */\nexport function scoreFileOverlap(\n\tsnapshot: Snapshot,\n\terrorContext: ErrorContext,\n\tconfig?: RestoreSuggestionConfig,\n): number {\n\tconst cfg = config?.fileOverlap ?? DEFAULT_CONFIG.fileOverlap;\n\n\tif (!errorContext.file || snapshot.files.length === 0) {\n\t\treturn 0;\n\t}\n\n\tconst errorFile = errorContext.file;\n\tconst errorDir = dirname(errorFile);\n\tconst errorBasename = basename(errorFile, \".ts\").replace(\".test\", \"\");\n\n\tlet totalScore = 0;\n\tconst seenDirs = new Set<string>();\n\n\tfor (const file of snapshot.files) {\n\t\tconst filePath = file.path;\n\t\tconst fileDir = dirname(filePath);\n\t\tconst fileBasename = basename(filePath, \".ts\").replace(\".test\", \"\");\n\n\t\t// Exact match\n\t\tif (filePath === errorFile) {\n\t\t\ttotalScore += cfg.exactMatch;\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Same directory (only count once per directory)\n\t\tif (fileDir === errorDir && !seenDirs.has(fileDir)) {\n\t\t\ttotalScore += cfg.sameDirectory;\n\t\t\tseenDirs.add(fileDir);\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Related file (same base name, e.g., login.ts <-> login.test.ts)\n\t\tif (fileBasename === errorBasename && fileDir === errorDir) {\n\t\t\ttotalScore += cfg.relatedFile;\n\t\t}\n\t}\n\n\treturn Math.min(cfg.maxScore, totalScore);\n}\n\n// =============================================================================\n// Risk Score Scoring\n// =============================================================================\n\n/**\n * Calculate risk-based score. High-risk changes are more likely culprits.\n *\n * Logic: Risk score maps linearly to scoring points.\n * - 0-30 risk: 0-5 points\n * - 30-60 risk: 5-12 points\n * - 60-100 risk: 12-20 points\n *\n * @param snapshot - The snapshot to score\n * @param config - Optional custom configuration\n * @returns Score between 0 and maxScore\n */\nexport function scoreRiskLevel(snapshot: Snapshot, config?: RestoreSuggestionConfig): number {\n\tconst cfg = config?.riskScore ?? DEFAULT_CONFIG.riskScore;\n\tconst riskScore = snapshot.metadata?.riskScore;\n\n\tif (riskScore === undefined || riskScore === null) {\n\t\t// Default to moderate score when no risk data\n\t\treturn cfg.maxScore * 0.4; // 8 points out of 20\n\t}\n\n\t// Linear mapping with slight emphasis on high risk\n\tconst normalizedRisk = Math.max(0, Math.min(100, riskScore)) / 100;\n\t// Use quadratic curve to emphasize high-risk snapshots\n\tconst score = cfg.maxScore * normalizedRisk ** 0.8;\n\n\treturn Math.round(score);\n}\n\n// =============================================================================\n// Error Context Scoring\n// =============================================================================\n\n/**\n * Calculate semantic match score between snapshot and error.\n *\n * Matches:\n * - Keywords in commit message vs error message\n * - File mentions in stack trace\n *\n * @param snapshot - The snapshot to score\n * @param errorContext - Error context with message and stack\n * @param config - Optional custom configuration\n * @returns Score between 0 and maxScore\n */\nexport function scoreErrorContext(\n\tsnapshot: Snapshot,\n\terrorContext: ErrorContext,\n\tconfig?: RestoreSuggestionConfig,\n): number {\n\tconst cfg = config?.errorContext ?? DEFAULT_CONFIG.errorContext;\n\tlet score = 0;\n\n\t// Extract keywords from error message\n\tconst errorKeywords = extractKeywords(\n\t\t`${errorContext.message ?? \"\"} ${errorContext.stack ?? \"\"}`,\n\t\tcfg.minKeywordLength,\n\t);\n\n\t// Extract keywords from commit message\n\tconst commitKeywords = extractKeywords(snapshot.metadata?.commitMessage ?? \"\", cfg.minKeywordLength);\n\n\t// Score keyword overlap\n\tconst keywordOverlap = errorKeywords.filter((k) =>\n\t\tcommitKeywords.some((ck) => ck.toLowerCase() === k.toLowerCase()),\n\t).length;\n\tscore += Math.min(6, keywordOverlap * 2);\n\n\t// Check stack trace for file matches\n\tif (errorContext.stack) {\n\t\tconst stackFiles = extractFilePaths(errorContext.stack);\n\t\tconst snapshotPaths = new Set(snapshot.files.map((f) => f.path));\n\n\t\tfor (const stackFile of stackFiles) {\n\t\t\tif (snapshotPaths.has(stackFile) || Array.from(snapshotPaths).some((p) => p.endsWith(stackFile))) {\n\t\t\t\tscore += 4;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn Math.min(cfg.maxScore, score);\n}\n\n// =============================================================================\n// Combined Scoring\n// =============================================================================\n\n/**\n * Score all snapshots and sort by relevance for restore suggestion.\n *\n * ALGORITHM:\n * 1. Score each snapshot on multiple factors\n * 2. Combine scores (additive, capped at 100)\n * 3. Sort by confidence\n * 4. Generate explanations\n *\n * GUARANTEED:\n * - Never returns empty (returns all snapshots if no clear winner)\n * - Never throws (catches errors, returns default scores)\n * - Executes in <50ms for typical datasets\n *\n * @param snapshots - Array of snapshots to score\n * @param errorContext - Error context for matching\n * @param config - Optional custom configuration\n * @returns Scored snapshots sorted by score (highest first)\n */\nexport function scoreSnapshots(\n\tsnapshots: Snapshot[],\n\terrorContext: ErrorContext,\n\tconfig?: RestoreSuggestionConfig,\n): ScoredSnapshot[] {\n\tif (snapshots.length === 0) {\n\t\treturn [];\n\t}\n\n\tconst now = Date.now();\n\tconst scored: ScoredSnapshot[] = [];\n\n\tfor (const snapshot of snapshots) {\n\t\ttry {\n\t\t\t// Calculate individual factors\n\t\t\tconst factors: ScoringFactors = {\n\t\t\t\trecency: scoreRecency(snapshot, now, config),\n\t\t\t\tfileOverlap: scoreFileOverlap(snapshot, errorContext, config),\n\t\t\t\triskScore: scoreRiskLevel(snapshot, config),\n\t\t\t\terrorContext: scoreErrorContext(snapshot, errorContext, config),\n\t\t\t};\n\n\t\t\t// Calculate total score\n\t\t\tconst totalScore = factors.recency + factors.fileOverlap + factors.riskScore + factors.errorContext;\n\t\t\tconst score = Math.min(100, Math.round(totalScore));\n\n\t\t\t// Calculate confidence based on data completeness\n\t\t\tconst confidence = calculateConfidence(snapshot, errorContext, factors);\n\n\t\t\t// Generate explanation\n\t\t\tconst reasoning = generateReasoning(factors, confidence, snapshot);\n\n\t\t\tscored.push({\n\t\t\t\tsnapshot,\n\t\t\t\tscore,\n\t\t\t\tconfidence,\n\t\t\t\treasoning,\n\t\t\t\tfactors,\n\t\t\t});\n\t\t} catch {\n\t\t\t// Scoring failed, use default\n\t\t\tscored.push({\n\t\t\t\tsnapshot,\n\t\t\t\tscore: 50,\n\t\t\t\tconfidence: 30,\n\t\t\t\treasoning: \"Unable to fully analyze this snapshot.\",\n\t\t\t\tfactors: {\n\t\t\t\t\trecency: 20,\n\t\t\t\t\tfileOverlap: 0,\n\t\t\t\t\triskScore: 10,\n\t\t\t\t\terrorContext: 0,\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\t}\n\n\t// Sort by score (highest first)\n\tscored.sort((a, b) => b.score - a.score);\n\n\treturn scored;\n}\n\n// =============================================================================\n// Helper Functions\n// =============================================================================\n\n/**\n * Extract keywords from text, filtering short words.\n */\nfunction extractKeywords(text: string, minLength: number): string[] {\n\treturn text\n\t\t.split(/\\W+/)\n\t\t.filter((word) => word.length >= minLength)\n\t\t.filter((word) => !STOP_WORDS.has(word.toLowerCase()));\n}\n\n/**\n * Extract file paths from a stack trace.\n */\nfunction extractFilePaths(stack: string): string[] {\n\tconst paths: string[] = [];\n\t// Match patterns like \"at file.ts:42\" or \"(src/file.ts:10:5)\"\n\tconst regex = /(?:at\\s+|[(\\s])([^\\s:(]+\\.(?:ts|tsx|js|jsx|mjs|cjs))(?::\\d+)?/g;\n\tlet match: RegExpExecArray | null;\n\n\twhile ((match = regex.exec(stack)) !== null) {\n\t\tif (match[1]) {\n\t\t\tpaths.push(match[1]);\n\t\t}\n\t}\n\n\treturn paths;\n}\n\n/**\n * Calculate confidence based on data completeness.\n */\nfunction calculateConfidence(snapshot: Snapshot, errorContext: ErrorContext, factors: ScoringFactors): number {\n\tlet confidence = 50; // Base confidence\n\n\t// More data = higher confidence\n\tif (snapshot.files.length > 0) {\n\t\tconfidence += 10;\n\t}\n\tif (snapshot.metadata?.commitMessage) {\n\t\tconfidence += 10;\n\t}\n\tif (snapshot.metadata?.riskScore !== undefined) {\n\t\tconfidence += 5;\n\t}\n\tif (errorContext.file) {\n\t\tconfidence += 5;\n\t}\n\tif (errorContext.message) {\n\t\tconfidence += 5;\n\t}\n\n\t// Strong signals boost confidence\n\tif (factors.fileOverlap >= 15) {\n\t\tconfidence += 10; // Exact file match\n\t}\n\tif (factors.recency >= 35) {\n\t\tconfidence += 5; // Very recent\n\t}\n\n\treturn Math.min(100, confidence);\n}\n\n/**\n * Generate human-readable reasoning for the score.\n */\nfunction generateReasoning(factors: ScoringFactors, confidence: number, snapshot: Snapshot): string {\n\tconst parts: string[] = [];\n\n\t// Recency explanation\n\tif (factors.recency >= 35) {\n\t\tparts.push(\"very recent snapshot\");\n\t} else if (factors.recency >= 20) {\n\t\tparts.push(\"recent snapshot (good recency score)\");\n\t} else if (factors.recency >= 10) {\n\t\tparts.push(\"moderately recent\");\n\t} else {\n\t\tparts.push(\"older snapshot\");\n\t}\n\n\t// File overlap explanation\n\tif (factors.fileOverlap >= 15) {\n\t\tparts.push(\"exact file match\");\n\t} else if (factors.fileOverlap >= 10) {\n\t\tparts.push(\"same directory\");\n\t} else if (factors.fileOverlap > 0) {\n\t\tparts.push(\"related files\");\n\t}\n\n\t// Risk explanation\n\tif (factors.riskScore >= 15) {\n\t\tparts.push(\"high-risk change (likely culprit)\");\n\t} else if (factors.riskScore >= 8) {\n\t\tparts.push(\"moderate risk\");\n\t}\n\n\t// Error context\n\tif (factors.errorContext >= 5) {\n\t\tparts.push(\"keyword match with error\");\n\t}\n\n\tconst trigger = snapshot.metadata?.trigger === \"manual\" ? \"Manual snapshot\" : \"Auto snapshot\";\n\tconst factorsSummary = parts.length > 0 ? parts.join(\", \") : \"no strong signals\";\n\n\treturn `${trigger}: ${factorsSummary}. Confidence: ${confidence}%`;\n}\n\n/**\n * Common stop words to filter from keyword extraction.\n */\nconst STOP_WORDS = new Set([\n\t\"the\",\n\t\"is\",\n\t\"at\",\n\t\"in\",\n\t\"of\",\n\t\"and\",\n\t\"or\",\n\t\"to\",\n\t\"for\",\n\t\"with\",\n\t\"from\",\n\t\"error\",\n\t\"undefined\",\n\t\"null\",\n\t\"function\",\n\t\"const\",\n\t\"let\",\n\t\"var\",\n]);\n","/**\n * @snapback/intelligence - External MCP Integration Types\n *\n * Types for GitHub, Context7, and Sentry MCP integrations,\n * as well as the Risk Engine and Context Aggregator.\n */\n\nimport { z } from \"zod\";\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Risk Factor Types\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Source of a risk factor\n */\nexport type RiskFactorSource = \"github\" | \"context7\" | \"sentry\" | \"local\" | \"ai_detection\";\n\n/**\n * A single risk factor contributing to overall risk score\n */\nexport interface RiskFactor {\n\t/** Unique name identifying the risk factor type */\n\tname: string;\n\t/** Score contribution: -100 to 100 (negative = reduces risk) */\n\tscore: number;\n\t/** Human-readable description of the risk */\n\tdescription: string;\n\t/** Source system that identified this risk */\n\tsource: RiskFactorSource;\n\t/** Optional suggestion to mitigate the risk */\n\tsuggestion?: string;\n\t/** Optional link to relevant documentation */\n\tdocsUrl?: string;\n}\n\n/**\n * Overall risk assessment for a file or change\n */\nexport interface RiskAssessment {\n\t/** Overall risk score: 0-100 */\n\tscore: number;\n\t/** Risk level classification */\n\tlevel: \"low\" | \"medium\" | \"high\" | \"critical\";\n\t/** All identified risk factors */\n\tfactors: RiskFactor[];\n\t/** Recommended action based on risk level */\n\trecommendation: \"proceed\" | \"warn\" | \"block\";\n\t/** Confidence in the assessment: 0-100 */\n\tconfidence: number;\n\t/** Human-readable explanation of the assessment */\n\texplanation: string;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// GitHub MCP Types\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Zod schema for GitHub commit information\n */\nexport const GitHubCommitSchema = z.object({\n\tsha: z.string(),\n\tmessage: z.string(),\n\tauthor: z.string(),\n\tdate: z.string(),\n\tadditions: z.number(),\n\tdeletions: z.number(),\n});\n\n/**\n * Zod schema for active PR information\n */\nexport const GitHubPRSchema = z.object({\n\tnumber: z.number(),\n\ttitle: z.string(),\n\tdescription: z.string().nullable(),\n\tlabels: z.array(z.string()),\n\treviewStatus: z.enum([\"pending\", \"approved\", \"changes_requested\", \"none\"]),\n});\n\n/**\n * Zod schema for related issue information\n */\nexport const GitHubIssueSchema = z.object({\n\tnumber: z.number(),\n\ttitle: z.string(),\n\tlabels: z.array(z.string()),\n\tstate: z.enum([\"open\", \"closed\"]),\n});\n\n/**\n * Zod schema for complete GitHub context\n */\nexport const GitHubContextSchema = z.object({\n\tfile: z.string(),\n\trecentCommits: z.array(GitHubCommitSchema).max(10),\n\tactivePR: GitHubPRSchema.nullable(),\n\trelatedIssues: z.array(GitHubIssueSchema).max(5),\n\tlastModifiedBy: z.string().nullable(),\n\tchangeFrequency: z.enum([\"stable\", \"moderate\", \"volatile\"]),\n});\n\nexport type GitHubCommit = z.infer<typeof GitHubCommitSchema>;\nexport type GitHubPR = z.infer<typeof GitHubPRSchema>;\nexport type GitHubIssue = z.infer<typeof GitHubIssueSchema>;\nexport type GitHubContext = z.infer<typeof GitHubContextSchema>;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Context7 MCP Types (Documentation Validation)\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Zod schema for package import information\n */\nexport const ImportValidationSchema = z.object({\n\tpackage: z.string(),\n\tversion: z.string().nullable(),\n\tlatestVersion: z.string().nullable(),\n\tisDeprecated: z.boolean(),\n\tdeprecationMessage: z.string().nullable(),\n});\n\n/**\n * Zod schema for API usage validation\n */\nexport const APIUsageSchema = z.object({\n\tapi: z.string(),\n\tisValid: z.boolean(),\n\tissue: z.string().nullable(),\n\tsuggestion: z.string().nullable(),\n\tdocsUrl: z.string().nullable(),\n});\n\n/**\n * Zod schema for pattern validation\n */\nexport const PatternValidationSchema = z.object({\n\tpattern: z.string(),\n\tisRecommended: z.boolean(),\n\talternative: z.string().nullable(),\n\treason: z.string().nullable(),\n});\n\n/**\n * Zod schema for complete documentation validation\n */\nexport const DocsValidationSchema = z.object({\n\tfile: z.string(),\n\timports: z.array(ImportValidationSchema),\n\tapiUsage: z.array(APIUsageSchema),\n\tpatterns: z.array(PatternValidationSchema),\n});\n\nexport type ImportValidation = z.infer<typeof ImportValidationSchema>;\nexport type APIUsage = z.infer<typeof APIUsageSchema>;\nexport type PatternValidation = z.infer<typeof PatternValidationSchema>;\nexport type DocsValidation = z.infer<typeof DocsValidationSchema>;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Sentry MCP Types (Production Error Context)\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Zod schema for Sentry error information\n */\nexport const SentryErrorSchema = z.object({\n\tid: z.string(),\n\ttitle: z.string(),\n\tculprit: z.string(),\n\tcount: z.number(),\n\tuserCount: z.number(),\n\tfirstSeen: z.string(),\n\tlastSeen: z.string(),\n\tisRegression: z.boolean(),\n\tlevel: z.enum([\"fatal\", \"error\", \"warning\", \"info\"]),\n});\n\n/**\n * Zod schema for release health information\n */\nexport const ReleaseHealthSchema = z.object({\n\tcrashFreeRate: z.number(),\n\tsessionsCount: z.number(),\n\thasRegressions: z.boolean(),\n});\n\n/**\n * Zod schema for similar issue information\n */\nexport const SimilarIssueSchema = z.object({\n\tid: z.string(),\n\ttitle: z.string(),\n\tsimilarity: z.number(),\n\tresolution: z.string().nullable(),\n});\n\n/**\n * Zod schema for complete Sentry context\n */\nexport const SentryContextSchema = z.object({\n\tfile: z.string(),\n\terrors: z.array(SentryErrorSchema),\n\terrorTrend: z.enum([\"increasing\", \"stable\", \"decreasing\", \"none\"]),\n\trecentReleaseHealth: ReleaseHealthSchema.nullable(),\n\tsimilarIssues: z.array(SimilarIssueSchema),\n});\n\nexport type SentryError = z.infer<typeof SentryErrorSchema>;\nexport type ReleaseHealth = z.infer<typeof ReleaseHealthSchema>;\nexport type SimilarIssue = z.infer<typeof SimilarIssueSchema>;\nexport type SentryContext = z.infer<typeof SentryContextSchema>;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Aggregated Context Types\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Aggregated context from all sources\n */\nexport interface AggregatedContext {\n\t/** File path being analyzed */\n\tfile: string;\n\t/** ISO timestamp when context was gathered */\n\tgatheredAt: string;\n\t/** Time taken to gather context in milliseconds */\n\tdurationMs: number;\n\t/** Context from each source */\n\tsources: {\n\t\tgithub?: GitHubContext;\n\t\tcontext7?: DocsValidation;\n\t\tsentry?: SentryContext;\n\t};\n\t/** All risk factors extracted from sources */\n\triskFactors: RiskFactor[];\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Configuration Types\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Zod schema for external integration configuration\n */\nexport const IntegrationConfigSchema = z.object({\n\tenabled: z.boolean().default(true),\n\n\tintegrations: z\n\t\t.object({\n\t\t\tgithub: z\n\t\t\t\t.object({\n\t\t\t\t\tenabled: z.boolean().default(false),\n\t\t\t\t\ttoken: z.string().optional(),\n\t\t\t\t\towner: z.string().optional(),\n\t\t\t\t\trepo: z.string().optional(),\n\t\t\t\t})\n\t\t\t\t.default({}),\n\n\t\t\tcontext7: z\n\t\t\t\t.object({\n\t\t\t\t\tenabled: z.boolean().default(false),\n\t\t\t\t\tapiKey: z.string().optional(),\n\t\t\t\t})\n\t\t\t\t.default({}),\n\n\t\t\tsentry: z\n\t\t\t\t.object({\n\t\t\t\t\tenabled: z.boolean().default(false),\n\t\t\t\t\tauthToken: z.string().optional(),\n\t\t\t\t\torganization: z.string().optional(),\n\t\t\t\t\tproject: z.string().optional(),\n\t\t\t\t})\n\t\t\t\t.default({}),\n\t\t})\n\t\t.default({}),\n\n\trisk: z\n\t\t.object({\n\t\t\tthresholds: z\n\t\t\t\t.object({\n\t\t\t\t\twarn: z.number().min(0).max(100).default(30),\n\t\t\t\t\tblock: z.number().min(0).max(100).default(70),\n\t\t\t\t})\n\t\t\t\t.default({}),\n\n\t\t\tweights: z\n\t\t\t\t.object({\n\t\t\t\t\tgithub: z.number().min(0).max(5).default(1.0),\n\t\t\t\t\tcontext7: z.number().min(0).max(5).default(1.2),\n\t\t\t\t\tsentry: z.number().min(0).max(5).default(1.5),\n\t\t\t\t\tlocal: z.number().min(0).max(5).default(0.8),\n\t\t\t\t\tai_detection: z.number().min(0).max(5).default(1.0),\n\t\t\t\t})\n\t\t\t\t.default({}),\n\t\t})\n\t\t.default({}),\n\n\tperformance: z\n\t\t.object({\n\t\t\tcontextTimeoutMs: z.number().min(100).max(30000).default(5000),\n\t\t\tcacheEnabled: z.boolean().default(true),\n\t\t\tcacheTtlMs: z.number().min(0).default(60000),\n\t\t})\n\t\t.default({}),\n});\n\nexport type IntegrationConfig = z.infer<typeof IntegrationConfigSchema>;\n\n/**\n * Risk weights for each source\n */\nexport interface RiskWeights {\n\tgithub: number;\n\tcontext7: number;\n\tsentry: number;\n\tlocal: number;\n\tai_detection: number;\n}\n\n/**\n * Default risk weights\n */\nexport const DEFAULT_RISK_WEIGHTS: RiskWeights = {\n\tgithub: 1.0,\n\tcontext7: 1.2, // Docs validation slightly more important\n\tsentry: 1.5, // Production errors most important\n\tlocal: 0.8,\n\tai_detection: 1.0,\n};\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Rollback Suggestion Types\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Suggestion for which snapshot to roll back to\n */\nexport interface RollbackSuggestion {\n\t/** ID of the suggested snapshot */\n\tsnapshotId: string;\n\t/** When the snapshot was created */\n\tcreatedAt: Date;\n\t/** Score indicating how good this rollback target is (0-100) */\n\tscore: number;\n\t/** Human-readable reasoning for the suggestion */\n\treasoning: string;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Pattern Query Types\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Query parameters for pattern search\n */\nexport interface PatternQueryInput {\n\t/** Natural language query about patterns */\n\tquery: string;\n\t/** Optional file path to scope the query */\n\tfilePath?: string;\n\t/** Time range for pattern analysis */\n\ttimeRange: \"7d\" | \"30d\" | \"90d\";\n}\n\n/**\n * Result from pattern query\n */\nexport interface PatternQueryResult {\n\t/** Patterns matching the query */\n\tpatterns: Array<{\n\t\tname: string;\n\t\tdescription: string;\n\t\toccurrences: number;\n\t\tlastSeen: string;\n\t\timpact: \"positive\" | \"negative\" | \"neutral\";\n\t}>;\n\t/** Summary explanation */\n\tsummary: string;\n}\n","/**\n * Risk Engine\n *\n * Core risk assessment engine that calculates overall risk scores\n * from aggregated context and risk factors.\n */\n\nimport {\n\ttype ErrorContext,\n\ttype Snapshot as RestoreSnapshot,\n\tscoreErrorContext,\n\tscoreFileOverlap,\n\tscoreRecency,\n\tscoreRiskLevel,\n} from \"../algorithms/RestoreSuggestion.js\";\nimport type {\n\tAggregatedContext,\n\tRiskAssessment,\n\tRiskFactor,\n\tRiskWeights,\n\tRollbackSuggestion,\n} from \"../types/integrations.js\";\nimport { DEFAULT_RISK_WEIGHTS } from \"../types/integrations.js\";\n\nexport interface RiskEngineOptions {\n\t/** Custom risk weights for each source */\n\tweights?: Partial<RiskWeights>;\n\t/** Score thresholds for recommendations */\n\tthresholds?: {\n\t\twarn: number;\n\t\tblock: number;\n\t};\n\t/** Optional logger */\n\tlogger?: {\n\t\tdebug: (msg: string, data?: unknown) => void;\n\t\tinfo: (msg: string, data?: unknown) => void;\n\t\twarn: (msg: string, data?: unknown) => void;\n\t\terror: (msg: string, data?: unknown) => void;\n\t};\n}\n\n/**\n * Snapshot metadata type for rollback suggestions\n */\ninterface SnapshotForRollback {\n\tid: string;\n\tcreatedAt: Date;\n\tfiles?: string[];\n\tmetadata?: {\n\t\triskScore?: number;\n\t\ttrigger?: string;\n\t\tcommitMessage?: string;\n\t\t[key: string]: unknown;\n\t};\n}\n\n/**\n * Default logger\n */\nconst defaultLogger = {\n\tdebug: (msg: string, data?: unknown) => console.debug(`[risk-engine] ${msg}`, data ?? \"\"),\n\tinfo: (msg: string, data?: unknown) => console.info(`[risk-engine] ${msg}`, data ?? \"\"),\n\twarn: (msg: string, data?: unknown) => console.warn(`[risk-engine] ${msg}`, data ?? \"\"),\n\terror: (msg: string, data?: unknown) => console.error(`[risk-engine] ${msg}`, data ?? \"\"),\n};\n\n/**\n * Risk Engine\n *\n * Calculates overall risk scores from aggregated context\n * using weighted risk factors.\n */\nexport class RiskEngine {\n\tprivate readonly weights: RiskWeights;\n\tprivate readonly thresholds: { warn: number; block: number };\n\tprivate readonly logger: RiskEngineOptions[\"logger\"];\n\n\tconstructor(options: RiskEngineOptions = {}) {\n\t\tthis.weights = { ...DEFAULT_RISK_WEIGHTS, ...options.weights };\n\t\tthis.thresholds = { warn: 30, block: 70, ...options.thresholds };\n\t\tthis.logger = options.logger ?? defaultLogger;\n\t}\n\n\t/**\n\t * Assess risk for a file change\n\t */\n\tasync assess(\n\t\tfilePath: string,\n\t\tcontent: string,\n\t\tpreviousContent: string | undefined,\n\t\tcontext: AggregatedContext,\n\t): Promise<RiskAssessment> {\n\t\tconst startTime = Date.now();\n\n\t\t// Calculate weighted score\n\t\tlet totalScore = 0;\n\t\tlet totalWeight = 0;\n\n\t\tfor (const factor of context.riskFactors) {\n\t\t\tconst weight = this.weights[factor.source] ?? 1.0;\n\t\t\ttotalScore += factor.score * weight;\n\t\t\ttotalWeight += Math.abs(factor.score) * weight;\n\t\t}\n\n\t\t// Normalize to 0-100 range\n\t\t// Base score of 50, adjusted by weighted factors\n\t\tconst normalizedScore = totalWeight > 0 ? Math.min(100, Math.max(0, 50 + totalScore / 2)) : 50;\n\n\t\t// Add local analysis factors\n\t\tconst localFactors = this.analyzeLocalChanges(content, previousContent, filePath);\n\n\t\t// Combine all factors\n\t\tconst allFactors = [...context.riskFactors, ...localFactors];\n\n\t\t// Recalculate with local factors\n\t\tlet adjustedScore = normalizedScore;\n\t\tfor (const factor of localFactors) {\n\t\t\tconst weight = this.weights[factor.source] ?? 1.0;\n\t\t\tadjustedScore += (factor.score * weight) / 10;\n\t\t}\n\n\t\tadjustedScore = Math.min(100, Math.max(0, adjustedScore));\n\n\t\t// Determine level\n\t\tconst level = this.scoreToLevel(adjustedScore);\n\n\t\t// Determine recommendation\n\t\tconst recommendation = this.levelToRecommendation(level);\n\n\t\t// Calculate confidence based on data completeness\n\t\tconst confidence = this.calculateConfidence(context);\n\n\t\t// Generate explanation\n\t\tconst explanation = this.generateExplanation(level, allFactors, confidence);\n\n\t\tconst duration = Date.now() - startTime;\n\t\tthis.logger?.debug(\"Risk assessed\", {\n\t\t\tfilePath,\n\t\t\tscore: Math.round(adjustedScore),\n\t\t\tlevel,\n\t\t\tduration,\n\t\t});\n\n\t\treturn {\n\t\t\tscore: Math.round(adjustedScore),\n\t\t\tlevel,\n\t\t\tfactors: allFactors,\n\t\t\trecommendation,\n\t\t\tconfidence,\n\t\t\texplanation,\n\t\t};\n\t}\n\n\t/**\n\t * Suggest best snapshots to roll back to using sophisticated multi-factor scoring.\n\t *\n\t * Uses RestoreSuggestion algorithm with:\n\t * - Recency (40 pts): Exponential decay, half-life 6 hours\n\t * - File overlap (30 pts): Exact match + directory proximity\n\t * - Risk score (20 pts): High-risk changes more likely culprits\n\t * - Error context (10 pts): Semantic match to error message\n\t */\n\tasync suggestRollback(\n\t\tfilePath: string,\n\t\tsnapshots: SnapshotForRollback[],\n\t\tsymptom?: string,\n\t): Promise<RollbackSuggestion[]> {\n\t\tconst suggestions: RollbackSuggestion[] = [];\n\t\tconst errorContext: ErrorContext = {\n\t\t\tfile: filePath,\n\t\t\tmessage: symptom,\n\t\t};\n\n\t\tfor (const snapshot of snapshots) {\n\t\t\tconst score = this.scoreSnapshotForRollback(snapshot, errorContext);\n\t\t\tsuggestions.push({\n\t\t\t\tsnapshotId: snapshot.id,\n\t\t\t\tcreatedAt: snapshot.createdAt,\n\t\t\t\tscore,\n\t\t\t\treasoning: this.generateRollbackReasoning(snapshot, score, errorContext),\n\t\t\t});\n\t\t}\n\n\t\t// Sort by score (higher = better rollback target)\n\t\treturn suggestions.sort((a, b) => b.score - a.score);\n\t}\n\n\t/**\n\t * Quick risk check without full context\n\t */\n\tquickAssess(factors: RiskFactor[]): {\n\t\tscore: number;\n\t\tlevel: RiskAssessment[\"level\"];\n\t\trecommendation: RiskAssessment[\"recommendation\"];\n\t} {\n\t\tlet totalScore = 0;\n\t\tlet totalWeight = 0;\n\n\t\tfor (const factor of factors) {\n\t\t\tconst weight = this.weights[factor.source] ?? 1.0;\n\t\t\ttotalScore += factor.score * weight;\n\t\t\ttotalWeight += Math.abs(factor.score) * weight;\n\t\t}\n\n\t\tconst normalizedScore = totalWeight > 0 ? Math.min(100, Math.max(0, 50 + totalScore / 2)) : 50;\n\n\t\tconst level = this.scoreToLevel(normalizedScore);\n\t\tconst recommendation = this.levelToRecommendation(level);\n\n\t\treturn {\n\t\t\tscore: Math.round(normalizedScore),\n\t\t\tlevel,\n\t\t\trecommendation,\n\t\t};\n\t}\n\n\t/**\n\t * Get current weights\n\t */\n\tgetWeights(): RiskWeights {\n\t\treturn { ...this.weights };\n\t}\n\n\t/**\n\t * Get current thresholds\n\t */\n\tgetThresholds(): { warn: number; block: number } {\n\t\treturn { ...this.thresholds };\n\t}\n\n\t// ---------------------------------------------------------------------------\n\t// Private Helpers\n\t// ---------------------------------------------------------------------------\n\n\tprivate analyzeLocalChanges(content: string, previousContent: string | undefined, filePath: string): RiskFactor[] {\n\t\tconst factors: RiskFactor[] = [];\n\n\t\t// Factor: Large change (many lines added/removed)\n\t\tif (previousContent) {\n\t\t\tconst prevLines = previousContent.split(\"\\n\").length;\n\t\t\tconst newLines = content.split(\"\\n\").length;\n\t\t\tconst diff = Math.abs(newLines - prevLines);\n\n\t\t\tif (diff > 100) {\n\t\t\t\tfactors.push({\n\t\t\t\t\tname: \"large_change\",\n\t\t\t\t\tscore: 15,\n\t\t\t\t\tdescription: `Large change: ${diff > 0 ? \"+\" : \"\"}${newLines - prevLines} lines`,\n\t\t\t\t\tsource: \"local\",\n\t\t\t\t});\n\t\t\t} else if (diff > 50) {\n\t\t\t\tfactors.push({\n\t\t\t\t\tname: \"moderate_change\",\n\t\t\t\t\tscore: 8,\n\t\t\t\t\tdescription: `Moderate change: ${diff > 0 ? \"+\" : \"\"}${newLines - prevLines} lines`,\n\t\t\t\t\tsource: \"local\",\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\t// Factor: Critical file patterns\n\t\tconst criticalPatterns = [\n\t\t\t{ pattern: /\\.env/, name: \"environment_file\", score: 15 },\n\t\t\t{ pattern: /config/, name: \"config_file\", score: 10 },\n\t\t\t{ pattern: /auth|authentication|login/i, name: \"auth_file\", score: 12 },\n\t\t\t{ pattern: /security|permission|access/i, name: \"security_file\", score: 12 },\n\t\t\t{ pattern: /payment|billing|stripe/i, name: \"payment_file\", score: 15 },\n\t\t\t{ pattern: /database|migration|schema/i, name: \"database_file\", score: 10 },\n\t\t];\n\n\t\tfor (const { pattern, name, score } of criticalPatterns) {\n\t\t\tif (pattern.test(filePath)) {\n\t\t\t\tfactors.push({\n\t\t\t\t\tname,\n\t\t\t\t\tscore,\n\t\t\t\t\tdescription: `Critical file type: ${name.replace(/_/g, \" \")}`,\n\t\t\t\t\tsource: \"local\",\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\t// Factor: Dangerous code patterns\n\t\tconst dangerousPatterns = [\n\t\t\t{\n\t\t\t\tpattern: /eval\\s*\\(/,\n\t\t\t\tname: \"eval_usage\",\n\t\t\t\tscore: 25,\n\t\t\t\tdescription: \"eval() usage detected (security risk)\",\n\t\t\t},\n\t\t\t{\n\t\t\t\tpattern: /innerHTML\\s*=/,\n\t\t\t\tname: \"innerHTML_assignment\",\n\t\t\t\tscore: 15,\n\t\t\t\tdescription: \"innerHTML assignment (XSS risk)\",\n\t\t\t},\n\t\t\t{\n\t\t\t\tpattern: /password|secret|apikey|api_key/i,\n\t\t\t\tname: \"sensitive_data\",\n\t\t\t\tscore: 10,\n\t\t\t\tdescription: \"Potentially sensitive data in code\",\n\t\t\t},\n\t\t\t{\n\t\t\t\tpattern: /TODO:|FIXME:|HACK:|XXX:/,\n\t\t\t\tname: \"incomplete_code\",\n\t\t\t\tscore: 5,\n\t\t\t\tdescription: \"Incomplete code markers (TODO/FIXME/HACK)\",\n\t\t\t},\n\t\t\t{\n\t\t\t\tpattern: /console\\.(log|debug|info)\\(/,\n\t\t\t\tname: \"debug_statements\",\n\t\t\t\tscore: 3,\n\t\t\t\tdescription: \"Debug statements in code\",\n\t\t\t},\n\t\t];\n\n\t\tfor (const { pattern, name, score, description } of dangerousPatterns) {\n\t\t\tif (pattern.test(content)) {\n\t\t\t\tfactors.push({\n\t\t\t\t\tname,\n\t\t\t\t\tscore,\n\t\t\t\t\tdescription,\n\t\t\t\t\tsource: \"local\",\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\treturn factors;\n\t}\n\n\tprivate scoreToLevel(score: number): RiskAssessment[\"level\"] {\n\t\tif (score < this.thresholds.warn) {\n\t\t\treturn \"low\";\n\t\t}\n\t\tif (score < 50) {\n\t\t\treturn \"medium\";\n\t\t}\n\t\tif (score < this.thresholds.block) {\n\t\t\treturn \"high\";\n\t\t}\n\t\treturn \"critical\";\n\t}\n\n\tprivate levelToRecommendation(level: RiskAssessment[\"level\"]): RiskAssessment[\"recommendation\"] {\n\t\tswitch (level) {\n\t\t\tcase \"low\":\n\t\t\t\treturn \"proceed\";\n\t\t\tcase \"medium\":\n\t\t\t\treturn \"warn\";\n\t\t\tcase \"high\":\n\t\t\tcase \"critical\":\n\t\t\t\treturn \"block\";\n\t\t}\n\t}\n\n\tprivate calculateConfidence(context: AggregatedContext): number {\n\t\tlet confidence = 50; // Base confidence\n\n\t\t// More sources = higher confidence\n\t\tconst sourceCount = Object.values(context.sources).filter(Boolean).length;\n\t\tconfidence += sourceCount * 10;\n\n\t\t// More factors = higher confidence (more data)\n\t\tconfidence += Math.min(20, context.riskFactors.length * 2);\n\n\t\t// Fast response = likely cached/reliable\n\t\tif (context.durationMs < 500) {\n\t\t\tconfidence += 10;\n\t\t} else if (context.durationMs > 3000) {\n\t\t\tconfidence -= 5;\n\t\t}\n\n\t\treturn Math.min(100, confidence);\n\t}\n\n\tprivate generateExplanation(level: RiskAssessment[\"level\"], factors: RiskFactor[], confidence: number): string {\n\t\tconst topFactors = factors.sort((a, b) => Math.abs(b.score) - Math.abs(a.score)).slice(0, 3);\n\n\t\tif (topFactors.length === 0) {\n\t\t\treturn `No significant risk factors detected. Confidence: ${confidence}%`;\n\t\t}\n\n\t\tconst factorDescriptions = topFactors.map((f) => f.description).join(\"; \");\n\n\t\tconst levelText = {\n\t\t\tlow: \"This change appears safe\",\n\t\t\tmedium: \"This change has moderate risk\",\n\t\t\thigh: \"This change has significant risk\",\n\t\t\tcritical: \"This change has critical risk factors\",\n\t\t}[level];\n\n\t\treturn `${levelText}. Key factors: ${factorDescriptions}. Confidence: ${confidence}%`;\n\t}\n\n\t/**\n\t * Score a snapshot for rollback using multi-factor algorithm.\n\t *\n\t * @see packages/intelligence/src/algorithms/RestoreSuggestion.ts\n\t */\n\tprivate scoreSnapshotForRollback(snapshot: SnapshotForRollback, errorContext: ErrorContext): number {\n\t\tconst now = Date.now();\n\n\t\t// Convert to RestoreSnapshot format for algorithm\n\t\tconst restoreSnapshot: RestoreSnapshot = {\n\t\t\tid: snapshot.id,\n\t\t\tcreatedAt: snapshot.createdAt,\n\t\t\tfiles: snapshot.files?.map((f) => ({ path: f, content: \"\", hash: \"\" })) ?? [],\n\t\t\tmetadata: snapshot.metadata,\n\t\t};\n\n\t\t// Calculate individual factors using RestoreSuggestion algorithm\n\t\tconst recency = scoreRecency(restoreSnapshot, now);\n\t\tconst fileOverlap = scoreFileOverlap(restoreSnapshot, errorContext);\n\t\tconst riskScore = scoreRiskLevel(restoreSnapshot);\n\t\tconst errorMatch = scoreErrorContext(restoreSnapshot, errorContext);\n\n\t\t// Combine factors (total 0-100)\n\t\tconst totalScore = recency + fileOverlap + riskScore + errorMatch;\n\n\t\t// Bonus for manual snapshots (more intentional save points)\n\t\tconst manualBonus = snapshot.metadata?.trigger === \"manual\" ? 5 : 0;\n\n\t\treturn Math.max(0, Math.min(100, Math.round(totalScore + manualBonus)));\n\t}\n\n\tprivate generateRollbackReasoning(\n\t\tsnapshot: SnapshotForRollback,\n\t\tscore: number,\n\t\terrorContext: ErrorContext,\n\t): string {\n\t\tconst age = this.formatAge(snapshot.createdAt);\n\t\tconst trigger = snapshot.metadata?.trigger ?? \"auto\";\n\n\t\tconst parts: string[] = [`Snapshot from ${age} (${trigger} trigger)`];\n\n\t\t// Add recency context\n\t\tconst ageHours = (Date.now() - snapshot.createdAt.getTime()) / (1000 * 60 * 60);\n\t\tif (ageHours < 6) {\n\t\t\tparts.push(\"recent snapshot with high recency score\");\n\t\t}\n\n\t\t// Add file overlap context\n\t\tif (errorContext.file && snapshot.files?.includes(errorContext.file)) {\n\t\t\tparts.push(`exact match for ${errorContext.file}`);\n\t\t}\n\n\t\t// Add risk context\n\t\tif (snapshot.metadata?.riskScore !== undefined) {\n\t\t\tconst riskLevel =\n\t\t\t\tsnapshot.metadata.riskScore >= 60 ? \"high\" : snapshot.metadata.riskScore >= 30 ? \"moderate\" : \"low\";\n\t\t\tparts.push(`${riskLevel} risk (${snapshot.metadata.riskScore}%)`);\n\t\t}\n\n\t\tparts.push(`Score: ${score}/100`);\n\n\t\treturn parts.join(\". \");\n\t}\n\n\tprivate formatAge(date: Date): string {\n\t\tconst hours = (Date.now() - date.getTime()) / (1000 * 60 * 60);\n\t\tif (hours < 1) {\n\t\t\treturn \"less than an hour ago\";\n\t\t}\n\t\tif (hours < 24) {\n\t\t\treturn `${Math.round(hours)} hours ago`;\n\t\t}\n\t\tconst days = Math.round(hours / 24);\n\t\treturn `${days} day${days > 1 ? \"s\" : \"\"} ago`;\n\t}\n}\n\n/**\n * Format risk assessment for display\n */\nexport function formatRiskAssessment(assessment: RiskAssessment): string {\n\tconst emoji = {\n\t\tlow: \"✅\",\n\t\tmedium: \"⚠️\",\n\t\thigh: \"🔶\",\n\t\tcritical: \"🛑\",\n\t}[assessment.level];\n\n\tlet output = `${emoji} Risk Assessment: ${assessment.level.toUpperCase()} (${assessment.score}/100)\\n\\n`;\n\toutput += `Recommendation: ${assessment.recommendation}\\n`;\n\toutput += `Confidence: ${assessment.confidence}%\\n\\n`;\n\n\tif (assessment.factors.length > 0) {\n\t\toutput += \"Risk Factors:\\n\";\n\t\tfor (const factor of assessment.factors.slice(0, 5)) {\n\t\t\tconst sign = factor.score >= 0 ? \"+\" : \"\";\n\t\t\toutput += ` • [${factor.source}] ${factor.description} (${sign}${factor.score})\\n`;\n\t\t\tif (factor.suggestion) {\n\t\t\t\toutput += ` → ${factor.suggestion}\\n`;\n\t\t\t}\n\t\t}\n\t}\n\n\toutput += `\\n${assessment.explanation}`;\n\treturn output;\n}\n\n/**\n * Create a risk engine with configuration\n */\nexport function createRiskEngine(options?: RiskEngineOptions): RiskEngine {\n\treturn new RiskEngine(options);\n}\n","/**\n * Config Store\n *\n * Loads and caches configuration from context files.\n * Provides static context for Anthropic prompt caching.\n */\n\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport type { CacheableContext, ResolvedConfig } from \"../types/config.js\";\n\n/**\n * Config Store for loading architecture, constraints, and patterns\n */\nexport class ConfigStore {\n\tprivate config: ResolvedConfig;\n\tprivate cache: {\n\t\tarchitecture?: string;\n\t\tconstraints?: string;\n\t\tpatterns?: string;\n\t\ttimestamp?: string;\n\t} = {};\n\n\tconstructor(config: ResolvedConfig) {\n\t\tthis.config = config;\n\t}\n\n\t/**\n\t * Get the root directory for intelligence data\n\t */\n\tget rootDir(): string {\n\t\treturn this.config.rootDir;\n\t}\n\n\t/**\n\t * Resolve a path relative to rootDir\n\t */\n\tresolvePath(relativePath: string): string {\n\t\treturn path.join(this.config.rootDir, relativePath);\n\t}\n\n\t/**\n\t * Load architecture documentation\n\t */\n\tloadArchitecture(): string {\n\t\tif (this.cache.architecture) {\n\t\t\treturn this.cache.architecture;\n\t\t}\n\n\t\tconst archPath = this.resolvePath(\"ARCHITECTURE.md\");\n\t\tif (fs.existsSync(archPath)) {\n\t\t\tthis.cache.architecture = fs.readFileSync(archPath, \"utf-8\");\n\t\t} else {\n\t\t\tthis.cache.architecture = \"\";\n\t\t}\n\t\treturn this.cache.architecture;\n\t}\n\n\t/**\n\t * Load constraints/rules\n\t */\n\tloadConstraints(): string {\n\t\tif (this.cache.constraints) {\n\t\t\treturn this.cache.constraints;\n\t\t}\n\n\t\tconst constraintsPath = this.resolvePath(this.config.constraintsFile);\n\t\tif (fs.existsSync(constraintsPath)) {\n\t\t\tthis.cache.constraints = fs.readFileSync(constraintsPath, \"utf-8\");\n\t\t} else {\n\t\t\tthis.cache.constraints = \"\";\n\t\t}\n\t\treturn this.cache.constraints;\n\t}\n\n\t/**\n\t * Load codebase patterns\n\t */\n\tloadPatterns(): string {\n\t\tif (this.cache.patterns) {\n\t\t\treturn this.cache.patterns;\n\t\t}\n\n\t\tconst patternsPath = this.resolvePath(path.join(this.config.patternsDir, \"codebase-patterns.md\"));\n\t\tif (fs.existsSync(patternsPath)) {\n\t\t\tthis.cache.patterns = fs.readFileSync(patternsPath, \"utf-8\");\n\t\t} else {\n\t\t\tthis.cache.patterns = \"\";\n\t\t}\n\t\treturn this.cache.patterns;\n\t}\n\n\t/**\n\t * Load any context file by name\n\t */\n\tloadContextFile(filename: string): string {\n\t\tconst filePath = this.resolvePath(filename);\n\t\tif (fs.existsSync(filePath)) {\n\t\t\treturn fs.readFileSync(filePath, \"utf-8\");\n\t\t}\n\t\treturn \"\";\n\t}\n\n\t/**\n\t * Get static context suitable for prompt caching\n\t *\n\t * Content changes rarely - cache for 5+ minutes.\n\t * Marked with cache_control for Anthropic prompt caching.\n\t *\n\t * @see https://docs.anthropic.com/claude/docs/prompt-caching\n\t */\n\tgetStaticContext(): CacheableContext {\n\t\treturn {\n\t\t\tarchitecture: this.loadArchitecture(),\n\t\t\tconstraints: this.loadConstraints(),\n\t\t\tpatterns: this.loadPatterns(),\n\t\t\ttimestamp: new Date().toISOString(),\n\t\t\t_cache_control: { type: \"ephemeral\" },\n\t\t};\n\t}\n\n\t/**\n\t * Clear the cache (for testing or after file changes)\n\t */\n\tclearCache(): void {\n\t\tthis.cache = {};\n\t}\n\n\t/**\n\t * Check if a context file exists\n\t */\n\tcontextFileExists(filename: string): boolean {\n\t\treturn fs.existsSync(this.resolvePath(filename));\n\t}\n\n\t/**\n\t * List all context files that exist\n\t */\n\tlistAvailableContextFiles(): string[] {\n\t\treturn this.config.contextFiles.filter((f) => this.contextFileExists(f));\n\t}\n}\n","/**\n * JSONL Store\n *\n * Atomic JSONL file operations for learnings, violations, and interactions.\n * Uses atomically package for safe writes that prevent corruption.\n */\n\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport { generateId as contractsGenerateId } from \"@snapback/contracts/id-generator\";\nimport { writeFile } from \"atomically\";\n\n/**\n * Load all records from a JSONL file\n */\nexport function loadJsonl<T>(filepath: string): T[] {\n\tif (!fs.existsSync(filepath)) {\n\t\treturn [];\n\t}\n\ttry {\n\t\treturn fs\n\t\t\t.readFileSync(filepath, \"utf-8\")\n\t\t\t.split(/\\r?\\n/) // Cross-platform: handles both \\n (Unix) and \\r\\n (Windows)\n\t\t\t.filter((line) => line.trim())\n\t\t\t.map((line) => JSON.parse(line) as T);\n\t} catch (e) {\n\t\tconsole.error(`[JsonlStore] Error loading ${filepath}:`, e);\n\t\treturn [];\n\t}\n}\n\n/**\n * Append a record to a JSONL file (sync)\n */\nexport function appendJsonl<T>(filepath: string, data: T): void {\n\tconst dir = path.dirname(filepath);\n\tif (!fs.existsSync(dir)) {\n\t\tfs.mkdirSync(dir, { recursive: true });\n\t}\n\tfs.appendFileSync(filepath, `${JSON.stringify(data)}\\n`);\n}\n\n/**\n * Append a record to a JSONL file (async, atomic)\n */\nexport async function appendJsonlAsync<T>(filepath: string, data: T): Promise<void> {\n\tconst dir = path.dirname(filepath);\n\tif (!fs.existsSync(dir)) {\n\t\tfs.mkdirSync(dir, { recursive: true });\n\t}\n\ttry {\n\t\tconst existing = fs.existsSync(filepath) ? fs.readFileSync(filepath, \"utf-8\") : \"\";\n\t\tawait writeFile(filepath, `${existing + JSON.stringify(data)}\\n`);\n\t} catch {\n\t\t// Fallback to sync append\n\t\tfs.appendFileSync(filepath, `${JSON.stringify(data)}\\n`);\n\t}\n}\n\n/**\n * Write all records to a JSONL file (atomic replace)\n */\nexport async function writeJsonl<T>(filepath: string, records: T[]): Promise<void> {\n\tconst dir = path.dirname(filepath);\n\tif (!fs.existsSync(dir)) {\n\t\tfs.mkdirSync(dir, { recursive: true });\n\t}\n\tconst content = `${records.map((r) => JSON.stringify(r)).join(\"\\n\")}\\n`;\n\ttry {\n\t\tawait writeFile(filepath, content);\n\t} catch {\n\t\t// Fallback to sync write\n\t\tfs.writeFileSync(filepath, content);\n\t}\n}\n\n/**\n * Find a record by predicate\n */\nexport function findInJsonl<T>(filepath: string, predicate: (item: T) => boolean): T | undefined {\n\tconst records = loadJsonl<T>(filepath);\n\treturn records.find(predicate);\n}\n\n/**\n * Update a record that matches the predicate\n */\nexport async function updateInJsonl<T>(\n\tfilepath: string,\n\tpredicate: (item: T) => boolean,\n\tupdater: (item: T) => T,\n): Promise<boolean> {\n\tconst records = loadJsonl<T>(filepath);\n\tlet updated = false;\n\n\tconst newRecords = records.map((record) => {\n\t\tif (predicate(record)) {\n\t\t\tupdated = true;\n\t\t\treturn updater(record);\n\t\t}\n\t\treturn record;\n\t});\n\n\tif (updated) {\n\t\tawait writeJsonl(filepath, newRecords);\n\t}\n\n\treturn updated;\n}\n\n/**\n * Count records matching a predicate\n */\nexport function countInJsonl<T>(filepath: string, predicate?: (item: T) => boolean): number {\n\tconst records = loadJsonl<T>(filepath);\n\tif (!predicate) {\n\t\treturn records.length;\n\t}\n\treturn records.filter(predicate).length;\n}\n\n/**\n * Generate a unique ID - delegates to @snapback/contracts\n * Re-exported for backwards compatibility\n */\nexport function generateId(prefix = \"ID\"): string {\n\treturn contractsGenerateId(prefix);\n}\n","/**\n * Task Intent Types for Context-Aware Learning Retrieval\n *\n * Based on research from Cursor RAG pipeline and A-MEM agentic memory systems\n * Enables semantic matching of learnings to specific task contexts\n *\n * @module types/intent\n */\n\n/**\n * Task intent categories for learning retrieval\n * Maps to specific development activities that require different pattern sets\n */\nexport type TaskIntent = \"implement\" | \"debug\" | \"refactor\" | \"test\" | \"review\" | \"explore\";\n\n/**\n * Component type classification for file affinity\n * Enables filtering learnings by component type regardless of file path\n */\nexport type ComponentType = \"hook\" | \"component\" | \"api\" | \"migration\" | \"test\" | \"util\" | \"type\" | \"config\" | \"tool\";\n\n/**\n * Task intent metadata attached to learnings\n * Enables multi-dimensional retrieval beyond simple keyword matching\n */\nexport interface IntentMetadata {\n\t/** Primary task intents this learning applies to */\n\tintents: TaskIntent[];\n\t/** Component types this learning is relevant for */\n\tcomponentTypes: ComponentType[];\n\t/** File glob patterns this learning commonly applies to */\n\tfileAffinities: string[];\n\t/** Semantic embedding vector for similarity search (future: vector DB) */\n\tsemanticEmbedding?: number[];\n\t/** Related learning IDs (Zettelkasten-style links) */\n\trelatedLearnings: string[];\n\t/** Number of times this intent-context pair was successful */\n\tintentSuccessCount: Record<TaskIntent, number>;\n}\n\n/**\n * Task context provided when requesting learnings\n * Used to match against IntentMetadata for precision retrieval\n */\nexport interface TaskContext {\n\t/** What the user/agent is trying to do */\n\tintent: TaskIntent;\n\t/** Files being worked on */\n\tfiles: string[];\n\t/** Optional keywords for additional filtering */\n\tkeywords?: string[];\n\t/** Optional component type hint from file analysis */\n\tcomponentType?: ComponentType;\n}\n\n/**\n * Scored learning result from intent-aware retrieval\n */\nexport interface ScoredLearning {\n\tlearningId: string;\n\tscore: number;\n\tmatchReasons: {\n\t\tintentMatch: boolean;\n\t\tcomponentMatch: boolean;\n\t\tfileAffinityMatch: boolean;\n\t\tkeywordMatch: boolean;\n\t\trelationshipMatch: boolean;\n\t};\n}\n\n/**\n * Intent-based retrieval configuration\n */\nexport interface IntentRetrievalConfig {\n\t/** Maximum learnings to return */\n\tmaxResults: number;\n\t/** Minimum score threshold (0-1) */\n\tminScore: number;\n\t/** Weight for intent matching (default: 0.4) */\n\tintentWeight: number;\n\t/** Weight for component type matching (default: 0.3) */\n\tcomponentWeight: number;\n\t/** Weight for file affinity matching (default: 0.2) */\n\tfileAffinityWeight: number;\n\t/** Weight for keyword matching (default: 0.1) */\n\tkeywordWeight: number;\n\t/** Include related learnings via graph traversal */\n\tincludeRelated: boolean;\n}\n\n/**\n * Default retrieval configuration\n */\nexport const DEFAULT_INTENT_CONFIG: IntentRetrievalConfig = {\n\tmaxResults: 10,\n\tminScore: 0.3,\n\tintentWeight: 0.4,\n\tcomponentWeight: 0.3,\n\tfileAffinityWeight: 0.2,\n\tkeywordWeight: 0.1,\n\tincludeRelated: true,\n};\n\n/**\n * Infer component type from file path\n */\nexport function inferComponentType(filePath: string): ComponentType | undefined {\n\tconst normalized = filePath.toLowerCase();\n\tconst filename = normalized.split(\"/\").pop() ?? \"\";\n\n\tif (normalized.includes(\"test\") || normalized.endsWith(\".test.ts\") || normalized.endsWith(\".spec.ts\")) {\n\t\treturn \"test\";\n\t}\n\tif (normalized.includes(\"hooks/\") || filename.startsWith(\"use-\")) {\n\t\treturn \"hook\";\n\t}\n\tif (normalized.includes(\"components/\") || normalized.endsWith(\".tsx\") || normalized.endsWith(\".jsx\")) {\n\t\treturn \"component\";\n\t}\n\tif (normalized.includes(\"api/\") || normalized.includes(\"routes/\") || normalized.includes(\"endpoints/\")) {\n\t\treturn \"api\";\n\t}\n\tif (normalized.includes(\"migrations/\") || normalized.includes(\"drizzle/\")) {\n\t\treturn \"migration\";\n\t}\n\tif (normalized.includes(\"utils/\") || normalized.includes(\"lib/\")) {\n\t\treturn \"util\";\n\t}\n\tif (normalized.includes(\"types/\") || normalized.endsWith(\".d.ts\")) {\n\t\treturn \"type\";\n\t}\n\tif (normalized.includes(\"config\") || normalized.endsWith(\".config.ts\") || normalized.endsWith(\".config.js\")) {\n\t\treturn \"config\";\n\t}\n\tif (normalized.includes(\"tools/\") || normalized.includes(\"mcp/\")) {\n\t\treturn \"tool\";\n\t}\n\n\treturn undefined;\n}\n\n/**\n * Generate file affinity patterns from file paths\n * Used to create glob patterns that match similar files\n */\nexport function generateFileAffinityPatterns(filePaths: string[]): string[] {\n\tconst patterns = new Set<string>();\n\n\tfor (const filePath of filePaths) {\n\t\tconst parts = filePath.split(\"/\");\n\n\t\t// Add directory patterns\n\t\tif (parts.length > 1) {\n\t\t\tpatterns.add(`${parts[0]}/**`); // Top-level dir\n\t\t\tif (parts.length > 2) {\n\t\t\t\tpatterns.add(`${parts.slice(0, 2).join(\"/\")}/**`); // 2-level dir\n\t\t\t}\n\t\t}\n\n\t\t// Add extension pattern\n\t\tconst ext = filePath.split(\".\").pop();\n\t\tif (ext) {\n\t\t\tpatterns.add(`**/*.${ext}`);\n\t\t}\n\n\t\t// Add filename pattern (e.g., \"use-*.ts\" for hooks)\n\t\tconst filename = parts[parts.length - 1];\n\t\tif (filename?.startsWith(\"use-\")) {\n\t\t\tpatterns.add(\"**/use-*.ts\");\n\t\t\tpatterns.add(\"**/use-*.tsx\");\n\t\t}\n\t}\n\n\treturn Array.from(patterns);\n}\n","/**\n * StateStore - Binary State Storage with IP Protection\n *\n * Stores internal SnapBack state (learnings, violations, patterns, sessions)\n * in a compressed binary format to:\n * 1. Protect IP (can't casually browse detection logic)\n * 2. Reduce disk usage (~70% compression)\n * 3. Optionally encrypt for pro tier users\n *\n * File format: state.bin\n * - Magic bytes: \"SNAPBACK\" (8 bytes)\n * - Version: uint8 (1 byte)\n * - Flags: uint8 (1 byte) - bit 0: encrypted\n * - Reserved: 6 bytes\n * - Payload: gzip-compressed JSON (optionally AES-256-GCM encrypted)\n *\n * @module storage/StateStore\n */\n\nimport * as crypto from \"node:crypto\";\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport * as zlib from \"node:zlib\";\nimport type {\n\tComponentType,\n\tIntentMetadata,\n\tIntentRetrievalConfig,\n\tScoredLearning,\n\tTaskContext,\n\tTaskIntent,\n} from \"../types/intent.js\";\nimport { DEFAULT_INTENT_CONFIG, generateFileAffinityPatterns, inferComponentType } from \"../types/intent.js\";\n\n/**\n * Simple glob pattern matching (internal, no external dependency)\n * Supports ** (any path), * (any chars), and ? (single char)\n */\nfunction matchGlob(pattern: string, text: string): boolean {\n\tconst regexPattern = pattern\n\t\t.replace(/[.+^${}()|[\\]\\\\]/g, \"\\\\$&\") // Escape special regex chars\n\t\t.replace(/\\*\\*/g, \"<<<GLOBSTAR>>>\") // Temp placeholder for **\n\t\t.replace(/\\*/g, \"[^/]*\") // * → any chars except /\n\t\t.replace(/<<<GLOBSTAR>>>/g, \".*\") // ** → any chars\n\t\t.replace(/\\?/g, \".\"); // ? → single char\n\n\tconst regex = new RegExp(`^${regexPattern}$`, \"i\");\n\treturn regex.test(text);\n}\n\n// Magic bytes for file identification\nconst MAGIC_BYTES = Buffer.from(\"SNAPBACK\", \"utf8\");\nconst HEADER_SIZE = 16; // 8 magic + 1 version + 1 flags + 6 reserved\nconst CURRENT_VERSION = 1;\n\n// Flags\nconst FLAG_ENCRYPTED = 0x01;\n\n/**\n * Learning record stored in state\n */\nexport interface StoredLearning {\n\tid: string;\n\ttype: \"pattern\" | \"pitfall\" | \"efficiency\" | \"discovery\" | \"workflow\";\n\ttrigger: string;\n\taction: string;\n\tkeywords?: string[];\n\tsource?: \"survey\" | \"manual\" | \"violation\" | \"curated\";\n\ttier: \"hot\" | \"warm\" | \"cold\";\n\tdomain?: string;\n\tcreatedAt: string;\n\tlastAccessed?: string;\n\taccessCount: number;\n\tappliedCount: number;\n\trelevanceScore: number;\n\tarchived?: boolean; // Phase 2.6b: Mark as archived (excluded from matching)\n\tarchivedAt?: string; // Phase 2.6b: ISO timestamp of archival\n\t// Phase 2.6c: Intent-aware retrieval metadata\n\tintentMetadata?: IntentMetadata;\n}\n\n/**\n * Violation record stored in state\n */\nexport interface StoredViolation {\n\tid: string;\n\ttype: string;\n\tfile: string;\n\tdescription: string;\n\treason?: string;\n\tprevention: string;\n\tcount: number;\n\tfirstSeen: string;\n\tlastSeen: string;\n\tpromotedToPattern?: boolean;\n}\n\n/**\n * Pattern record stored in state\n */\nexport interface StoredPattern {\n\tid: string;\n\tname: string;\n\tdescription: string;\n\ttrigger: string;\n\taction: string;\n\tsource: \"violation\" | \"manual\" | \"curated\";\n\tconfidence: number;\n\tusageCount: number;\n\tcreatedAt: string;\n}\n\n/**\n * Session checkpoint stored in state\n */\nexport interface StoredSession {\n\tid: string;\n\ttaskDescription?: string;\n\tstartedAt: string;\n\tlastCheckpoint: string;\n\tsnapshotId?: string;\n\tcontext?: Record<string, unknown>;\n\tappliedLearnings?: string[]; // Learning IDs applied in this session (Phase 2.6a)\n}\n\n/**\n * Pending sync item (learning waiting to be synced to cloud)\n */\nexport interface PendingSyncItem {\n\tid: string;\n\ttype: \"learning\" | \"violation\";\n\tpatternKey: string;\n\tpatternType: string;\n\tconfidence: number;\n\tqueuedAt: string;\n\tretryCount: number;\n}\n\n/**\n * Project context stored in state\n */\nexport interface StoredProjectContext {\n\tversion: number;\n\tgenerated: string;\n\ttechStack: {\n\t\tprimary: string[];\n\t\ttesting?: string[];\n\t\tinfra?: string[];\n\t};\n\tarchitecture?: {\n\t\tpattern: string;\n\t\tlayers: string[];\n\t\tentryPoints?: string[];\n\t};\n\tconventions?: Record<string, string>;\n\timportantFiles?: string[];\n\tdoNotTouch?: string[];\n}\n\n/**\n * Sync status for CRDT synchronization\n */\nexport type SyncStatus = \"syncing\" | \"synced\" | \"error\" | \"pending\";\n\n/**\n * Complete internal state\n */\nexport interface InternalState {\n\t/** Schema version for migrations */\n\tschemaVersion: number;\n\t/** Last modified timestamp */\n\tlastModified: string;\n\t/** Workspace ID this state belongs to */\n\tworkspaceId?: string;\n\t/** Tiered learnings */\n\tlearnings: StoredLearning[];\n\t/** Violation tracking */\n\tviolations: StoredViolation[];\n\t/** Promoted patterns */\n\tpatterns: StoredPattern[];\n\t/** Session checkpoints */\n\tsessions: StoredSession[];\n\t/** Pending sync queue (items waiting to sync to cloud) */\n\tpendingSync: PendingSyncItem[];\n\t/** Project context */\n\tprojectContext?: StoredProjectContext;\n\t/** CRDT sync version for conflict resolution */\n\tsyncVersion: number;\n\t/** Last successful sync timestamp */\n\tlastSynced?: string;\n\t/** Current sync status */\n\tsyncStatus: SyncStatus;\n\t/** Last sync error message (cleared on success) */\n\tlastSyncError?: string;\n}\n\n/**\n * StateStore options\n */\nexport interface StateStoreOptions {\n\t/** Path to .snapback directory */\n\tsnapbackDir: string;\n\t/** Enable encryption (requires encryptionKey) */\n\tencrypt?: boolean;\n\t/** Encryption key (32 bytes for AES-256) */\n\tencryptionKey?: Buffer;\n}\n\n/**\n * Default empty state\n */\nfunction createEmptyState(): InternalState {\n\treturn {\n\t\tschemaVersion: 1,\n\t\tlastModified: new Date().toISOString(),\n\t\tlearnings: [],\n\t\tviolations: [],\n\t\tpatterns: [],\n\t\tsessions: [],\n\t\tpendingSync: [],\n\t\tsyncVersion: 0,\n\t\tsyncStatus: \"pending\",\n\t};\n}\n\n/**\n * StateStore - Binary state storage with compression and optional encryption\n */\nexport class StateStore {\n\tprivate readonly statePath: string;\n\tprivate readonly encrypt: boolean;\n\tprivate readonly encryptionKey?: Buffer;\n\tprivate state: InternalState;\n\tprivate dirty = false;\n\n\tconstructor(options: StateStoreOptions) {\n\t\tthis.statePath = path.join(options.snapbackDir, \"state.bin\");\n\t\tthis.encrypt = options.encrypt ?? false;\n\t\tthis.encryptionKey = options.encryptionKey;\n\n\t\tif (this.encrypt && (!this.encryptionKey || this.encryptionKey.length !== 32)) {\n\t\t\tthrow new Error(\"Encryption requires a 32-byte key\");\n\t\t}\n\n\t\tthis.state = createEmptyState();\n\t}\n\n\t/**\n\t * Load state from disk\n\t */\n\tasync load(): Promise<InternalState> {\n\t\tif (!fs.existsSync(this.statePath)) {\n\t\t\tthis.state = createEmptyState();\n\t\t\treturn this.state;\n\t\t}\n\n\t\ttry {\n\t\t\tconst raw = await fs.promises.readFile(this.statePath);\n\t\t\tthis.state = this.deserialize(raw);\n\t\t\treturn this.state;\n\t\t} catch (error) {\n\t\t\tconsole.error(\"[StateStore] Failed to load state, starting fresh:\", error);\n\t\t\tthis.state = createEmptyState();\n\t\t\treturn this.state;\n\t\t}\n\t}\n\n\t/**\n\t * Save state to disk\n\t */\n\tasync save(): Promise<void> {\n\t\tthis.state.lastModified = new Date().toISOString();\n\n\t\tconst serialized = this.serialize(this.state);\n\n\t\t// Ensure directory exists\n\t\tconst dir = path.dirname(this.statePath);\n\t\tif (!fs.existsSync(dir)) {\n\t\t\tawait fs.promises.mkdir(dir, { recursive: true });\n\t\t}\n\n\t\t// Atomic write via temp file\n\t\tconst tempPath = `${this.statePath}.tmp`;\n\t\tawait fs.promises.writeFile(tempPath, serialized);\n\t\tawait fs.promises.rename(tempPath, this.statePath);\n\n\t\tthis.dirty = false;\n\t}\n\n\t/**\n\t * Get current state (readonly)\n\t */\n\tgetState(): Readonly<InternalState> {\n\t\treturn this.state;\n\t}\n\n\t/**\n\t * Check if state has unsaved changes\n\t */\n\tisDirty(): boolean {\n\t\treturn this.dirty;\n\t}\n\n\t// ============================================================================\n\t// LEARNINGS\n\t// ============================================================================\n\n\tgetLearnings(tier?: \"hot\" | \"warm\" | \"cold\"): StoredLearning[] {\n\t\tif (!tier) {\n\t\t\treturn [...this.state.learnings];\n\t\t}\n\t\treturn this.state.learnings.filter((l) => l.tier === tier);\n\t}\n\n\taddLearning(\n\t\tlearning: Omit<StoredLearning, \"id\" | \"createdAt\" | \"accessCount\" | \"appliedCount\" | \"relevanceScore\">,\n\t): StoredLearning {\n\t\tconst newLearning: StoredLearning = {\n\t\t\t...learning,\n\t\t\tid: crypto.randomUUID(),\n\t\t\tcreatedAt: new Date().toISOString(),\n\t\t\taccessCount: 0,\n\t\t\tappliedCount: 0,\n\t\t\trelevanceScore: 1.0,\n\t\t};\n\t\tthis.state.learnings.push(newLearning);\n\t\tthis.dirty = true;\n\t\treturn newLearning;\n\t}\n\n\tupdateLearning(id: string, updates: Partial<StoredLearning>): boolean {\n\t\tconst index = this.state.learnings.findIndex((l) => l.id === id);\n\t\tif (index === -1) {\n\t\t\treturn false;\n\t\t}\n\t\tthis.state.learnings[index] = { ...this.state.learnings[index], ...updates };\n\t\tthis.dirty = true;\n\t\treturn true;\n\t}\n\n\t/**\n\t * Archive a learning (Phase 2.6b: set archived flag, preserve data)\n\t */\n\tarchiveLearning(learningId: string): boolean {\n\t\tconst learning = this.state.learnings.find((l) => l.id === learningId);\n\t\tif (!learning) {\n\t\t\treturn false;\n\t\t}\n\t\tlearning.archived = true;\n\t\tlearning.archivedAt = new Date().toISOString();\n\t\tthis.dirty = true;\n\t\treturn true;\n\t}\n\n\t/**\n\t * Delete a learning permanently (Phase 2.6b: remove from state)\n\t */\n\tdeleteLearning(learningId: string): boolean {\n\t\tconst index = this.state.learnings.findIndex((l) => l.id === learningId);\n\t\tif (index === -1) {\n\t\t\treturn false;\n\t\t}\n\t\tthis.state.learnings.splice(index, 1);\n\t\tthis.dirty = true;\n\t\treturn true;\n\t}\n\n\t/**\n\t * Get archived learnings (Phase 2.6b)\n\t */\n\tgetArchivedLearnings(): StoredLearning[] {\n\t\treturn this.state.learnings.filter((l) => l.archived === true);\n\t}\n\n\t// ============================================================================\n\t// INTENT-AWARE RETRIEVAL (Phase 2.6c)\n\t// ============================================================================\n\n\t/**\n\t * Retrieve learnings using task-intent graph indexing\n\t * Based on Cursor RAG + A-MEM research patterns\n\t *\n\t * @param context - Task context with intent, files, and keywords\n\t * @param config - Optional retrieval configuration\n\t * @returns Scored learnings ranked by relevance\n\t */\n\tretrieveByIntent(context: TaskContext, config: Partial<IntentRetrievalConfig> = {}): ScoredLearning[] {\n\t\tconst fullConfig: IntentRetrievalConfig = { ...DEFAULT_INTENT_CONFIG, ...config };\n\n\t\t// Infer component type from files if not provided\n\t\tconst componentType = context.componentType ?? this.inferDominantComponentType(context.files);\n\n\t\t// Score all non-archived learnings\n\t\tconst scored: ScoredLearning[] = [];\n\t\tfor (const learning of this.state.learnings) {\n\t\t\tif (learning.archived) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst score = this.scoreLearning(learning, context, componentType, fullConfig);\n\t\t\tif (score.totalScore >= fullConfig.minScore) {\n\t\t\t\tscored.push({\n\t\t\t\t\tlearningId: learning.id,\n\t\t\t\t\tscore: score.totalScore,\n\t\t\t\t\tmatchReasons: score.reasons,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\t// Sort by score descending\n\t\tscored.sort((a, b) => b.score - a.score);\n\n\t\t// Include related learnings via graph traversal\n\t\tif (fullConfig.includeRelated) {\n\t\t\tthis.expandWithRelated(scored, fullConfig.maxResults);\n\t\t}\n\n\t\treturn scored.slice(0, fullConfig.maxResults);\n\t}\n\n\t/**\n\t * Enrich a learning with intent metadata\n\t * Called when creating/updating learnings with file context\n\t */\n\tenrichWithIntentMetadata(\n\t\tlearningId: string,\n\t\tcontext: { intent: TaskIntent; files: string[]; keywords?: string[] },\n\t): boolean {\n\t\tconst learning = this.state.learnings.find((l) => l.id === learningId);\n\t\tif (!learning) {\n\t\t\treturn false;\n\t\t}\n\n\t\tconst existingMeta = learning.intentMetadata;\n\t\tconst componentTypes = context.files.map((f) => inferComponentType(f)).filter(Boolean) as ComponentType[];\n\t\tconst fileAffinities = generateFileAffinityPatterns(context.files);\n\n\t\t// Merge with existing metadata\n\t\tlearning.intentMetadata = {\n\t\t\tintents: existingMeta ? Array.from(new Set([...existingMeta.intents, context.intent])) : [context.intent],\n\t\t\tcomponentTypes: existingMeta\n\t\t\t\t? Array.from(new Set([...existingMeta.componentTypes, ...componentTypes]))\n\t\t\t\t: componentTypes,\n\t\t\tfileAffinities: existingMeta\n\t\t\t\t? Array.from(new Set([...existingMeta.fileAffinities, ...fileAffinities]))\n\t\t\t\t: fileAffinities,\n\t\t\trelatedLearnings: existingMeta?.relatedLearnings ?? [],\n\t\t\tintentSuccessCount: {\n\t\t\t\t...(existingMeta?.intentSuccessCount ?? {}),\n\t\t\t\t[context.intent]: (existingMeta?.intentSuccessCount?.[context.intent] ?? 0) + 1,\n\t\t\t} as Record<TaskIntent, number>,\n\t\t};\n\n\t\tthis.dirty = true;\n\t\treturn true;\n\t}\n\n\t/**\n\t * Link two learnings together (Zettelkasten-style)\n\t */\n\tlinkLearnings(learningId1: string, learningId2: string): boolean {\n\t\tconst learning1 = this.state.learnings.find((l) => l.id === learningId1);\n\t\tconst learning2 = this.state.learnings.find((l) => l.id === learningId2);\n\t\tif (!learning1 || !learning2) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Ensure metadata exists\n\t\tif (!learning1.intentMetadata) {\n\t\t\tlearning1.intentMetadata = {\n\t\t\t\tintents: [],\n\t\t\t\tcomponentTypes: [],\n\t\t\t\tfileAffinities: [],\n\t\t\t\trelatedLearnings: [],\n\t\t\t\tintentSuccessCount: {} as Record<TaskIntent, number>,\n\t\t\t};\n\t\t}\n\t\tif (!learning2.intentMetadata) {\n\t\t\tlearning2.intentMetadata = {\n\t\t\t\tintents: [],\n\t\t\t\tcomponentTypes: [],\n\t\t\t\tfileAffinities: [],\n\t\t\t\trelatedLearnings: [],\n\t\t\t\tintentSuccessCount: {} as Record<TaskIntent, number>,\n\t\t\t};\n\t\t}\n\n\t\t// Bidirectional link\n\t\tif (!learning1.intentMetadata.relatedLearnings.includes(learningId2)) {\n\t\t\tlearning1.intentMetadata.relatedLearnings.push(learningId2);\n\t\t}\n\t\tif (!learning2.intentMetadata.relatedLearnings.includes(learningId1)) {\n\t\t\tlearning2.intentMetadata.relatedLearnings.push(learningId1);\n\t\t}\n\n\t\tthis.dirty = true;\n\t\treturn true;\n\t}\n\n\t/**\n\t * Private: Score a learning against task context\n\t */\n\tprivate scoreLearning(\n\t\tlearning: StoredLearning,\n\t\tcontext: TaskContext,\n\t\tcomponentType: ComponentType | undefined,\n\t\tconfig: IntentRetrievalConfig,\n\t): { totalScore: number; reasons: ScoredLearning[\"matchReasons\"] } {\n\t\tconst meta = learning.intentMetadata;\n\t\tconst reasons: ScoredLearning[\"matchReasons\"] = {\n\t\t\tintentMatch: false,\n\t\t\tcomponentMatch: false,\n\t\t\tfileAffinityMatch: false,\n\t\t\tkeywordMatch: false,\n\t\t\trelationshipMatch: false,\n\t\t};\n\n\t\tlet totalScore = 0;\n\n\t\t// Intent matching\n\t\tif (meta?.intents.includes(context.intent)) {\n\t\t\treasons.intentMatch = true;\n\t\t\ttotalScore += config.intentWeight;\n\t\t}\n\n\t\t// Component type matching\n\t\tif (componentType && meta?.componentTypes.includes(componentType)) {\n\t\t\treasons.componentMatch = true;\n\t\t\ttotalScore += config.componentWeight;\n\t\t}\n\n\t\t// File affinity matching (glob patterns)\n\t\tif (meta?.fileAffinities.length) {\n\t\t\tconst matchCount = context.files.filter((file) =>\n\t\t\t\tmeta.fileAffinities.some((pattern) => matchGlob(pattern, file)),\n\t\t\t).length;\n\t\t\tif (matchCount > 0) {\n\t\t\t\treasons.fileAffinityMatch = true;\n\t\t\t\ttotalScore += config.fileAffinityWeight * (matchCount / context.files.length);\n\t\t\t}\n\t\t}\n\n\t\t// Keyword matching\n\t\tif (context.keywords?.length && learning.keywords?.length) {\n\t\t\tconst matchCount = context.keywords.filter((kw) => learning.keywords?.includes(kw)).length;\n\t\t\tif (matchCount > 0) {\n\t\t\t\treasons.keywordMatch = true;\n\t\t\t\ttotalScore += config.keywordWeight * (matchCount / context.keywords.length);\n\t\t\t}\n\t\t}\n\n\t\treturn { totalScore, reasons };\n\t}\n\n\t/**\n\t * Private: Infer dominant component type from file list\n\t */\n\tprivate inferDominantComponentType(files: string[]): ComponentType | undefined {\n\t\tconst types = files.map((f) => inferComponentType(f)).filter((t): t is ComponentType => t !== undefined);\n\t\tif (types.length === 0) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\t// Return most common type\n\t\tconst counts = new Map<ComponentType, number>();\n\t\tfor (const type of types) {\n\t\t\tcounts.set(type, (counts.get(type) ?? 0) + 1);\n\t\t}\n\t\treturn Array.from(counts.entries()).sort((a, b) => b[1] - a[1])[0]?.[0];\n\t}\n\n\t/**\n\t * Private: Expand results with related learnings via graph traversal\n\t */\n\tprivate expandWithRelated(scored: ScoredLearning[], _maxResults: number): void {\n\t\tconst visited = new Set<string>(scored.map((s) => s.learningId));\n\t\tconst toAdd: ScoredLearning[] = [];\n\n\t\tfor (const item of scored) {\n\t\t\tconst learning = this.state.learnings.find((l) => l.id === item.learningId);\n\t\t\tif (!learning?.intentMetadata?.relatedLearnings.length) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tfor (const relatedId of learning.intentMetadata.relatedLearnings) {\n\t\t\t\tif (visited.has(relatedId)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tvisited.add(relatedId);\n\n\t\t\t\t// Add related learning with reduced score\n\t\t\t\ttoAdd.push({\n\t\t\t\t\tlearningId: relatedId,\n\t\t\t\t\tscore: item.score * 0.7, // Related learnings get 70% of parent score\n\t\t\t\t\tmatchReasons: {\n\t\t\t\t\t\tintentMatch: false,\n\t\t\t\t\t\tcomponentMatch: false,\n\t\t\t\t\t\tfileAffinityMatch: false,\n\t\t\t\t\t\tkeywordMatch: false,\n\t\t\t\t\t\trelationshipMatch: true,\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\t// Merge and re-sort\n\t\tscored.push(...toAdd);\n\t\tscored.sort((a, b) => b.score - a.score);\n\t}\n\n\t// ============================================================================\n\t// VIOLATIONS\n\t// ============================================================================\n\n\tgetViolations(): StoredViolation[] {\n\t\treturn [...this.state.violations];\n\t}\n\n\trecordViolation(violation: Omit<StoredViolation, \"id\" | \"count\" | \"firstSeen\" | \"lastSeen\">): StoredViolation {\n\t\t// Check if violation of this type/file already exists\n\t\tconst existing = this.state.violations.find((v) => v.type === violation.type && v.file === violation.file);\n\n\t\tif (existing) {\n\t\t\texisting.count++;\n\t\t\texisting.lastSeen = new Date().toISOString();\n\t\t\tthis.dirty = true;\n\t\t\treturn existing;\n\t\t}\n\n\t\tconst newViolation: StoredViolation = {\n\t\t\t...violation,\n\t\t\tid: crypto.randomUUID(),\n\t\t\tcount: 1,\n\t\t\tfirstSeen: new Date().toISOString(),\n\t\t\tlastSeen: new Date().toISOString(),\n\t\t};\n\t\tthis.state.violations.push(newViolation);\n\t\tthis.dirty = true;\n\t\treturn newViolation;\n\t}\n\n\t/**\n\t * Remove a violation by ID\n\t *\n\t * @param violationId - Violation ID to remove\n\t * @returns true if violation was removed, false if not found\n\t */\n\tremoveViolation(violationId: string): boolean {\n\t\tconst index = this.state.violations.findIndex((v) => v.id === violationId);\n\t\tif (index === -1) {\n\t\t\treturn false;\n\t\t}\n\t\tthis.state.violations.splice(index, 1);\n\t\tthis.dirty = true;\n\t\treturn true;\n\t}\n\n\t// ============================================================================\n\t// PATTERNS\n\t// ============================================================================\n\n\tgetPatterns(): StoredPattern[] {\n\t\treturn [...this.state.patterns];\n\t}\n\n\taddPattern(pattern: Omit<StoredPattern, \"id\" | \"createdAt\" | \"usageCount\">): StoredPattern {\n\t\tconst newPattern: StoredPattern = {\n\t\t\t...pattern,\n\t\t\tid: crypto.randomUUID(),\n\t\t\tcreatedAt: new Date().toISOString(),\n\t\t\tusageCount: 0,\n\t\t};\n\t\tthis.state.patterns.push(newPattern);\n\t\tthis.dirty = true;\n\t\treturn newPattern;\n\t}\n\n\t// ============================================================================\n\t// SESSIONS\n\t// ============================================================================\n\n\tgetSessions(): StoredSession[] {\n\t\treturn [...this.state.sessions];\n\t}\n\n\tsaveSession(\n\t\tsession: Partial<StoredSession> & {\n\t\t\ttaskDescription?: string;\n\t\t\tstartedAt: string;\n\t\t\tsnapshotId?: string;\n\t\t\tcontext?: Record<string, unknown>;\n\t\t\tappliedLearnings?: string[]; // Phase 2.6a: Track applied learning IDs\n\t\t},\n\t): StoredSession {\n\t\tconst existing = session.id ? this.state.sessions.find((s) => s.id === session.id) : undefined;\n\t\tif (existing) {\n\t\t\tObject.assign(existing, session, { lastCheckpoint: new Date().toISOString() });\n\t\t\tthis.dirty = true;\n\t\t\treturn existing;\n\t\t}\n\n\t\tconst newSession: StoredSession = {\n\t\t\tid: session.id || crypto.randomUUID(),\n\t\t\ttaskDescription: session.taskDescription,\n\t\t\tstartedAt: session.startedAt,\n\t\t\tsnapshotId: session.snapshotId,\n\t\t\tcontext: session.context,\n\t\t\tappliedLearnings: session.appliedLearnings || [], // Initialize empty array if not provided\n\t\t\tlastCheckpoint: new Date().toISOString(),\n\t\t};\n\t\tthis.state.sessions.push(newSession);\n\t\tthis.dirty = true;\n\t\treturn newSession;\n\t}\n\n\t/**\n\t * Update applied learnings for a session (Phase 2.6a)\n\t * Atomic operation for repetition avoidance\n\t */\n\tupdateSessionLearnings(sessionId: string, learningIds: string[]): boolean {\n\t\tconst session = this.state.sessions.find((s) => s.id === sessionId);\n\t\tif (!session) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Merge with existing appliedLearnings (deduplicate)\n\t\tconst existing = new Set(session.appliedLearnings || []);\n\t\tfor (const id of learningIds) {\n\t\t\texisting.add(id);\n\t\t}\n\t\tsession.appliedLearnings = Array.from(existing);\n\t\tsession.lastCheckpoint = new Date().toISOString();\n\t\tthis.dirty = true;\n\t\treturn true;\n\t}\n\n\t// ============================================================================\n\t// PROJECT CONTEXT\n\t// ============================================================================\n\n\tgetProjectContext(): StoredProjectContext | undefined {\n\t\treturn this.state.projectContext;\n\t}\n\n\tsetProjectContext(context: StoredProjectContext): void {\n\t\tthis.state.projectContext = context;\n\t\tthis.dirty = true;\n\t}\n\n\t// ============================================================================\n\t// SYNC QUEUE\n\t// ============================================================================\n\n\t/**\n\t * Get pending sync items\n\t */\n\tgetPendingSync(): PendingSyncItem[] {\n\t\treturn [...(this.state.pendingSync || [])];\n\t}\n\n\t/**\n\t * Queue an item for cloud sync\n\t */\n\tqueueForSync(item: Omit<PendingSyncItem, \"id\" | \"queuedAt\" | \"retryCount\">): PendingSyncItem {\n\t\t// Deduplicate by patternKey\n\t\tconst existing = this.state.pendingSync?.find((p) => p.patternKey === item.patternKey);\n\t\tif (existing) {\n\t\t\treturn existing;\n\t\t}\n\n\t\tconst newItem: PendingSyncItem = {\n\t\t\t...item,\n\t\t\tid: crypto.randomUUID(),\n\t\t\tqueuedAt: new Date().toISOString(),\n\t\t\tretryCount: 0,\n\t\t};\n\n\t\tif (!this.state.pendingSync) {\n\t\t\tthis.state.pendingSync = [];\n\t\t}\n\t\tthis.state.pendingSync.push(newItem);\n\t\tthis.dirty = true;\n\t\treturn newItem;\n\t}\n\n\t/**\n\t * Remove synced items from queue\n\t */\n\tremoveSyncedItems(ids: string[]): void {\n\t\tif (!this.state.pendingSync) {\n\t\t\treturn;\n\t\t}\n\t\tconst idSet = new Set(ids);\n\t\tthis.state.pendingSync = this.state.pendingSync.filter((p) => !idSet.has(p.id));\n\t\tthis.dirty = true;\n\t}\n\n\t/**\n\t * Increment retry count for failed items\n\t */\n\tincrementRetryCount(ids: string[]): void {\n\t\tif (!this.state.pendingSync) {\n\t\t\treturn;\n\t\t}\n\t\tconst idSet = new Set(ids);\n\t\tfor (const item of this.state.pendingSync) {\n\t\t\tif (idSet.has(item.id)) {\n\t\t\t\titem.retryCount++;\n\t\t\t}\n\t\t}\n\t\tthis.dirty = true;\n\t}\n\n\t// ============================================================================\n\t// SYNC METADATA (Phase 1: Intelligence New Platform)\n\t// ============================================================================\n\n\t/**\n\t * Get current sync status\n\t */\n\tgetSyncStatus(): SyncStatus {\n\t\treturn this.state.syncStatus;\n\t}\n\n\t/**\n\t * Set sync status\n\t */\n\tsetSyncStatus(status: SyncStatus): void {\n\t\tthis.state.syncStatus = status;\n\t\tthis.dirty = true;\n\t}\n\n\t/**\n\t * Get current sync version (for CRDT conflict resolution)\n\t */\n\tgetSyncVersion(): number {\n\t\treturn this.state.syncVersion;\n\t}\n\n\t/**\n\t * Increment sync version and return new value\n\t */\n\tincrementSyncVersion(): number {\n\t\tthis.state.syncVersion++;\n\t\tthis.dirty = true;\n\t\treturn this.state.syncVersion;\n\t}\n\n\t/**\n\t * Mark state as successfully synced with timestamp\n\t * Clears any previous sync error\n\t */\n\tmarkSynced(): void {\n\t\tthis.state.syncStatus = \"synced\";\n\t\tthis.state.lastSynced = new Date().toISOString();\n\t\tthis.state.lastSyncError = undefined;\n\t\tthis.dirty = true;\n\t}\n\n\t/**\n\t * Get last synced timestamp\n\t */\n\tgetLastSynced(): string | undefined {\n\t\treturn this.state.lastSynced;\n\t}\n\n\t/**\n\t * Set sync error status with optional message\n\t */\n\tsetSyncError(message?: string): void {\n\t\tthis.state.syncStatus = \"error\";\n\t\tthis.state.lastSyncError = message;\n\t\tthis.dirty = true;\n\t}\n\n\t// ============================================================================\n\t// SERIALIZATION\n\t// ============================================================================\n\n\tprivate serialize(state: InternalState): Buffer {\n\t\t// Convert to JSON\n\t\tconst json = JSON.stringify(state);\n\t\tconst jsonBuffer = Buffer.from(json, \"utf8\");\n\n\t\t// Compress with gzip\n\t\tconst compressed = zlib.gzipSync(jsonBuffer, { level: 9 });\n\n\t\t// Optionally encrypt\n\t\tlet payload = compressed;\n\t\tlet flags = 0;\n\n\t\tif (this.encrypt && this.encryptionKey) {\n\t\t\tpayload = this.encryptPayload(compressed);\n\t\t\tflags |= FLAG_ENCRYPTED;\n\t\t}\n\n\t\t// Build header\n\t\tconst header = Buffer.alloc(HEADER_SIZE);\n\t\tMAGIC_BYTES.copy(header, 0);\n\t\theader.writeUInt8(CURRENT_VERSION, 8);\n\t\theader.writeUInt8(flags, 9);\n\t\t// Reserved bytes 10-15 are already zero\n\n\t\t// Combine header + payload\n\t\treturn Buffer.concat([header, payload]);\n\t}\n\n\tprivate deserialize(raw: Buffer): InternalState {\n\t\tif (raw.length < HEADER_SIZE) {\n\t\t\tthrow new Error(\"Invalid state file: too small\");\n\t\t}\n\n\t\t// Verify magic bytes\n\t\tconst magic = raw.subarray(0, 8);\n\t\tif (!magic.equals(MAGIC_BYTES)) {\n\t\t\tthrow new Error(\"Invalid state file: bad magic bytes\");\n\t\t}\n\n\t\t// Read header\n\t\tconst version = raw.readUInt8(8);\n\t\tconst flags = raw.readUInt8(9);\n\n\t\tif (version > CURRENT_VERSION) {\n\t\t\tthrow new Error(`State file version ${version} is newer than supported ${CURRENT_VERSION}`);\n\t\t}\n\n\t\t// Extract payload\n\t\tlet payload = raw.subarray(HEADER_SIZE);\n\n\t\t// Decrypt if needed\n\t\tif (flags & FLAG_ENCRYPTED) {\n\t\t\tif (!this.encryptionKey) {\n\t\t\t\tthrow new Error(\"State file is encrypted but no key provided\");\n\t\t\t}\n\t\t\tpayload = this.decryptPayload(payload);\n\t\t}\n\n\t\t// Decompress\n\t\tconst decompressed = zlib.gunzipSync(payload);\n\n\t\t// Parse JSON\n\t\tconst json = decompressed.toString(\"utf8\");\n\t\treturn JSON.parse(json) as InternalState;\n\t}\n\n\tprivate encryptPayload(data: Buffer): Buffer {\n\t\tif (!this.encryptionKey) {\n\t\t\tthrow new Error(\"No encryption key\");\n\t\t}\n\n\t\t// Generate random IV\n\t\tconst iv = crypto.randomBytes(12);\n\n\t\t// Create cipher\n\t\tconst cipher = crypto.createCipheriv(\"aes-256-gcm\", this.encryptionKey, iv);\n\n\t\t// Encrypt\n\t\tconst encrypted = Buffer.concat([cipher.update(data), cipher.final()]);\n\n\t\t// Get auth tag\n\t\tconst authTag = cipher.getAuthTag();\n\n\t\t// Format: IV (12) + AuthTag (16) + Encrypted data\n\t\treturn Buffer.concat([iv, authTag, encrypted]);\n\t}\n\n\tprivate decryptPayload(data: Buffer): Buffer {\n\t\tif (!this.encryptionKey) {\n\t\t\tthrow new Error(\"No encryption key\");\n\t\t}\n\n\t\tif (data.length < 28) {\n\t\t\tthrow new Error(\"Encrypted payload too small\");\n\t\t}\n\n\t\t// Extract components\n\t\tconst iv = data.subarray(0, 12);\n\t\tconst authTag = data.subarray(12, 28);\n\t\tconst encrypted = data.subarray(28);\n\n\t\t// Create decipher\n\t\tconst decipher = crypto.createDecipheriv(\"aes-256-gcm\", this.encryptionKey, iv);\n\t\tdecipher.setAuthTag(authTag);\n\n\t\t// Decrypt\n\t\treturn Buffer.concat([decipher.update(encrypted), decipher.final()]);\n\t}\n\n\t// ============================================================================\n\t// MIGRATION\n\t// ============================================================================\n\n\t/**\n\t * Migrate from legacy JSONL files to binary state\n\t */\n\tasync migrateFromJsonl(learningsDir: string, patternsDir: string): Promise<{ migrated: number; errors: string[] }> {\n\t\tconst errors: string[] = [];\n\t\tlet migrated = 0;\n\n\t\t// Migrate learnings\n\t\tconst learningFiles = [\"hot.jsonl\", \"warm.jsonl\", \"cold.jsonl\", \"user-learnings.jsonl\", \"learnings.jsonl\"];\n\t\tfor (const file of learningFiles) {\n\t\t\tconst filePath = path.join(learningsDir, file);\n\t\t\tif (fs.existsSync(filePath)) {\n\t\t\t\ttry {\n\t\t\t\t\tconst content = fs.readFileSync(filePath, \"utf8\");\n\t\t\t\t\tconst lines = content.split(\"\\n\").filter((l) => l.trim());\n\t\t\t\t\tfor (const line of lines) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst legacy = JSON.parse(line);\n\t\t\t\t\t\t\t// Determine tier from filename or default to warm\n\t\t\t\t\t\t\tconst tier = file.startsWith(\"hot\") ? \"hot\" : file.startsWith(\"cold\") ? \"cold\" : \"warm\";\n\t\t\t\t\t\t\tthis.addLearning({\n\t\t\t\t\t\t\t\ttype: legacy.type || \"pattern\",\n\t\t\t\t\t\t\t\ttrigger: legacy.trigger || \"\",\n\t\t\t\t\t\t\t\taction: legacy.action || \"\",\n\t\t\t\t\t\t\t\tkeywords: legacy.keywords,\n\t\t\t\t\t\t\t\tsource: legacy.source,\n\t\t\t\t\t\t\t\ttier: legacy.tier || tier,\n\t\t\t\t\t\t\t\tdomain: legacy.domain,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tmigrated++;\n\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\terrors.push(`Failed to parse learning: ${line.substring(0, 50)}...`);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} catch (e) {\n\t\t\t\t\terrors.push(`Failed to read ${file}: ${e}`);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Migrate violations\n\t\tconst violationsPath = path.join(patternsDir, \"violations.jsonl\");\n\t\tif (fs.existsSync(violationsPath)) {\n\t\t\ttry {\n\t\t\t\tconst content = fs.readFileSync(violationsPath, \"utf8\");\n\t\t\t\tconst lines = content.split(\"\\n\").filter((l) => l.trim());\n\t\t\t\tfor (const line of lines) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst legacy = JSON.parse(line);\n\t\t\t\t\t\tthis.recordViolation({\n\t\t\t\t\t\t\ttype: legacy.type || \"unknown\",\n\t\t\t\t\t\t\tfile: legacy.file || \"\",\n\t\t\t\t\t\t\tdescription: legacy.description || legacy.whatHappened || \"\",\n\t\t\t\t\t\t\treason: legacy.reason || legacy.whyItHappened,\n\t\t\t\t\t\t\tprevention: legacy.prevention || legacy.howToPrevent || \"\",\n\t\t\t\t\t\t});\n\t\t\t\t\t\tmigrated++;\n\t\t\t\t\t} catch {\n\t\t\t\t\t\terrors.push(`Failed to parse violation: ${line.substring(0, 50)}...`);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\terrors.push(`Failed to read violations.jsonl: ${e}`);\n\t\t\t}\n\t\t}\n\n\t\t// Save migrated state\n\t\tawait this.save();\n\n\t\treturn { migrated, errors };\n\t}\n}\n\n/**\n * Derive an encryption key from workspace ID + machine ID\n * This ensures the same key is generated on each run without storing it\n */\nexport function deriveEncryptionKey(workspaceId: string, machineId: string): Buffer {\n\treturn crypto.pbkdf2Sync(\n\t\tworkspaceId,\n\t\tmachineId,\n\t\t100000, // iterations\n\t\t32, // key length (256 bits)\n\t\t\"sha256\",\n\t);\n}\n\n/**\n * Get machine-specific ID for encryption key derivation\n */\nexport function getMachineId(): string {\n\t// Use a combination of platform-specific values\n\tconst os = require(\"node:os\");\n\tconst parts = [os.hostname(), os.platform(), os.arch(), os.cpus()[0]?.model || \"unknown\"];\n\treturn crypto.createHash(\"sha256\").update(parts.join(\":\")).digest(\"hex\").substring(0, 32);\n}\n","/**\n * Yjs CRDT Adapter\n *\n * Adapts StateStore to Yjs CRDT for conflict-free sync to Neon PostgreSQL.\n * Implements vector clock conflict resolution using syncVersion.\n */\n\nimport * as Y from \"yjs\";\nimport type { StateStore } from \"../storage/StateStore\";\n\n/**\n * YjsAdapter - Bridges StateStore and Yjs CRDT\n *\n * Responsibilities:\n * - Sync StateStore to Yjs shared types (learnings, patterns, violations)\n * - Sync Yjs updates back to StateStore\n * - Maintain vector clock (syncVersion) for conflict resolution\n * - Encode/decode state for network transmission\n */\nexport class YjsAdapter {\n\tprivate doc: Y.Doc;\n\tprivate store: StateStore;\n\n\tconstructor(store: StateStore) {\n\t\tthis.store = store;\n\t\tthis.doc = new Y.Doc();\n\t}\n\n\t/**\n\t * Get the underlying Yjs document\n\t */\n\tgetDoc(): Y.Doc {\n\t\treturn this.doc;\n\t}\n\n\t/**\n\t * Sync StateStore → Yjs\n\t * Pushes all state from StateStore into Yjs shared types\n\t */\n\tasync syncFromStateStore(): Promise<void> {\n\t\tconst state = this.store.getState();\n\n\t\t// Sync learnings\n\t\tconst learnings = this.doc.getArray(\"learnings\");\n\t\tlearnings.delete(0, learnings.length); // Clear existing\n\t\tlearnings.push(state.learnings.map((l) => ({ ...l })));\n\n\t\t// Sync patterns\n\t\tconst patterns = this.doc.getArray(\"patterns\");\n\t\tpatterns.delete(0, patterns.length);\n\t\tpatterns.push(state.patterns.map((p) => ({ ...p })));\n\n\t\t// Sync violations\n\t\tconst violations = this.doc.getArray(\"violations\");\n\t\tviolations.delete(0, violations.length);\n\t\tviolations.push(state.violations.map((v) => ({ ...v })));\n\n\t\t// Sync sessions\n\t\tconst sessions = this.doc.getArray(\"sessions\");\n\t\tsessions.delete(0, sessions.length);\n\t\tsessions.push(state.sessions.map((s) => ({ ...s })));\n\n\t\t// Store sync metadata in Yjs map\n\t\tconst meta = this.doc.getMap(\"meta\");\n\t\tmeta.set(\"syncVersion\", state.syncVersion);\n\t\tmeta.set(\"lastSynced\", state.lastSynced);\n\t\tmeta.set(\"syncStatus\", state.syncStatus);\n\t}\n\n\t/**\n\t * Sync Yjs → StateStore\n\t * Pulls updates from Yjs and applies to StateStore\n\t */\n\tasync syncToStateStore(): Promise<void> {\n\t\tconst learnings = this.doc.getArray(\"learnings\");\n\t\tconst patterns = this.doc.getArray(\"patterns\");\n\t\tconst violations = this.doc.getArray(\"violations\");\n\t\tconst meta = this.doc.getMap(\"meta\");\n\n\t\t// Get current state to detect conflicts\n\t\tconst currentState = this.store.getState();\n\n\t\t// Sync learnings (merge strategy: prefer Yjs if different)\n\t\tconst yjsLearnings = learnings.toArray() as any[];\n\t\tfor (const yjsLearning of yjsLearnings) {\n\t\t\tconst existing = currentState.learnings.find((l) => l.id === yjsLearning.id);\n\t\t\tif (!existing) {\n\t\t\t\t// New learning from remote\n\t\t\t\tthis.store.addLearning(yjsLearning as any);\n\t\t\t} else {\n\t\t\t\t// Potential conflict - use simple last-write-wins for now\n\t\t\t\t// TODO: Implement proper CRDT merge based on syncVersion\n\t\t\t\tif (JSON.stringify(existing) !== JSON.stringify(yjsLearning)) {\n\t\t\t\t\tthis.store.updateLearning(yjsLearning.id, yjsLearning as any);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Sync patterns\n\t\tconst yjsPatterns = patterns.toArray() as any[];\n\t\tfor (const yjsPattern of yjsPatterns) {\n\t\t\tconst existing = currentState.patterns.find((p) => p.id === yjsPattern.id);\n\t\t\tif (!existing) {\n\t\t\t\tthis.store.addPattern(yjsPattern as any);\n\t\t\t}\n\t\t}\n\n\t\t// Sync violations\n\t\tconst yjsViolations = violations.toArray() as any[];\n\t\tfor (const yjsViolation of yjsViolations) {\n\t\t\tconst existing = currentState.violations.find((v) => v.id === yjsViolation.id);\n\t\t\tif (!existing) {\n\t\t\t\tthis.store.recordViolation(yjsViolation as any);\n\t\t\t}\n\t\t}\n\n\t\t// Update sync metadata\n\t\tconst yjsSyncVersion = meta.get(\"syncVersion\");\n\t\tif (typeof yjsSyncVersion === \"number\" && yjsSyncVersion > currentState.syncVersion) {\n\t\t\t// Remote is ahead, increment our version\n\t\t\tthis.store.incrementSyncVersion();\n\t\t}\n\n\t\tthis.store.markSynced();\n\t}\n\n\t/**\n\t * Encode current Yjs state as binary update\n\t * Used for network transmission or persistence\n\t */\n\tencodeState(): Uint8Array {\n\t\treturn Y.encodeStateAsUpdate(this.doc);\n\t}\n\n\t/**\n\t * Apply binary update to Yjs document\n\t * Used to merge remote changes\n\t */\n\tapplyUpdate(update: Uint8Array): void {\n\t\tY.applyUpdate(this.doc, update);\n\t}\n\n\t/**\n\t * Get state vector for delta sync\n\t * Used to request only missing updates from remote\n\t */\n\tgetStateVector(): Uint8Array {\n\t\treturn Y.encodeStateVector(this.doc);\n\t}\n\n\t/**\n\t * Encode state difference since given state vector\n\t * Implements delta sync for efficiency\n\t */\n\tencodeStateDiff(stateVector: Uint8Array): Uint8Array {\n\t\treturn Y.encodeStateAsUpdate(this.doc, stateVector);\n\t}\n\n\t/**\n\t * Clean up resources\n\t */\n\tdestroy(): void {\n\t\tthis.doc.destroy();\n\t}\n}\n","/**\n * SyncWorker - Background sync coordinator\n *\n * Manages background sync from StateStore → Neon PostgreSQL via YjsAdapter.\n * Implements persistent queue, exponential backoff, and conflict resolution.\n *\n * Phase 2.4: Now includes WebSocket client for real-time sync to API.\n */\n\nimport { EventEmitter } from \"node:events\";\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport type { StateStore } from \"../storage/StateStore\";\nimport { YjsAdapter } from \"./YjsAdapter\";\n\ninterface SyncOperation {\n\tid: string;\n\ttype: \"learning\" | \"pattern\" | \"violation\" | \"session\";\n\taction: \"create\" | \"update\" | \"delete\";\n\tdata: any;\n\ttimestamp: string;\n\tretries?: number;\n}\n\nexport type SyncStatus = \"connected\" | \"connecting\" | \"syncing\" | \"offline\" | \"error\";\n\nexport interface SyncWorkerConfig {\n\tuserId: string;\n\tworkspaceId: string;\n\tsyncInterval?: number; // ms between syncs (default: 30000)\n\tmaxRetries?: number; // max retry attempts (default: 3)\n\tbaseDelay?: number; // base delay for exponential backoff (default: 1000ms)\n\tmaxDelay?: number; // max delay cap (default: 30000ms)\n\tapiUrl?: string; // API WebSocket URL (default: wss://api.snapback.dev)\n\tauthToken?: string; // Auth token for platform sync\n}\n\n/**\n * SyncWorker - Coordinates background sync to Neon PostgreSQL\n *\n * Features:\n * - Persistent sync queue (.snapback/sync-queue.json)\n * - Exponential backoff with jitter\n * - Conflict resolution via CRDT\n * - Event-driven error handling\n */\nexport class SyncWorker extends EventEmitter {\n\tprivate store: StateStore;\n\tprivate adapter: YjsAdapter;\n\tprivate config: Required<SyncWorkerConfig>;\n\tprivate queue: SyncOperation[] = [];\n\tprivate queuePath: string;\n\tprivate syncInterval: NodeJS.Timeout | null = null;\n\tprivate isSyncing = false;\n\tprivate snapbackDir: string;\n\n\tconstructor(store: StateStore, config: SyncWorkerConfig) {\n\t\tsuper();\n\t\tthis.store = store;\n\t\tthis.adapter = new YjsAdapter(store);\n\t\tthis.config = {\n\t\t\tsyncInterval: 30000, // 30s default\n\t\t\tmaxRetries: 3,\n\t\t\tbaseDelay: 1000,\n\t\t\tmaxDelay: 30000,\n\t\t\tapiUrl: \"wss://api.snapback.dev\",\n\t\t\tauthToken: \"\",\n\t\t\t...config,\n\t\t};\n\t\t// Extract snapbackDir from statePath\n\t\tthis.snapbackDir = path.dirname((store as any).statePath);\n\t\tthis.queuePath = path.join(this.snapbackDir, \"sync-queue.json\");\n\t}\n\n\t/**\n\t * Initialize worker - load persisted queue\n\t */\n\tasync init(): Promise<void> {\n\t\tawait this.loadQueue();\n\t}\n\n\t/**\n\t * Start background sync\n\t */\n\tstart(): void {\n\t\tif (this.syncInterval) {\n\t\t\treturn; // Already running\n\t\t}\n\n\t\tthis.syncInterval = setInterval(() => {\n\t\t\tvoid this.syncIfDirty();\n\t\t}, this.config.syncInterval);\n\t}\n\n\t/**\n\t * Stop background sync\n\t */\n\tstop(): void {\n\t\tif (this.syncInterval) {\n\t\t\tclearInterval(this.syncInterval);\n\t\t\tthis.syncInterval = null;\n\t\t}\n\t}\n\n\t/**\n\t * Enqueue sync operation\n\t */\n\tasync enqueue(operation: Omit<SyncOperation, \"id\" | \"timestamp\">): Promise<void> {\n\t\tconst op: SyncOperation = {\n\t\t\t...operation,\n\t\t\tid: `op_${Date.now()}_${Math.random().toString(36).slice(2)}`,\n\t\t\ttimestamp: new Date().toISOString(),\n\t\t\tretries: 0,\n\t\t};\n\n\t\tthis.queue.push(op);\n\t\tawait this.persistQueue();\n\t\tthis.emit(\"enqueued\", op);\n\t}\n\n\t/**\n\t * Dequeue next operation\n\t */\n\tasync dequeue(): Promise<SyncOperation | undefined> {\n\t\tconst op = this.queue.shift();\n\t\tif (op) {\n\t\t\tawait this.persistQueue();\n\t\t\tthis.emit(\"dequeued\", op);\n\t\t}\n\t\treturn op;\n\t}\n\n\t/**\n\t * Get current queue size\n\t */\n\tgetQueueSize(): number {\n\t\treturn this.queue.length;\n\t}\n\n\t/**\n\t * Sync now (manual trigger)\n\t */\n\tasync syncNow(): Promise<void> {\n\t\tawait this.sync();\n\t}\n\n\t/**\n\t * Sync if state is dirty\n\t */\n\tprivate async syncIfDirty(): Promise<void> {\n\t\tif (this.store.isDirty()) {\n\t\t\tawait this.sync();\n\t\t}\n\t}\n\n\t/**\n\t * Perform sync with retry logic\n\t */\n\tprivate async sync(): Promise<void> {\n\t\tif (this.isSyncing) {\n\t\t\treturn; // Avoid concurrent syncs\n\t\t}\n\n\t\tthis.isSyncing = true;\n\n\t\ttry {\n\t\t\tawait this.syncWithRetry();\n\t\t\tthis.emit(\"synced\");\n\t\t} catch (error) {\n\t\t\tthis.emit(\"error\", error);\n\t\t} finally {\n\t\t\tthis.isSyncing = false;\n\t\t}\n\t}\n\n\t/**\n\t * Sync with exponential backoff retry\n\t */\n\tprivate async syncWithRetry(attempt = 0): Promise<void> {\n\t\ttry {\n\t\t\tawait this.syncToNeon();\n\t\t} catch (error) {\n\t\t\tif (attempt < this.config.maxRetries) {\n\t\t\t\tconst delay = this.calculateBackoff(attempt);\n\t\t\t\tawait new Promise((resolve) => setTimeout(resolve, delay));\n\t\t\t\treturn this.syncWithRetry(attempt + 1);\n\t\t\t}\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\t/**\n\t * Calculate exponential backoff delay with jitter\n\t */\n\tprivate calculateBackoff(attempt: number): number {\n\t\tconst exponential = this.config.baseDelay * 2 ** attempt;\n\t\tconst jitter = Math.random() * 1000; // 0-1000ms jitter\n\t\treturn Math.min(exponential + jitter, this.config.maxDelay);\n\t}\n\n\t/**\n\t * Sync to Neon PostgreSQL via WebSocket\n\t *\n\t * Emits 'sync:update' event with Yjs binary update for the daemon to send\n\t * to the API WebSocket hub. The daemon handles the actual WebSocket connection\n\t * to keep this package platform-agnostic.\n\t */\n\tprivate async syncToNeon(): Promise<void> {\n\t\t// Sync StateStore → Yjs\n\t\tawait this.adapter.syncFromStateStore();\n\n\t\t// Encode state as Yjs binary update\n\t\tconst update = this.adapter.encodeState();\n\n\t\t// Emit event for daemon to send via WebSocket\n\t\t// The daemon listens to this and sends to the API WebSocket hub\n\t\tthis.emit(\"sync:update\", {\n\t\t\tuserId: this.config.userId,\n\t\t\tworkspaceId: this.config.workspaceId,\n\t\t\tupdate: update,\n\t\t\ttimestamp: new Date().toISOString(),\n\t\t});\n\n\t\t// Mark as synced\n\t\tthis.store.markSynced();\n\t}\n\n\t/**\n\t * Apply remote update from WebSocket\n\t * Called by daemon when receiving updates from the API\n\t */\n\tasync applyRemoteUpdate(update: Uint8Array): Promise<void> {\n\t\tthis.adapter.applyUpdate(update);\n\t\tawait this.adapter.syncToStateStore();\n\t\tthis.emit(\"sync:applied\", { timestamp: new Date().toISOString() });\n\t}\n\n\t/**\n\t * Get current state vector for delta sync\n\t */\n\tgetStateVector(): Uint8Array {\n\t\treturn this.adapter.getStateVector();\n\t}\n\n\t/**\n\t * Get state diff since given vector\n\t */\n\tgetStateDiff(stateVector: Uint8Array): Uint8Array {\n\t\treturn this.adapter.encodeStateDiff(stateVector);\n\t}\n\n\t/**\n\t * Get current sync status\n\t */\n\tgetStatus(): SyncStatus {\n\t\tif (!this.config.authToken) {\n\t\t\treturn \"offline\";\n\t\t}\n\t\tif (this.isSyncing) {\n\t\t\treturn \"syncing\";\n\t\t}\n\t\tif (this.syncInterval) {\n\t\t\treturn \"connected\";\n\t\t}\n\t\treturn \"offline\";\n\t}\n\n\t/**\n\t * Load persisted queue from disk\n\t */\n\tprivate async loadQueue(): Promise<void> {\n\t\tif (fs.existsSync(this.queuePath)) {\n\t\t\tconst content = fs.readFileSync(this.queuePath, \"utf-8\");\n\t\t\tthis.queue = JSON.parse(content);\n\t\t}\n\t}\n\n\t/**\n\t * Persist queue to disk\n\t */\n\tprivate async persistQueue(): Promise<void> {\n\t\tconst dir = path.dirname(this.queuePath);\n\t\tif (!fs.existsSync(dir)) {\n\t\t\tfs.mkdirSync(dir, { recursive: true });\n\t\t}\n\t\tfs.writeFileSync(this.queuePath, JSON.stringify(this.queue, null, 2));\n\t}\n\n\t/**\n\t * Clean up resources\n\t */\n\tdestroy(): void {\n\t\tthis.stop();\n\t\tthis.adapter.destroy();\n\t\tthis.removeAllListeners();\n\t}\n}\n","/**\n * Embeddings Module Types\n *\n * Configuration and type definitions for the embeddings service.\n *\n * @module embeddings/types\n */\n\n/**\n * Metrics emitted during embedding operations.\n * Integrate with PostHog for analytics.\n */\nexport interface EmbeddingMetrics {\n\t/** Time to load model (first call only) */\n\tmodelLoadTimeMs?: number;\n\t/** Time to generate single embedding */\n\tembeddingTimeMs?: number;\n\t/** Original text length in characters */\n\ttextLengthChars?: number;\n\t/** Whether text was truncated */\n\ttruncationOccurred?: boolean;\n\t/** Method used for truncation */\n\ttruncationMethod?: \"token\" | \"character\";\n\t/** Original token/char count before truncation */\n\toriginalLength?: number;\n\t/** Final token/char count after truncation */\n\ttruncatedLength?: number;\n}\n\n/**\n * Configuration for embedding operations\n */\nexport interface EmbeddingConfig {\n\t/** Model to use (default: Xenova/all-MiniLM-L6-v2) */\n\tmodel?: string;\n\t/** Use quantized model for smaller size (default: true) */\n\tquantized?: boolean;\n\t/** Progress callback during model loading */\n\tonProgress?: (progress: { status: string; progress?: number }) => void;\n\t/** Timeout for model loading in ms (default: 120000) */\n\tloadTimeout?: number;\n\t/** Metrics callback for telemetry */\n\tonMetrics?: (metrics: EmbeddingMetrics) => void;\n}\n\n/**\n * Options for batch embedding operations\n */\nexport interface BatchEmbeddingOptions {\n\t/** Items per batch (default: 32) */\n\tbatchSize?: number;\n\t/** Max concurrent embeddings (default: 4) */\n\tconcurrency?: number;\n\t/** Progress callback (called per-embedding, not per-batch) */\n\tonProgress?: (done: number, total: number) => void;\n}\n\n/**\n * Options for similarity operations\n */\nexport interface SimilarityOptions {\n\t/** Skip normalization validation (default: false) */\n\tskipNormalizationCheck?: boolean;\n}\n\n/**\n * Default configuration values\n *\n * NOTE: Requires @huggingface/transformers@^3.0.0\n * If version changes, verify pipeline API is compatible.\n */\nexport const EMBEDDING_DEFAULTS = {\n\t/** Default model - all-MiniLM-L6-v2 is fast with good quality */\n\tMODEL: \"Xenova/all-MiniLM-L6-v2\",\n\t/** Output dimension for default model */\n\tDIMENSION: 384,\n\t/** Use quantized model by default (smaller, slightly less accurate) */\n\tQUANTIZED: true,\n\t/** Transformer attention window limit */\n\tMAX_TOKENS: 256,\n\t/** Fallback character limit when tokenizer unavailable */\n\tMAX_CHARS_FALLBACK: 1000,\n\t/** Model load timeout (2 minutes) */\n\tLOAD_TIMEOUT_MS: 120_000,\n\t/** Default batch size */\n\tBATCH_SIZE: 32,\n\t/** Default concurrent operations */\n\tCONCURRENCY: 4,\n\t/** Tolerance for normalization check (vectors should be ~1.0 magnitude) */\n\tNORMALIZATION_TOLERANCE: 0.01,\n} as const;\n\n/** Embedding vector type */\nexport type EmbeddingVector = Float32Array;\n","/**\n * Embeddings Module Error Types\n *\n * Custom error hierarchy for embedding operations.\n *\n * @module embeddings/errors\n */\n\n/**\n * Base error for all embedding-related errors\n */\nexport class EmbeddingError extends Error {\n\tconstructor(\n\t\tmessage: string,\n\t\tpublic readonly cause?: Error,\n\t) {\n\t\tsuper(message);\n\t\tthis.name = \"EmbeddingError\";\n\n\t\t// Maintain proper stack trace in V8\n\t\tif (Error.captureStackTrace) {\n\t\t\tError.captureStackTrace(this, this.constructor);\n\t\t}\n\t}\n}\n\n/**\n * Error loading the transformer pipeline\n */\nexport class PipelineLoadError extends EmbeddingError {\n\tconstructor(message: string, cause?: Error) {\n\t\tsuper(message, cause);\n\t\tthis.name = \"PipelineLoadError\";\n\t}\n}\n\n/**\n * Timeout while loading the transformer model\n */\nexport class PipelineTimeoutError extends EmbeddingError {\n\tconstructor(public readonly timeoutMs: number) {\n\t\tsuper(`Model load timeout after ${timeoutMs}ms`);\n\t\tthis.name = \"PipelineTimeoutError\";\n\t}\n}\n\n/**\n * Model returned unexpected embedding dimension\n */\nexport class DimensionMismatchError extends EmbeddingError {\n\tconstructor(\n\t\tpublic readonly expected: number,\n\t\tpublic readonly actual: number,\n\t\tpublic readonly model: string | null,\n\t) {\n\t\tsuper(\n\t\t\t`Model returned unexpected dimension: ${actual} (expected ${expected}). ` +\n\t\t\t\t`Current model: ${model ?? \"unknown\"}`,\n\t\t);\n\t\tthis.name = \"DimensionMismatchError\";\n\t}\n}\n\n/**\n * Input vectors have mismatched dimensions\n */\nexport class VectorDimensionError extends EmbeddingError {\n\tconstructor(\n\t\tpublic readonly dimA: number,\n\t\tpublic readonly dimB: number,\n\t) {\n\t\tsuper(`Vector dimension mismatch: ${dimA} vs ${dimB}`);\n\t\tthis.name = \"VectorDimensionError\";\n\t}\n}\n","/**\n * Hardened Singleton Transformer Pipeline\n *\n * Addresses production concerns:\n * - Memory leak prevention on model switching (cleanup previous pipeline)\n * - Promise rejection handling (allows retry on failure)\n * - Load timeout (prevents hanging indefinitely)\n * - API compatibility validation\n *\n * CRITICAL: Uses dynamic import for @huggingface/transformers.\n * Static imports cause \"Cannot find module\" errors in VS Code extension\n * bundles because native modules are externalized but not shipped.\n *\n * NOTE: Requires @huggingface/transformers@^3.0.0\n * If version changes, verify pipeline API is compatible.\n *\n * @module embeddings/pipeline\n */\n\nimport { EmbeddingError, PipelineLoadError, PipelineTimeoutError } from \"./errors.js\";\nimport { EMBEDDING_DEFAULTS, type EmbeddingConfig } from \"./types.js\";\n\n/**\n * Pipeline interface for feature extraction.\n * Uses `unknown` internally due to dynamic import complexity.\n * Runtime validation ensures correct shape.\n */\nexport type EmbeddingPipeline = unknown;\n\n// Pipeline state - using unknown for dynamic import compatibility\nlet pipeline: EmbeddingPipeline = null;\nlet loadPromise: Promise<EmbeddingPipeline> | null = null;\nlet currentModel: string | null = null;\nlet loadError: Error | null = null;\nlet modelLoadStartTime: number | null = null;\n\n/**\n * Dispose of current pipeline to free memory.\n *\n * Called automatically on model switch to prevent memory leaks.\n */\nasync function disposePipeline(): Promise<void> {\n\tif (pipeline) {\n\t\t// Try to call dispose if available (model-dependent)\n\t\tconst pipelineObj = pipeline as { dispose?: () => Promise<void> };\n\t\tif (typeof pipelineObj.dispose === \"function\") {\n\t\t\ttry {\n\t\t\t\tawait pipelineObj.dispose();\n\t\t\t} catch {\n\t\t\t\t// Best-effort cleanup - some models don't support dispose\n\t\t\t}\n\t\t}\n\t\tpipeline = null;\n\t\tcurrentModel = null;\n\t}\n}\n\n/**\n * Get or create embedding pipeline with proper error handling.\n *\n * **WARNING**: Do not cache the returned pipeline across multiple calls.\n * Always use getEmbedding() instead, which handles pipeline refresh\n * correctly when models change.\n *\n * @param config - Pipeline configuration\n * @returns Initialized embedding pipeline\n * @throws {PipelineLoadError} If pipeline fails to load\n * @throws {PipelineTimeoutError} If loading exceeds timeout\n */\nexport async function getEmbeddingPipeline(config: EmbeddingConfig = {}): Promise<EmbeddingPipeline> {\n\tconst model = config.model ?? EMBEDDING_DEFAULTS.MODEL;\n\tconst timeout = config.loadTimeout ?? EMBEDDING_DEFAULTS.LOAD_TIMEOUT_MS;\n\n\t// Return cached if same model and no previous error\n\tif (pipeline && currentModel === model && !loadError) {\n\t\treturn pipeline;\n\t}\n\n\t// Wait for existing load of same model\n\tif (loadPromise && currentModel === model && !loadError) {\n\t\treturn loadPromise;\n\t}\n\n\t// Model switch: dispose previous to prevent memory leak\n\t// NOTE: This will invalidate any in-flight embeddings using old pipeline.\n\t// Safe because getEmbedding() gets a fresh pipeline reference per call.\n\tif (currentModel !== model && pipeline) {\n\t\tawait disposePipeline();\n\t}\n\n\t// Clear previous error state for retry\n\tloadError = null;\n\tmodelLoadStartTime = performance.now();\n\n\tloadPromise = (async (): Promise<EmbeddingPipeline> => {\n\t\ttry {\n\t\t\t// CRITICAL: Dynamic import for VS Code extension compatibility\n\t\t\t// Native modules with .node binaries must use dynamic import\n\t\t\t// to avoid bundling issues (externalized but not shipped)\n\t\t\tconst transformers = await import(\"@huggingface/transformers\");\n\n\t\t\t// Validate API compatibility with @huggingface/transformers@^3.0.0\n\t\t\tif (typeof transformers.pipeline !== \"function\") {\n\t\t\t\tthrow new PipelineLoadError(\n\t\t\t\t\t\"Incompatible @huggingface/transformers version: pipeline() not found. \" +\n\t\t\t\t\t\t\"Required: @huggingface/transformers@^3.0.0\",\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// Pipeline options - using Record for flexibility across versions\n\t\t\tconst pipelineOptions: Record<string, unknown> = {};\n\n\t\t\t// Add quantized option if supported (reduces model size)\n\t\t\tpipelineOptions.quantized = config.quantized ?? EMBEDDING_DEFAULTS.QUANTIZED;\n\n\t\t\t// Add progress callback if provided\n\t\t\tif (config.onProgress) {\n\t\t\t\tpipelineOptions.progress_callback = config.onProgress;\n\t\t\t}\n\n\t\t\t// Race against timeout to prevent hanging indefinitely\n\t\t\tconst pipe = await Promise.race([\n\t\t\t\ttransformers.pipeline(\"feature-extraction\", model, pipelineOptions),\n\t\t\t\tnew Promise<never>((_, reject) => setTimeout(() => reject(new PipelineTimeoutError(timeout)), timeout)),\n\t\t\t]);\n\n\t\t\t// Validate pipeline is callable\n\t\t\tif (typeof pipe !== \"function\") {\n\t\t\t\tthrow new PipelineLoadError(\"Pipeline did not return callable function\");\n\t\t\t}\n\n\t\t\t// Store loaded pipeline\n\t\t\tpipeline = pipe;\n\t\t\tcurrentModel = model;\n\t\t\tloadPromise = null;\n\n\t\t\t// Emit load time metric\n\t\t\tif (config.onMetrics && modelLoadStartTime) {\n\t\t\t\tconfig.onMetrics({\n\t\t\t\t\tmodelLoadTimeMs: performance.now() - modelLoadStartTime,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn pipe;\n\t\t} catch (error) {\n\t\t\t// Store error to allow retry on next call\n\t\t\tloadError = error as Error;\n\t\t\tloadPromise = null; // Reset promise so next call can retry\n\n\t\t\t// Wrap in typed error if needed\n\t\t\tif (error instanceof EmbeddingError) {\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t\tthrow new PipelineLoadError(\"Failed to load embedding model\", error as Error);\n\t\t}\n\t})();\n\n\treturn loadPromise;\n}\n\n/**\n * Check if pipeline is loaded and ready for use\n */\nexport function isPipelineReady(): boolean {\n\treturn pipeline !== null && loadError === null;\n}\n\n/**\n * Get currently loaded model name\n */\nexport function getCurrentModel(): string | null {\n\treturn currentModel;\n}\n\n/**\n * Get last load error (null if no error or successfully loaded after error)\n */\nexport function getLoadError(): Error | null {\n\treturn loadError;\n}\n\n/**\n * Preload pipeline (non-blocking, catches errors).\n *\n * Call during initialization to warm up the model.\n * Safe to call in VS Code extension activation - won't throw.\n *\n * @param config - Pipeline configuration\n */\nexport async function preloadPipeline(config?: EmbeddingConfig): Promise<void> {\n\ttry {\n\t\tawait getEmbeddingPipeline(config);\n\t} catch (error) {\n\t\t// Log but don't throw - preload is best-effort\n\t\tconsole.warn(\"[embeddings] Preload failed:\", (error as Error).message);\n\t}\n}\n\n/**\n * Force dispose and reset pipeline state.\n *\n * Use for testing or to force model reload.\n */\nexport async function resetPipeline(): Promise<void> {\n\tawait disposePipeline();\n\tloadPromise = null;\n\tloadError = null;\n\tmodelLoadStartTime = null;\n}\n","/**\n * Core Embedding Operations\n *\n * Provides the main getEmbedding() function with proper tokenization\n * handling, truncation logging, and metrics emission.\n *\n * @module embeddings/embedding\n */\n\nimport { DimensionMismatchError, EmbeddingError } from \"./errors.js\";\nimport { getCurrentModel, getEmbeddingPipeline } from \"./pipeline.js\";\nimport { EMBEDDING_DEFAULTS, type EmbeddingConfig, type EmbeddingMetrics, type EmbeddingVector } from \"./types.js\";\n\n/**\n * Generate embedding for a single text\n *\n * Uses proper tokenization (not character truncation) to respect\n * the model's attention window. Falls back to character truncation\n * if tokenizer is unavailable.\n *\n * @param text - Input text to embed\n * @param config - Embedding configuration\n * @returns 384-dimensional embedding vector (for default model)\n * @throws {DimensionMismatchError} If model returns unexpected dimension\n * @throws {EmbeddingError} If embedding generation fails\n *\n * @example\n * ```typescript\n * const embedding = await getEmbedding(\"How do I authenticate users?\");\n * console.log(embedding.length); // 384\n * ```\n */\nexport async function getEmbedding(text: string, config?: EmbeddingConfig): Promise<EmbeddingVector> {\n\tconst startTime = performance.now();\n\tconst originalLength = text.length;\n\n\t// Track metrics\n\tlet truncationOccurred = false;\n\tlet truncationMethod: \"token\" | \"character\" | undefined;\n\tlet truncatedLength = originalLength;\n\n\tconst pipelineRaw = await getEmbeddingPipeline(config);\n\n\t// Cast pipeline to expected shape for runtime access\n\t// The actual type is validated at load time in pipeline.ts\n\tconst pipe = pipelineRaw as (\n\t\ttext: string,\n\t\toptions?: { pooling?: string; normalize?: boolean },\n\t) => Promise<{ data: Float32Array }>;\n\n\tconst pipeWithTokenizer = pipelineRaw as {\n\t\ttokenizer?: {\n\t\t\tencode?: (text: string) => number[] | { input_ids?: number[] };\n\t\t\ttokenize?: (text: string) => number[];\n\t\t\tdecode?: (tokens: number[], options?: { skip_special_tokens?: boolean }) => string;\n\t\t};\n\t};\n\n\t// Process text with proper tokenization\n\tlet processedText = text;\n\n\t// Try tokenization-based truncation first\n\tconst tokenizer = pipeWithTokenizer.tokenizer;\n\n\tif (tokenizer) {\n\t\ttry {\n\t\t\t// Different tokenizer APIs exist - try common patterns\n\t\t\tlet tokens: number[] | undefined;\n\t\t\tlet tokenCount = 0;\n\n\t\t\t// Try encode() first (common in @huggingface/transformers@3.x)\n\t\t\tif (typeof tokenizer.encode === \"function\") {\n\t\t\t\tconst encoded = tokenizer.encode(text);\n\t\t\t\t// Handle both direct array and {input_ids} object patterns\n\t\t\t\ttokens = Array.isArray(encoded) ? encoded : encoded?.input_ids;\n\t\t\t\ttokenCount = tokens?.length ?? 0;\n\t\t\t}\n\t\t\t// Fallback to tokenize() (older API)\n\t\t\telse if (typeof tokenizer.tokenize === \"function\") {\n\t\t\t\ttokens = tokenizer.tokenize(text);\n\t\t\t\ttokenCount = tokens?.length ?? 0;\n\t\t\t}\n\t\t\t// Fallback to direct call (some tokenizers are callable)\n\t\t\t// Cast needed because TypeScript narrowing doesn't account for callable objects\n\t\t\telse if (typeof tokenizer === \"function\") {\n\t\t\t\tconst callableTokenizer = tokenizer as unknown as (text: string) => { input_ids?: number[] };\n\t\t\t\tconst result = callableTokenizer(text);\n\t\t\t\ttokens = result?.input_ids;\n\t\t\t\ttokenCount = tokens?.length ?? 0;\n\t\t\t}\n\n\t\t\tif (tokens && tokenCount > EMBEDDING_DEFAULTS.MAX_TOKENS) {\n\t\t\t\ttruncationOccurred = true;\n\t\t\t\ttruncationMethod = \"token\";\n\t\t\t\ttruncatedLength = EMBEDDING_DEFAULTS.MAX_TOKENS;\n\n\t\t\t\tconsole.warn(\n\t\t\t\t\t`[embeddings] Text truncated (token): ${tokenCount} → ${EMBEDDING_DEFAULTS.MAX_TOKENS} tokens`,\n\t\t\t\t);\n\n\t\t\t\t// Decode truncated tokens back to text\n\t\t\t\tconst truncatedTokens = tokens.slice(0, EMBEDDING_DEFAULTS.MAX_TOKENS);\n\n\t\t\t\tif (typeof tokenizer.decode === \"function\") {\n\t\t\t\t\tprocessedText = tokenizer.decode(truncatedTokens, { skip_special_tokens: true });\n\t\t\t\t} else {\n\t\t\t\t\t// Fallback if decode unavailable\n\t\t\t\t\tprocessedText = text.slice(0, EMBEDDING_DEFAULTS.MAX_CHARS_FALLBACK);\n\t\t\t\t\ttruncationMethod = \"character\";\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (tokenizerError) {\n\t\t\t// Tokenizer failed - fall back to character truncation\n\t\t\tconsole.warn(\"[embeddings] Tokenizer error, using character fallback:\", (tokenizerError as Error).message);\n\n\t\t\tif (text.length > EMBEDDING_DEFAULTS.MAX_CHARS_FALLBACK) {\n\t\t\t\ttruncationOccurred = true;\n\t\t\t\ttruncationMethod = \"character\";\n\t\t\t\ttruncatedLength = EMBEDDING_DEFAULTS.MAX_CHARS_FALLBACK;\n\t\t\t\tprocessedText = text.slice(0, EMBEDDING_DEFAULTS.MAX_CHARS_FALLBACK);\n\n\t\t\t\tconsole.warn(\n\t\t\t\t\t`[embeddings] Text truncated (character): ${originalLength} → ${EMBEDDING_DEFAULTS.MAX_CHARS_FALLBACK} chars`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t} else {\n\t\t// No tokenizer available - use character truncation\n\t\tif (text.length > EMBEDDING_DEFAULTS.MAX_CHARS_FALLBACK) {\n\t\t\ttruncationOccurred = true;\n\t\t\ttruncationMethod = \"character\";\n\t\t\ttruncatedLength = EMBEDDING_DEFAULTS.MAX_CHARS_FALLBACK;\n\t\t\tprocessedText = text.slice(0, EMBEDDING_DEFAULTS.MAX_CHARS_FALLBACK);\n\n\t\t\tconsole.warn(\n\t\t\t\t`[embeddings] No tokenizer, text truncated (character): ${originalLength} → ${EMBEDDING_DEFAULTS.MAX_CHARS_FALLBACK} chars`,\n\t\t\t);\n\t\t}\n\t}\n\n\ttry {\n\t\t// Generate embedding\n\t\tconst output = await pipe(processedText, {\n\t\t\tpooling: \"mean\",\n\t\t\tnormalize: true,\n\t\t});\n\n\t\tconst embedding = output.data as Float32Array;\n\n\t\t// Validate dimension\n\t\tif (embedding.length !== EMBEDDING_DEFAULTS.DIMENSION) {\n\t\t\tthrow new DimensionMismatchError(EMBEDDING_DEFAULTS.DIMENSION, embedding.length, getCurrentModel());\n\t\t}\n\n\t\t// Emit metrics\n\t\tconst elapsedMs = performance.now() - startTime;\n\n\t\tif (config?.onMetrics) {\n\t\t\tconst metrics: EmbeddingMetrics = {\n\t\t\t\tembeddingTimeMs: elapsedMs,\n\t\t\t\ttextLengthChars: originalLength,\n\t\t\t\ttruncationOccurred,\n\t\t\t\ttruncationMethod,\n\t\t\t\toriginalLength,\n\t\t\t\ttruncatedLength,\n\t\t\t};\n\t\t\tconfig.onMetrics(metrics);\n\t\t}\n\n\t\treturn embedding;\n\t} catch (error) {\n\t\tif (error instanceof EmbeddingError) {\n\t\t\tthrow error;\n\t\t}\n\t\tthrow new EmbeddingError(\"Failed to generate embedding\", error as Error);\n\t}\n}\n\n/**\n * Get embedding dimension for current/default model\n *\n * @returns Dimension (384 for default all-MiniLM-L6-v2 model)\n */\nexport function getEmbeddingDimension(): number {\n\treturn EMBEDDING_DEFAULTS.DIMENSION;\n}\n","/**\n * Vector Similarity Operations\n *\n * Provides cosine similarity, euclidean distance, and other vector math\n * with optional normalization validation.\n *\n * @module embeddings/similarity\n */\n\nimport { VectorDimensionError } from \"./errors.js\";\nimport { EMBEDDING_DEFAULTS, type SimilarityOptions } from \"./types.js\";\n\n/**\n * Compute dot product of two vectors\n *\n * @param a - First vector\n * @param b - Second vector\n * @returns Dot product (sum of element-wise products)\n * @throws {VectorDimensionError} If dimensions don't match\n */\nexport function dotProduct(a: Float32Array, b: Float32Array): number {\n\tif (a.length !== b.length) {\n\t\tthrow new VectorDimensionError(a.length, b.length);\n\t}\n\n\tlet result = 0;\n\tfor (let i = 0; i < a.length; i++) {\n\t\tresult += a[i] * b[i];\n\t}\n\treturn result;\n}\n\n/**\n * Compute vector magnitude (L2 norm)\n *\n * @param v - Input vector\n * @returns Magnitude (square root of sum of squares)\n */\nexport function magnitude(v: Float32Array): number {\n\tlet sum = 0;\n\tfor (let i = 0; i < v.length; i++) {\n\t\tsum += v[i] * v[i];\n\t}\n\treturn Math.sqrt(sum);\n}\n\n/**\n * Normalize a vector to unit length (L2 normalization)\n *\n * @param v - Input vector\n * @returns New normalized vector with magnitude 1.0\n */\nexport function normalize(v: Float32Array): Float32Array {\n\tconst mag = magnitude(v);\n\tif (mag === 0) {\n\t\treturn new Float32Array(v.length); // Return zero vector\n\t}\n\n\tconst result = new Float32Array(v.length);\n\tfor (let i = 0; i < v.length; i++) {\n\t\tresult[i] = v[i] / mag;\n\t}\n\treturn result;\n}\n\n/**\n * Cosine similarity between two vectors\n *\n * **For normalized vectors** (as produced by getEmbedding with normalize: true):\n * This equals the dot product, which is faster.\n *\n * **For non-normalized vectors**: Computes full formula (dot / (mag_a * mag_b)).\n *\n * By default, validates that inputs appear normalized (magnitude ~1.0).\n * Set `skipNormalizationCheck: true` for raw/external vectors.\n *\n * @param a - First embedding vector\n * @param b - Second embedding vector\n * @param options - Validation options\n * @returns Similarity score in [-1, 1] range (1 = identical, 0 = orthogonal, -1 = opposite)\n * @throws {VectorDimensionError} If dimensions don't match\n */\nexport function cosineSimilarity(a: Float32Array, b: Float32Array, options: SimilarityOptions = {}): number {\n\tif (a.length !== b.length) {\n\t\tthrow new VectorDimensionError(a.length, b.length);\n\t}\n\n\tconst tolerance = EMBEDDING_DEFAULTS.NORMALIZATION_TOLERANCE;\n\n\t// Normalization check - vectors from getEmbedding should have magnitude ~1.0\n\tif (!options.skipNormalizationCheck) {\n\t\tconst magA = magnitude(a);\n\t\tconst magB = magnitude(b);\n\n\t\tconst aIsNormalized = Math.abs(magA - 1.0) <= tolerance;\n\t\tconst bIsNormalized = Math.abs(magB - 1.0) <= tolerance;\n\n\t\tif (!aIsNormalized || !bIsNormalized) {\n\t\t\tconsole.warn(\n\t\t\t\t\"[embeddings] Vectors may not be normalized \" +\n\t\t\t\t\t`(magnitudes: ${magA.toFixed(3)}, ${magB.toFixed(3)}). ` +\n\t\t\t\t\t`For vectors from getEmbedding(), this warning shouldn't appear.`,\n\t\t\t);\n\t\t}\n\n\t\t// Fast path: for normalized vectors, dot product = cosine similarity\n\t\tif (aIsNormalized && bIsNormalized) {\n\t\t\treturn dotProduct(a, b);\n\t\t}\n\t}\n\n\t// Full formula for non-normalized vectors\n\tconst dot = dotProduct(a, b);\n\tconst magProduct = magnitude(a) * magnitude(b);\n\treturn magProduct === 0 ? 0 : dot / magProduct;\n}\n\n/**\n * Euclidean distance between two vectors\n *\n * Lower values = more similar. Unlike cosine similarity, this is\n * affected by vector magnitude (not just direction).\n *\n * @param a - First vector\n * @param b - Second vector\n * @returns Euclidean distance (L2 distance)\n * @throws {VectorDimensionError} If dimensions don't match\n */\nexport function euclideanDistance(a: Float32Array, b: Float32Array): number {\n\tif (a.length !== b.length) {\n\t\tthrow new VectorDimensionError(a.length, b.length);\n\t}\n\n\tlet sum = 0;\n\tfor (let i = 0; i < a.length; i++) {\n\t\tconst diff = a[i] - b[i];\n\t\tsum += diff * diff;\n\t}\n\treturn Math.sqrt(sum);\n}\n\n/**\n * Manhattan distance (L1 distance) between two vectors\n *\n * Sum of absolute differences. More robust to outliers than Euclidean.\n *\n * @param a - First vector\n * @param b - Second vector\n * @returns Manhattan distance\n * @throws {VectorDimensionError} If dimensions don't match\n */\nexport function manhattanDistance(a: Float32Array, b: Float32Array): number {\n\tif (a.length !== b.length) {\n\t\tthrow new VectorDimensionError(a.length, b.length);\n\t}\n\n\tlet sum = 0;\n\tfor (let i = 0; i < a.length; i++) {\n\t\tsum += Math.abs(a[i] - b[i]);\n\t}\n\treturn sum;\n}\n","/**\n * Batch Embedding Operations\n *\n * Provides batched embedding generation with semaphore-based\n * concurrency control to prevent memory exhaustion in long-running\n * processes (MCP server, CLI with large operations).\n *\n * @module embeddings/batch\n */\n\nimport { getEmbedding } from \"./embedding.js\";\nimport { type BatchEmbeddingOptions, EMBEDDING_DEFAULTS, type EmbeddingConfig, type EmbeddingVector } from \"./types.js\";\n\n/**\n * Simple semaphore for concurrency control\n *\n * Limits the number of concurrent operations to prevent memory\n * exhaustion when processing large batches of embeddings.\n */\nclass Semaphore {\n\tprivate queue: Array<() => void> = [];\n\tprivate running = 0;\n\n\tconstructor(private readonly limit: number) {}\n\n\t/**\n\t * Acquire a slot (waits if all slots are in use)\n\t */\n\tasync acquire(): Promise<void> {\n\t\tif (this.running < this.limit) {\n\t\t\tthis.running++;\n\t\t\treturn;\n\t\t}\n\n\t\treturn new Promise((resolve) => {\n\t\t\tthis.queue.push(resolve);\n\t\t});\n\t}\n\n\t/**\n\t * Release a slot (allows next queued operation to proceed)\n\t */\n\trelease(): void {\n\t\tthis.running--;\n\t\tconst next = this.queue.shift();\n\t\tif (next) {\n\t\t\tthis.running++;\n\t\t\tnext();\n\t\t}\n\t}\n\n\t/**\n\t * Get current number of running operations\n\t */\n\tgetRunning(): number {\n\t\treturn this.running;\n\t}\n\n\t/**\n\t * Get number of operations waiting in queue\n\t */\n\tgetQueued(): number {\n\t\treturn this.queue.length;\n\t}\n}\n\n/**\n * Generate embeddings for multiple texts with concurrency control\n *\n * Processes texts in batches with a semaphore limiting parallel\n * operations to prevent memory exhaustion. Progress is reported\n * per-embedding (not per-batch) for accurate UI feedback.\n *\n * @param texts - Array of texts to embed\n * @param options - Batch options including concurrency limit\n * @param config - Embedding configuration\n * @returns Array of embeddings in same order as input texts\n *\n * @example\n * ```typescript\n * const embeddings = await batchEmbeddings(\n * [\"query 1\", \"query 2\", \"query 3\"],\n * {\n * concurrency: 4,\n * onProgress: (done, total) => console.log(`${done}/${total}`)\n * }\n * );\n * ```\n */\nexport async function batchEmbeddings(\n\ttexts: string[],\n\toptions: BatchEmbeddingOptions = {},\n\tconfig?: EmbeddingConfig,\n): Promise<EmbeddingVector[]> {\n\tconst {\n\t\tbatchSize = EMBEDDING_DEFAULTS.BATCH_SIZE,\n\t\tconcurrency = EMBEDDING_DEFAULTS.CONCURRENCY,\n\t\tonProgress,\n\t} = options;\n\n\t// Handle empty input\n\tif (texts.length === 0) {\n\t\treturn [];\n\t}\n\n\t// Single item - no batching needed\n\tif (texts.length === 1) {\n\t\tconst result = await getEmbedding(texts[0], config);\n\t\tonProgress?.(1, 1);\n\t\treturn [result];\n\t}\n\n\tconst results: EmbeddingVector[] = new Array(texts.length);\n\tconst semaphore = new Semaphore(concurrency);\n\tlet completed = 0;\n\n\t// Process in batches to manage memory allocation\n\tfor (let batchStart = 0; batchStart < texts.length; batchStart += batchSize) {\n\t\tconst batchEnd = Math.min(batchStart + batchSize, texts.length);\n\t\tconst batchIndices = Array.from({ length: batchEnd - batchStart }, (_, i) => batchStart + i);\n\n\t\t// Process batch with concurrency limit\n\t\tawait Promise.all(\n\t\t\tbatchIndices.map(async (index) => {\n\t\t\t\tawait semaphore.acquire();\n\t\t\t\ttry {\n\t\t\t\t\tresults[index] = await getEmbedding(texts[index], config);\n\n\t\t\t\t\t// Report progress per-embedding (not per-batch)\n\t\t\t\t\tcompleted++;\n\t\t\t\t\tonProgress?.(completed, texts.length);\n\t\t\t\t} finally {\n\t\t\t\t\tsemaphore.release();\n\t\t\t\t}\n\t\t\t}),\n\t\t);\n\t}\n\n\treturn results;\n}\n\n/**\n * Stream embeddings for texts (generator function)\n *\n * For very large datasets where you want to process results\n * as they become available rather than waiting for all.\n *\n * @param texts - Array of texts to embed\n * @param options - Batch options\n * @param config - Embedding configuration\n * @yields Objects with index and embedding\n *\n * @example\n * ```typescript\n * for await (const { index, embedding } of streamEmbeddings(texts)) {\n * console.log(`Got embedding ${index}`);\n * // Process immediately\n * }\n * ```\n */\nexport async function* streamEmbeddings(\n\ttexts: string[],\n\toptions: BatchEmbeddingOptions = {},\n\tconfig?: EmbeddingConfig,\n): AsyncGenerator<{ index: number; embedding: EmbeddingVector }> {\n\tconst { concurrency = EMBEDDING_DEFAULTS.CONCURRENCY } = options;\n\n\tconst semaphore = new Semaphore(concurrency);\n\tconst pending: Array<Promise<{ index: number; embedding: EmbeddingVector }>> = [];\n\n\tfor (let i = 0; i < texts.length; i++) {\n\t\tconst index = i;\n\n\t\tconst promise = (async () => {\n\t\t\tawait semaphore.acquire();\n\t\t\ttry {\n\t\t\t\tconst embedding = await getEmbedding(texts[index], config);\n\t\t\t\treturn { index, embedding };\n\t\t\t} finally {\n\t\t\t\tsemaphore.release();\n\t\t\t}\n\t\t})();\n\n\t\tpending.push(promise);\n\n\t\t// Yield results as they complete (up to concurrency limit)\n\t\tif (pending.length >= concurrency) {\n\t\t\tconst result = await Promise.race(pending);\n\t\t\tconst resultIndex = pending.findIndex((p) =>\n\t\t\t\tp.then(\n\t\t\t\t\t(r) => r.index === result.index,\n\t\t\t\t\t() => false,\n\t\t\t\t),\n\t\t\t);\n\t\t\tif (resultIndex !== -1) {\n\t\t\t\tpending.splice(resultIndex, 1);\n\t\t\t}\n\t\t\tyield result;\n\t\t}\n\t}\n\n\t// Yield remaining results\n\tfor (const promise of pending) {\n\t\tyield await promise;\n\t}\n}\n","/**\n * Intelligence Cache Service\n *\n * Domain-specific caching for Intelligence Layer MCP integrations.\n * Uses simple LRU implementation to avoid cross-package dependencies.\n *\n * @module cache/service\n */\n\nimport type { DocsValidation, GitHubContext, SentryContext } from \"../types/integrations.js\";\n\n/**\n * Cache configuration\n */\nexport interface CacheConfig {\n\t/** Maximum cache size per type (default: 100) */\n\tmaxSize?: number;\n\t/** TTL in milliseconds (default: 5 minutes) */\n\tttlMs?: number;\n}\n\n/**\n * Cache statistics for a single cache\n */\nexport interface CacheTypeStats {\n\thits: number;\n\tmisses: number;\n\tevictions: number;\n\tsize: number;\n\thitRate: number;\n}\n\n/**\n * Overall cache statistics\n */\nexport interface CacheStats {\n\tgithub: CacheTypeStats;\n\tdocs: CacheTypeStats;\n\tsentry: CacheTypeStats;\n\toverall: {\n\t\ttotalHits: number;\n\t\ttotalMisses: number;\n\t\ttotalSize: number;\n\t\thitRate: number;\n\t};\n}\n\n/**\n * Wrapper around simple Map-based LRU cache with statistics tracking\n */\nclass TrackedCache<T> {\n\tprivate cache: Map<string, { value: T; expiry: number }> = new Map();\n\tprivate stats = { hits: 0, misses: 0, evictions: 0 };\n\tprivate ttlMs: number;\n\tprivate maxSize: number;\n\n\tconstructor(maxSize: number, ttlMs: number) {\n\t\tthis.maxSize = maxSize;\n\t\tthis.ttlMs = ttlMs;\n\t}\n\n\tget(key: string): T | null {\n\t\tconst item = this.cache.get(key);\n\t\tif (!item) {\n\t\t\tthis.stats.misses++;\n\t\t\treturn null;\n\t\t}\n\n\t\t// Check expiry\n\t\tif (Date.now() > item.expiry) {\n\t\t\tthis.cache.delete(key);\n\t\t\tthis.stats.misses++;\n\t\t\treturn null;\n\t\t}\n\n\t\tthis.stats.hits++;\n\t\t// Move to end for LRU ordering\n\t\tthis.cache.delete(key);\n\t\tthis.cache.set(key, item);\n\t\treturn item.value;\n\t}\n\n\tset(key: string, value: T): void {\n\t\t// Delete existing to update order\n\t\tconst existed = this.cache.has(key);\n\t\tif (existed) {\n\t\t\tthis.cache.delete(key);\n\t\t}\n\n\t\t// Evict oldest if at capacity\n\t\tif (!existed && this.cache.size >= this.maxSize) {\n\t\t\tconst oldest = this.cache.keys().next().value;\n\t\t\tif (oldest !== undefined) {\n\t\t\t\tthis.cache.delete(oldest);\n\t\t\t\tthis.stats.evictions++;\n\t\t\t}\n\t\t}\n\n\t\tthis.cache.set(key, {\n\t\t\tvalue,\n\t\t\texpiry: Date.now() + this.ttlMs,\n\t\t});\n\t}\n\n\thas(key: string): boolean {\n\t\tconst item = this.cache.get(key);\n\t\tif (!item) {\n\t\t\treturn false;\n\t\t}\n\t\tif (Date.now() > item.expiry) {\n\t\t\tthis.cache.delete(key);\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t}\n\n\tclear(): void {\n\t\tthis.cache.clear();\n\t}\n\n\tgetStats(): CacheTypeStats {\n\t\tconst total = this.stats.hits + this.stats.misses;\n\t\treturn {\n\t\t\thits: this.stats.hits,\n\t\t\tmisses: this.stats.misses,\n\t\t\tevictions: this.stats.evictions,\n\t\t\tsize: this.cache.size,\n\t\t\thitRate: total > 0 ? this.stats.hits / total : 0,\n\t\t};\n\t}\n}\n\n/**\n * Intelligence Cache\n *\n * Provides domain-specific caching for GitHub, Context7, and Sentry MCP integrations.\n * Uses SDK's LRUCache under the hood to avoid code duplication.\n */\nexport class IntelligenceCache {\n\tprivate githubCache: TrackedCache<GitHubContext>;\n\tprivate docsCache: TrackedCache<DocsValidation>;\n\tprivate sentryCache: TrackedCache<SentryContext>;\n\n\tconstructor(config: CacheConfig = {}) {\n\t\tconst maxSize = config.maxSize ?? 100;\n\t\tconst ttlMs = config.ttlMs ?? 5 * 60 * 1000; // 5 minutes default\n\n\t\tthis.githubCache = new TrackedCache<GitHubContext>(maxSize, ttlMs);\n\t\tthis.docsCache = new TrackedCache<DocsValidation>(maxSize, ttlMs);\n\t\tthis.sentryCache = new TrackedCache<SentryContext>(maxSize, ttlMs);\n\t}\n\n\t// =========================================================================\n\t// GitHub Cache\n\t// =========================================================================\n\n\t/**\n\t * Get cached GitHub context for a file\n\t */\n\tgetGitHub(filePath: string): GitHubContext | null {\n\t\tconst key = this.normalizePath(filePath);\n\t\treturn this.githubCache.get(key);\n\t}\n\n\t/**\n\t * Cache GitHub context for a file\n\t */\n\tsetGitHub(filePath: string, context: GitHubContext): void {\n\t\tconst key = this.normalizePath(filePath);\n\t\tthis.githubCache.set(key, context);\n\t}\n\n\t// =========================================================================\n\t// Docs (Context7) Cache\n\t// =========================================================================\n\n\t/**\n\t * Get cached docs validation for a file + content hash\n\t */\n\tgetDocs(filePath: string, contentHash: string): DocsValidation | null {\n\t\tconst key = this.makeDocsKey(filePath, contentHash);\n\t\treturn this.docsCache.get(key);\n\t}\n\n\t/**\n\t * Cache docs validation for a file + content hash\n\t */\n\tsetDocs(filePath: string, contentHash: string, validation: DocsValidation): void {\n\t\tconst key = this.makeDocsKey(filePath, contentHash);\n\t\tthis.docsCache.set(key, validation);\n\t}\n\n\t// =========================================================================\n\t// Sentry Cache\n\t// =========================================================================\n\n\t/**\n\t * Get cached Sentry context for a file\n\t */\n\tgetSentry(filePath: string): SentryContext | null {\n\t\tconst key = this.normalizePath(filePath);\n\t\treturn this.sentryCache.get(key);\n\t}\n\n\t/**\n\t * Cache Sentry context for a file\n\t */\n\tsetSentry(filePath: string, context: SentryContext): void {\n\t\tconst key = this.normalizePath(filePath);\n\t\tthis.sentryCache.set(key, context);\n\t}\n\n\t// =========================================================================\n\t// Cache Management\n\t// =========================================================================\n\n\t/**\n\t * Clear all caches\n\t */\n\tclearAll(): void {\n\t\tthis.githubCache.clear();\n\t\tthis.docsCache.clear();\n\t\tthis.sentryCache.clear();\n\t}\n\n\t/**\n\t * Clear GitHub cache only\n\t */\n\tclearGitHub(): void {\n\t\tthis.githubCache.clear();\n\t}\n\n\t/**\n\t * Clear Docs cache only\n\t */\n\tclearDocs(): void {\n\t\tthis.docsCache.clear();\n\t}\n\n\t/**\n\t * Clear Sentry cache only\n\t */\n\tclearSentry(): void {\n\t\tthis.sentryCache.clear();\n\t}\n\n\t/**\n\t * Get cache statistics\n\t */\n\tgetStats(): CacheStats {\n\t\tconst github = this.githubCache.getStats();\n\t\tconst docs = this.docsCache.getStats();\n\t\tconst sentry = this.sentryCache.getStats();\n\n\t\tconst totalHits = github.hits + docs.hits + sentry.hits;\n\t\tconst totalMisses = github.misses + docs.misses + sentry.misses;\n\t\tconst totalSize = github.size + docs.size + sentry.size;\n\t\tconst total = totalHits + totalMisses;\n\n\t\treturn {\n\t\t\tgithub,\n\t\t\tdocs,\n\t\t\tsentry,\n\t\t\toverall: {\n\t\t\t\ttotalHits,\n\t\t\t\ttotalMisses,\n\t\t\t\ttotalSize,\n\t\t\t\thitRate: total > 0 ? totalHits / total : 0,\n\t\t\t},\n\t\t};\n\t}\n\n\t// =========================================================================\n\t// Private Helpers\n\t// =========================================================================\n\n\t/**\n\t * Normalize file path for cache key consistency\n\t */\n\tprivate normalizePath(filePath: string): string {\n\t\treturn filePath.replace(/^\\/+|\\/+$/g, \"\");\n\t}\n\n\t/**\n\t * Create cache key for docs (includes content hash for invalidation)\n\t */\n\tprivate makeDocsKey(filePath: string, contentHash: string): string {\n\t\treturn `${this.normalizePath(filePath)}:${contentHash}`;\n\t}\n}\n\n/**\n * Create an intelligence cache instance\n */\nexport function createIntelligenceCache(config?: CacheConfig): IntelligenceCache {\n\treturn new IntelligenceCache(config);\n}\n","/**\n * Composer Core Types\n *\n * Type definitions for the deterministic context assembly system.\n * These types enable:\n * - Lane-based artifact categorization\n * - Type-safe artifact handling\n * - Privacy-safe references (no paths exposed)\n * - Shrinkable content for budget fitting\n */\n\n/**\n * Lanes categorize artifacts by purpose and priority.\n * Priority 0 = highest (always included first).\n */\nexport type Lane =\n\t| \"policy\" // Priority 0: Constraints, invariants, danger zones\n\t| \"rules\" // Priority 1: Protection rules, config\n\t| \"local\" // Priority 2: Current diff, recent edits\n\t| \"structure\" // Priority 3: Dependency graphs\n\t| \"retrieved\" // Priority 4: Semantic retrieval\n\t| \"history\"; // Priority 5: Session context\n\n/**\n * Lane priority mapping (lower = higher priority)\n */\nexport const LANE_PRIORITIES: Readonly<Record<Lane, number>> = {\n\tpolicy: 0,\n\trules: 1,\n\tlocal: 2,\n\tstructure: 3,\n\tretrieved: 4,\n\thistory: 5,\n} as const;\n\n/**\n * All valid lanes in priority order\n */\nexport const LANES_BY_PRIORITY: readonly Lane[] = [\n\t\"policy\",\n\t\"rules\",\n\t\"local\",\n\t\"structure\",\n\t\"retrieved\",\n\t\"history\",\n] as const;\n\n/**\n * Artifact kinds for fine-grained control.\n */\nexport type ArtifactKind =\n\t| \"constraint\" // Hard rules, invariants\n\t| \"rule_doc\" // Protection rules\n\t| \"local_diff\" // Current changes\n\t| \"recent_edit\" // Recent file edits\n\t| \"symbol_context\" // Symbol definitions\n\t| \"dependency_graph\" // Import/export relationships\n\t| \"test_context\" // Related tests\n\t| \"semantic_match\" // Embedding-based retrieval\n\t| \"session_history\" // Previous conversation context\n\t| \"violation\" // Recent violations\n\t| \"learning\"; // Relevant learnings\n\n/**\n * Kind priority mapping (lower = higher priority)\n */\nexport const KIND_PRIORITIES: Readonly<Record<ArtifactKind, number>> = {\n\tconstraint: 0,\n\trule_doc: 1,\n\tlocal_diff: 2,\n\trecent_edit: 3,\n\tsymbol_context: 4,\n\tdependency_graph: 5,\n\ttest_context: 6,\n\tsemantic_match: 7,\n\tsession_history: 8,\n\tviolation: 9,\n\tlearning: 10,\n} as const;\n\n/**\n * Shrink strategies per artifact kind.\n * Determines how content is reduced when budget is exceeded.\n */\nexport type ShrinkStrategy =\n\t| \"truncate_oldest\" // For diffs: drop oldest hunks first\n\t| \"keep_signatures\" // For code: keep signatures, drop bodies\n\t| \"collapse_summary\" // For graphs: collapse to summary\n\t| \"drop_entries\" // For history: drop oldest entries\n\t| \"never\"; // For rules: never shrink (hard constraint)\n\n/**\n * Reference to an artifact (safe for logs/telemetry).\n * Contains NO paths or content.\n */\nexport interface ArtifactRef {\n\t/** HMAC-based, stable, path-free identifier */\n\tid: string;\n\t/** The type of content this artifact contains */\n\tkind: ArtifactKind;\n\t/** The lane this artifact belongs to */\n\tlane: Lane;\n\t/** Estimated token count (may differ from actual) */\n\ttokenEstimate: number;\n}\n\n/**\n * Candidate artifact before selection.\n * Has content access internally but never exposes it in logs.\n */\nexport interface ArtifactCandidate extends ArtifactRef {\n\t/**\n\t * Recency bucket (0-5, higher = more recent)\n\t * Quantized to prevent time-based non-determinism\n\t */\n\trecencyBucket: number;\n\n\t/**\n\t * Relevance score (0-1, quantized to 0.001)\n\t * How well this artifact matches the current context\n\t */\n\trelevanceScore: number;\n\n\t/**\n\t * Specificity score (0-1, quantized to 0.001)\n\t * How targeted this artifact is to the specific task\n\t */\n\tspecificityScore: number;\n\n\t/**\n\t * Risk alignment (0-1)\n\t * How well this artifact relates to current risk factors\n\t */\n\triskAlignment: number;\n\n\t/**\n\t * Get the content of this artifact (internal use only, never logged)\n\t */\n\tgetContent(): string;\n\n\t/**\n\t * Create a shrunk version of this artifact to fit target tokens\n\t * @param targetTokens Maximum tokens for the result\n\t */\n\tshrink(targetTokens: number): RenderedArtifact;\n}\n\n/**\n * Rendered artifact with exact token count.\n * Content is internal only, never logged externally.\n */\nexport interface RenderedArtifact {\n\t/** HMAC-based, stable, path-free identifier */\n\tid: string;\n\t/** The type of content this artifact contains */\n\tkind: ArtifactKind;\n\t/** The lane this artifact belongs to */\n\tlane: Lane;\n\n\t/**\n\t * Final rendered content (internal only, never logged)\n\t */\n\tcontent: string;\n\n\t/**\n\t * Exact token count after rendering/shrinking\n\t */\n\texactTokenCount: number;\n\n\t/**\n\t * Whether this artifact was shrunk to fit budget\n\t */\n\tshrunk: boolean;\n\n\t/**\n\t * Original token count before shrinking (if shrunk)\n\t */\n\toriginalTokenCount?: number;\n\n\t/**\n\t * Strategy used for shrinking (if shrunk)\n\t */\n\tshrinkStrategy?: ShrinkStrategy;\n}\n\n/**\n * Token counting function type\n * Allows plugging in different tokenizers\n */\nexport type TokenCounter = (text: string) => number;\n\n/**\n * Default token counter using approximate word-based estimation\n * ~4 characters per token on average for English text\n */\nexport function defaultTokenCounter(text: string): number {\n\tif (!text) {\n\t\treturn 0;\n\t}\n\t// Approximation: ~4 characters per token\n\t// This is a reasonable estimate for GPT-style tokenizers\n\treturn Math.ceil(text.length / 4);\n}\n\n/**\n * Artifact source interface for generating candidates\n * Implemented by ContextEngine, PolicyEngine, etc.\n */\nexport interface ArtifactSource {\n\t/**\n\t * Generate artifact candidates for the given trigger\n\t * @param trigger What triggered this composition\n\t * @param workspaceSecret Secret for HMAC-based ID generation\n\t */\n\tgenerateCandidates(trigger: ComposeTriggerInput, workspaceSecret: string): Promise<ArtifactCandidate[]>;\n}\n\n/**\n * Input for triggering composition\n */\nexport interface ComposeTriggerInput {\n\t/** What triggered this composition */\n\tevent: string;\n\t/** Workspace fingerprint for cache keying */\n\tworkspaceFingerprint: string;\n\t/** Git commit or equivalent */\n\tcommitish?: string;\n\t/** Keywords for relevance scoring */\n\tkeywords?: string[];\n\t/** Files currently being edited */\n\tfiles?: string[];\n}\n\n/**\n * Validate that a value is a valid Lane\n */\nexport function isValidLane(value: string): value is Lane {\n\treturn value in LANE_PRIORITIES;\n}\n\n/**\n * Validate that a value is a valid ArtifactKind\n */\nexport function isValidArtifactKind(value: string): value is ArtifactKind {\n\treturn value in KIND_PRIORITIES;\n}\n\n/**\n * Compare two artifact refs by lane and kind priority\n * Returns negative if a comes before b, positive if after, 0 if equal\n */\nexport function compareArtifactPriority(a: ArtifactRef, b: ArtifactRef): number {\n\t// First compare by lane priority\n\tconst laneDiff = LANE_PRIORITIES[a.lane] - LANE_PRIORITIES[b.lane];\n\tif (laneDiff !== 0) {\n\t\treturn laneDiff;\n\t}\n\n\t// Then compare by kind priority\n\tconst kindDiff = KIND_PRIORITIES[a.kind] - KIND_PRIORITIES[b.kind];\n\tif (kindDiff !== 0) {\n\t\treturn kindDiff;\n\t}\n\n\t// Finally compare by ID for stability\n\treturn a.id.localeCompare(b.id);\n}\n","/**\n * Budget Configuration and Management\n *\n * Defines token budgets for each lane and enforces constraints:\n * - Minimum allocations per lane (guaranteed if content available)\n * - Maximum caps per lane (never exceeded)\n * - Total budget constraint (absolute limit)\n *\n * Invariant: sum(lane.min) <= totalTokens\n */\n\nimport type { Lane } from \"./types.js\";\nimport { LANES_BY_PRIORITY } from \"./types.js\";\n\n/**\n * Lane-specific budget configuration\n */\nexport interface LaneBudget {\n\t/** Minimum tokens to allocate (if available) */\n\tmin: number;\n\t/** Maximum tokens allowed */\n\tmax: number;\n\t/** Lower = higher priority (0 = highest) */\n\tpriority: number;\n}\n\n/**\n * Complete budget configuration\n */\nexport interface BudgetConfig {\n\t/** Total token budget (absolute limit) */\n\ttotalTokens: number;\n\t/** Per-lane budget configuration */\n\tlanes: Record<Lane, LaneBudget>;\n}\n\n/**\n * Default budget configuration.\n * Optimized for 8000 token context window.\n *\n * Invariant: sum(lane.min) = 1700 <= 8000 = totalTokens ✓\n *\n * Lane breakdown:\n * - policy: 200-500 (Priority 0) - Constraints, invariants\n * - rules: 500-2000 (Priority 1) - Protection rules\n * - local: 1000-3000 (Priority 2) - Current diff, recent edits\n * - structure: 0-1500 (Priority 3) - Dependency graphs\n * - retrieved: 0-2000 (Priority 4) - Semantic retrieval\n * - history: 0-1000 (Priority 5) - Session context\n */\nexport const DEFAULT_BUDGET_CONFIG: BudgetConfig = {\n\ttotalTokens: 8000,\n\tlanes: {\n\t\tpolicy: { min: 200, max: 500, priority: 0 },\n\t\trules: { min: 500, max: 2000, priority: 1 },\n\t\tlocal: { min: 1000, max: 3000, priority: 2 },\n\t\tstructure: { min: 0, max: 1500, priority: 3 },\n\t\tretrieved: { min: 0, max: 2000, priority: 4 },\n\t\thistory: { min: 0, max: 1000, priority: 5 },\n\t},\n} as const;\n\n/**\n * Validate budget configuration.\n * Throws Error if invalid.\n *\n * Checks:\n * 1. Sum of lane mins doesn't exceed total\n * 2. Each lane's min <= max\n * 3. No negative values\n * 4. All lanes are defined\n *\n * @param config - Budget configuration to validate\n * @throws Error if configuration is invalid\n *\n * @example\n * // Valid config\n * validateBudgetConfig(DEFAULT_BUDGET_CONFIG); // OK\n *\n * // Invalid: mins exceed total\n * validateBudgetConfig({\n * totalTokens: 1000,\n * lanes: { policy: { min: 500, max: 600, priority: 0 }, ... }\n * }); // Throws\n */\nexport function validateBudgetConfig(config: BudgetConfig): void {\n\tif (!config) {\n\t\tthrow new Error(\"Budget config is required\");\n\t}\n\n\tif (!Number.isFinite(config.totalTokens) || config.totalTokens <= 0) {\n\t\tthrow new Error(`Invalid totalTokens: ${config.totalTokens}. Must be positive.`);\n\t}\n\n\t// Check all required lanes are defined\n\tfor (const lane of LANES_BY_PRIORITY) {\n\t\tif (!config.lanes[lane]) {\n\t\t\tthrow new Error(`Missing lane configuration: ${lane}`);\n\t\t}\n\t}\n\n\t// Calculate sum of minimums\n\tconst sumMins = Object.values(config.lanes).reduce((sum, lane) => sum + lane.min, 0);\n\n\tif (sumMins > config.totalTokens) {\n\t\tthrow new Error(\n\t\t\t`Invalid budget: sum of lane mins (${sumMins}) exceeds total (${config.totalTokens}). ` +\n\t\t\t\t\"Reduce mins or increase totalTokens.\",\n\t\t);\n\t}\n\n\t// Validate each lane\n\tfor (const [name, lane] of Object.entries(config.lanes)) {\n\t\tif (lane.min > lane.max) {\n\t\t\tthrow new Error(`Lane ${name}: min (${lane.min}) > max (${lane.max})`);\n\t\t}\n\t\tif (lane.min < 0) {\n\t\t\tthrow new Error(`Lane ${name}: negative min (${lane.min})`);\n\t\t}\n\t\tif (lane.max < 0) {\n\t\t\tthrow new Error(`Lane ${name}: negative max (${lane.max})`);\n\t\t}\n\t\tif (!Number.isFinite(lane.priority)) {\n\t\t\tthrow new Error(`Lane ${name}: invalid priority (${lane.priority})`);\n\t\t}\n\t}\n}\n\n/**\n * Get lanes sorted by priority (lowest first = highest priority)\n *\n * @param config - Budget configuration\n * @returns Lanes sorted by priority\n */\nexport function getLanesByPriority(config: BudgetConfig): Lane[] {\n\treturn (Object.entries(config.lanes) as [Lane, LaneBudget][])\n\t\t.sort((a, b) => a[1].priority - b[1].priority)\n\t\t.map(([lane]) => lane);\n}\n\n/**\n * Calculate available budget after minimums are satisfied\n *\n * @param config - Budget configuration\n * @returns Remaining budget for discretionary allocation\n */\nexport function getDiscretionaryBudget(config: BudgetConfig): number {\n\tconst sumMins = Object.values(config.lanes).reduce((sum, lane) => sum + lane.min, 0);\n\treturn config.totalTokens - sumMins;\n}\n\n/**\n * Create a modified budget config with adjusted total\n *\n * @param config - Base budget configuration\n * @param newTotal - New total token budget\n * @returns Modified configuration with scaled lanes\n */\nexport function withTotalBudget(config: BudgetConfig, newTotal: number): BudgetConfig {\n\tif (newTotal <= 0) {\n\t\tthrow new Error(`Invalid total budget: ${newTotal}`);\n\t}\n\n\tconst ratio = newTotal / config.totalTokens;\n\n\tconst newLanes = {} as Record<Lane, LaneBudget>;\n\tfor (const [lane, budget] of Object.entries(config.lanes) as [Lane, LaneBudget][]) {\n\t\tnewLanes[lane] = {\n\t\t\tmin: Math.floor(budget.min * ratio),\n\t\t\tmax: Math.floor(budget.max * ratio),\n\t\t\tpriority: budget.priority,\n\t\t};\n\t}\n\n\tconst result = {\n\t\ttotalTokens: newTotal,\n\t\tlanes: newLanes,\n\t};\n\n\t// Validate the result\n\tvalidateBudgetConfig(result);\n\n\treturn result;\n}\n\n/**\n * Create a budget config with lane overrides\n *\n * @param config - Base budget configuration\n * @param overrides - Lane-specific overrides\n * @returns Modified configuration\n */\nexport function withLaneOverrides(\n\tconfig: BudgetConfig,\n\toverrides: Partial<Record<Lane, Partial<LaneBudget>>>,\n): BudgetConfig {\n\tconst newLanes = {} as Record<Lane, LaneBudget>;\n\n\tfor (const [lane, budget] of Object.entries(config.lanes) as [Lane, LaneBudget][]) {\n\t\tconst override = overrides[lane];\n\t\tnewLanes[lane] = {\n\t\t\tmin: override?.min ?? budget.min,\n\t\t\tmax: override?.max ?? budget.max,\n\t\t\tpriority: override?.priority ?? budget.priority,\n\t\t};\n\t}\n\n\tconst result = {\n\t\ttotalTokens: config.totalTokens,\n\t\tlanes: newLanes,\n\t};\n\n\t// Validate the result\n\tvalidateBudgetConfig(result);\n\n\treturn result;\n}\n\n/**\n * Budget usage tracking\n */\nexport interface BudgetUsage {\n\t/** Tokens used per lane */\n\tbyLane: Record<Lane, number>;\n\t/** Total tokens used */\n\ttotal: number;\n\t/** Remaining budget */\n\tremaining: number;\n\t/** Per-lane remaining */\n\tremainingByLane: Record<Lane, number>;\n}\n\n/**\n * Create a new budget usage tracker\n *\n * @param config - Budget configuration\n * @returns Initial usage state\n */\nexport function createBudgetUsage(config: BudgetConfig): BudgetUsage {\n\tconst byLane = {} as Record<Lane, number>;\n\tconst remainingByLane = {} as Record<Lane, number>;\n\n\tfor (const [lane, budget] of Object.entries(config.lanes) as [Lane, LaneBudget][]) {\n\t\tbyLane[lane] = 0;\n\t\tremainingByLane[lane] = budget.max;\n\t}\n\n\treturn {\n\t\tbyLane,\n\t\ttotal: 0,\n\t\tremaining: config.totalTokens,\n\t\tremainingByLane,\n\t};\n}\n\n/**\n * Check if tokens can be allocated to a lane\n *\n * @param usage - Current usage state\n * @param config - Budget configuration\n * @param lane - Target lane\n * @param tokens - Tokens to allocate\n * @returns true if allocation is possible\n */\nexport function canAllocate(usage: BudgetUsage, config: BudgetConfig, lane: Lane, tokens: number): boolean {\n\tconst laneConfig = config.lanes[lane];\n\n\t// Check lane max\n\tif (usage.byLane[lane] + tokens > laneConfig.max) {\n\t\treturn false;\n\t}\n\n\t// Check total budget\n\tif (usage.total + tokens > config.totalTokens) {\n\t\treturn false;\n\t}\n\n\treturn true;\n}\n\n/**\n * Allocate tokens to a lane\n *\n * @param usage - Current usage state (mutated)\n * @param config - Budget configuration\n * @param lane - Target lane\n * @param tokens - Tokens to allocate\n * @returns Updated usage state\n */\nexport function allocate(usage: BudgetUsage, config: BudgetConfig, lane: Lane, tokens: number): BudgetUsage {\n\tif (!canAllocate(usage, config, lane, tokens)) {\n\t\tthrow new Error(\n\t\t\t`Cannot allocate ${tokens} tokens to ${lane}: ` +\n\t\t\t\t`lane=${usage.byLane[lane]}/${config.lanes[lane].max}, ` +\n\t\t\t\t`total=${usage.total}/${config.totalTokens}`,\n\t\t);\n\t}\n\n\tusage.byLane[lane] += tokens;\n\tusage.total += tokens;\n\tusage.remaining -= tokens;\n\tusage.remainingByLane[lane] -= tokens;\n\n\treturn usage;\n}\n","/**\n * Budget Allocation Module\n *\n * Allocates token budgets to lanes based on:\n * - Lane minimum requirements\n * - Available candidates per lane\n * - Priority ordering\n *\n * Key feature: If a lane can't fill its minimum, the unused budget\n * is reallocated to the global pool for other lanes.\n */\n\nimport type { BudgetConfig } from \"./budget.js\";\nimport { getLanesByPriority } from \"./budget.js\";\nimport type { ArtifactCandidate, Lane } from \"./types.js\";\n\n/**\n * Result of budget allocation\n */\nexport interface AllocationResult {\n\t/** Tokens allocated to each lane */\n\tallocation: Record<Lane, number>;\n\t/** Remaining tokens available for global selection */\n\tpool: number;\n\t/** Lanes that couldn't meet their minimum */\n\tshortfalls: Array<{\n\t\tlane: Lane;\n\t\trequested: number;\n\t\tavailable: number;\n\t}>;\n}\n\n/**\n * Group candidates by their lane\n *\n * @param candidates - Array of candidates\n * @returns Map of lane to candidates\n */\nexport function groupByLane(candidates: ArtifactCandidate[]): Map<Lane, ArtifactCandidate[]> {\n\tconst byLane = new Map<Lane, ArtifactCandidate[]>();\n\n\tfor (const candidate of candidates) {\n\t\tconst list = byLane.get(candidate.lane) ?? [];\n\t\tlist.push(candidate);\n\t\tbyLane.set(candidate.lane, list);\n\t}\n\n\treturn byLane;\n}\n\n/**\n * Calculate total token estimate for candidates\n *\n * @param candidates - Array of candidates\n * @returns Total estimated tokens\n */\nexport function sumTokenEstimates(candidates: ArtifactCandidate[]): number {\n\treturn candidates.reduce((sum, c) => sum + c.tokenEstimate, 0);\n}\n\n/**\n * Allocate minimum budgets per lane.\n *\n * Algorithm:\n * 1. Group candidates by lane\n * 2. For each lane (by priority order):\n * - Calculate available tokens from candidates\n * - Allocate min(laneMin, available, remainingPool)\n * - Track shortfalls if can't meet min\n * 3. Return allocation and remaining pool\n *\n * The pool contains tokens that can be used by any lane after\n * minimums are satisfied.\n *\n * @param candidates - All artifact candidates\n * @param config - Budget configuration\n * @returns Allocation result with per-lane budgets and remaining pool\n *\n * @example\n * const { allocation, pool, shortfalls } = allocateMinBudgets(candidates, config);\n * // allocation: { policy: 200, rules: 500, local: 1000, ... }\n * // pool: 6300 (remaining for discretionary use)\n * // shortfalls: [] (all mins met)\n */\nexport function allocateMinBudgets(candidates: ArtifactCandidate[], config: BudgetConfig): AllocationResult {\n\tconst allocation = {} as Record<Lane, number>;\n\tconst shortfalls: AllocationResult[\"shortfalls\"] = [];\n\tlet pool = config.totalTokens;\n\n\t// Group candidates by lane\n\tconst byLane = groupByLane(candidates);\n\n\t// Get lanes in priority order\n\tconst lanes = getLanesByPriority(config);\n\n\t// Allocate minimums by priority\n\tfor (const lane of lanes) {\n\t\tconst laneCandidates = byLane.get(lane) ?? [];\n\t\tconst available = sumTokenEstimates(laneCandidates);\n\t\tconst laneMin = config.lanes[lane].min;\n\n\t\t// Can only allocate: min of (lane minimum, available content, remaining pool)\n\t\tconst allocated = Math.min(laneMin, available, pool);\n\t\tallocation[lane] = allocated;\n\t\tpool -= allocated;\n\n\t\t// Track shortfall for debugging/explainability\n\t\tif (allocated < laneMin) {\n\t\t\tshortfalls.push({\n\t\t\t\tlane,\n\t\t\t\trequested: laneMin,\n\t\t\t\tavailable,\n\t\t\t});\n\t\t}\n\t}\n\n\treturn { allocation, pool, shortfalls };\n}\n\n/**\n * Calculate how much more budget a lane can use\n *\n * @param lane - Lane to check\n * @param currentUsage - Current usage per lane\n * @param config - Budget configuration\n * @param remainingPool - Remaining global pool\n * @returns Maximum additional tokens that can be allocated\n */\nexport function getLaneHeadroom(\n\tlane: Lane,\n\tcurrentUsage: Record<Lane, number>,\n\tconfig: BudgetConfig,\n\tremainingPool: number,\n): number {\n\tconst laneMax = config.lanes[lane].max;\n\tconst laneUsed = currentUsage[lane];\n\tconst laneRemaining = laneMax - laneUsed;\n\n\t// Can use up to: min(lane remaining, global pool remaining)\n\treturn Math.min(laneRemaining, remainingPool);\n}\n\n/**\n * Check if an artifact can be allocated given current state\n *\n * @param candidate - Candidate to check\n * @param currentUsage - Current usage per lane\n * @param totalUsed - Total tokens used\n * @param config - Budget configuration\n * @returns true if allocation is possible\n */\nexport function canAllocateArtifact(\n\tcandidate: ArtifactCandidate,\n\tcurrentUsage: Record<Lane, number>,\n\ttotalUsed: number,\n\tconfig: BudgetConfig,\n): boolean {\n\tconst lane = candidate.lane;\n\tconst tokens = candidate.tokenEstimate;\n\tconst laneMax = config.lanes[lane].max;\n\n\t// Check lane max\n\tif (currentUsage[lane] + tokens > laneMax) {\n\t\treturn false;\n\t}\n\n\t// Check total budget\n\tif (totalUsed + tokens > config.totalTokens) {\n\t\treturn false;\n\t}\n\n\treturn true;\n}\n\n/**\n * Result of trying to select artifacts within budget\n */\nexport interface SelectionBudgetResult {\n\t/** Artifacts that fit within budget */\n\tselected: ArtifactCandidate[];\n\t/** Artifacts that didn't fit */\n\trejected: Array<{\n\t\tcandidate: ArtifactCandidate;\n\t\treason: \"lane_max_reached\" | \"budget_exceeded\";\n\t}>;\n\t/** Final usage per lane */\n\tusage: Record<Lane, number>;\n\t/** Total tokens used */\n\ttotalUsed: number;\n}\n\n/**\n * Select artifacts from a scored list within budget constraints\n *\n * @param scored - Candidates sorted by score (highest first)\n * @param alreadySelected - Candidates already selected (pinned, must-include)\n * @param config - Budget configuration\n * @returns Selection result with selected, rejected, and usage\n */\nexport function selectWithinBudget(\n\tscored: ArtifactCandidate[],\n\talreadySelected: ArtifactCandidate[],\n\tconfig: BudgetConfig,\n): SelectionBudgetResult {\n\tconst selected: ArtifactCandidate[] = [];\n\tconst rejected: SelectionBudgetResult[\"rejected\"] = [];\n\n\t// Initialize usage from already-selected artifacts\n\tconst usage = {} as Record<Lane, number>;\n\tfor (const lane of Object.keys(config.lanes) as Lane[]) {\n\t\tusage[lane] = 0;\n\t}\n\n\tlet totalUsed = 0;\n\n\t// Account for already-selected artifacts\n\tfor (const s of alreadySelected) {\n\t\tusage[s.lane] += s.tokenEstimate;\n\t\ttotalUsed += s.tokenEstimate;\n\t}\n\n\t// Select from scored list\n\tfor (const candidate of scored) {\n\t\tconst lane = candidate.lane;\n\t\tconst tokens = candidate.tokenEstimate;\n\t\tconst laneMax = config.lanes[lane].max;\n\n\t\t// Check lane max\n\t\tif (usage[lane] + tokens > laneMax) {\n\t\t\trejected.push({\n\t\t\t\tcandidate,\n\t\t\t\treason: \"lane_max_reached\",\n\t\t\t});\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Check total budget\n\t\tif (totalUsed + tokens > config.totalTokens) {\n\t\t\trejected.push({\n\t\t\t\tcandidate,\n\t\t\t\treason: \"budget_exceeded\",\n\t\t\t});\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Select!\n\t\tselected.push(candidate);\n\t\tusage[lane] += tokens;\n\t\ttotalUsed += tokens;\n\t}\n\n\treturn {\n\t\tselected,\n\t\trejected,\n\t\tusage,\n\t\ttotalUsed,\n\t};\n}\n\n/**\n * Calculate budget utilization metrics\n *\n * @param usage - Current usage per lane\n * @param config - Budget configuration\n * @returns Utilization metrics\n */\nexport function calculateUtilization(\n\tusage: Record<Lane, number>,\n\tconfig: BudgetConfig,\n): {\n\ttotal: number;\n\ttotalPercent: number;\n\tbyLane: Record<Lane, { used: number; max: number; percent: number }>;\n} {\n\tconst totalUsed = Object.values(usage).reduce((a, b) => a + b, 0);\n\tconst totalPercent = Math.round((totalUsed / config.totalTokens) * 100);\n\n\tconst byLane = {} as Record<Lane, { used: number; max: number; percent: number }>;\n\tfor (const [lane, used] of Object.entries(usage) as [Lane, number][]) {\n\t\tconst max = config.lanes[lane].max;\n\t\tbyLane[lane] = {\n\t\t\tused,\n\t\t\tmax,\n\t\t\tpercent: Math.round((used / max) * 100),\n\t\t};\n\t}\n\n\treturn {\n\t\ttotal: totalUsed,\n\t\ttotalPercent,\n\t\tbyLane,\n\t};\n}\n","/**\n * Cache Module\n *\n * Implements input-based caching for selection results.\n * Key insight: Cache key is computed from INPUTS, not outputs.\n *\n * Cache invalidation triggers:\n * - File saved\n * - Git commit\n * - Config changed\n * - Rules changed\n * - Constraints changed\n * - Session expired (5 min TTL)\n */\n\nimport { createHash } from \"node:crypto\";\nimport type { ComposerConstraints } from \"./constraints.js\";\nimport type { ArtifactCandidate } from \"./types.js\";\n\n/**\n * Inputs for cache key computation.\n * Key is computed BEFORE selection (not from output).\n */\nexport interface CacheKeyInputs {\n\t/** Hash of workspace structure */\n\tworkspaceFingerprint: string;\n\t/** What triggered composition */\n\ttriggerEvent: string;\n\t/** Git HEAD or equivalent */\n\tcommitish: string;\n\t/** Hash of candidate set */\n\tcandidateDigest: string;\n\t/** Hash of active rules */\n\trulesDigest: string;\n\t/** Hash of budget config */\n\tbudgetConfigDigest: string;\n\t/** Hash of constraints */\n\tconstraintsDigest: string;\n\t/** Composer version (so upgrades invalidate) */\n\tcomposerVersion: string;\n}\n\n/**\n * Current composer version for cache invalidation\n */\nexport const COMPOSER_VERSION = \"1.0.0\";\n\n/**\n * Cache TTL in milliseconds (5 minutes)\n */\nexport const CACHE_TTL_MS = 5 * 60 * 1000;\n\n/**\n * Invalidation triggers for cache\n */\nexport type InvalidationTrigger =\n\t| \"file_saved\"\n\t| \"git_commit\"\n\t| \"config_changed\"\n\t| \"rules_changed\"\n\t| \"constraints_changed\"\n\t| \"session_expired\";\n\n/**\n * Compute cache key from inputs.\n * This key is computed BEFORE doing selection work.\n *\n * @param inputs - Cache key inputs\n * @returns 32-character cache key\n *\n * @example\n * const key = computeCacheKey({\n * workspaceFingerprint: 'abc123',\n * triggerEvent: 'file_saved',\n * commitish: 'HEAD',\n * candidateDigest: 'def456',\n * rulesDigest: 'ghi789',\n * budgetConfigDigest: 'jkl012',\n * constraintsDigest: 'mno345',\n * composerVersion: '1.0.0',\n * });\n * // Returns something like: \"Xk9mQ2vN8pL3Rm5sYt7uWxAb\"\n */\nexport function computeCacheKey(inputs: CacheKeyInputs): string {\n\t// Sort keys for determinism\n\tconst normalized = JSON.stringify(inputs, Object.keys(inputs).sort());\n\treturn createHash(\"sha256\").update(normalized).digest(\"base64url\").slice(0, 32);\n}\n\n/**\n * Compute candidate digest from candidate set.\n * Includes id, lane, kind, tokenEstimate for each candidate.\n *\n * @param candidates - Array of candidates\n * @returns 16-character digest\n */\nexport function computeCandidateDigest(candidates: ArtifactCandidate[]): string {\n\t// Sort by ID for determinism\n\tconst sorted = [...candidates].sort((a, b) => a.id.localeCompare(b.id));\n\n\t// Build deterministic representation\n\tconst data = sorted.map((c) => `${c.id}:${c.lane}:${c.kind}:${c.tokenEstimate}`);\n\n\treturn createHash(\"sha256\").update(data.join(\"|\")).digest(\"base64url\").slice(0, 16);\n}\n\n/**\n * Compute constraints digest\n *\n * @param constraints - Composer constraints\n * @returns 16-character digest\n */\nexport function computeConstraintsDigest(constraints: ComposerConstraints): string {\n\t// Create deterministic representation\n\tconst data = {\n\t\tmustInclude: constraints.mustInclude.map((c) => JSON.stringify(c.match)).sort(),\n\t\tmustExclude: constraints.mustExclude.map((c) => JSON.stringify(c.match)).sort(),\n\t\tpinned: constraints.pinned.map((c) => JSON.stringify(c.match)).sort(),\n\t\tlaneRequirements: constraints.laneRequirements.map((r) => `${r.lane}:${r.minTokens}`).sort(),\n\t};\n\n\treturn createHash(\"sha256\").update(JSON.stringify(data)).digest(\"base64url\").slice(0, 16);\n}\n\n/**\n * Compute budget config digest\n *\n * @param config - Budget configuration object\n * @returns 16-character digest\n */\nexport function computeBudgetConfigDigest(config: Record<string, unknown>): string {\n\tconst normalized = JSON.stringify(config, Object.keys(config).sort());\n\treturn createHash(\"sha256\").update(normalized).digest(\"base64url\").slice(0, 16);\n}\n\n/**\n * Cache entry with value and metadata\n */\nexport interface CacheEntry<T> {\n\t/** Cached value */\n\tvalue: T;\n\t/** Cache key */\n\tkey: string;\n\t/** When the entry was created */\n\tcreatedAt: number;\n\t/** When the entry expires */\n\texpiresAt: number;\n\t/** Trigger that would invalidate this entry */\n\tinvalidatedBy?: InvalidationTrigger;\n}\n\n/**\n * Simple in-memory cache for selection results\n */\nexport class SelectionCache<T> {\n\tprivate cache = new Map<string, CacheEntry<T>>();\n\tprivate ttlMs: number;\n\n\tconstructor(ttlMs: number = CACHE_TTL_MS) {\n\t\tthis.ttlMs = ttlMs;\n\t}\n\n\t/**\n\t * Get a cached value\n\t *\n\t * @param key - Cache key\n\t * @returns Cached value or undefined if not found/expired\n\t */\n\tget(key: string): T | undefined {\n\t\tconst entry = this.cache.get(key);\n\t\tif (!entry) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\t// Check expiration\n\t\tif (Date.now() > entry.expiresAt) {\n\t\t\tthis.cache.delete(key);\n\t\t\treturn undefined;\n\t\t}\n\n\t\treturn entry.value;\n\t}\n\n\t/**\n\t * Set a cached value\n\t *\n\t * @param key - Cache key\n\t * @param value - Value to cache\n\t */\n\tset(key: string, value: T): void {\n\t\tconst now = Date.now();\n\t\tthis.cache.set(key, {\n\t\t\tvalue,\n\t\t\tkey,\n\t\t\tcreatedAt: now,\n\t\t\texpiresAt: now + this.ttlMs,\n\t\t});\n\t}\n\n\t/**\n\t * Invalidate entries matching a trigger\n\t *\n\t * @param trigger - Invalidation trigger\n\t */\n\tinvalidate(_trigger: InvalidationTrigger): void {\n\t\t// For simplicity, clear all on any trigger\n\t\t// A more sophisticated implementation would track triggers per entry\n\t\tthis.cache.clear();\n\t}\n\n\t/**\n\t * Clear all cached entries\n\t */\n\tclear(): void {\n\t\tthis.cache.clear();\n\t}\n\n\t/**\n\t * Get cache statistics\n\t */\n\tgetStats(): { size: number; hitRate: number } {\n\t\treturn {\n\t\t\tsize: this.cache.size,\n\t\t\thitRate: 0, // Would need tracking for real hit rate\n\t\t};\n\t}\n\n\t/**\n\t * Check if key exists and is valid\n\t */\n\thas(key: string): boolean {\n\t\tconst entry = this.cache.get(key);\n\t\tif (!entry) {\n\t\t\treturn false;\n\t\t}\n\t\tif (Date.now() > entry.expiresAt) {\n\t\t\tthis.cache.delete(key);\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t}\n\n\t/**\n\t * Prune expired entries\n\t */\n\tprune(): number {\n\t\tconst now = Date.now();\n\t\tlet pruned = 0;\n\n\t\tfor (const [key, entry] of this.cache.entries()) {\n\t\t\tif (now > entry.expiresAt) {\n\t\t\t\tthis.cache.delete(key);\n\t\t\t\tpruned++;\n\t\t\t}\n\t\t}\n\n\t\treturn pruned;\n\t}\n}\n\n/**\n * Build complete cache key inputs from context\n *\n * @param candidates - Artifact candidates\n * @param constraints - Composer constraints\n * @param budgetConfig - Budget configuration\n * @param context - Additional context\n * @returns Complete cache key inputs\n */\nexport function buildCacheKeyInputs(\n\tcandidates: ArtifactCandidate[],\n\tconstraints: ComposerConstraints,\n\tbudgetConfig: Record<string, unknown>,\n\tcontext: {\n\t\tworkspaceFingerprint: string;\n\t\ttriggerEvent: string;\n\t\tcommitish: string;\n\t\trulesDigest: string;\n\t},\n): CacheKeyInputs {\n\treturn {\n\t\tworkspaceFingerprint: context.workspaceFingerprint,\n\t\ttriggerEvent: context.triggerEvent,\n\t\tcommitish: context.commitish,\n\t\tcandidateDigest: computeCandidateDigest(candidates),\n\t\trulesDigest: context.rulesDigest,\n\t\tbudgetConfigDigest: computeBudgetConfigDigest(budgetConfig),\n\t\tconstraintsDigest: computeConstraintsDigest(constraints),\n\t\tcomposerVersion: COMPOSER_VERSION,\n\t};\n}\n","/**\n * Constraints Interface (Policy → Composer)\n *\n * Defines the interface between PolicyEngine and Composer.\n * PolicyEngine outputs constraints; Composer executes them.\n *\n * Constraint types:\n * - mustInclude: Artifacts that MUST be selected (policy-mandated)\n * - mustExclude: Artifacts that MUST NOT be selected (policy-blocked)\n * - pinned: Artifacts selected first (e.g., current diff)\n * - laneRequirements: Minimum tokens per lane\n */\n\nimport type { ArtifactCandidate, ArtifactKind, Lane } from \"./types.js\";\n\n/**\n * Matcher for identifying artifacts.\n * Used to specify which artifacts a constraint applies to.\n */\nexport type ArtifactMatcher =\n\t| { type: \"id\"; id: string }\n\t| { type: \"kind\"; kind: ArtifactKind }\n\t| { type: \"lane\"; lane: Lane }\n\t| { type: \"pattern\"; pattern: string }; // Glob pattern on internal path\n\n/**\n * Create an ID matcher\n */\nexport function matchId(id: string): ArtifactMatcher {\n\treturn { type: \"id\", id };\n}\n\n/**\n * Create a kind matcher\n */\nexport function matchKind(kind: ArtifactKind): ArtifactMatcher {\n\treturn { type: \"kind\", kind };\n}\n\n/**\n * Create a lane matcher\n */\nexport function matchLane(lane: Lane): ArtifactMatcher {\n\treturn { type: \"lane\", lane };\n}\n\n/**\n * Create a pattern matcher\n */\nexport function matchPattern(pattern: string): ArtifactMatcher {\n\treturn { type: \"pattern\", pattern };\n}\n\n/**\n * Constraint with reason for explainability.\n * Every constraint includes a reason for transparency.\n */\nexport interface Constraint {\n\t/** How to identify matching artifacts */\n\tmatch: ArtifactMatcher;\n\t/** Human-readable reason for this constraint */\n\treason: string;\n}\n\n/**\n * Lane requirement from policy.\n * Specifies minimum tokens for a lane.\n */\nexport interface LaneRequirement {\n\t/** Target lane */\n\tlane: Lane;\n\t/** Minimum tokens required */\n\tminTokens: number;\n\t/** Reason for this requirement */\n\treason: string;\n}\n\n/**\n * Constraints from Policy Engine to Composer.\n * Hard constraints that must be respected.\n */\nexport interface ComposerConstraints {\n\t/**\n\t * Must include these artifacts (policy-mandated).\n\t * Selected before scoring, use budget from their lane.\n\t */\n\tmustInclude: Constraint[];\n\n\t/**\n\t * Must exclude these artifacts (policy-blocked).\n\t * Removed before scoring, never selected.\n\t */\n\tmustExclude: Constraint[];\n\n\t/**\n\t * Pinned artifacts (always selected first).\n\t * E.g., current diff is always pinned.\n\t */\n\tpinned: Constraint[];\n\n\t/**\n\t * Lane requirements from policy.\n\t * E.g., \"rules lane must have at least 300 tokens\"\n\t */\n\tlaneRequirements: LaneRequirement[];\n}\n\n/**\n * Default empty constraints.\n * Used when no policy constraints apply.\n */\nexport const EMPTY_CONSTRAINTS: ComposerConstraints = {\n\tmustInclude: [],\n\tmustExclude: [],\n\tpinned: [],\n\tlaneRequirements: [],\n} as const;\n\n/**\n * Simple glob pattern matching.\n * Supports * (any characters) and ? (single character).\n *\n * @param pattern - Glob pattern\n * @param text - Text to match\n * @returns true if text matches pattern\n */\nfunction matchGlob(pattern: string, text: string): boolean {\n\t// Convert glob to regex\n\tconst regexPattern = pattern\n\t\t.replace(/[.+^${}()|[\\]\\\\]/g, \"\\\\$&\") // Escape special regex chars\n\t\t.replace(/\\*/g, \".*\") // * → .*\n\t\t.replace(/\\?/g, \".\"); // ? → .\n\n\tconst regex = new RegExp(`^${regexPattern}$`, \"i\");\n\treturn regex.test(text);\n}\n\n/**\n * Check if an artifact matches a constraint matcher.\n *\n * @param artifact - Artifact to check\n * @param matcher - Matcher to apply\n * @param getPath - Optional function to get artifact path (for pattern matching)\n * @returns true if artifact matches\n *\n * @example\n * // Match by ID\n * matches(artifact, { type: 'id', id: 'abc123' });\n *\n * // Match by kind\n * matches(artifact, { type: 'kind', kind: 'local_diff' });\n *\n * // Match by lane\n * matches(artifact, { type: 'lane', lane: 'policy' });\n */\nexport function matches(\n\tartifact: ArtifactCandidate,\n\tmatcher: ArtifactMatcher,\n\tgetPath?: (artifact: ArtifactCandidate) => string | undefined,\n): boolean {\n\tswitch (matcher.type) {\n\t\tcase \"id\":\n\t\t\treturn artifact.id === matcher.id;\n\n\t\tcase \"kind\":\n\t\t\treturn artifact.kind === matcher.kind;\n\n\t\tcase \"lane\":\n\t\t\treturn artifact.lane === matcher.lane;\n\n\t\tcase \"pattern\": {\n\t\t\t// Pattern matching requires path access\n\t\t\t// This is only used during selection, path is never logged\n\t\t\tif (!getPath) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tconst path = getPath(artifact);\n\t\t\tif (!path) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\treturn matchGlob(matcher.pattern, path);\n\t\t}\n\t}\n}\n\n/**\n * Check if an artifact matches any of the constraints.\n *\n * @param artifact - Artifact to check\n * @param constraints - Array of constraints to check\n * @param getPath - Optional function to get artifact path\n * @returns The first matching constraint, or undefined if none match\n */\nexport function findMatchingConstraint(\n\tartifact: ArtifactCandidate,\n\tconstraints: Constraint[],\n\tgetPath?: (artifact: ArtifactCandidate) => string | undefined,\n): Constraint | undefined {\n\treturn constraints.find((c) => matches(artifact, c.match, getPath));\n}\n\n/**\n * Check if an artifact is excluded by any constraint.\n *\n * @param artifact - Artifact to check\n * @param constraints - Composer constraints\n * @param getPath - Optional function to get artifact path\n * @returns Constraint that excludes the artifact, or undefined\n */\nexport function isExcluded(\n\tartifact: ArtifactCandidate,\n\tconstraints: ComposerConstraints,\n\tgetPath?: (artifact: ArtifactCandidate) => string | undefined,\n): Constraint | undefined {\n\treturn findMatchingConstraint(artifact, constraints.mustExclude, getPath);\n}\n\n/**\n * Check if an artifact is pinned.\n *\n * @param artifact - Artifact to check\n * @param constraints - Composer constraints\n * @param getPath - Optional function to get artifact path\n * @returns Constraint that pins the artifact, or undefined\n */\nexport function isPinned(\n\tartifact: ArtifactCandidate,\n\tconstraints: ComposerConstraints,\n\tgetPath?: (artifact: ArtifactCandidate) => string | undefined,\n): Constraint | undefined {\n\treturn findMatchingConstraint(artifact, constraints.pinned, getPath);\n}\n\n/**\n * Check if an artifact must be included.\n *\n * @param artifact - Artifact to check\n * @param constraints - Composer constraints\n * @param getPath - Optional function to get artifact path\n * @returns Constraint that requires the artifact, or undefined\n */\nexport function isMustInclude(\n\tartifact: ArtifactCandidate,\n\tconstraints: ComposerConstraints,\n\tgetPath?: (artifact: ArtifactCandidate) => string | undefined,\n): Constraint | undefined {\n\treturn findMatchingConstraint(artifact, constraints.mustInclude, getPath);\n}\n\n/**\n * Builder for creating ComposerConstraints\n */\nexport class ConstraintsBuilder {\n\tprivate constraints: ComposerConstraints = {\n\t\tmustInclude: [],\n\t\tmustExclude: [],\n\t\tpinned: [],\n\t\tlaneRequirements: [],\n\t};\n\n\t/**\n\t * Add a must-include constraint\n\t */\n\tmustInclude(match: ArtifactMatcher, reason: string): this {\n\t\tthis.constraints.mustInclude.push({ match, reason });\n\t\treturn this;\n\t}\n\n\t/**\n\t * Add a must-exclude constraint\n\t */\n\tmustExclude(match: ArtifactMatcher, reason: string): this {\n\t\tthis.constraints.mustExclude.push({ match, reason });\n\t\treturn this;\n\t}\n\n\t/**\n\t * Add a pinned constraint\n\t */\n\tpin(match: ArtifactMatcher, reason: string): this {\n\t\tthis.constraints.pinned.push({ match, reason });\n\t\treturn this;\n\t}\n\n\t/**\n\t * Add a lane requirement\n\t */\n\trequireLane(lane: Lane, minTokens: number, reason: string): this {\n\t\tthis.constraints.laneRequirements.push({ lane, minTokens, reason });\n\t\treturn this;\n\t}\n\n\t/**\n\t * Build the constraints\n\t */\n\tbuild(): ComposerConstraints {\n\t\treturn { ...this.constraints };\n\t}\n}\n\n/**\n * Create a new constraints builder\n */\nexport function constraints(): ConstraintsBuilder {\n\treturn new ConstraintsBuilder();\n}\n\n/**\n * Merge multiple constraint sets\n *\n * @param constraintSets - Constraint sets to merge\n * @returns Merged constraints\n */\nexport function mergeConstraints(...constraintSets: ComposerConstraints[]): ComposerConstraints {\n\treturn {\n\t\tmustInclude: constraintSets.flatMap((c) => c.mustInclude),\n\t\tmustExclude: constraintSets.flatMap((c) => c.mustExclude),\n\t\tpinned: constraintSets.flatMap((c) => c.pinned),\n\t\tlaneRequirements: constraintSets.flatMap((c) => c.laneRequirements),\n\t};\n}\n","/**\n * Determinism Guardrails\n *\n * Ensures reproducible selection by:\n * - Quantizing floating-point scores to fixed precision\n * - Bucketing time-based values to prevent \"now\" drift\n * - Providing stable tie-breakers for equal scores\n *\n * Core guarantee: Same inputs → Same outputs (verifiable via replay)\n */\n\nimport { type ArtifactCandidate, KIND_PRIORITIES, LANE_PRIORITIES } from \"./types.js\";\n\n/**\n * Quantization precision for relevance scores.\n * Prevents floating-point differences from changing selection order.\n *\n * 0.001 means scores are rounded to 3 decimal places.\n * Example: 0.123456 → 0.123\n */\nexport const RELEVANCE_PRECISION = 1e-3;\n\n/**\n * Recency bucket thresholds in seconds.\n * Each threshold defines the boundary for a recency level.\n *\n * Bucketing prevents \"now\" from causing non-determinism:\n * - Two runs 1 second apart will get the same bucket\n * - Only large time differences change the bucket\n */\nexport const RECENCY_BUCKETS = [\n\t0, // Bucket 5: current (< 1 min)\n\t60, // Bucket 4: recent (1-5 min)\n\t300, // Bucket 3: warm (5-30 min)\n\t1800, // Bucket 2: cold (30min-2hr)\n\t7200, // Bucket 1: stale (2hr-24hr)\n\t86400, // Bucket 0: old (> 24hr)\n] as const;\n\n/**\n * Number of recency buckets (0-5)\n */\nexport const MAX_RECENCY_BUCKET = RECENCY_BUCKETS.length;\n\n/**\n * Quantize a relevance score to fixed precision.\n * This ensures that minor floating-point variations don't affect ordering.\n *\n * @param score - Raw score value (0-1)\n * @returns Quantized score rounded to RELEVANCE_PRECISION\n *\n * @example\n * quantizeRelevance(0.123456789) // → 0.123\n * quantizeRelevance(0.9999) // → 1.000\n */\nexport function quantizeRelevance(score: number): number {\n\tif (!Number.isFinite(score)) {\n\t\treturn 0;\n\t}\n\t// Clamp to valid range\n\tconst clamped = Math.max(0, Math.min(1, score));\n\t// Round to precision\n\treturn Math.round(clamped / RELEVANCE_PRECISION) * RELEVANCE_PRECISION;\n}\n\n/**\n * Bucket recency by age in milliseconds.\n * Returns bucket number (higher = more recent).\n *\n * Bucket mapping:\n * - 5: Current (< 1 min)\n * - 4: Recent (1-5 min)\n * - 3: Warm (5-30 min)\n * - 2: Cold (30min-2hr)\n * - 1: Stale (2hr-24hr)\n * - 0: Old (> 24hr)\n *\n * @param ageMs - Age in milliseconds since the artifact was created/modified\n * @returns Bucket number 0-5 (higher = more recent)\n *\n * @example\n * bucketRecency(30 * 1000) // 30 seconds → bucket 5 (current)\n * bucketRecency(2 * 60 * 1000) // 2 minutes → bucket 4 (recent)\n * bucketRecency(10 * 60 * 1000) // 10 minutes → bucket 3 (warm)\n */\nexport function bucketRecency(ageMs: number): number {\n\tif (!Number.isFinite(ageMs) || ageMs < 0) {\n\t\treturn MAX_RECENCY_BUCKET - 1; // Treat invalid as most recent\n\t}\n\n\tconst ageSec = ageMs / 1000;\n\n\t// Find the bucket threshold that the age exceeds\n\t// Iterate from oldest to newest thresholds\n\tfor (let i = RECENCY_BUCKETS.length - 1; i >= 0; i--) {\n\t\tif (ageSec >= RECENCY_BUCKETS[i]) {\n\t\t\t// Return bucket number (higher = more recent)\n\t\t\t// RECENCY_BUCKETS.length - 1 - i converts threshold index to bucket\n\t\t\treturn RECENCY_BUCKETS.length - 1 - i;\n\t\t}\n\t}\n\n\t// Age is less than smallest threshold (0), so it's the most recent bucket\n\treturn MAX_RECENCY_BUCKET - 1;\n}\n\n/**\n * Get the recency bucket label for display\n *\n * @param bucket - Bucket number 0-5\n * @returns Human-readable label\n */\nexport function getRecencyLabel(bucket: number): string {\n\tconst labels: Record<number, string> = {\n\t\t5: \"current\",\n\t\t4: \"recent\",\n\t\t3: \"warm\",\n\t\t2: \"cold\",\n\t\t1: \"stale\",\n\t\t0: \"old\",\n\t};\n\treturn labels[bucket] ?? \"unknown\";\n}\n\n/**\n * Stable tie-breaker when scores are equal.\n * Ensures deterministic ordering even with identical scores.\n *\n * Order priority:\n * 1. Lane priority (lower = higher priority, e.g., policy > rules > local)\n * 2. Kind priority (lower = higher priority, e.g., constraint > rule_doc)\n * 3. Lexicographic by ID (stable, deterministic)\n *\n * @param a - First candidate to compare\n * @param b - Second candidate to compare\n * @returns Negative if a comes before b, positive if after, 0 if equal\n *\n * @example\n * // Policy lane beats rules lane\n * tieBreaker(\n * { lane: 'policy', kind: 'constraint', id: 'a' },\n * { lane: 'rules', kind: 'rule_doc', id: 'b' }\n * ) // → -1 (policy comes first)\n */\nexport function tieBreaker(a: ArtifactCandidate, b: ArtifactCandidate): number {\n\t// 1. Lane priority (lower = higher priority)\n\tconst lanePriorityA = LANE_PRIORITIES[a.lane];\n\tconst lanePriorityB = LANE_PRIORITIES[b.lane];\n\tif (lanePriorityA !== lanePriorityB) {\n\t\treturn lanePriorityA - lanePriorityB;\n\t}\n\n\t// 2. Kind priority (lower = higher priority)\n\tconst kindPriorityA = KIND_PRIORITIES[a.kind] ?? 99;\n\tconst kindPriorityB = KIND_PRIORITIES[b.kind] ?? 99;\n\tif (kindPriorityA !== kindPriorityB) {\n\t\treturn kindPriorityA - kindPriorityB;\n\t}\n\n\t// 3. Lexicographic by ID (stable)\n\treturn a.id.localeCompare(b.id);\n}\n\n/**\n * Check if two scores are effectively equal after quantization\n *\n * @param a - First score\n * @param b - Second score\n * @returns true if scores are equal after quantization\n */\nexport function scoresEqual(a: number, b: number): boolean {\n\treturn quantizeRelevance(a) === quantizeRelevance(b);\n}\n\n/**\n * Normalize a timestamp to bucket boundaries for deterministic caching\n *\n * @param timestamp - Unix timestamp in milliseconds\n * @param bucketSizeMs - Size of time buckets in milliseconds\n * @returns Normalized timestamp at bucket boundary\n */\nexport function normalizeTimestamp(\n\ttimestamp: number,\n\tbucketSizeMs = 60000, // 1 minute default\n): number {\n\treturn Math.floor(timestamp / bucketSizeMs) * bucketSizeMs;\n}\n\n/**\n * Create a deterministic hash of an array of strings\n * Used for cache key components\n *\n * @param items - Array of strings to hash\n * @returns Deterministic string representation\n */\nexport function deterministicArrayHash(items: string[]): string {\n\t// Sort for determinism, then join with delimiter that won't appear in data\n\treturn [...items].sort().join(\"\\x00\");\n}\n\n/**\n * Quantize a number to a specific number of decimal places\n *\n * @param value - The value to quantize\n * @param decimals - Number of decimal places\n * @returns Quantized value\n */\nexport function quantizeToDecimals(value: number, decimals: number): number {\n\tconst factor = 10 ** decimals;\n\treturn Math.round(value * factor) / factor;\n}\n","/**\n * Scoring Module\n *\n * Computes composite scores for artifact candidates.\n * Scores are quantized for determinism and sorted with stable tie-breakers.\n *\n * Scoring dimensions:\n * - Recency: How recently the artifact was modified (30%)\n * - Relevance: How well it matches the current context (35%)\n * - Specificity: How targeted it is to the task (20%)\n * - Risk alignment: How relevant to current risk factors (15%)\n */\n\nimport { quantizeRelevance, tieBreaker } from \"./determinism.js\";\nimport type { ArtifactCandidate } from \"./types.js\";\n\n/**\n * Scoring weights (must sum to 1.0).\n * These weights balance the importance of each dimension.\n */\nexport const SCORING_WEIGHTS = {\n\t/** How recently the artifact was modified */\n\trecency: 0.3,\n\t/** How well it matches the current context */\n\trelevance: 0.35,\n\t/** How targeted it is to the specific task */\n\tspecificity: 0.2,\n\t/** How well it relates to current risk factors */\n\triskAlignment: 0.15,\n} as const;\n\n/**\n * Maximum recency bucket value (for normalization)\n */\nconst MAX_RECENCY_BUCKET = 5;\n\n/**\n * Compute composite score for an artifact candidate.\n * All inputs are pre-quantized for determinism.\n *\n * Formula:\n * score = 0.30 × (recencyBucket/5) +\n * 0.35 × relevanceScore +\n * 0.20 × specificityScore +\n * 0.15 × riskAlignment\n *\n * @param candidate - Artifact candidate with scoring inputs\n * @returns Composite score (0-1, quantized to 0.001)\n *\n * @example\n * const score = computeScore({\n * recencyBucket: 4, // Recent\n * relevanceScore: 0.8, // High relevance\n * specificityScore: 0.6, // Medium specificity\n * riskAlignment: 0.5, // Medium risk alignment\n * });\n * // score ≈ 0.30×0.8 + 0.35×0.8 + 0.20×0.6 + 0.15×0.5 = 0.715\n */\nexport function computeScore(candidate: ArtifactCandidate): number {\n\t// Normalize recency to 0-1 range\n\tconst normalizedRecency = candidate.recencyBucket / MAX_RECENCY_BUCKET;\n\n\tconst score =\n\t\tSCORING_WEIGHTS.recency * normalizedRecency +\n\t\tSCORING_WEIGHTS.relevance * candidate.relevanceScore +\n\t\tSCORING_WEIGHTS.specificity * candidate.specificityScore +\n\t\tSCORING_WEIGHTS.riskAlignment * candidate.riskAlignment;\n\n\t// Quantize output for determinism\n\treturn quantizeRelevance(score);\n}\n\n/**\n * Scored candidate with computed score attached.\n */\nexport interface ScoredCandidate {\n\t/** Original candidate */\n\tcandidate: ArtifactCandidate;\n\t/** Computed composite score */\n\tscore: number;\n}\n\n/**\n * Score and sort candidates deterministically.\n * Same inputs → Same order (guaranteed).\n *\n * Sorting order:\n * 1. Higher score first\n * 2. If scores equal, use tie-breaker (lane priority → kind priority → ID)\n *\n * @param candidates - Array of candidates to score\n * @returns Scored candidates sorted by score descending\n *\n * @example\n * const sorted = scoreAndSort(candidates);\n * // sorted[0] has highest score\n * // sorted[sorted.length - 1] has lowest score\n */\nexport function scoreAndSort(candidates: ArtifactCandidate[]): ScoredCandidate[] {\n\t// Score all candidates\n\tconst scored = candidates.map((candidate) => ({\n\t\tcandidate,\n\t\tscore: computeScore(candidate),\n\t}));\n\n\t// Sort by score descending, then tie-breaker\n\tscored.sort((a, b) => {\n\t\tif (a.score !== b.score) {\n\t\t\treturn b.score - a.score; // Higher score first\n\t\t}\n\t\treturn tieBreaker(a.candidate, b.candidate);\n\t});\n\n\treturn scored;\n}\n\n/**\n * Get the top N candidates by score\n *\n * @param candidates - Array of candidates\n * @param n - Number of top candidates to return\n * @returns Top N scored candidates\n */\nexport function topN(candidates: ArtifactCandidate[], n: number): ScoredCandidate[] {\n\tconst sorted = scoreAndSort(candidates);\n\treturn sorted.slice(0, n);\n}\n\n/**\n * Get candidates with score above threshold\n *\n * @param candidates - Array of candidates\n * @param threshold - Minimum score (0-1)\n * @returns Scored candidates above threshold\n */\nexport function aboveThreshold(candidates: ArtifactCandidate[], threshold: number): ScoredCandidate[] {\n\tconst sorted = scoreAndSort(candidates);\n\treturn sorted.filter((s) => s.score >= threshold);\n}\n\n/**\n * Adjust candidate scores based on context.\n * Used by WorkspaceVitals to boost relevant artifacts.\n *\n * @param candidates - Candidates to adjust\n * @param adjustments - Score adjustments by ID\n * @returns Adjusted candidates (new array, inputs not mutated)\n */\nexport function applyScoreAdjustments(\n\tcandidates: ArtifactCandidate[],\n\tadjustments: Map<string, number>,\n): ArtifactCandidate[] {\n\treturn candidates.map((c) => {\n\t\tconst adjustment = adjustments.get(c.id) ?? 0;\n\t\tif (adjustment === 0) {\n\t\t\treturn c;\n\t\t}\n\n\t\t// Create new candidate with adjusted relevance\n\t\treturn {\n\t\t\t...c,\n\t\t\trelevanceScore: quantizeRelevance(Math.min(1, Math.max(0, c.relevanceScore + adjustment))),\n\t\t};\n\t});\n}\n\n/**\n * Calculate score statistics for a set of candidates\n *\n * @param candidates - Array of candidates\n * @returns Score statistics\n */\nexport function getScoreStats(candidates: ArtifactCandidate[]): {\n\tmin: number;\n\tmax: number;\n\tmean: number;\n\tmedian: number;\n} {\n\tif (candidates.length === 0) {\n\t\treturn { min: 0, max: 0, mean: 0, median: 0 };\n\t}\n\n\tconst scores = candidates.map(computeScore).sort((a, b) => a - b);\n\tconst sum = scores.reduce((a, b) => a + b, 0);\n\n\treturn {\n\t\tmin: scores[0],\n\t\tmax: scores[scores.length - 1],\n\t\tmean: quantizeRelevance(sum / scores.length),\n\t\tmedian: scores[Math.floor(scores.length / 2)],\n\t};\n}\n\n/**\n * Validate scoring weights sum to 1.0\n * @throws Error if weights don't sum to 1.0\n */\nexport function validateScoringWeights(): void {\n\tconst sum =\n\t\tSCORING_WEIGHTS.recency +\n\t\tSCORING_WEIGHTS.relevance +\n\t\tSCORING_WEIGHTS.specificity +\n\t\tSCORING_WEIGHTS.riskAlignment;\n\n\tif (Math.abs(sum - 1.0) > 0.001) {\n\t\tthrow new Error(`Scoring weights must sum to 1.0, got ${sum}`);\n\t}\n}\n\n// Validate on module load\nvalidateScoringWeights();\n","/**\n * Explainability Module\n *\n * Provides human-readable explanations for selection decisions.\n * Every rejection is logged with a reason for transparency.\n *\n * Output formats:\n * - Structured data for programmatic access\n * - CLI-formatted output for humans\n * - JSON for logging and telemetry\n */\n\nimport type { BudgetConfig } from \"./budget.js\";\nimport { computeScore } from \"./scoring.js\";\nimport type { RejectionReason, RejectionRecord } from \"./selection.js\";\nimport type { ArtifactCandidate, ArtifactKind, ArtifactRef, Lane } from \"./types.js\";\n\n/**\n * Selection explanation for debugging and transparency.\n * Contains all information needed to understand a selection decision.\n */\nexport interface SelectionExplanation {\n\t/** Human-readable summary */\n\tsummary: string;\n\n\t/** Breakdown by lane */\n\tlaneBreakdown: Array<{\n\t\tlane: Lane;\n\t\tselectedCount: number;\n\t\tbudgetUsed: number;\n\t\tbudgetMax: number;\n\t\ttopArtifacts: Array<{\n\t\t\tid: string;\n\t\t\tkind: ArtifactKind;\n\t\t\tscore: number;\n\t\t}>;\n\t}>;\n\n\t/** Top rejections for visibility */\n\ttopRejections: Array<{\n\t\tartifact: ArtifactRef;\n\t\treason: RejectionReason;\n\t\tdetail?: string;\n\t}>;\n\n\t/** Constraint summary */\n\tconstraints: {\n\t\tpinnedCount: number;\n\t\tmustIncludeCount: number;\n\t\texcludedCount: number;\n\t};\n\n\t/** Performance metrics */\n\tperformance: {\n\t\tcandidateCount: number;\n\t\tselectedCount: number;\n\t\tcompressionRatio: number;\n\t\tcacheHit: boolean;\n\t};\n}\n\n/**\n * Build a human-readable explanation from selection data.\n *\n * @param selected - Selected candidates\n * @param rejections - Rejection records\n * @param laneUsage - Tokens used per lane\n * @param config - Budget configuration\n * @param shortfalls - Lanes that couldn't meet minimum\n * @param constraintCounts - Counts from constraint enforcement\n * @returns Complete explanation\n */\nexport function buildExplanation(\n\tselected: ArtifactCandidate[],\n\trejections: RejectionRecord[],\n\tlaneUsage: Record<Lane, number>,\n\tconfig: BudgetConfig,\n\tshortfalls: Array<{ lane: Lane; requested: number; available: number }>,\n\tconstraintCounts?: {\n\t\tpinned: number;\n\t\tmustInclude: number;\n\t\texcluded: number;\n\t},\n): SelectionExplanation {\n\tconst lanes = Object.keys(config.lanes) as Lane[];\n\n\t// Build lane breakdown\n\tconst laneBreakdown = lanes.map((lane) => {\n\t\tconst laneSelected = selected.filter((s) => s.lane === lane);\n\t\tconst laneConfig = config.lanes[lane];\n\n\t\treturn {\n\t\t\tlane,\n\t\t\tselectedCount: laneSelected.length,\n\t\t\tbudgetUsed: laneUsage[lane] ?? 0,\n\t\t\tbudgetMax: laneConfig.max,\n\t\t\ttopArtifacts: laneSelected.slice(0, 3).map((s) => ({\n\t\t\t\tid: s.id,\n\t\t\t\tkind: s.kind,\n\t\t\t\tscore: computeScore(s),\n\t\t\t})),\n\t\t};\n\t});\n\n\t// Calculate totals\n\tconst totalUsed = Object.values(laneUsage).reduce((a, b) => a + b, 0);\n\tconst totalCandidates = selected.length + rejections.length;\n\n\t// Build summary\n\tconst summaryParts = [`Selected ${selected.length} artifacts`, `using ${totalUsed}/${config.totalTokens} tokens`];\n\n\tif (shortfalls.length > 0) {\n\t\tsummaryParts.push(`(${shortfalls.length} lanes under-filled)`);\n\t}\n\n\tconst summary = summaryParts.join(\" \");\n\n\t// Top rejections (limit to 5)\n\tconst topRejections = rejections.slice(0, 5).map((r) => ({\n\t\tartifact: r.artifact,\n\t\treason: r.reason,\n\t\tdetail: r.detail,\n\t}));\n\n\treturn {\n\t\tsummary,\n\t\tlaneBreakdown,\n\t\ttopRejections,\n\t\tconstraints: {\n\t\t\tpinnedCount: constraintCounts?.pinned ?? 0,\n\t\t\tmustIncludeCount: constraintCounts?.mustInclude ?? 0,\n\t\t\texcludedCount:\n\t\t\t\tconstraintCounts?.excluded ?? rejections.filter((r) => r.reason === \"excluded_by_policy\").length,\n\t\t},\n\t\tperformance: {\n\t\t\tcandidateCount: totalCandidates,\n\t\t\tselectedCount: selected.length,\n\t\t\tcompressionRatio: totalCandidates > 0 ? Math.round((selected.length / totalCandidates) * 100) / 100 : 0,\n\t\t\tcacheHit: false, // Filled by caller\n\t\t},\n\t};\n}\n\n/**\n * Format explanation for CLI output.\n * Produces human-readable text with visual bars.\n *\n * @param exp - Selection explanation\n * @returns Formatted string for terminal output\n */\nexport function formatExplanationForCLI(exp: SelectionExplanation): string {\n\tconst lines: string[] = [\"\", \"📊 Composition Summary\", ` ${exp.summary}`, \"\", \"📁 Lane Breakdown:\"];\n\n\tfor (const lane of exp.laneBreakdown) {\n\t\tconst pct = lane.budgetMax > 0 ? Math.round((lane.budgetUsed / lane.budgetMax) * 100) : 0;\n\t\tconst filledBars = Math.round(pct / 10);\n\t\tconst emptyBars = 10 - filledBars;\n\t\tconst bar = \"█\".repeat(filledBars) + \"░\".repeat(emptyBars);\n\n\t\tlines.push(\n\t\t\t` ${lane.lane.padEnd(10)} ${bar} ${lane.selectedCount} artifacts (${lane.budgetUsed}/${lane.budgetMax} tokens)`,\n\t\t);\n\t}\n\n\tif (exp.topRejections.length > 0) {\n\t\tlines.push(\"\");\n\t\tlines.push(\"⏭️ Top Rejections:\");\n\t\tfor (const rej of exp.topRejections.slice(0, 3)) {\n\t\t\tconst detail = rej.detail ? ` (${rej.detail})` : \"\";\n\t\t\tlines.push(` • ${rej.artifact.kind}: ${formatRejectionReason(rej.reason)}${detail}`);\n\t\t}\n\t}\n\n\tif (exp.constraints.pinnedCount > 0 || exp.constraints.mustIncludeCount > 0) {\n\t\tlines.push(\"\");\n\t\tlines.push(\"📌 Constraints:\");\n\t\tif (exp.constraints.pinnedCount > 0) {\n\t\t\tlines.push(` • ${exp.constraints.pinnedCount} pinned artifacts`);\n\t\t}\n\t\tif (exp.constraints.mustIncludeCount > 0) {\n\t\t\tlines.push(` • ${exp.constraints.mustIncludeCount} must-include artifacts`);\n\t\t}\n\t\tif (exp.constraints.excludedCount > 0) {\n\t\t\tlines.push(` • ${exp.constraints.excludedCount} excluded by policy`);\n\t\t}\n\t}\n\n\tlines.push(\"\");\n\tlines.push(\n\t\t`📈 Performance: ${exp.performance.selectedCount}/${exp.performance.candidateCount} candidates selected (${Math.round(exp.performance.compressionRatio * 100)}%)`,\n\t);\n\n\tif (exp.performance.cacheHit) {\n\t\tlines.push(\" (cache hit)\");\n\t}\n\n\treturn lines.join(\"\\n\");\n}\n\n/**\n * Format rejection reason for display\n *\n * @param reason - Rejection reason code\n * @returns Human-readable reason\n */\nexport function formatRejectionReason(reason: RejectionReason): string {\n\tconst reasonMap: Record<RejectionReason, string> = {\n\t\texcluded_by_policy: \"excluded by policy\",\n\t\tlane_max_reached: \"lane budget exceeded\",\n\t\tbudget_exceeded: \"total budget exceeded\",\n\t\tlower_priority: \"lower priority\",\n\t};\n\n\treturn reasonMap[reason] ?? reason;\n}\n\n/**\n * Format explanation as JSON for logging\n *\n * @param exp - Selection explanation\n * @returns JSON string\n */\nexport function formatExplanationAsJSON(exp: SelectionExplanation): string {\n\treturn JSON.stringify(exp, null, 2);\n}\n\n/**\n * Create a minimal explanation for logging (no artifact details)\n *\n * @param exp - Full explanation\n * @returns Minimal explanation\n */\nexport function toMinimalExplanation(exp: SelectionExplanation): {\n\tsummary: string;\n\tselectedCount: number;\n\trejectedCount: number;\n\tcacheHit: boolean;\n} {\n\treturn {\n\t\tsummary: exp.summary,\n\t\tselectedCount: exp.performance.selectedCount,\n\t\trejectedCount: exp.topRejections.length,\n\t\tcacheHit: exp.performance.cacheHit,\n\t};\n}\n\n/**\n * Build explanation for an empty selection (no candidates)\n *\n * @returns Explanation for empty selection\n */\nexport function buildEmptyExplanation(): SelectionExplanation {\n\treturn {\n\t\tsummary: \"No candidates available for selection\",\n\t\tlaneBreakdown: [],\n\t\ttopRejections: [],\n\t\tconstraints: {\n\t\t\tpinnedCount: 0,\n\t\t\tmustIncludeCount: 0,\n\t\t\texcludedCount: 0,\n\t\t},\n\t\tperformance: {\n\t\t\tcandidateCount: 0,\n\t\t\tselectedCount: 0,\n\t\t\tcompressionRatio: 0,\n\t\t\tcacheHit: false,\n\t\t},\n\t};\n}\n\n/**\n * Add cache hit status to explanation\n *\n * @param exp - Explanation\n * @param cacheHit - Whether this was a cache hit\n * @returns Updated explanation\n */\nexport function withCacheHit(exp: SelectionExplanation, cacheHit: boolean): SelectionExplanation {\n\treturn {\n\t\t...exp,\n\t\tperformance: {\n\t\t\t...exp.performance,\n\t\t\tcacheHit,\n\t\t},\n\t};\n}\n\n/**\n * Calculate rejection statistics\n *\n * @param rejections - All rejections\n * @returns Statistics by reason\n */\nexport function getRejectionStats(rejections: RejectionRecord[]): Record<RejectionReason, number> {\n\tconst stats = {} as Record<RejectionReason, number>;\n\n\tfor (const r of rejections) {\n\t\tstats[r.reason] = (stats[r.reason] ?? 0) + 1;\n\t}\n\n\treturn stats;\n}\n","/**\n * Artifact Fingerprinting\n *\n * Generates stable, privacy-safe artifact identifiers using HMAC.\n * These IDs are:\n * - Deterministic: Same inputs → Same ID\n * - Stable: ID doesn't change if file content changes\n * - Privacy-safe: File paths are not exposed in logs/telemetry\n * - Collision-resistant: Different artifacts get different IDs\n */\n\nimport { createHash, createHmac, randomUUID } from \"node:crypto\";\nimport type { ArtifactKind, Lane } from \"./types.js\";\n\n/**\n * Configuration for fingerprinting.\n * The workspace secret is generated once per workspace and stored locally.\n */\nexport interface FingerprintConfig {\n\t/** Generated once per workspace, stored locally */\n\tworkspaceSecret: string;\n\t/** Hash algorithm to use */\n\talgorithm: \"sha256\";\n\t/** Output encoding */\n\tencoding: \"base64url\";\n}\n\n/**\n * Default fingerprint configuration\n */\nexport const DEFAULT_FINGERPRINT_CONFIG: Omit<FingerprintConfig, \"workspaceSecret\"> = {\n\talgorithm: \"sha256\",\n\tencoding: \"base64url\",\n} as const;\n\n/**\n * Generate a new workspace secret.\n * Called once per workspace during initialization.\n *\n * The secret is used to create HMAC-based artifact IDs that:\n * - Are deterministic within the workspace\n * - Cannot be reversed to reveal file paths\n * - Are unique per workspace (different workspaces get different IDs for same paths)\n *\n * @returns A cryptographically secure random secret\n *\n * @example\n * const secret = generateWorkspaceSecret();\n * // Store in .snapback/config or equivalent\n * await writeFile('.snapback/secret', secret);\n */\nexport function generateWorkspaceSecret(): string {\n\t// Combine multiple sources of randomness for extra security\n\treturn createHash(\"sha256\")\n\t\t.update(randomUUID())\n\t\t.update(Date.now().toString())\n\t\t.update(Math.random().toString())\n\t\t.digest(\"base64url\");\n}\n\n/**\n * Input for computing an artifact ID\n */\nexport interface ArtifactIdInput {\n\t/** The type of content this artifact contains */\n\tkind: ArtifactKind;\n\t/** The lane this artifact belongs to */\n\tlane: Lane;\n\t/** Relative path within the workspace (internal only, never logged) */\n\trelativePath: string;\n\t/** Chunk index for multi-chunk artifacts (default: 0) */\n\tchunkIndex?: number;\n}\n\n/**\n * Generate a stable artifact ID using HMAC.\n * Safe for logs/telemetry (no paths exposed).\n *\n * The ID is computed as:\n * 1. HMAC the relative path with workspace secret → path fingerprint\n * 2. Combine kind, lane, path fingerprint, chunk index\n * 3. Hash the combination → final ID\n *\n * @param artifact - The artifact properties to fingerprint\n * @param secret - The workspace secret for HMAC\n * @returns A 24-character base64url-encoded ID\n *\n * @example\n * const id = computeArtifactId(\n * { kind: 'local_diff', lane: 'local', relativePath: 'src/auth.ts', chunkIndex: 0 },\n * workspaceSecret\n * );\n * // Returns something like: \"Xk9mQ2vN8pL3Rm5sYt7uWx\"\n */\nexport function computeArtifactId(artifact: ArtifactIdInput, secret: string): string {\n\tif (!artifact.relativePath) {\n\t\tthrow new Error(\"Artifact relativePath is required for ID generation\");\n\t}\n\tif (!secret) {\n\t\tthrow new Error(\"Workspace secret is required for ID generation\");\n\t}\n\n\t// Step 1: Create path fingerprint using HMAC (not reversible)\n\tconst pathFingerprint = createHmac(\"sha256\", secret).update(artifact.relativePath).digest(\"base64url\").slice(0, 12);\n\n\t// Step 2: Combine components\n\tconst components = [artifact.kind, artifact.lane, pathFingerprint, (artifact.chunkIndex ?? 0).toString()];\n\n\t// Step 3: Hash the combination\n\treturn createHash(\"sha256\").update(components.join(\":\")).digest(\"base64url\").slice(0, 24);\n}\n\n/**\n * Compute a digest of multiple artifact IDs for cache keying.\n * The digest is deterministic regardless of input order.\n *\n * @param artifactIds - Array of artifact IDs\n * @returns A 16-character digest\n */\nexport function computeArtifactSetDigest(artifactIds: string[]): string {\n\t// Sort for determinism\n\tconst sorted = [...artifactIds].sort();\n\treturn createHash(\"sha256\").update(sorted.join(\"|\")).digest(\"base64url\").slice(0, 16);\n}\n\n/**\n * Compute a deterministic hash of an object for cache keying.\n * Keys are sorted to ensure deterministic output.\n *\n * @param obj - Object to hash\n * @returns A 16-character digest\n */\nexport function hashObject(obj: Record<string, unknown>): string {\n\t// Sort keys for determinism\n\tconst normalized = JSON.stringify(obj, Object.keys(obj).sort());\n\treturn createHash(\"sha256\").update(normalized).digest(\"base64url\").slice(0, 16);\n}\n\n/**\n * Generate a unique log ID for decision logging\n *\n * @returns A unique ID with timestamp prefix for sorting\n */\nexport function generateLogId(): string {\n\tconst timestamp = Date.now().toString(36); // Base36 for compact representation\n\tconst random = randomUUID().split(\"-\")[0]; // First segment of UUID\n\treturn `${timestamp}-${random}`;\n}\n\n/**\n * Validate that a string looks like a valid artifact ID\n *\n * @param id - String to validate\n * @returns true if the string matches artifact ID format\n */\nexport function isValidArtifactId(id: string): boolean {\n\t// Artifact IDs are 24 characters of base64url\n\tif (!id || id.length !== 24) {\n\t\treturn false;\n\t}\n\t// Base64url alphabet: A-Z, a-z, 0-9, -, _\n\treturn /^[A-Za-z0-9_-]{24}$/.test(id);\n}\n\n/**\n * Compute a workspace fingerprint from its path.\n * Used for cache keying across sessions.\n *\n * @param workspacePath - Absolute path to the workspace\n * @returns A 16-character fingerprint\n */\nexport function computeWorkspaceFingerprint(workspacePath: string): string {\n\treturn createHash(\"sha256\").update(workspacePath).digest(\"base64url\").slice(0, 16);\n}\n\n/**\n * Compute a content fingerprint for change detection.\n * Used to invalidate cache when content changes.\n *\n * @param content - Content to fingerprint\n * @returns A 16-character fingerprint\n */\nexport function computeContentFingerprint(content: string): string {\n\treturn createHash(\"sha256\").update(content).digest(\"base64url\").slice(0, 16);\n}\n","/**\n * Rendering Module\n *\n * Second pass of the two-pass pipeline:\n * 1. Selection: Pick artifacts using coarse estimates\n * 2. Rendering: Render content, measure exact tokens, shrink if needed\n *\n * This module handles:\n * - Rendering artifact content\n * - Measuring exact token counts\n * - Shrinking content to fit budget\n * - Strategy-based shrinking per artifact kind\n */\n\nimport type {\n\tArtifactCandidate,\n\tArtifactKind,\n\tArtifactRef,\n\tRenderedArtifact,\n\tShrinkStrategy,\n\tTokenCounter,\n} from \"./types.js\";\nimport { defaultTokenCounter, LANE_PRIORITIES } from \"./types.js\";\n\n/**\n * Shrink strategies per artifact kind.\n * Determines how content is reduced when budget is exceeded.\n */\nexport const SHRINK_STRATEGIES: Readonly<Record<ArtifactKind, ShrinkStrategy>> = {\n\tconstraint: \"never\", // Never shrink rules\n\trule_doc: \"never\", // Never shrink rules\n\tlocal_diff: \"truncate_oldest\", // Drop oldest hunks\n\trecent_edit: \"truncate_oldest\", // Drop oldest content\n\tsymbol_context: \"keep_signatures\", // Keep signatures, drop bodies\n\tdependency_graph: \"collapse_summary\", // Collapse to summary\n\ttest_context: \"keep_signatures\", // Keep signatures, drop bodies\n\tsemantic_match: \"truncate_oldest\", // Truncate if needed\n\tsession_history: \"drop_entries\", // Drop oldest entries\n\tviolation: \"drop_entries\", // Drop oldest entries\n\tlearning: \"drop_entries\", // Drop oldest entries\n} as const;\n\n/**\n * Minimum content size after shrinking (tokens)\n */\nexport const MIN_SHRUNK_SIZE = 50;\n\n/**\n * Render a single artifact from ref to full content.\n *\n * @param ref - Artifact reference\n * @param candidates - All candidates (to find matching content)\n * @param countTokens - Token counting function\n * @returns Rendered artifact with exact token count\n * @throws Error if candidate not found\n */\nexport function renderArtifact(\n\tref: ArtifactRef,\n\tcandidates: ArtifactCandidate[],\n\tcountTokens: TokenCounter = defaultTokenCounter,\n): RenderedArtifact {\n\tconst candidate = candidates.find((c) => c.id === ref.id);\n\tif (!candidate) {\n\t\tthrow new Error(`Candidate not found: ${ref.id}`);\n\t}\n\n\tconst content = candidate.getContent();\n\tconst exactTokenCount = countTokens(content);\n\n\treturn {\n\t\tid: ref.id,\n\t\tkind: ref.kind,\n\t\tlane: ref.lane,\n\t\tcontent,\n\t\texactTokenCount,\n\t\tshrunk: false,\n\t};\n}\n\n/**\n * Render multiple artifacts.\n *\n * @param refs - Artifact references\n * @param candidates - All candidates\n * @param countTokens - Token counting function\n * @returns Array of rendered artifacts\n */\nexport function renderArtifacts(\n\trefs: ArtifactRef[],\n\tcandidates: ArtifactCandidate[],\n\tcountTokens: TokenCounter = defaultTokenCounter,\n): RenderedArtifact[] {\n\treturn refs.map((ref) => renderArtifact(ref, candidates, countTokens));\n}\n\n/**\n * Get total token count of rendered artifacts\n *\n * @param rendered - Rendered artifacts\n * @returns Total token count\n */\nexport function getTotalTokens(rendered: RenderedArtifact[]): number {\n\treturn rendered.reduce((sum, r) => sum + r.exactTokenCount, 0);\n}\n\n/**\n * Shrink rendered artifacts to fit within target budget.\n *\n * Algorithm:\n * 1. Calculate overflow (current - target)\n * 2. Sort artifacts by shrinkability (never-shrink last, low priority first)\n * 3. Shrink artifacts one by one until budget is met\n *\n * @param rendered - Rendered artifacts\n * @param targetTokens - Target token budget\n * @param countTokens - Token counting function\n * @returns Shrunk artifacts that fit budget\n */\nexport function shrinkToFit(\n\trendered: RenderedArtifact[],\n\ttargetTokens: number,\n\tcountTokens: TokenCounter = defaultTokenCounter,\n): RenderedArtifact[] {\n\tconst current = getTotalTokens(rendered);\n\n\tif (current <= targetTokens) {\n\t\treturn rendered;\n\t}\n\n\t// Sort by shrinkability (never-shrink last, then by lane priority descending)\n\tconst ordered = [...rendered].sort((a, b) => {\n\t\tconst stratA = SHRINK_STRATEGIES[a.kind];\n\t\tconst stratB = SHRINK_STRATEGIES[b.kind];\n\n\t\t// Never-shrink goes last\n\t\tif (stratA === \"never\" && stratB !== \"never\") {\n\t\t\treturn 1;\n\t\t}\n\t\tif (stratB === \"never\" && stratA !== \"never\") {\n\t\t\treturn -1;\n\t\t}\n\n\t\t// Otherwise, shrink lower priority lanes first (higher priority number = lower priority)\n\t\treturn LANE_PRIORITIES[b.lane] - LANE_PRIORITIES[a.lane];\n\t});\n\n\tconst result: RenderedArtifact[] = [];\n\tconst overflow = current - targetTokens;\n\tlet shrunk = 0;\n\n\tfor (const artifact of ordered) {\n\t\t// If we've shrunk enough or this artifact can't shrink\n\t\tif (shrunk >= overflow || SHRINK_STRATEGIES[artifact.kind] === \"never\") {\n\t\t\tresult.push(artifact);\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Calculate target size for this artifact\n\t\tconst tokensToShrink = overflow - shrunk;\n\t\tconst newTarget = Math.max(artifact.exactTokenCount - tokensToShrink, MIN_SHRUNK_SIZE);\n\n\t\t// If already at or below target, no shrink needed\n\t\tif (artifact.exactTokenCount <= newTarget) {\n\t\t\tresult.push(artifact);\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Apply shrink strategy\n\t\tconst shrunkArtifact = applyShrinkStrategy(artifact, newTarget, countTokens);\n\t\tconst saved = artifact.exactTokenCount - shrunkArtifact.exactTokenCount;\n\t\tshrunk += saved;\n\t\tresult.push(shrunkArtifact);\n\t}\n\n\treturn result;\n}\n\n/**\n * Apply shrink strategy to a single artifact.\n *\n * @param artifact - Artifact to shrink\n * @param targetTokens - Target token count\n * @param countTokens - Token counting function\n * @returns Shrunk artifact\n */\nexport function applyShrinkStrategy(\n\tartifact: RenderedArtifact,\n\ttargetTokens: number,\n\tcountTokens: TokenCounter = defaultTokenCounter,\n): RenderedArtifact {\n\tconst strategy = SHRINK_STRATEGIES[artifact.kind];\n\n\tswitch (strategy) {\n\t\tcase \"truncate_oldest\":\n\t\t\treturn truncateOldest(artifact, targetTokens, countTokens);\n\t\tcase \"keep_signatures\":\n\t\t\treturn keepSignatures(artifact, targetTokens, countTokens);\n\t\tcase \"collapse_summary\":\n\t\t\treturn collapseSummary(artifact, targetTokens, countTokens);\n\t\tcase \"drop_entries\":\n\t\t\treturn dropEntries(artifact, targetTokens, countTokens);\n\t\tdefault:\n\t\t\treturn artifact;\n\t}\n}\n\n/**\n * Truncate oldest content strategy.\n * Used for diffs, histories, and other time-ordered content.\n * Removes lines from the beginning until target is reached.\n *\n * @param artifact - Artifact to shrink\n * @param targetTokens - Target token count\n * @param countTokens - Token counting function\n * @returns Shrunk artifact\n */\nexport function truncateOldest(\n\tartifact: RenderedArtifact,\n\ttargetTokens: number,\n\tcountTokens: TokenCounter = defaultTokenCounter,\n): RenderedArtifact {\n\tconst lines = artifact.content.split(\"\\n\");\n\tlet startIndex = 0;\n\n\t// Remove lines from the start until we're at target\n\twhile (startIndex < lines.length - 1) {\n\t\tconst remaining = lines.slice(startIndex).join(\"\\n\");\n\t\tconst tokens = countTokens(remaining);\n\n\t\tif (tokens <= targetTokens) {\n\t\t\tbreak;\n\t\t}\n\n\t\tstartIndex++;\n\t}\n\n\tconst newContent = (startIndex > 0 ? \"... (truncated)\\n\" : \"\") + lines.slice(startIndex).join(\"\\n\");\n\tconst exactTokenCount = countTokens(newContent);\n\n\treturn {\n\t\t...artifact,\n\t\tcontent: newContent,\n\t\texactTokenCount,\n\t\tshrunk: true,\n\t\toriginalTokenCount: artifact.exactTokenCount,\n\t\tshrinkStrategy: \"truncate_oldest\",\n\t};\n}\n\n/**\n * Keep signatures strategy.\n * Used for code artifacts - keeps function/class signatures, drops bodies.\n *\n * @param artifact - Artifact to shrink\n * @param targetTokens - Target token count\n * @param countTokens - Token counting function\n * @returns Shrunk artifact\n */\nexport function keepSignatures(\n\tartifact: RenderedArtifact,\n\ttargetTokens: number,\n\tcountTokens: TokenCounter = defaultTokenCounter,\n): RenderedArtifact {\n\tconst lines = artifact.content.split(\"\\n\");\n\tconst signatures: string[] = [];\n\tlet inBody = false;\n\tlet braceDepth = 0;\n\n\tfor (const line of lines) {\n\t\tconst trimmed = line.trim();\n\n\t\t// Track brace depth for body detection\n\t\tconst openBraces = (line.match(/{/g) || []).length;\n\t\tconst closeBraces = (line.match(/}/g) || []).length;\n\n\t\tif (!inBody) {\n\t\t\t// Look for function/class/interface signatures\n\t\t\tif (\n\t\t\t\ttrimmed.match(/^(export\\s+)?(async\\s+)?function\\s+\\w+/) ||\n\t\t\t\ttrimmed.match(/^(export\\s+)?(class|interface|type|enum)\\s+\\w+/) ||\n\t\t\t\ttrimmed.match(/^\\w+\\s*\\([^)]*\\)\\s*[:{]/) ||\n\t\t\t\ttrimmed.match(/^(public|private|protected|static|async)\\s+\\w+/)\n\t\t\t) {\n\t\t\t\tsignatures.push(line);\n\t\t\t\tif (openBraces > closeBraces) {\n\t\t\t\t\tinBody = true;\n\t\t\t\t\tbraceDepth = openBraces - closeBraces;\n\t\t\t\t\tsignatures.push(\" // ... body omitted\");\n\t\t\t\t}\n\t\t\t} else if (!trimmed.startsWith(\"//\") && !trimmed.startsWith(\"/*\") && !trimmed.startsWith(\"*\")) {\n\t\t\t\t// Keep non-body, non-comment lines\n\t\t\t\tif (trimmed !== \"\" && !trimmed.startsWith(\"import\") && !trimmed.startsWith(\"require\")) {\n\t\t\t\t\tsignatures.push(line);\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\t// Track body depth\n\t\t\tbraceDepth += openBraces - closeBraces;\n\t\t\tif (braceDepth <= 0) {\n\t\t\t\tinBody = false;\n\t\t\t\tbraceDepth = 0;\n\t\t\t\tsignatures.push(line); // Include closing brace\n\t\t\t}\n\t\t}\n\n\t\t// Check if we're at target\n\t\tconst current = signatures.join(\"\\n\");\n\t\tif (countTokens(current) >= targetTokens) {\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tconst newContent = signatures.join(\"\\n\");\n\tconst exactTokenCount = countTokens(newContent);\n\n\treturn {\n\t\t...artifact,\n\t\tcontent: newContent,\n\t\texactTokenCount,\n\t\tshrunk: true,\n\t\toriginalTokenCount: artifact.exactTokenCount,\n\t\tshrinkStrategy: \"keep_signatures\",\n\t};\n}\n\n/**\n * Collapse summary strategy.\n * Used for dependency graphs - collapses to high-level summary.\n *\n * @param artifact - Artifact to shrink\n * @param targetTokens - Target token count\n * @param countTokens - Token counting function\n * @returns Shrunk artifact\n */\nexport function collapseSummary(\n\tartifact: RenderedArtifact,\n\ttargetTokens: number,\n\tcountTokens: TokenCounter = defaultTokenCounter,\n): RenderedArtifact {\n\tconst lines = artifact.content.split(\"\\n\");\n\n\t// Extract summary lines (headers, top-level items)\n\tconst summary: string[] = [];\n\tlet itemCount = 0;\n\n\tfor (const line of lines) {\n\t\tconst trimmed = line.trim();\n\n\t\t// Keep headers and top-level items\n\t\tif (\n\t\t\ttrimmed.startsWith(\"#\") ||\n\t\t\ttrimmed.startsWith(\"##\") ||\n\t\t\ttrimmed.startsWith(\"- \") ||\n\t\t\ttrimmed.startsWith(\"* \") ||\n\t\t\ttrimmed.match(/^\\d+\\./)\n\t\t) {\n\t\t\tsummary.push(line);\n\t\t\titemCount++;\n\t\t}\n\n\t\t// Stop if we've reached target\n\t\tconst current = summary.join(\"\\n\");\n\t\tif (countTokens(current) >= targetTokens - 20) {\n\t\t\t// Leave room for summary note\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tconst totalItems = lines.filter((l) => l.trim().startsWith(\"- \") || l.trim().startsWith(\"* \")).length;\n\n\tconst summaryNote = itemCount < totalItems ? `\\n... and ${totalItems - itemCount} more items (collapsed)` : \"\";\n\n\tconst newContent = summary.join(\"\\n\") + summaryNote;\n\tconst exactTokenCount = countTokens(newContent);\n\n\treturn {\n\t\t...artifact,\n\t\tcontent: newContent,\n\t\texactTokenCount,\n\t\tshrunk: true,\n\t\toriginalTokenCount: artifact.exactTokenCount,\n\t\tshrinkStrategy: \"collapse_summary\",\n\t};\n}\n\n/**\n * Drop entries strategy.\n * Used for lists/histories - drops oldest entries first.\n *\n * @param artifact - Artifact to shrink\n * @param targetTokens - Target token count\n * @param countTokens - Token counting function\n * @returns Shrunk artifact\n */\nexport function dropEntries(\n\tartifact: RenderedArtifact,\n\ttargetTokens: number,\n\tcountTokens: TokenCounter = defaultTokenCounter,\n): RenderedArtifact {\n\tconst lines = artifact.content.split(\"\\n\");\n\n\t// Find entry boundaries (empty lines or entry markers)\n\tconst entries: string[][] = [];\n\tlet currentEntry: string[] = [];\n\n\tfor (const line of lines) {\n\t\tif (line.trim() === \"\" && currentEntry.length > 0) {\n\t\t\tentries.push(currentEntry);\n\t\t\tcurrentEntry = [];\n\t\t} else {\n\t\t\tcurrentEntry.push(line);\n\t\t}\n\t}\n\tif (currentEntry.length > 0) {\n\t\tentries.push(currentEntry);\n\t}\n\n\t// Keep entries from the end (most recent)\n\tconst kept: string[][] = [];\n\tlet totalTokens = 0;\n\n\tfor (let i = entries.length - 1; i >= 0; i--) {\n\t\tconst entry = entries[i];\n\t\tconst entryContent = entry.join(\"\\n\");\n\t\tconst entryTokens = countTokens(entryContent);\n\n\t\tif (totalTokens + entryTokens <= targetTokens - 30) {\n\t\t\t// Leave room for note\n\t\t\tkept.unshift(entry);\n\t\t\ttotalTokens += entryTokens;\n\t\t} else if (kept.length === 0) {\n\t\t\t// Keep at least one entry\n\t\t\tkept.unshift(entry);\n\t\t\tbreak;\n\t\t} else {\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tconst droppedCount = entries.length - kept.length;\n\tconst droppedNote = droppedCount > 0 ? `... ${droppedCount} older entries dropped\\n\\n` : \"\";\n\n\tconst newContent = droppedNote + kept.map((e) => e.join(\"\\n\")).join(\"\\n\\n\");\n\tconst exactTokenCount = countTokens(newContent);\n\n\treturn {\n\t\t...artifact,\n\t\tcontent: newContent,\n\t\texactTokenCount,\n\t\tshrunk: true,\n\t\toriginalTokenCount: artifact.exactTokenCount,\n\t\tshrinkStrategy: \"drop_entries\",\n\t};\n}\n\n/**\n * Check if shrinking is needed for a set of rendered artifacts\n *\n * @param rendered - Rendered artifacts\n * @param budget - Token budget\n * @returns true if total exceeds budget\n */\nexport function needsShrinking(rendered: RenderedArtifact[], budget: number): boolean {\n\treturn getTotalTokens(rendered) > budget;\n}\n\n/**\n * Calculate shrink statistics\n *\n * @param rendered - Rendered artifacts (after shrinking)\n * @returns Shrink statistics\n */\nexport function getShrinkStats(rendered: RenderedArtifact[]): {\n\tshrunkCount: number;\n\ttotalSaved: number;\n\tbyStrategy: Record<ShrinkStrategy, number>;\n} {\n\tlet shrunkCount = 0;\n\tlet totalSaved = 0;\n\tconst byStrategy = {} as Record<ShrinkStrategy, number>;\n\n\tfor (const r of rendered) {\n\t\tif (r.shrunk && r.originalTokenCount !== undefined && r.shrinkStrategy) {\n\t\t\tshrunkCount++;\n\t\t\tconst saved = r.originalTokenCount - r.exactTokenCount;\n\t\t\ttotalSaved += saved;\n\t\t\tbyStrategy[r.shrinkStrategy] = (byStrategy[r.shrinkStrategy] ?? 0) + 1;\n\t\t}\n\t}\n\n\treturn { shrunkCount, totalSaved, byStrategy };\n}\n","/**\n * Replay Module\n *\n * Records decision logs for:\n * - Determinism verification (replay same inputs → same outputs)\n * - Debugging (why was artifact X selected/rejected?)\n * - Evaluation (A/B testing selection strategies)\n * - Auditing (what context was provided to AI?)\n *\n * Decision logs are safe for external storage (no file content).\n */\n\nimport { COMPOSER_VERSION, computeCandidateDigest } from \"./cache.js\";\nimport type { ComposerConstraints } from \"./constraints.js\";\nimport { hashObject } from \"./fingerprint.js\";\nimport type { ArtifactCandidate, ArtifactRef, Lane } from \"./types.js\";\n\n/**\n * Decision log for replay and evaluation.\n * Saved after each composition for determinism verification.\n * Contains NO file content - safe for external storage.\n */\nexport interface ComposerDecisionLog {\n\t// Identification\n\t/** Unique log ID */\n\tid: string;\n\t/** Unix timestamp */\n\ttimestamp: number;\n\t/** Composer version for compatibility */\n\tcomposerVersion: string;\n\n\t// Context\n\t/** Workspace fingerprint */\n\tworkspaceFingerprint: string;\n\t/** Trigger event type */\n\ttriggerEvent: string;\n\t/** Git commit or equivalent */\n\tcommitish: string;\n\n\t// Inputs\n\t/** Number of candidates considered */\n\tcandidateCount: number;\n\t/** Digest of candidate set for verification */\n\tcandidateDigest: string;\n\t/** Digest of constraints */\n\tconstraintsDigest: string;\n\t/** Digest of budget configuration */\n\tbudgetConfigDigest: string;\n\n\t// Outputs\n\t/** Selected artifact references */\n\tselectedArtifacts: ArtifactRef[];\n\t/** Token allocation by lane */\n\tbudgetAllocation: Record<Lane, number>;\n\t/** Total tokens used */\n\ttotalTokensUsed: number;\n\n\t// Rankings (for debugging)\n\trankings: Array<{\n\t\tartifact: ArtifactRef;\n\t\tscore: number;\n\t\tselected: boolean;\n\t\trejectionReason?: string;\n\t}>;\n\n\t// Cache\n\t/** Cache key for this composition */\n\tcacheKey: string;\n\t/** Whether this was a cache hit */\n\tcacheHit: boolean;\n\n\t// Expected (for golden tests)\n\texpectedSelection?: ArtifactRef[];\n\n\t// Performance\n\t/** Duration in milliseconds */\n\tdurationMs: number;\n}\n\n/**\n * Generate a unique log ID.\n *\n * @returns Log ID with timestamp prefix for sorting\n */\nexport function generateLogId(): string {\n\tconst timestamp = Date.now().toString(36);\n\tconst random = Math.random().toString(36).slice(2, 10);\n\treturn `log_${timestamp}_${random}`;\n}\n\n/**\n * Emit a decision log after composition.\n *\n * @param params - Parameters for the decision log\n * @returns Complete decision log\n */\nexport function emitDecisionLog(params: {\n\tresult: {\n\t\tselected: ArtifactRef[];\n\t\tallocation: Record<Lane, number>;\n\t\tcacheKey: string;\n\t\tcacheHit: boolean;\n\t\tactualTokens: number;\n\t};\n\ttrigger: {\n\t\tevent: string;\n\t\tworkspaceFingerprint: string;\n\t\tcommitish?: string;\n\t};\n\tconstraints: ComposerConstraints;\n\tcandidates: ArtifactCandidate[];\n\tbudgetConfig: Record<string, unknown>;\n\trankings: Array<{\n\t\tartifact: ArtifactRef;\n\t\tscore: number;\n\t\tselected: boolean;\n\t\trejectionReason?: string;\n\t}>;\n\tstartTime: number;\n}): ComposerDecisionLog {\n\tconst { result, trigger, constraints, candidates, budgetConfig, rankings, startTime } = params;\n\n\treturn {\n\t\tid: generateLogId(),\n\t\ttimestamp: Date.now(),\n\t\tcomposerVersion: COMPOSER_VERSION,\n\n\t\tworkspaceFingerprint: trigger.workspaceFingerprint,\n\t\ttriggerEvent: trigger.event,\n\t\tcommitish: trigger.commitish ?? \"HEAD\",\n\n\t\tcandidateCount: candidates.length,\n\t\tcandidateDigest: computeCandidateDigest(candidates),\n\t\tconstraintsDigest: hashObject(constraints as unknown as Record<string, unknown>),\n\t\tbudgetConfigDigest: hashObject(budgetConfig),\n\n\t\tselectedArtifacts: result.selected,\n\t\tbudgetAllocation: result.allocation,\n\t\ttotalTokensUsed: result.actualTokens,\n\n\t\trankings,\n\n\t\tcacheKey: result.cacheKey,\n\t\tcacheHit: result.cacheHit,\n\n\t\tdurationMs: Date.now() - startTime,\n\t};\n}\n\n/**\n * Result of determinism verification\n */\nexport interface VerificationResult {\n\t/** Whether verification passed */\n\tpassed: boolean;\n\t/** List of differences found */\n\tdifferences: string[];\n\t/** Original log */\n\toriginal: ComposerDecisionLog;\n\t/** Replay result */\n\treplay?: Partial<ComposerDecisionLog>;\n}\n\n/**\n * Verify determinism by comparing a log with a replay.\n *\n * @param original - Original decision log\n * @param replay - Replay result\n * @returns Verification result with differences\n */\nexport function verifyDeterminism(\n\toriginal: ComposerDecisionLog,\n\treplay: {\n\t\tselected: ArtifactRef[];\n\t\tallocation: Record<Lane, number>;\n\t\ttotalTokensUsed: number;\n\t\tcacheKey: string;\n\t},\n): VerificationResult {\n\tconst differences: string[] = [];\n\n\t// Compare selected artifacts\n\tconst originalIds = new Set(original.selectedArtifacts.map((a) => a.id));\n\tconst replayIds = new Set(replay.selected.map((a) => a.id));\n\n\tfor (const id of originalIds) {\n\t\tif (!replayIds.has(id)) {\n\t\t\tdifferences.push(`Missing in replay: ${id}`);\n\t\t}\n\t}\n\n\tfor (const id of replayIds) {\n\t\tif (!originalIds.has(id)) {\n\t\t\tdifferences.push(`Extra in replay: ${id}`);\n\t\t}\n\t}\n\n\t// Compare order (if IDs match)\n\tif (differences.length === 0) {\n\t\tconst originalOrder = original.selectedArtifacts.map((a) => a.id);\n\t\tconst replayOrder = replay.selected.map((a) => a.id);\n\n\t\tfor (let i = 0; i < originalOrder.length; i++) {\n\t\t\tif (originalOrder[i] !== replayOrder[i]) {\n\t\t\t\tdifferences.push(`Order mismatch at position ${i}: ${originalOrder[i]} vs ${replayOrder[i]}`);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Compare token usage\n\tif (original.totalTokensUsed !== replay.totalTokensUsed) {\n\t\tdifferences.push(`Token mismatch: original=${original.totalTokensUsed}, replay=${replay.totalTokensUsed}`);\n\t}\n\n\t// Compare allocation\n\tfor (const lane of Object.keys(original.budgetAllocation) as Lane[]) {\n\t\tconst origLane = original.budgetAllocation[lane];\n\t\tconst replayLane = replay.allocation[lane];\n\t\tif (origLane !== replayLane) {\n\t\t\tdifferences.push(`Lane ${lane} mismatch: original=${origLane}, replay=${replayLane}`);\n\t\t}\n\t}\n\n\t// Compare cache keys\n\tif (original.cacheKey !== replay.cacheKey) {\n\t\tdifferences.push(`Cache key mismatch: original=${original.cacheKey}, replay=${replay.cacheKey}`);\n\t}\n\n\treturn {\n\t\tpassed: differences.length === 0,\n\t\tdifferences,\n\t\toriginal,\n\t\treplay: {\n\t\t\tselectedArtifacts: replay.selected,\n\t\t\tbudgetAllocation: replay.allocation,\n\t\t\ttotalTokensUsed: replay.totalTokensUsed,\n\t\t\tcacheKey: replay.cacheKey,\n\t\t},\n\t};\n}\n\n/**\n * Format a decision log for display\n *\n * @param log - Decision log\n * @returns Formatted string\n */\nexport function formatDecisionLog(log: ComposerDecisionLog): string {\n\tconst lines: string[] = [\n\t\t`Decision Log: ${log.id}`,\n\t\t` Timestamp: ${new Date(log.timestamp).toISOString()}`,\n\t\t` Version: ${log.composerVersion}`,\n\t\t` Trigger: ${log.triggerEvent}`,\n\t\t` Commit: ${log.commitish}`,\n\t\t\"\",\n\t\t` Candidates: ${log.candidateCount}`,\n\t\t` Selected: ${log.selectedArtifacts.length}`,\n\t\t` Tokens: ${log.totalTokensUsed}`,\n\t\t` Duration: ${log.durationMs}ms`,\n\t\t` Cache: ${log.cacheHit ? \"HIT\" : \"MISS\"}`,\n\t\t\"\",\n\t\t\" Allocation:\",\n\t];\n\n\tfor (const [lane, tokens] of Object.entries(log.budgetAllocation)) {\n\t\tlines.push(` ${lane}: ${tokens}`);\n\t}\n\n\tif (log.rankings.length > 0) {\n\t\tlines.push(\"\");\n\t\tlines.push(\" Top Rankings:\");\n\t\tfor (const r of log.rankings.slice(0, 5)) {\n\t\t\tconst status = r.selected ? \"✓\" : `✗ (${r.rejectionReason})`;\n\t\t\tlines.push(` ${status} ${r.artifact.kind}: ${r.score.toFixed(3)}`);\n\t\t}\n\t}\n\n\treturn lines.join(\"\\n\");\n}\n\n/**\n * Create a minimal log for storage (no rankings)\n *\n * @param log - Full decision log\n * @returns Minimal log\n */\nexport function toMinimalLog(log: ComposerDecisionLog): Omit<ComposerDecisionLog, \"rankings\"> {\n\tconst { rankings: _rankings, ...minimal } = log;\n\treturn minimal;\n}\n\n/**\n * Validate a decision log structure\n *\n * @param log - Log to validate\n * @returns true if valid\n */\nexport function isValidDecisionLog(log: unknown): log is ComposerDecisionLog {\n\tif (!log || typeof log !== \"object\") {\n\t\treturn false;\n\t}\n\n\tconst l = log as Record<string, unknown>;\n\n\treturn (\n\t\ttypeof l.id === \"string\" &&\n\t\ttypeof l.timestamp === \"number\" &&\n\t\ttypeof l.composerVersion === \"string\" &&\n\t\ttypeof l.workspaceFingerprint === \"string\" &&\n\t\ttypeof l.triggerEvent === \"string\" &&\n\t\ttypeof l.candidateCount === \"number\" &&\n\t\tArray.isArray(l.selectedArtifacts) &&\n\t\ttypeof l.totalTokensUsed === \"number\"\n\t);\n}\n\n/**\n * Compare two logs for equality (ignoring timing/cache)\n *\n * @param a - First log\n * @param b - Second log\n * @returns true if selections are equivalent\n */\nexport function logsAreEquivalent(a: ComposerDecisionLog, b: ComposerDecisionLog): boolean {\n\t// Compare selected artifact IDs\n\tconst aIds = a.selectedArtifacts\n\t\t.map((x) => x.id)\n\t\t.sort()\n\t\t.join(\",\");\n\tconst bIds = b.selectedArtifacts\n\t\t.map((x) => x.id)\n\t\t.sort()\n\t\t.join(\",\");\n\n\tif (aIds !== bIds) {\n\t\treturn false;\n\t}\n\n\t// Compare token totals\n\tif (a.totalTokensUsed !== b.totalTokensUsed) {\n\t\treturn false;\n\t}\n\n\t// Compare allocations\n\tfor (const lane of Object.keys(a.budgetAllocation) as Lane[]) {\n\t\tif (a.budgetAllocation[lane] !== b.budgetAllocation[lane]) {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\treturn true;\n}\n","/**\n * Selection Pipeline\n *\n * The core selection algorithm that:\n * 1. Applies exclusions (policy-blocked artifacts)\n * 2. Extracts pinned artifacts (always selected first)\n * 3. Extracts must-include artifacts (after pinned)\n * 4. Scores and ranks remaining candidates\n * 5. Selects within budget constraints\n * 6. Generates explainable results\n *\n * Key guarantee: Deterministic - same inputs → same outputs\n */\n\nimport type { AllocationResult } from \"./allocation.js\";\nimport { allocateMinBudgets, selectWithinBudget } from \"./allocation.js\";\nimport type { BudgetConfig } from \"./budget.js\";\nimport type { ComposerConstraints } from \"./constraints.js\";\nimport { isExcluded, isMustInclude, isPinned } from \"./constraints.js\";\nimport { scoreAndSort } from \"./scoring.js\";\nimport type { ArtifactCandidate, ArtifactRef, Lane, RenderedArtifact } from \"./types.js\";\n\n/**\n * Reason why an artifact was rejected\n */\nexport type RejectionReason = \"excluded_by_policy\" | \"lane_max_reached\" | \"budget_exceeded\" | \"lower_priority\";\n\n/**\n * Record of a rejected artifact with reason\n */\nexport interface RejectionRecord {\n\tartifact: ArtifactRef;\n\treason: RejectionReason;\n\tdetail?: string;\n}\n\n/**\n * Context for selection (used for cache key computation)\n */\nexport interface SelectionContext {\n\t/** Workspace fingerprint for cache keying */\n\tworkspaceFingerprint: string;\n\t/** What triggered this selection */\n\ttriggerEvent: string;\n\t/** Git commit or equivalent */\n\tcommitish: string;\n\t/** Hash of active rules */\n\trulesDigest: string;\n}\n\n/**\n * Selection result (safe for logging/telemetry)\n */\nexport interface SelectionResult {\n\t/** Selected artifact references (IDs only, no content) */\n\tselected: ArtifactRef[];\n\t/** Tokens used per lane */\n\tallocation: Record<Lane, number>;\n\t/** Rejection records for explainability */\n\trejections: RejectionRecord[];\n\t/** Cache key for this selection */\n\tcacheKey: string;\n\t/** Whether this was a cache hit */\n\tcacheHit: boolean;\n\t/** Allocation details (for debugging) */\n\tallocationDetails: AllocationResult;\n\n\t/**\n\t * Rendered artifacts (internal only, filled in render pass)\n\t * Content is never logged externally\n\t */\n\trendered: RenderedArtifact[];\n}\n\n/**\n * Convert an ArtifactCandidate to an ArtifactRef (safe for logging)\n *\n * @param candidate - Full candidate with content\n * @returns Reference without content\n */\nexport function toRef(candidate: ArtifactCandidate): ArtifactRef {\n\treturn {\n\t\tid: candidate.id,\n\t\tkind: candidate.kind,\n\t\tlane: candidate.lane,\n\t\ttokenEstimate: candidate.tokenEstimate,\n\t};\n}\n\n/**\n * Main selection function.\n * Implements the constraint-aware selection pipeline.\n *\n * Algorithm:\n * 1. Apply exclusions (remove policy-blocked)\n * 2. Extract pinned (selected unconditionally)\n * 3. Extract must-include (selected after pinned)\n * 4. Allocate minimum budgets per lane\n * 5. Score and sort remaining candidates\n * 6. Select within budget constraints\n * 7. Generate cache key and result\n *\n * @param candidates - All artifact candidates\n * @param config - Budget configuration\n * @param constraints - Policy constraints\n * @param context - Selection context for cache key\n * @param getPath - Optional function to get artifact paths (for pattern matching)\n * @returns Selection result with selected, rejections, and allocation\n */\nexport function selectArtifacts(\n\tcandidates: ArtifactCandidate[],\n\tconfig: BudgetConfig,\n\tconstraints: ComposerConstraints,\n\tcontext: SelectionContext,\n\tgetPath?: (artifact: ArtifactCandidate) => string | undefined,\n): SelectionResult {\n\t// Track selected by ID (not object identity) - Set<string> for determinism\n\tconst selectedIds = new Set<string>();\n\tconst selected: ArtifactCandidate[] = [];\n\tconst rejections: RejectionRecord[] = [];\n\n\t// =========================================================================\n\t// STEP 1: Apply exclusions\n\t// =========================================================================\n\tconst afterExclude = candidates.filter((c) => {\n\t\tconst exclusion = isExcluded(c, constraints, getPath);\n\t\tif (exclusion) {\n\t\t\trejections.push({\n\t\t\t\tartifact: toRef(c),\n\t\t\t\treason: \"excluded_by_policy\",\n\t\t\t\tdetail: exclusion.reason,\n\t\t\t});\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t});\n\n\t// =========================================================================\n\t// STEP 2: Extract pinned (selected first, unconditionally)\n\t// =========================================================================\n\tfor (const candidate of afterExclude) {\n\t\tconst pinConstraint = isPinned(candidate, constraints, getPath);\n\t\tif (pinConstraint && !selectedIds.has(candidate.id)) {\n\t\t\tselectedIds.add(candidate.id);\n\t\t\tselected.push(candidate);\n\t\t}\n\t}\n\n\t// =========================================================================\n\t// STEP 3: Extract must-include (after pinned)\n\t// =========================================================================\n\tfor (const candidate of afterExclude) {\n\t\tif (selectedIds.has(candidate.id)) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst mustIncludeConstraint = isMustInclude(candidate, constraints, getPath);\n\t\tif (mustIncludeConstraint) {\n\t\t\tselectedIds.add(candidate.id);\n\t\t\tselected.push(candidate);\n\t\t}\n\t}\n\n\t// =========================================================================\n\t// STEP 4: Remaining candidates for scoring\n\t// =========================================================================\n\tconst eligible = afterExclude.filter((c) => !selectedIds.has(c.id));\n\n\t// =========================================================================\n\t// STEP 5: Allocate budgets and score candidates\n\t// =========================================================================\n\tconst allocationDetails = allocateMinBudgets(eligible, config);\n\n\t// Score and sort eligible candidates\n\tconst scored = scoreAndSort(eligible);\n\n\t// =========================================================================\n\t// STEP 6: Select within budget constraints\n\t// =========================================================================\n\tconst budgetResult = selectWithinBudget(\n\t\tscored.map((s) => s.candidate),\n\t\tselected,\n\t\tconfig,\n\t);\n\n\t// Add budget-selected artifacts\n\tfor (const s of budgetResult.selected) {\n\t\tif (!selectedIds.has(s.id)) {\n\t\t\tselectedIds.add(s.id);\n\t\t\tselected.push(s);\n\t\t}\n\t}\n\n\t// Record rejections\n\tfor (const r of budgetResult.rejected) {\n\t\trejections.push({\n\t\t\tartifact: toRef(r.candidate),\n\t\t\treason: r.reason,\n\t\t\tdetail: r.reason === \"lane_max_reached\" ? `${r.candidate.lane} lane at max` : \"Total budget exhausted\",\n\t\t});\n\t}\n\n\t// =========================================================================\n\t// STEP 7: Compute cache key\n\t// =========================================================================\n\tconst cacheKey = computeSelectionCacheKey(candidates, config, constraints, context);\n\n\t// =========================================================================\n\t// STEP 8: Build result\n\t// =========================================================================\n\treturn {\n\t\tselected: selected.map(toRef),\n\t\tallocation: budgetResult.usage,\n\t\trejections,\n\t\tcacheKey,\n\t\tcacheHit: false,\n\t\tallocationDetails,\n\t\trendered: [], // Filled in render pass\n\t};\n}\n\n/**\n * Compute a cache key for the selection inputs.\n * Key is computed BEFORE selection work, not from output.\n *\n * @param candidates - All candidates\n * @param config - Budget configuration\n * @param constraints - Policy constraints\n * @param context - Selection context\n * @returns Cache key string\n */\nfunction computeSelectionCacheKey(\n\tcandidates: ArtifactCandidate[],\n\tconfig: BudgetConfig,\n\tconstraints: ComposerConstraints,\n\tcontext: SelectionContext,\n): string {\n\t// Build cache key components\n\tconst components = [\n\t\tcontext.workspaceFingerprint,\n\t\tcontext.triggerEvent,\n\t\tcontext.commitish,\n\t\tcontext.rulesDigest,\n\t\tconfig.totalTokens.toString(),\n\t\tcandidates.length.toString(),\n\t\t// Include candidate IDs (sorted for determinism)\n\t\t...candidates.map((c) => c.id).sort(),\n\t\t// Include constraint counts\n\t\tconstraints.mustInclude.length.toString(),\n\t\tconstraints.mustExclude.length.toString(),\n\t\tconstraints.pinned.length.toString(),\n\t];\n\n\t// Simple hash for cache key\n\tlet hash = 0;\n\tconst str = components.join(\"|\");\n\tfor (let i = 0; i < str.length; i++) {\n\t\tconst char = str.charCodeAt(i);\n\t\thash = ((hash << 5) - hash + char) | 0;\n\t}\n\n\treturn `sel_${Math.abs(hash).toString(36)}`;\n}\n\n/**\n * Verify that selection is deterministic by running twice\n *\n * @param candidates - All candidates\n * @param config - Budget configuration\n * @param constraints - Policy constraints\n * @param context - Selection context\n * @returns true if both runs produce identical results\n */\nexport function verifySelectionDeterminism(\n\tcandidates: ArtifactCandidate[],\n\tconfig: BudgetConfig,\n\tconstraints: ComposerConstraints,\n\tcontext: SelectionContext,\n): boolean {\n\tconst result1 = selectArtifacts(candidates, config, constraints, context);\n\tconst result2 = selectArtifacts(candidates, config, constraints, context);\n\n\t// Compare selected IDs\n\tconst ids1 = result1.selected.map((s) => s.id).join(\",\");\n\tconst ids2 = result2.selected.map((s) => s.id).join(\",\");\n\n\tif (ids1 !== ids2) {\n\t\treturn false;\n\t}\n\n\t// Compare cache keys\n\tif (result1.cacheKey !== result2.cacheKey) {\n\t\treturn false;\n\t}\n\n\treturn true;\n}\n\n/**\n * Get selection statistics\n *\n * @param result - Selection result\n * @returns Statistics for monitoring\n */\nexport function getSelectionStats(result: SelectionResult): {\n\ttotalSelected: number;\n\ttotalRejected: number;\n\tbyLane: Record<Lane, number>;\n\trejectionsByReason: Record<RejectionReason, number>;\n} {\n\tconst byLane = {} as Record<Lane, number>;\n\tfor (const s of result.selected) {\n\t\tbyLane[s.lane] = (byLane[s.lane] ?? 0) + 1;\n\t}\n\n\tconst rejectionsByReason = {} as Record<RejectionReason, number>;\n\tfor (const r of result.rejections) {\n\t\trejectionsByReason[r.reason] = (rejectionsByReason[r.reason] ?? 0) + 1;\n\t}\n\n\treturn {\n\t\ttotalSelected: result.selected.length,\n\t\ttotalRejected: result.rejections.length,\n\t\tbyLane,\n\t\trejectionsByReason,\n\t};\n}\n","/**\n * Composer - Main Orchestrator\n *\n * The trust core of SnapBack's context assembly system.\n * Provides deterministic, reproducible artifact selection under strict token budgets.\n *\n * Pipeline:\n * 1. Gather candidates from sources\n * 2. Check cache (input-based key)\n * 3. PASS 1: Select using coarse token estimates\n * 4. PASS 2: Render, measure exact tokens, shrink if needed\n * 5. Emit decision log for replay\n * 6. Return result with explanation\n *\n * Guarantees:\n * - Determinism: Same inputs → Same outputs\n * - Budget compliance: Never exceeds allocated tokens\n * - Explainability: Every decision logged with reason\n * - Privacy: Artifact IDs are path-free (HMAC-based)\n */\n\nimport type { BudgetConfig } from \"./budget.js\";\nimport { DEFAULT_BUDGET_CONFIG, validateBudgetConfig } from \"./budget.js\";\nimport { buildCacheKeyInputs, CACHE_TTL_MS, computeCacheKey, SelectionCache } from \"./cache.js\";\nimport type { ComposerConstraints } from \"./constraints.js\";\nimport { EMPTY_CONSTRAINTS } from \"./constraints.js\";\nimport { buildExplanation, type SelectionExplanation, withCacheHit } from \"./explainability.js\";\nimport { generateWorkspaceSecret } from \"./fingerprint.js\";\nimport { getTotalTokens, renderArtifacts, shrinkToFit } from \"./rendering.js\";\nimport { type ComposerDecisionLog, emitDecisionLog } from \"./replay.js\";\nimport { scoreAndSort } from \"./scoring.js\";\nimport { selectArtifacts, toRef } from \"./selection.js\";\nimport type { ArtifactCandidate, ArtifactRef, ArtifactSource, Lane, RenderedArtifact, TokenCounter } from \"./types.js\";\nimport { defaultTokenCounter } from \"./types.js\";\n\n/**\n * Composer configuration options\n */\nexport interface ComposerOptions {\n\t/** Budget configuration (defaults to DEFAULT_BUDGET_CONFIG) */\n\tbudgetConfig?: BudgetConfig;\n\t/** Artifact sources to gather candidates from */\n\tsources?: ArtifactSource[];\n\t/** Cache TTL in milliseconds (defaults to 5 minutes) */\n\tcacheTtlMs?: number;\n\t/** Token counter function (defaults to char/4 approximation) */\n\ttokenCounter?: TokenCounter;\n\t/** Workspace secret for HMAC-based artifact IDs */\n\tworkspaceSecret?: string;\n\t/** Whether to emit decision logs */\n\temitDecisionLogs?: boolean;\n}\n\n/**\n * Trigger for composition\n */\nexport interface ComposeTrigger {\n\t/** What triggered this composition */\n\tevent: string;\n\t/** Workspace fingerprint for cache keying */\n\tworkspaceFingerprint: string;\n\t/** Git commit or equivalent */\n\tcommitish?: string;\n\t/** Keywords for relevance scoring */\n\tkeywords?: string[];\n\t/** Files currently being edited */\n\tfiles?: string[];\n}\n\n/**\n * Complete composition result\n */\nexport interface CompositionResult {\n\t/** Selected artifact references (safe for logging) */\n\tselected: ArtifactRef[];\n\t/** Token allocation by lane */\n\tallocation: Record<Lane, number>;\n\t/** Human-readable explanation */\n\texplanation: SelectionExplanation;\n\t/** Cache key for this composition */\n\tcacheKey: string;\n\t/** Whether this was a cache hit */\n\tcacheHit: boolean;\n\t/** Actual token count after rendering */\n\tactualTokens: number;\n\t/** Rendered artifacts (internal use only) */\n\trendered: RenderedArtifact[];\n\t/** Decision log (if emitDecisionLogs is true) */\n\tdecisionLog?: ComposerDecisionLog;\n}\n\n/**\n * Resolved composer configuration\n */\ninterface ResolvedConfig {\n\tbudgetConfig: BudgetConfig;\n\tsources: ArtifactSource[];\n\tcacheTtlMs: number;\n\ttokenCounter: TokenCounter;\n\tworkspaceSecret: string;\n\temitDecisionLogs: boolean;\n}\n\n/**\n * Main Composer class.\n * Orchestrates the two-pass selection + rendering pipeline.\n */\nexport class Composer {\n\tprivate config: ResolvedConfig;\n\tprivate cache: SelectionCache<CompositionResult>;\n\tprivate rulesDigest = \"\";\n\n\tconstructor(options: ComposerOptions = {}) {\n\t\tthis.config = this.resolveConfig(options);\n\n\t\t// Validate budget config on construction\n\t\tvalidateBudgetConfig(this.config.budgetConfig);\n\n\t\t// Initialize cache\n\t\tthis.cache = new SelectionCache(this.config.cacheTtlMs);\n\t}\n\n\t/**\n\t * Main entry point: compose context for a trigger.\n\t *\n\t * @param trigger - What triggered this composition\n\t * @param constraints - Policy constraints (optional)\n\t * @returns Composition result with selected artifacts\n\t */\n\tasync compose(\n\t\ttrigger: ComposeTrigger,\n\t\tconstraints: ComposerConstraints = EMPTY_CONSTRAINTS,\n\t): Promise<CompositionResult> {\n\t\tconst startTime = Date.now();\n\n\t\t// =========================================================================\n\t\t// STEP 1: Gather candidates from all sources\n\t\t// =========================================================================\n\t\tconst candidates = await this.gatherCandidates(trigger);\n\n\t\t// =========================================================================\n\t\t// STEP 2: Build context for cache key\n\t\t// =========================================================================\n\t\tconst context = {\n\t\t\tworkspaceFingerprint: trigger.workspaceFingerprint,\n\t\t\ttriggerEvent: trigger.event,\n\t\t\tcommitish: trigger.commitish ?? \"HEAD\",\n\t\t\trulesDigest: this.rulesDigest,\n\t\t};\n\n\t\t// =========================================================================\n\t\t// STEP 3: Check cache\n\t\t// =========================================================================\n\t\tconst cacheKeyInputs = buildCacheKeyInputs(\n\t\t\tcandidates,\n\t\t\tconstraints,\n\t\t\tthis.config.budgetConfig as unknown as Record<string, unknown>,\n\t\t\tcontext,\n\t\t);\n\t\tconst cacheKey = computeCacheKey(cacheKeyInputs);\n\n\t\tconst cached = this.cache.get(cacheKey);\n\t\tif (cached) {\n\t\t\treturn {\n\t\t\t\t...cached,\n\t\t\t\tcacheHit: true,\n\t\t\t\texplanation: withCacheHit(cached.explanation, true),\n\t\t\t};\n\t\t}\n\n\t\t// =========================================================================\n\t\t// STEP 4: PASS 1 - Select using coarse estimates\n\t\t// =========================================================================\n\t\tconst selection = selectArtifacts(candidates, this.config.budgetConfig, constraints, context);\n\n\t\t// =========================================================================\n\t\t// STEP 5: PASS 2 - Render and measure actual tokens\n\t\t// =========================================================================\n\t\tconst rendered = renderArtifacts(selection.selected, candidates, this.config.tokenCounter);\n\n\t\t// =========================================================================\n\t\t// STEP 6: Measure actual tokens\n\t\t// =========================================================================\n\t\tlet actualTotal = getTotalTokens(rendered);\n\n\t\t// =========================================================================\n\t\t// STEP 7: If over budget, shrink\n\t\t// =========================================================================\n\t\tlet finalRendered = rendered;\n\t\tif (actualTotal > this.config.budgetConfig.totalTokens) {\n\t\t\tfinalRendered = shrinkToFit(rendered, this.config.budgetConfig.totalTokens, this.config.tokenCounter);\n\t\t\tactualTotal = getTotalTokens(finalRendered);\n\t\t}\n\n\t\t// =========================================================================\n\t\t// STEP 8: Build explanation\n\t\t// =========================================================================\n\t\tconst selectedCandidates = candidates.filter((c) => selection.selected.some((s) => s.id === c.id));\n\n\t\tconst explanation = buildExplanation(\n\t\t\tselectedCandidates,\n\t\t\tselection.rejections,\n\t\t\tselection.allocation,\n\t\t\tthis.config.budgetConfig,\n\t\t\tselection.allocationDetails.shortfalls,\n\t\t\t{\n\t\t\t\tpinned: constraints.pinned.length,\n\t\t\t\tmustInclude: constraints.mustInclude.length,\n\t\t\t\texcluded: constraints.mustExclude.length,\n\t\t\t},\n\t\t);\n\n\t\t// =========================================================================\n\t\t// STEP 9: Build result\n\t\t// =========================================================================\n\t\tconst result: CompositionResult = {\n\t\t\tselected: selection.selected,\n\t\t\tallocation: selection.allocation,\n\t\t\texplanation,\n\t\t\tcacheKey,\n\t\t\tcacheHit: false,\n\t\t\tactualTokens: actualTotal,\n\t\t\trendered: finalRendered,\n\t\t};\n\n\t\t// =========================================================================\n\t\t// STEP 10: Emit decision log\n\t\t// =========================================================================\n\t\tif (this.config.emitDecisionLogs) {\n\t\t\tconst rankings = scoreAndSort(candidates).map((sc) => ({\n\t\t\t\tartifact: toRef(sc.candidate),\n\t\t\t\tscore: sc.score,\n\t\t\t\tselected: selection.selected.some((s) => s.id === sc.candidate.id),\n\t\t\t\trejectionReason: selection.rejections.find((r) => r.artifact.id === sc.candidate.id)?.reason,\n\t\t\t}));\n\n\t\t\tresult.decisionLog = emitDecisionLog({\n\t\t\t\tresult: {\n\t\t\t\t\tselected: result.selected,\n\t\t\t\t\tallocation: result.allocation,\n\t\t\t\t\tcacheKey: result.cacheKey,\n\t\t\t\t\tcacheHit: result.cacheHit,\n\t\t\t\t\tactualTokens: result.actualTokens,\n\t\t\t\t},\n\t\t\t\ttrigger,\n\t\t\t\tconstraints,\n\t\t\t\tcandidates,\n\t\t\t\tbudgetConfig: this.config.budgetConfig as unknown as Record<string, unknown>,\n\t\t\t\trankings,\n\t\t\t\tstartTime,\n\t\t\t});\n\t\t}\n\n\t\t// =========================================================================\n\t\t// STEP 11: Cache result\n\t\t// =========================================================================\n\t\tthis.cache.set(cacheKey, result);\n\n\t\treturn result;\n\t}\n\n\t/**\n\t * Compose with explicit candidates (for testing)\n\t */\n\tasync composeWithCandidates(\n\t\tcandidates: ArtifactCandidate[],\n\t\ttrigger: ComposeTrigger,\n\t\tconstraints: ComposerConstraints = EMPTY_CONSTRAINTS,\n\t): Promise<CompositionResult> {\n\t\t// Store candidates temporarily as a source\n\t\tconst tempSource: ArtifactSource = {\n\t\t\tgenerateCandidates: async () => candidates,\n\t\t};\n\n\t\tconst originalSources = this.config.sources;\n\t\tthis.config.sources = [tempSource];\n\n\t\ttry {\n\t\t\treturn await this.compose(trigger, constraints);\n\t\t} finally {\n\t\t\tthis.config.sources = originalSources;\n\t\t}\n\t}\n\n\t/**\n\t * Get the current configuration\n\t */\n\tgetConfig(): BudgetConfig {\n\t\treturn this.config.budgetConfig;\n\t}\n\n\t/**\n\t * Update the rules digest (invalidates cache)\n\t */\n\tsetRulesDigest(digest: string): void {\n\t\tthis.rulesDigest = digest;\n\t\tthis.cache.clear();\n\t}\n\n\t/**\n\t * Clear the cache\n\t */\n\tclearCache(): void {\n\t\tthis.cache.clear();\n\t}\n\n\t/**\n\t * Get cache statistics\n\t */\n\tgetCacheStats(): { size: number; hitRate: number } {\n\t\treturn this.cache.getStats();\n\t}\n\n\t/**\n\t * Get the workspace secret\n\t */\n\tgetWorkspaceSecret(): string {\n\t\treturn this.config.workspaceSecret;\n\t}\n\n\t/**\n\t * Gather candidates from all configured sources\n\t */\n\tprivate async gatherCandidates(trigger: ComposeTrigger): Promise<ArtifactCandidate[]> {\n\t\tconst allCandidates: ArtifactCandidate[] = [];\n\n\t\tfor (const source of this.config.sources) {\n\t\t\tconst candidates = await source.generateCandidates(trigger, this.config.workspaceSecret);\n\t\t\tallCandidates.push(...candidates);\n\t\t}\n\n\t\treturn allCandidates;\n\t}\n\n\t/**\n\t * Resolve configuration with defaults\n\t */\n\tprivate resolveConfig(options: ComposerOptions): ResolvedConfig {\n\t\treturn {\n\t\t\tbudgetConfig: options.budgetConfig ?? DEFAULT_BUDGET_CONFIG,\n\t\t\tsources: options.sources ?? [],\n\t\t\tcacheTtlMs: options.cacheTtlMs ?? CACHE_TTL_MS,\n\t\t\ttokenCounter: options.tokenCounter ?? defaultTokenCounter,\n\t\t\tworkspaceSecret: options.workspaceSecret ?? generateWorkspaceSecret(),\n\t\t\temitDecisionLogs: options.emitDecisionLogs ?? false,\n\t\t};\n\t}\n}\n\n/**\n * Create a composer with default configuration\n */\nexport function createComposer(options?: ComposerOptions): Composer {\n\treturn new Composer(options);\n}\n\n/**\n * Create a mock artifact candidate for testing\n */\nexport function createMockCandidate(params: {\n\tid: string;\n\tkind: ArtifactCandidate[\"kind\"];\n\tlane: Lane;\n\tcontent: string;\n\ttokenEstimate?: number;\n\trecencyBucket?: number;\n\trelevanceScore?: number;\n\tspecificityScore?: number;\n\triskAlignment?: number;\n}): ArtifactCandidate {\n\tconst tokenEstimate = params.tokenEstimate ?? Math.ceil(params.content.length / 4);\n\n\treturn {\n\t\tid: params.id,\n\t\tkind: params.kind,\n\t\tlane: params.lane,\n\t\ttokenEstimate,\n\t\trecencyBucket: params.recencyBucket ?? 3,\n\t\trelevanceScore: params.relevanceScore ?? 0.5,\n\t\tspecificityScore: params.specificityScore ?? 0.5,\n\t\triskAlignment: params.riskAlignment ?? 0.5,\n\t\tgetContent: () => params.content,\n\t\tshrink: (targetTokens: number) => ({\n\t\t\tid: params.id,\n\t\t\tkind: params.kind,\n\t\t\tlane: params.lane,\n\t\t\tcontent: params.content.slice(0, targetTokens * 4),\n\t\t\texactTokenCount: targetTokens,\n\t\t\tshrunk: true,\n\t\t\toriginalTokenCount: tokenEstimate,\n\t\t\tshrinkStrategy: \"truncate_oldest\",\n\t\t}),\n\t};\n}\n","/**\n * Confidence Calculator\n *\n * Calculates honest confidence scores based on analyzer results.\n * Follows the principle: \"If you can't prove it's safe, don't say it is.\"\n *\n * Key differences from the old arbitrary 0.95 approach:\n * - Confidence is capped by what was actually analyzed\n * - Critical issues cause dramatic confidence drops\n * - Incomplete analysis means lower confidence ceiling\n *\n * @module confidence/ConfidenceCalculator\n */\n\nimport type { AnalyzerResult, ConfidenceResult, CoverageInfo, Severity } from \"@snapback/core\";\nimport { applyAdditivePenalties, calculateWeightedScore, clampScore } from \"@snapback/core\";\n\n/**\n * Weight assigned to each analyzer for confidence calculation\n */\nconst ANALYZER_WEIGHTS: Record<string, number> = {\n\tsyntax: 0.15, // Basic parsing is essential\n\ttypes: 0.05, // Type safety is nice but not critical for merge decision\n\tsecurity: 0.25, // Security is high priority\n\t\"eslint-security\": 0.1, // Additional security rules\n\tbiome: 0.1, // Lint quality\n\t\"circular-deps\": 0.05, // Architecture quality\n\t\"duplicate-code\": 0.05, // Code quality\n\tcompleteness: 0.1, // Code completeness\n\tdependencies: 0.1, // Dependency health\n\t\"domain-patterns\": 0.05, // Domain-specific patterns\n};\n\n/**\n * Penalty applied per issue by severity\n */\nconst SEVERITY_PENALTIES: Record<Severity, number> = {\n\tcritical: 0.25, // Each critical issue reduces confidence by 25%\n\thigh: 0.1, // High issues are significant\n\tmedium: 0.02, // Medium issues add up\n\tlow: 0.005, // Low issues are minor\n\tinfo: 0, // Info doesn't affect confidence\n};\n\n/**\n * Maximum confidence based on coverage gaps\n */\nconst COVERAGE_CAPS = {\n\tnoAST: 0.2, // Without AST parsing, we can only be 20% confident\n\tnoSecurity: 0.5, // Without security analysis, cap at 50%\n\tnoCompleteness: 0.7, // Without completeness check, cap at 70%\n\tnoArchitecture: 0.8, // Without architecture check, cap at 80%\n\tfull: 1.0, // Full analysis can achieve 100%\n};\n\n/**\n * Review recommendation type\n */\nexport type ReviewRecommendation = \"manual_review_required\" | \"review_recommended\" | \"auto_merge_candidate\";\n\n/**\n * Confidence thresholds for recommendations\n */\nconst RECOMMENDATION_THRESHOLDS = {\n\tautoMerge: 0.6, // Lowered from 0.95 - honest analysis rarely hits this\n\tquickReview: 0.3, // Lowered - most code needs review\n};\n\n/**\n * Calculates honest confidence scores based on analysis results\n */\nexport class ConfidenceCalculator {\n\t/**\n\t * Calculate confidence from analyzer results\n\t */\n\tcalculate(analyzerResults: AnalyzerResult[], coverage: CoverageInfo): ConfidenceResult {\n\t\t// Build signals and weights for weighted scoring\n\t\tconst signals: Record<string, number> = {};\n\t\tconst breakdown: Record<string, number> = {};\n\n\t\tfor (const result of analyzerResults) {\n\t\t\tconst score = result.success ? result.coverage : 0;\n\t\t\tsignals[result.analyzer] = score;\n\t\t\tbreakdown[result.analyzer] = score;\n\t\t}\n\n\t\t// Calculate base confidence using shared utility\n\t\tlet confidence = calculateWeightedScore(signals, ANALYZER_WEIGHTS);\n\n\t\t// Apply additive penalties for issues using shared utility\n\t\tconst penalties: number[] = [];\n\t\tfor (const result of analyzerResults) {\n\t\t\tfor (const issue of result.issues) {\n\t\t\t\tconst penalty = SEVERITY_PENALTIES[issue.severity] ?? 0;\n\t\t\t\tpenalties.push(penalty);\n\t\t\t}\n\t\t}\n\t\tconfidence = applyAdditivePenalties(confidence, penalties, 0);\n\n\t\t// Cap confidence based on coverage gaps\n\t\tconst maxPossibleConfidence = this.calculateMaxConfidence(coverage);\n\t\tconfidence = clampScore(confidence, 0, maxPossibleConfidence);\n\n\t\t// Round to 2 decimal places\n\t\tconfidence = Math.round(confidence * 100) / 100;\n\n\t\treturn {\n\t\t\tconfidence,\n\t\t\tbreakdown,\n\t\t\texplanation: this.generateExplanation(confidence, coverage, analyzerResults),\n\t\t\tmaxPossibleConfidence,\n\t\t};\n\t}\n\n\t/**\n\t * Get review recommendation based on confidence\n\t */\n\tgetRecommendation(confidenceResult: ConfidenceResult, hasCriticalIssues: boolean): ReviewRecommendation {\n\t\t// Critical issues always require manual review\n\t\tif (hasCriticalIssues) {\n\t\t\treturn \"manual_review_required\";\n\t\t}\n\n\t\tconst { confidence } = confidenceResult;\n\n\t\tif (confidence >= RECOMMENDATION_THRESHOLDS.autoMerge) {\n\t\t\treturn \"auto_merge_candidate\";\n\t\t}\n\n\t\tif (confidence >= RECOMMENDATION_THRESHOLDS.quickReview) {\n\t\t\treturn \"review_recommended\";\n\t\t}\n\n\t\treturn \"manual_review_required\";\n\t}\n\n\t/**\n\t * Calculate maximum possible confidence based on coverage\n\t */\n\tprivate calculateMaxConfidence(coverage: CoverageInfo): number {\n\t\t// Start with minimum possible\n\t\tlet maxConfidence = COVERAGE_CAPS.full;\n\n\t\t// If no AST parsing, we can't trust much\n\t\tif (!coverage.astParsed) {\n\t\t\tmaxConfidence = Math.min(maxConfidence, COVERAGE_CAPS.noAST);\n\t\t}\n\n\t\t// If no security analysis, cap confidence\n\t\tif (!coverage.securityChecked) {\n\t\t\tmaxConfidence = Math.min(maxConfidence, COVERAGE_CAPS.noSecurity);\n\t\t}\n\n\t\t// If no completeness check, cap confidence\n\t\tif (!coverage.completenessChecked) {\n\t\t\tmaxConfidence = Math.min(maxConfidence, COVERAGE_CAPS.noCompleteness);\n\t\t}\n\n\t\t// If no architecture check, cap confidence\n\t\tif (!coverage.architectureChecked) {\n\t\t\tmaxConfidence = Math.min(maxConfidence, COVERAGE_CAPS.noArchitecture);\n\t\t}\n\n\t\t// Also cap based on file coverage\n\t\tmaxConfidence = Math.min(maxConfidence, coverage.filesCoverage);\n\n\t\treturn maxConfidence;\n\t}\n\n\t/**\n\t * Generate human-readable explanation\n\t */\n\tprivate generateExplanation(confidence: number, coverage: CoverageInfo, results: AnalyzerResult[]): string {\n\t\tconst parts: string[] = [];\n\n\t\t// Overall confidence statement\n\t\tif (confidence < 0.3) {\n\t\t\tparts.push(`Low confidence (${Math.round(confidence * 100)}%): Manual review required.`);\n\t\t} else if (confidence < 0.6) {\n\t\t\tparts.push(`Moderate confidence (${Math.round(confidence * 100)}%): Review recommended.`);\n\t\t} else {\n\t\t\tparts.push(`Good confidence (${Math.round(confidence * 100)}%): Auto-merge candidate.`);\n\t\t}\n\n\t\t// Coverage gaps\n\t\tconst gaps: string[] = [];\n\t\tif (!coverage.astParsed) {\n\t\t\tgaps.push(\"AST parsing failed\");\n\t\t}\n\t\tif (!coverage.securityChecked) {\n\t\t\tgaps.push(\"security not analyzed\");\n\t\t}\n\t\tif (!coverage.completenessChecked) {\n\t\t\tgaps.push(\"completeness not checked\");\n\t\t}\n\t\tif (!coverage.architectureChecked) {\n\t\t\tgaps.push(\"architecture not validated\");\n\t\t}\n\n\t\tif (gaps.length > 0) {\n\t\t\tparts.push(`Coverage gaps: ${gaps.join(\", \")}.`);\n\t\t}\n\n\t\t// Issue summary\n\t\tconst totalIssues = results.reduce((sum, r) => sum + r.issues.length, 0);\n\t\tconst criticalIssues = results.flatMap((r) => r.issues).filter((i) => i.severity === \"critical\").length;\n\t\tconst highIssues = results.flatMap((r) => r.issues).filter((i) => i.severity === \"high\").length;\n\n\t\tif (criticalIssues > 0 || highIssues > 0) {\n\t\t\tparts.push(`Issues: ${criticalIssues} critical, ${highIssues} high, ${totalIssues} total.`);\n\t\t} else if (totalIssues > 0) {\n\t\t\tparts.push(`Found ${totalIssues} issues (none critical).`);\n\t\t} else {\n\t\t\tparts.push(\"No issues detected.\");\n\t\t}\n\n\t\treturn parts.join(\" \");\n\t}\n\n\t/**\n\t * Build coverage info from analyzer results\n\t */\n\tstatic buildCoverageInfo(results: AnalyzerResult[]): CoverageInfo {\n\t\tconst analyzerIds = new Set(results.map((r) => r.analyzer));\n\t\tconst avgCoverage = results.length > 0 ? results.reduce((sum, r) => sum + r.coverage, 0) / results.length : 0;\n\n\t\treturn {\n\t\t\tastParsed: analyzerIds.has(\"syntax\") && results.find((r) => r.analyzer === \"syntax\")?.success === true,\n\t\t\tsecurityChecked:\n\t\t\t\tanalyzerIds.has(\"security\") && results.find((r) => r.analyzer === \"security\")?.success === true,\n\t\t\tcompletenessChecked:\n\t\t\t\tanalyzerIds.has(\"completeness\") && results.find((r) => r.analyzer === \"completeness\")?.success === true,\n\t\t\tarchitectureChecked:\n\t\t\t\tanalyzerIds.has(\"architecture\") && results.find((r) => r.analyzer === \"architecture\")?.success === true,\n\t\t\tfilesCoverage: avgCoverage,\n\t\t};\n\t}\n}\n","/**\n * Context Engine\n *\n * Assembles relevant context for tasks from:\n * - Architecture documentation\n * - Constraints and rules\n * - Codebase patterns\n * - Recent violations\n * - Relevant learnings\n *\n * Uses keyword matching for fast retrieval.\n * Optional: semantic search when enableSemanticSearch is true.\n */\n\nimport * as path from \"node:path\";\nimport type { ConfigStore } from \"../storage/ConfigStore.js\";\nimport { loadJsonl } from \"../storage/JsonlStore.js\";\nimport type { ResolvedConfig } from \"../types/config.js\";\nimport type { ContextInput, ContextResult, Learning, Violation } from \"../types/index.js\";\n\n/**\n * Context Engine for intelligent context assembly\n */\nexport class ContextEngine {\n\tprivate config: ResolvedConfig;\n\tprivate configStore: ConfigStore;\n\tprivate initialized = false;\n\n\tconstructor(config: ResolvedConfig, configStore: ConfigStore) {\n\t\tthis.config = config;\n\t\tthis.configStore = configStore;\n\t}\n\n\t/**\n\t * Initialize async resources (embeddings, database)\n\t * Only needed when semantic search is enabled\n\t */\n\tasync initialize(): Promise<void> {\n\t\tif (this.initialized) {\n\t\t\treturn;\n\t\t}\n\n\t\t// For now, just mark as initialized\n\t\t// Semantic search initialization would go here\n\t\tthis.initialized = true;\n\t}\n\n\t/**\n\t * Get relevant context for a task\n\t * Primary entry point - used before implementing anything\n\t */\n\tasync getContext(params: ContextInput): Promise<ContextResult> {\n\t\tconst { task, files = [], keywords = [] } = params;\n\n\t\t// Extract keywords from task if none provided\n\t\tconst effectiveKeywords = keywords.length > 0 ? keywords : this.extractKeywords(task);\n\n\t\t// Load context sections\n\t\tconst architecture = this.configStore.loadArchitecture();\n\t\tconst constraints = this.configStore.loadConstraints();\n\t\tconst patterns = this.configStore.loadPatterns();\n\n\t\t// Filter to relevant sections\n\t\tconst contextSections = this.filterRelevantSections([architecture, patterns].join(\"\\n\\n\"), effectiveKeywords);\n\n\t\t// Get hard rules (always include)\n\t\tconst hardRules = this.extractHardRules(constraints);\n\n\t\t// Load recent violations\n\t\tconst recentViolations = this.getRecentViolations(effectiveKeywords, files);\n\n\t\t// Load relevant learnings\n\t\tconst relevantLearnings = this.getRelevantLearnings(effectiveKeywords);\n\n\t\treturn {\n\t\t\ttask,\n\t\t\tcontextSections,\n\t\t\thardRules,\n\t\t\tpatterns,\n\t\t\trecentViolations,\n\t\t\trelevantLearnings,\n\t\t\thint: this.generateHint(recentViolations.length, relevantLearnings.length),\n\t\t};\n\t}\n\n\t/**\n\t * Extract keywords from a task description\n\t */\n\tprivate extractKeywords(task: string): string[] {\n\t\tconst stopWords = new Set([\n\t\t\t\"the\",\n\t\t\t\"a\",\n\t\t\t\"an\",\n\t\t\t\"is\",\n\t\t\t\"are\",\n\t\t\t\"was\",\n\t\t\t\"were\",\n\t\t\t\"be\",\n\t\t\t\"been\",\n\t\t\t\"being\",\n\t\t\t\"have\",\n\t\t\t\"has\",\n\t\t\t\"had\",\n\t\t\t\"do\",\n\t\t\t\"does\",\n\t\t\t\"did\",\n\t\t\t\"will\",\n\t\t\t\"would\",\n\t\t\t\"could\",\n\t\t\t\"should\",\n\t\t\t\"may\",\n\t\t\t\"might\",\n\t\t\t\"must\",\n\t\t\t\"shall\",\n\t\t\t\"can\",\n\t\t\t\"need\",\n\t\t\t\"to\",\n\t\t\t\"of\",\n\t\t\t\"in\",\n\t\t\t\"for\",\n\t\t\t\"on\",\n\t\t\t\"with\",\n\t\t\t\"at\",\n\t\t\t\"by\",\n\t\t\t\"from\",\n\t\t\t\"as\",\n\t\t\t\"into\",\n\t\t\t\"through\",\n\t\t\t\"during\",\n\t\t\t\"before\",\n\t\t\t\"after\",\n\t\t\t\"above\",\n\t\t\t\"below\",\n\t\t\t\"between\",\n\t\t\t\"under\",\n\t\t\t\"again\",\n\t\t\t\"further\",\n\t\t\t\"then\",\n\t\t\t\"once\",\n\t\t\t\"here\",\n\t\t\t\"there\",\n\t\t\t\"when\",\n\t\t\t\"where\",\n\t\t\t\"why\",\n\t\t\t\"how\",\n\t\t\t\"all\",\n\t\t\t\"each\",\n\t\t\t\"few\",\n\t\t\t\"more\",\n\t\t\t\"most\",\n\t\t\t\"other\",\n\t\t\t\"some\",\n\t\t\t\"such\",\n\t\t\t\"no\",\n\t\t\t\"nor\",\n\t\t\t\"not\",\n\t\t\t\"only\",\n\t\t\t\"own\",\n\t\t\t\"same\",\n\t\t\t\"so\",\n\t\t\t\"than\",\n\t\t\t\"too\",\n\t\t\t\"very\",\n\t\t\t\"just\",\n\t\t\t\"and\",\n\t\t\t\"but\",\n\t\t\t\"if\",\n\t\t\t\"or\",\n\t\t\t\"because\",\n\t\t\t\"until\",\n\t\t\t\"while\",\n\t\t\t\"this\",\n\t\t\t\"that\",\n\t\t\t\"these\",\n\t\t\t\"those\",\n\t\t\t\"i\",\n\t\t\t\"me\",\n\t\t\t\"my\",\n\t\t\t\"we\",\n\t\t\t\"our\",\n\t\t\t\"you\",\n\t\t\t\"your\",\n\t\t\t\"it\",\n\t\t\t\"its\",\n\t\t]);\n\n\t\treturn task\n\t\t\t.toLowerCase()\n\t\t\t.split(/\\W+/)\n\t\t\t.filter((word) => word.length > 2 && !stopWords.has(word))\n\t\t\t.slice(0, 10);\n\t}\n\n\t/**\n\t * Filter content to relevant sections based on keywords\n\t */\n\tprivate filterRelevantSections(content: string, keywords: string[]): string {\n\t\tconst sections = content.split(/(?=## )/);\n\t\tconst lowerKeywords = keywords.map((k) => k.toLowerCase());\n\n\t\tconst relevantSections = sections.filter((section) => {\n\t\t\tconst lowerSection = section.toLowerCase();\n\t\t\treturn lowerKeywords.some((kw) => lowerSection.includes(kw));\n\t\t});\n\n\t\t// If no relevant sections found, return first few sections as fallback\n\t\tif (relevantSections.length === 0) {\n\t\t\treturn sections.slice(0, 3).join(\"\\n\");\n\t\t}\n\n\t\treturn relevantSections.join(\"\\n\");\n\t}\n\n\t/**\n\t * Extract hard rules from constraints\n\t */\n\tprivate extractHardRules(constraints: string): string {\n\t\t// Find the \"Hard Rules\" section\n\t\tconst hardRulesMatch = constraints.match(/## Hard Rules[\\s\\S]*?(?=## |$)/i);\n\t\treturn hardRulesMatch ? hardRulesMatch[0] : \"\";\n\t}\n\n\t/**\n\t * Get recent violations relevant to keywords/files\n\t */\n\tprivate getRecentViolations(\n\t\tkeywords: string[],\n\t\tfiles: string[],\n\t): Array<{ type: string; file: string; message: string; timestamp: string; prevention?: string }> {\n\t\tconst violationsPath = path.join(this.config.rootDir, this.config.violationsFile);\n\t\tconst violations = loadJsonl<Violation>(violationsPath);\n\n\t\tconst lowerKeywords = keywords.map((k) => k.toLowerCase());\n\n\t\treturn violations\n\t\t\t.filter((v) => {\n\t\t\t\t// Match by file\n\t\t\t\tif (files.some((f) => v.file.includes(f))) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\t// Match by keyword in type or message\n\t\t\t\tconst text = `${v.type} ${v.whatHappened}`.toLowerCase();\n\t\t\t\treturn lowerKeywords.some((kw) => text.includes(kw));\n\t\t\t})\n\t\t\t.slice(-5)\n\t\t\t.map((v) => ({\n\t\t\t\ttype: v.type,\n\t\t\t\tfile: v.file,\n\t\t\t\tmessage: v.whatHappened,\n\t\t\t\ttimestamp: v.timestamp,\n\t\t\t\tprevention: v.prevention,\n\t\t\t}));\n\t}\n\n\t/**\n\t * Get learnings relevant to keywords\n\t */\n\tprivate getRelevantLearnings(keywords: string[]): Array<{ trigger: string; action: string; type: string }> {\n\t\tconst learningsPath = path.join(this.config.rootDir, this.config.learningsDir, \"learnings.jsonl\");\n\t\tconst learnings = loadJsonl<Learning>(learningsPath);\n\n\t\tconst lowerKeywords = keywords.map((k) => k.toLowerCase());\n\n\t\treturn learnings\n\t\t\t.filter((l) => {\n\t\t\t\tconst triggers = Array.isArray(l.trigger) ? l.trigger : [l.trigger];\n\t\t\t\tconst text = [...triggers, l.action].join(\" \").toLowerCase();\n\t\t\t\treturn lowerKeywords.some((kw) => text.includes(kw));\n\t\t\t})\n\t\t\t.slice(-5)\n\t\t\t.map((l) => ({\n\t\t\t\ttrigger: Array.isArray(l.trigger) ? l.trigger.join(\", \") : l.trigger,\n\t\t\t\taction: l.action,\n\t\t\t\ttype: l.type,\n\t\t\t}));\n\t}\n\n\t/**\n\t * Generate a contextual hint based on findings\n\t */\n\tprivate generateHint(violationCount: number, learningCount: number): string {\n\t\tif (violationCount > 0 && learningCount > 0) {\n\t\t\treturn \"Review violations and learnings before implementing. These are patterns learned from past mistakes.\";\n\t\t}\n\t\tif (violationCount > 0) {\n\t\t\treturn \"Recent violations found for this area. Review before proceeding.\";\n\t\t}\n\t\tif (learningCount > 0) {\n\t\t\treturn \"Relevant learnings found. Apply these patterns.\";\n\t\t}\n\t\treturn \"No specific patterns found. Check CONSTRAINTS.md for rules.\";\n\t}\n\n\t/**\n\t * Dispose resources\n\t */\n\tasync dispose(): Promise<void> {\n\t\t// Clean up any resources (embeddings database, etc.)\n\t\tthis.initialized = false;\n\t}\n}\n","/**\n * Semantic Context Retriever\n *\n * Provides 88% token reduction via semantic search:\n * - Local embeddings using @huggingface/transformers (no API cost)\n * - SQLite database for section embeddings (sql.js)\n * - Returns only relevant context sections within token budget\n *\n * Dependencies are optional - gracefully degrades if not available.\n *\n * @example\n * ```typescript\n * const retriever = new SemanticRetriever({ rootDir: \"/project\" });\n * await retriever.initialize();\n * await retriever.indexContextFiles();\n * const result = await retriever.getRelevantContext(\"authentication\", 2000);\n * ```\n */\n\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\n\nimport type { IndexStatus, ScoredSection, SearchResult, Section } from \"../types/context.js\";\n\n// Optional dependencies - loaded dynamically\ntype FeatureExtractionPipeline = (\n\ttext: string,\n\toptions?: { pooling?: string; normalize?: boolean },\n) => Promise<{ data: Float32Array }>;\n\ninterface SemanticRetrieverConfig {\n\t/** Root directory containing context files */\n\trootDir: string;\n\t/** Path to embeddings database (relative to rootDir or absolute) */\n\tdbPath?: string;\n\t/** Files to index for semantic search */\n\tcontextFiles?: string[];\n}\n\nconst DEFAULT_CONTEXT_FILES = [\"ARCHITECTURE.md\", \"CONSTRAINTS.md\", \"ROUTER.md\", \"patterns/codebase-patterns.md\"];\n\n/**\n * Semantic Context Retriever\n *\n * Uses local embeddings to find and return only relevant context sections,\n * dramatically reducing token usage while maintaining context quality.\n */\nexport class SemanticRetriever {\n\tprivate embedder: FeatureExtractionPipeline | null = null;\n\tprivate db: any = null;\n\tprivate initialized = false;\n\tprivate available = true;\n\tprivate readonly rootDir: string;\n\tprivate readonly dbPath: string;\n\tprivate readonly contextFiles: string[];\n\n\tconstructor(config: SemanticRetrieverConfig) {\n\t\tthis.rootDir = config.rootDir;\n\t\tthis.dbPath = config.dbPath\n\t\t\t? path.isAbsolute(config.dbPath)\n\t\t\t\t? config.dbPath\n\t\t\t\t: path.join(config.rootDir, config.dbPath)\n\t\t\t: path.join(config.rootDir, \"embeddings.db\");\n\t\tthis.contextFiles = config.contextFiles || DEFAULT_CONTEXT_FILES;\n\t}\n\n\t/**\n\t * Check if semantic retrieval is available (deps installed)\n\t */\n\tisAvailable(): boolean {\n\t\treturn this.available;\n\t}\n\n\t/**\n\t * Ensure database is loaded and schema exists\n\t */\n\tprivate async ensureDb(): Promise<any> {\n\t\tif (this.db) {\n\t\t\treturn this.db;\n\t\t}\n\n\t\ttry {\n\t\t\t// Dynamic import for optional dependency\n\t\t\t// @ts-expect-error - sql.js lacks type declarations\n\t\t\tconst initSqlJs = await import(\"sql.js\").then((m) => m.default);\n\t\t\tconst SQL = await initSqlJs();\n\n\t\t\t// Load existing database or create new one\n\t\t\tif (fs.existsSync(this.dbPath)) {\n\t\t\t\tconst fileBuffer = fs.readFileSync(this.dbPath);\n\t\t\t\tthis.db = new SQL.Database(fileBuffer);\n\t\t\t} else {\n\t\t\t\tthis.db = new SQL.Database();\n\t\t\t}\n\n\t\t\t// Ensure schema\n\t\t\tthis.db.run(`\n CREATE TABLE IF NOT EXISTS sections (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n file TEXT NOT NULL,\n section TEXT NOT NULL,\n content TEXT NOT NULL,\n embedding BLOB,\n tokens INTEGER,\n indexed_at TEXT DEFAULT CURRENT_TIMESTAMP,\n UNIQUE(file, section)\n )\n `);\n\n\t\t\treturn this.db;\n\t\t} catch (_err) {\n\t\t\tthis.available = false;\n\t\t\tthrow new Error(\n\t\t\t\t\"SemanticRetriever requires sql.js as optional peer dependency. Install with: pnpm add sql.js\",\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Save database to disk\n\t */\n\tprivate saveDb(): void {\n\t\tif (!this.db) {\n\t\t\treturn;\n\t\t}\n\t\tconst data = this.db.export();\n\t\tconst buffer = Buffer.from(data);\n\n\t\t// Ensure directory exists\n\t\tconst dir = path.dirname(this.dbPath);\n\t\tif (!fs.existsSync(dir)) {\n\t\t\tfs.mkdirSync(dir, { recursive: true });\n\t\t}\n\n\t\tfs.writeFileSync(this.dbPath, buffer);\n\t}\n\n\t/**\n\t * Initialize the embedder and database (lazy loading)\n\t */\n\tasync initialize(): Promise<void> {\n\t\tif (this.initialized) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Initialize database\n\t\tawait this.ensureDb();\n\n\t\ttry {\n\t\t\t// Dynamic import for optional dependency\n\t\t\tconst { pipeline } = await import(\"@huggingface/transformers\");\n\n\t\t\t// Use all-MiniLM-L6-v2: fast, 384-dimensional vectors\n\t\t\tthis.embedder = (await pipeline(\n\t\t\t\t\"feature-extraction\",\n\t\t\t\t\"Xenova/all-MiniLM-L6-v2\",\n\t\t\t)) as unknown as FeatureExtractionPipeline;\n\n\t\t\tthis.initialized = true;\n\t\t} catch (_err) {\n\t\t\tthis.available = false;\n\t\t\tthrow new Error(\n\t\t\t\t\"SemanticRetriever requires @huggingface/transformers as optional peer dependency. Install with: pnpm add @huggingface/transformers\",\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Index all context files (run on startup or after changes)\n\t */\n\tasync indexContextFiles(): Promise<IndexStatus> {\n\t\tawait this.initialize();\n\n\t\tlet indexed = 0;\n\t\tlet skipped = 0;\n\n\t\tfor (const file of this.contextFiles) {\n\t\t\tconst fullPath = path.join(this.rootDir, file);\n\t\t\tif (!fs.existsSync(fullPath)) {\n\t\t\t\tskipped++;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst content = fs.readFileSync(fullPath, \"utf-8\");\n\t\t\tconst sections = this.splitIntoSections(content);\n\n\t\t\tfor (const section of sections) {\n\t\t\t\t// Check if section exists with same content\n\t\t\t\tconst stmt = this.db?.prepare(\"SELECT id, content FROM sections WHERE file = ? AND section = ?\");\n\t\t\t\tstmt.bind([file, section.header]);\n\n\t\t\t\tlet existingContent: string | null = null;\n\t\t\t\tif (stmt.step()) {\n\t\t\t\t\tconst row = stmt.getAsObject();\n\t\t\t\t\texistingContent = row.content as string;\n\t\t\t\t}\n\t\t\t\tstmt.free();\n\n\t\t\t\t// Skip if content unchanged\n\t\t\t\tif (existingContent === section.content) {\n\t\t\t\t\tskipped++;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Generate embedding\n\t\t\t\tconst embedding = await this.embed(section.content);\n\t\t\t\tconst tokens = this.estimateTokens(section.content);\n\t\t\t\tconst embeddingBlob = new Uint8Array(new Float32Array(embedding).buffer);\n\n\t\t\t\t// Upsert section\n\t\t\t\tthis.db?.run(\n\t\t\t\t\t`INSERT OR REPLACE INTO sections (file, section, content, embedding, tokens, indexed_at)\n VALUES (?, ?, ?, ?, ?, datetime('now'))`,\n\t\t\t\t\t[file, section.header, section.content, embeddingBlob, tokens],\n\t\t\t\t);\n\n\t\t\t\tindexed++;\n\t\t\t}\n\t\t}\n\n\t\t// Save to disk after indexing\n\t\tthis.saveDb();\n\n\t\treturn { indexed, skipped };\n\t}\n\n\t/**\n\t * Get relevant context for a query within token budget\n\t */\n\tasync getRelevantContext(query: string, maxTokens = 2000): Promise<SearchResult> {\n\t\tawait this.initialize();\n\n\t\t// Get all sections with embeddings\n\t\tconst sections: Section[] = [];\n\t\tconst stmt = this.db?.prepare(\n\t\t\t\"SELECT id, file, section, content, embedding, tokens FROM sections WHERE embedding IS NOT NULL\",\n\t\t);\n\t\twhile (stmt.step()) {\n\t\t\tconst row = stmt.getAsObject();\n\t\t\tsections.push({\n\t\t\t\tid: row.id as number,\n\t\t\t\tfile: row.file as string,\n\t\t\t\tsection: row.section as string,\n\t\t\t\tcontent: row.content as string,\n\t\t\t\tembedding: row.embedding as Uint8Array,\n\t\t\t\ttokens: row.tokens as number,\n\t\t\t});\n\t\t}\n\t\tstmt.free();\n\n\t\tif (sections.length === 0) {\n\t\t\treturn {\n\t\t\t\tcontext: \"\",\n\t\t\t\ttokensUsed: 0,\n\t\t\t\tsectionsIncluded: 0,\n\t\t\t\tcompressionRatio: 0,\n\t\t\t};\n\t\t}\n\n\t\t// Embed the query\n\t\tconst queryEmbedding = await this.embed(query);\n\n\t\t// Score all sections by similarity\n\t\tconst scored: ScoredSection[] = sections\n\t\t\t.filter((s): s is Section & { embedding: Uint8Array } => s.embedding !== undefined && s.embedding !== null)\n\t\t\t.map((s) => {\n\t\t\t\tconst embeddingArray = new Float32Array(\n\t\t\t\t\ts.embedding.buffer,\n\t\t\t\t\ts.embedding.byteOffset,\n\t\t\t\t\ts.embedding.byteLength / 4,\n\t\t\t\t);\n\t\t\t\treturn {\n\t\t\t\t\t...s,\n\t\t\t\t\tscore: this.cosineSimilarity(queryEmbedding, embeddingArray),\n\t\t\t\t};\n\t\t\t})\n\t\t\t.sort((a, b) => b.score - a.score);\n\n\t\t// Select top sections within token budget\n\t\tlet totalTokens = 0;\n\t\tconst selected: ScoredSection[] = [];\n\n\t\tfor (const section of scored) {\n\t\t\tif (totalTokens + section.tokens <= maxTokens) {\n\t\t\t\tselected.push(section);\n\t\t\t\ttotalTokens += section.tokens;\n\t\t\t} else if (selected.length >= 3) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\t// Calculate compression ratio\n\t\tconst totalDbTokens = sections.reduce((sum, s) => sum + s.tokens, 0);\n\t\tconst context = selected.map((s) => `## ${s.file} - ${s.section}\\n${s.content}`).join(\"\\n\\n---\\n\\n\");\n\n\t\treturn {\n\t\t\tcontext,\n\t\t\ttokensUsed: totalTokens,\n\t\t\tsectionsIncluded: selected.length,\n\t\t\tcompressionRatio: totalDbTokens > 0 ? 1 - totalTokens / totalDbTokens : 0,\n\t\t};\n\t}\n\n\t/**\n\t * Embed text using local model\n\t */\n\tprivate async embed(text: string): Promise<number[]> {\n\t\tif (!this.embedder) {\n\t\t\tthrow new Error(\"Embedder not initialized. Call initialize() first.\");\n\t\t}\n\n\t\tconst result = await this.embedder(text, { pooling: \"mean\", normalize: true });\n\t\treturn Array.from(result.data);\n\t}\n\n\t/**\n\t * Calculate cosine similarity between two vectors\n\t */\n\tprivate cosineSimilarity(a: number[], b: Float32Array): number {\n\t\tlet dotProduct = 0;\n\t\tlet normA = 0;\n\t\tlet normB = 0;\n\n\t\tfor (let i = 0; i < a.length; i++) {\n\t\t\tdotProduct += a[i] * b[i];\n\t\t\tnormA += a[i] * a[i];\n\t\t\tnormB += b[i] * b[i];\n\t\t}\n\n\t\tconst denominator = Math.sqrt(normA) * Math.sqrt(normB);\n\t\treturn denominator === 0 ? 0 : dotProduct / denominator;\n\t}\n\n\t/**\n\t * Split markdown content into sections by ## headers\n\t */\n\tprivate splitIntoSections(content: string): Array<{ header: string; content: string }> {\n\t\tconst sections: Array<{ header: string; content: string }> = [];\n\t\tconst lines = content.split(\"\\n\");\n\n\t\tlet currentHeader = \"Introduction\";\n\t\tlet currentContent: string[] = [];\n\n\t\tfor (const line of lines) {\n\t\t\tif (line.startsWith(\"## \")) {\n\t\t\t\tif (currentContent.length > 0) {\n\t\t\t\t\tconst sectionContent = currentContent.join(\"\\n\").trim();\n\t\t\t\t\tif (sectionContent.length > 50) {\n\t\t\t\t\t\tsections.push({ header: currentHeader, content: sectionContent });\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tcurrentHeader = line.replace(\"## \", \"\").trim();\n\t\t\t\tcurrentContent = [];\n\t\t\t} else {\n\t\t\t\tcurrentContent.push(line);\n\t\t\t}\n\t\t}\n\n\t\t// Last section\n\t\tif (currentContent.length > 0) {\n\t\t\tconst sectionContent = currentContent.join(\"\\n\").trim();\n\t\t\tif (sectionContent.length > 50) {\n\t\t\t\tsections.push({ header: currentHeader, content: sectionContent });\n\t\t\t}\n\t\t}\n\n\t\treturn sections;\n\t}\n\n\t/**\n\t * Estimate token count (~4 chars per token)\n\t */\n\tprivate estimateTokens(text: string): number {\n\t\treturn Math.ceil(text.length / 4);\n\t}\n\n\t/**\n\t * Get statistics about indexed content\n\t */\n\tgetStats(): { totalSections: number; totalTokens: number; files: string[] } {\n\t\tif (!this.db) {\n\t\t\treturn { totalSections: 0, totalTokens: 0, files: [] };\n\t\t}\n\n\t\tconst countStmt = this.db.prepare(\"SELECT COUNT(*) as cnt, COALESCE(SUM(tokens), 0) as total FROM sections\");\n\t\tlet totalSections = 0;\n\t\tlet totalTokens = 0;\n\t\tif (countStmt.step()) {\n\t\t\tconst row = countStmt.getAsObject();\n\t\t\ttotalSections = row.cnt as number;\n\t\t\ttotalTokens = row.total as number;\n\t\t}\n\t\tcountStmt.free();\n\n\t\tconst files: string[] = [];\n\t\tconst filesStmt = this.db.prepare(\"SELECT DISTINCT file FROM sections\");\n\t\twhile (filesStmt.step()) {\n\t\t\tconst row = filesStmt.getAsObject();\n\t\t\tfiles.push(row.file as string);\n\t\t}\n\t\tfilesStmt.free();\n\n\t\treturn { totalSections, totalTokens, files };\n\t}\n\n\t/**\n\t * Close database connection and save\n\t */\n\tclose(): void {\n\t\tif (this.db) {\n\t\t\tthis.saveDb();\n\t\t\tthis.db.close();\n\t\t\tthis.db = null;\n\t\t}\n\t}\n}\n","/**\n * API Domain Bundle\n *\n * Patterns for validating API endpoint implementation.\n * Covers input validation, error handling, response formatting,\n * and security best practices for HTTP APIs.\n *\n * @module domain/bundles/api\n */\n\nimport type { DomainBundle, DomainPattern } from \"@snapback/core/analysis\";\n\nconst patterns: DomainPattern[] = [\n\t{\n\t\tid: \"api-input-validation\",\n\t\tname: \"Input Validation\",\n\t\tdescription: \"All API inputs must be validated using a schema validator (zod, joi, yup)\",\n\t\trequired: true,\n\t\tseverity: \"critical\",\n\t\tdetectWith: {\n\t\t\tastPattern: \"zod.parse || schema.validate || yup.validate\",\n\t\t\tkeywords: [\"zod\", \"joi\", \"yup\", \"validate\", \"parse\", \"schema\"],\n\t\t},\n\t\tfailureMessage: \"API endpoint accepts input without schema validation\",\n\t\tfixSuggestion: \"Add input validation: const input = schema.parse(req.body)\",\n\t},\n\t{\n\t\tid: \"api-error-handling\",\n\t\tname: \"Structured Error Handling\",\n\t\tdescription: \"API errors should be caught and returned in a consistent format\",\n\t\trequired: true,\n\t\tseverity: \"high\",\n\t\tdetectWith: {\n\t\t\tastPattern: \"try-catch && (res.status || throw)\",\n\t\t\tkeywords: [\"try\", \"catch\", \"error\", \"status\", \"errorHandler\"],\n\t\t},\n\t\tfailureMessage: \"API endpoint missing structured error handling\",\n\t\tfixSuggestion: \"Wrap handler in try-catch with consistent error response format\",\n\t},\n\t{\n\t\tid: \"api-no-stack-traces\",\n\t\tname: \"No Stack Traces in Production\",\n\t\tdescription: \"API error responses should not expose stack traces in production\",\n\t\trequired: true,\n\t\tseverity: \"high\",\n\t\tdetectWith: {\n\t\t\tastPattern: \"!error.stack in response || process.env.NODE_ENV check\",\n\t\t\tkeywords: [\"stack\", \"NODE_ENV\", \"production\", \"development\"],\n\t\t},\n\t\tfailureMessage: \"API may expose stack traces in error responses\",\n\t\tfixSuggestion: \"Only include stack traces when NODE_ENV !== 'production'\",\n\t},\n\t{\n\t\tid: \"api-content-type\",\n\t\tname: \"Content-Type Headers\",\n\t\tdescription: \"API responses should set appropriate Content-Type headers\",\n\t\trequired: true,\n\t\tseverity: \"medium\",\n\t\tdetectWith: {\n\t\t\tastPattern: \"res.json || res.setHeader('Content-Type')\",\n\t\t\tkeywords: [\"Content-Type\", \"application/json\", \"json\"],\n\t\t},\n\t\tfailureMessage: \"API response missing Content-Type header\",\n\t\tfixSuggestion: \"Use res.json() or explicitly set Content-Type header\",\n\t},\n\t{\n\t\tid: \"api-cors-config\",\n\t\tname: \"CORS Configuration\",\n\t\tdescription: \"Cross-origin requests should be explicitly configured, not use wildcard\",\n\t\trequired: true,\n\t\tseverity: \"high\",\n\t\tdetectWith: {\n\t\t\tastPattern: \"cors && origin !== '*'\",\n\t\t\tkeywords: [\"cors\", \"origin\", \"Access-Control\"],\n\t\t},\n\t\tfailureMessage: \"CORS configured with wildcard origin (*)\",\n\t\tfixSuggestion: \"Specify allowed origins explicitly: cors({ origin: ['https://app.example.com'] })\",\n\t},\n\t{\n\t\tid: \"api-response-sanitization\",\n\t\tname: \"Response Data Sanitization\",\n\t\tdescription: \"Sensitive fields should be excluded from API responses\",\n\t\trequired: true,\n\t\tseverity: \"critical\",\n\t\tdetectWith: {\n\t\t\tastPattern: \"select || omit || pick || exclude password/token/secret\",\n\t\t\tkeywords: [\"select\", \"omit\", \"pick\", \"exclude\", \"sanitize\"],\n\t\t},\n\t\tfailureMessage: \"API response may include sensitive fields (password, tokens, secrets)\",\n\t\tfixSuggestion: \"Use omit() or select() to exclude sensitive fields from responses\",\n\t},\n\t{\n\t\tid: \"api-method-validation\",\n\t\tname: \"HTTP Method Validation\",\n\t\tdescription: \"Endpoints should only accept intended HTTP methods\",\n\t\trequired: true,\n\t\tseverity: \"medium\",\n\t\tdetectWith: {\n\t\t\tastPattern: \"app.get || app.post || app.put || router.method\",\n\t\t\tkeywords: [\"get\", \"post\", \"put\", \"delete\", \"patch\", \"method\"],\n\t\t},\n\t\tfailureMessage: \"Endpoint may accept unintended HTTP methods\",\n\t\tfixSuggestion: \"Use specific method handlers: app.post('/users', handler) not app.use('/users', handler)\",\n\t},\n\t{\n\t\tid: \"api-pagination\",\n\t\tname: \"Pagination for List Endpoints\",\n\t\tdescription: \"List endpoints should implement pagination to prevent memory issues\",\n\t\trequired: true,\n\t\tseverity: \"high\",\n\t\tdetectWith: {\n\t\t\tastPattern: \"limit && (offset || page || cursor)\",\n\t\t\tkeywords: [\"limit\", \"offset\", \"page\", \"cursor\", \"pagination\", \"take\", \"skip\"],\n\t\t},\n\t\tfailureMessage: \"List endpoint without pagination (potential memory/performance issue)\",\n\t\tfixSuggestion: \"Add pagination: query.limit(pageSize).offset(page * pageSize)\",\n\t},\n\t{\n\t\tid: \"api-request-size-limit\",\n\t\tname: \"Request Size Limit\",\n\t\tdescription: \"API should limit request body size to prevent DoS attacks\",\n\t\trequired: true,\n\t\tseverity: \"high\",\n\t\tdetectWith: {\n\t\t\tastPattern: \"bodyParser.json({ limit }) || express.json({ limit })\",\n\t\t\tkeywords: [\"limit\", \"bodyParser\", \"json\", \"urlencoded\"],\n\t\t},\n\t\tfailureMessage: \"API accepts unlimited request body size\",\n\t\tfixSuggestion: \"Add body size limit: express.json({ limit: '1mb' })\",\n\t},\n];\n\n/**\n * API domain pattern bundle\n */\nexport const apiPatterns: DomainBundle = {\n\tid: \"api\",\n\tname: \"API Endpoints\",\n\tdescription: \"Patterns for secure and robust API endpoint implementation\",\n\tpatterns,\n\tapplicableTo: [\"api\", \"endpoint\", \"route\", \"handler\", \"controller\", \"rest\", \"graphql\"],\n};\n","/**\n * Authentication Domain Bundle\n *\n * Patterns for validating authentication and authorization code.\n * Covers session management, token handling, password security,\n * and access control patterns.\n *\n * @module domain/bundles/auth\n */\n\nimport type { DomainBundle, DomainPattern } from \"@snapback/core/analysis\";\n\nconst patterns: DomainPattern[] = [\n\t{\n\t\tid: \"auth-session-expiry\",\n\t\tname: \"Session Expiry Configuration\",\n\t\tdescription: \"Sessions should have explicit expiry times to prevent session hijacking\",\n\t\trequired: true,\n\t\tseverity: \"high\",\n\t\tdetectWith: {\n\t\t\tastPattern: \"session && (maxAge || expires || expiresIn)\",\n\t\t\tkeywords: [\"session\", \"maxAge\", \"expires\", \"expiresIn\", \"ttl\"],\n\t\t},\n\t\tfailureMessage: \"Session created without explicit expiry time\",\n\t\tfixSuggestion: \"Add session expiry: { maxAge: 3600000 } or similar\",\n\t},\n\t{\n\t\tid: \"auth-password-hashing\",\n\t\tname: \"Password Hashing\",\n\t\tdescription: \"Passwords must be hashed using bcrypt, argon2, or scrypt\",\n\t\trequired: true,\n\t\tseverity: \"critical\",\n\t\tdetectWith: {\n\t\t\tastPattern: \"password && (bcrypt || argon2 || scrypt)\",\n\t\t\tkeywords: [\"bcrypt\", \"argon2\", \"scrypt\", \"hash\", \"password\"],\n\t\t},\n\t\tfailureMessage: \"Password storage without proper hashing detected\",\n\t\tfixSuggestion: \"Use bcrypt.hash() or argon2.hash() for password storage\",\n\t},\n\t{\n\t\tid: \"auth-token-validation\",\n\t\tname: \"JWT Token Validation\",\n\t\tdescription: \"JWT tokens must be validated with signature verification\",\n\t\trequired: true,\n\t\tseverity: \"critical\",\n\t\tdetectWith: {\n\t\t\tastPattern: \"jwt.verify || jsonwebtoken.verify\",\n\t\t\tkeywords: [\"jwt\", \"verify\", \"jsonwebtoken\", \"token\"],\n\t\t},\n\t\tfailureMessage: \"JWT used without proper verification\",\n\t\tfixSuggestion: \"Use jwt.verify(token, secret) with a strong secret\",\n\t},\n\t{\n\t\tid: \"auth-csrf-protection\",\n\t\tname: \"CSRF Protection\",\n\t\tdescription: \"State-changing endpoints should have CSRF protection\",\n\t\trequired: true,\n\t\tseverity: \"high\",\n\t\tdetectWith: {\n\t\t\tastPattern: \"csrf || csrfToken || _csrf\",\n\t\t\tkeywords: [\"csrf\", \"csrfToken\", \"xsrf\", \"csurf\"],\n\t\t},\n\t\tfailureMessage: \"State-changing endpoint without CSRF protection\",\n\t\tfixSuggestion: \"Add CSRF token validation using csurf or similar middleware\",\n\t},\n\t{\n\t\tid: \"auth-rate-limiting\",\n\t\tname: \"Rate Limiting on Auth Endpoints\",\n\t\tdescription: \"Authentication endpoints should be rate-limited to prevent brute force\",\n\t\trequired: true,\n\t\tseverity: \"high\",\n\t\tdetectWith: {\n\t\t\tastPattern: \"rateLimit || rateLimiter || express-rate-limit\",\n\t\t\tkeywords: [\"rateLimit\", \"rateLimiter\", \"throttle\", \"brute\"],\n\t\t},\n\t\tfailureMessage: \"Authentication endpoint without rate limiting\",\n\t\tfixSuggestion: \"Add rate limiting: app.use('/login', rateLimit({ max: 5, windowMs: 15*60*1000 }))\",\n\t},\n\t{\n\t\tid: \"auth-secure-cookies\",\n\t\tname: \"Secure Cookie Configuration\",\n\t\tdescription: \"Authentication cookies must have secure, httpOnly, and sameSite flags\",\n\t\trequired: true,\n\t\tseverity: \"high\",\n\t\tdetectWith: {\n\t\t\tastPattern: \"cookie && (secure && httpOnly && sameSite)\",\n\t\t\tkeywords: [\"secure\", \"httpOnly\", \"sameSite\", \"cookie\"],\n\t\t},\n\t\tfailureMessage: \"Authentication cookie missing security flags\",\n\t\tfixSuggestion: \"Set cookie options: { secure: true, httpOnly: true, sameSite: 'strict' }\",\n\t},\n\t{\n\t\tid: \"auth-constant-time-compare\",\n\t\tname: \"Constant-Time Comparison\",\n\t\tdescription: \"Secret comparisons should use timing-safe comparison to prevent timing attacks\",\n\t\trequired: true,\n\t\tseverity: \"high\",\n\t\tdetectWith: {\n\t\t\tastPattern: \"timingSafeEqual || crypto.timingSafeEqual\",\n\t\t\tkeywords: [\"timingSafeEqual\", \"constantTimeCompare\", \"safeCompare\"],\n\t\t},\n\t\tfailureMessage: \"Secret comparison using non-constant-time method (vulnerable to timing attacks)\",\n\t\tfixSuggestion: \"Use crypto.timingSafeEqual(Buffer.from(a), Buffer.from(b))\",\n\t},\n];\n\n/**\n * Authentication domain pattern bundle\n */\nexport const authPatterns: DomainBundle = {\n\tid: \"auth\",\n\tname: \"Authentication & Authorization\",\n\tdescription: \"Patterns for secure authentication and authorization implementation\",\n\tpatterns,\n\tapplicableTo: [\"auth\", \"login\", \"session\", \"jwt\", \"oauth\", \"passport\"],\n};\n","/**\n * Daemon Domain Bundle\n *\n * Domain-specific patterns for daemon/server code.\n * Detects missing signal handlers, socket permissions, buffer limits, etc.\n *\n * @module domain/bundles/daemon\n */\n\nimport type { AnalysisIssue, DomainBundle, Severity } from \"@snapback/core\";\n\n/**\n * Helper to create issue ID\n */\nfunction createIssueId(pattern: string, file: string, line?: number): string {\n\treturn `domain/daemon/${pattern}/${file}${line ? `/${line}` : \"\"}`;\n}\n\n/**\n * Helper to find line number for a pattern\n */\nfunction findLine(content: string, search: string): number | undefined {\n\tconst lines = content.split(\"\\n\");\n\tconst idx = lines.findIndex((l) => l.includes(search));\n\treturn idx >= 0 ? idx + 1 : undefined;\n}\n\n/**\n * Daemon/Server domain-specific patterns\n */\nexport const daemonPatterns: DomainBundle = {\n\tid: \"daemon\",\n\tname: \"Daemon/Server Patterns\",\n\tkeywords: [\"daemon\", \"server\", \"socket\", \"ipc\", \"listen\", \"spawn\", \"worker\", \"process\"],\n\tpatterns: [\n\t\t{\n\t\t\tid: \"daemon/signal-handlers\",\n\t\t\tname: \"Missing Signal Handlers\",\n\t\t\tdetect: (content: string, file: string): AnalysisIssue[] => {\n\t\t\t\tconst issues: AnalysisIssue[] = [];\n\n\t\t\t\t// Detect daemon/server context\n\t\t\t\tconst isDaemon =\n\t\t\t\t\tcontent.includes(\".listen(\") ||\n\t\t\t\t\tfile.includes(\"daemon\") ||\n\t\t\t\t\tfile.includes(\"server\") ||\n\t\t\t\t\tfile.includes(\"worker\") ||\n\t\t\t\t\tcontent.includes(\"net.createServer\") ||\n\t\t\t\t\tcontent.includes(\"http.createServer\");\n\n\t\t\t\tif (!isDaemon) {\n\t\t\t\t\treturn issues;\n\t\t\t\t}\n\n\t\t\t\t// Check for signal handlers\n\t\t\t\tconst hasSIGTERM = content.includes(\"process.on('SIGTERM'\") || content.includes('process.on(\"SIGTERM\"');\n\t\t\t\tconst hasSIGINT = content.includes(\"process.on('SIGINT'\") || content.includes('process.on(\"SIGINT\"');\n\n\t\t\t\tif (!hasSIGTERM && !hasSIGINT) {\n\t\t\t\t\tissues.push({\n\t\t\t\t\t\tid: createIssueId(\"signal-handlers\", file),\n\t\t\t\t\t\tseverity: \"high\" as Severity,\n\t\t\t\t\t\ttype: \"MISSING_PATTERN\",\n\t\t\t\t\t\tmessage: \"Daemon/server missing signal handlers (SIGTERM/SIGINT)\",\n\t\t\t\t\t\tfile,\n\t\t\t\t\t\tfix: \"Add process.on('SIGTERM', gracefulShutdown) for clean shutdown\",\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\treturn issues;\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tid: \"daemon/socket-permissions\",\n\t\t\tname: \"Socket Permissions\",\n\t\t\tdetect: (content: string, file: string): AnalysisIssue[] => {\n\t\t\t\tconst issues: AnalysisIssue[] = [];\n\n\t\t\t\t// Check for Unix socket usage\n\t\t\t\tconst hasUnixSocket =\n\t\t\t\t\t(content.includes(\".listen(\") && content.includes(\".sock\")) ||\n\t\t\t\t\t(content.includes(\"createServer\") && content.includes(\".sock\"));\n\n\t\t\t\tif (!hasUnixSocket) {\n\t\t\t\t\treturn issues;\n\t\t\t\t}\n\n\t\t\t\t// Check for permission setting\n\t\t\t\tconst setsPermissions =\n\t\t\t\t\tcontent.includes(\"chmod\") ||\n\t\t\t\t\tcontent.includes(\"0o600\") ||\n\t\t\t\t\tcontent.includes(\"0o700\") ||\n\t\t\t\t\tcontent.includes(\"chmodSync\");\n\n\t\t\t\tif (!setsPermissions) {\n\t\t\t\t\tconst line = findLine(content, \".sock\");\n\t\t\t\t\tissues.push({\n\t\t\t\t\t\tid: createIssueId(\"socket-permissions\", file, line),\n\t\t\t\t\t\tseverity: \"high\" as Severity,\n\t\t\t\t\t\ttype: \"MISSING_PATTERN\",\n\t\t\t\t\t\tmessage: \"Unix socket without explicit permissions\",\n\t\t\t\t\t\tfile,\n\t\t\t\t\t\tline,\n\t\t\t\t\t\tfix: \"Add fs.chmodSync(socketPath, 0o600) after listen() to restrict access\",\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\treturn issues;\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tid: \"daemon/buffer-limits\",\n\t\t\tname: \"Buffer Limits\",\n\t\t\tdetect: (content: string, file: string): AnalysisIssue[] => {\n\t\t\t\tconst issues: AnalysisIssue[] = [];\n\n\t\t\t\t// Check for data reading\n\t\t\t\tconst readsData =\n\t\t\t\t\tcontent.includes(\".on('data'\") ||\n\t\t\t\t\tcontent.includes('.on(\"data\"') ||\n\t\t\t\t\tcontent.includes(\"socket.read\") ||\n\t\t\t\t\tcontent.includes(\"stream.read\");\n\n\t\t\t\tif (!readsData) {\n\t\t\t\t\treturn issues;\n\t\t\t\t}\n\n\t\t\t\t// Check for buffer limits\n\t\t\t\tconst hasLimit =\n\t\t\t\t\tcontent.includes(\"MAX_BUFFER\") ||\n\t\t\t\t\tcontent.includes(\"maxSize\") ||\n\t\t\t\t\tcontent.includes(\"maxLength\") ||\n\t\t\t\t\t/\\.length\\s*[<>]/.test(content) ||\n\t\t\t\t\tcontent.includes(\"Buffer.allocUnsafe\") ||\n\t\t\t\t\tcontent.includes(\"highWaterMark\");\n\n\t\t\t\tif (!hasLimit) {\n\t\t\t\t\tconst line = findLine(content, \".on('data'\") || findLine(content, '.on(\"data\"');\n\t\t\t\t\tissues.push({\n\t\t\t\t\t\tid: createIssueId(\"buffer-limits\", file, line),\n\t\t\t\t\t\tseverity: \"high\" as Severity,\n\t\t\t\t\t\ttype: \"BUFFER_OVERFLOW\",\n\t\t\t\t\t\tmessage: \"Reading data without buffer limits (potential DoS vulnerability)\",\n\t\t\t\t\t\tfile,\n\t\t\t\t\t\tline,\n\t\t\t\t\t\tfix: \"Add buffer size limit check before processing data\",\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\treturn issues;\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tid: \"daemon/lock-acquisition\",\n\t\t\tname: \"Lock Acquisition\",\n\t\t\tdetect: (content: string, file: string): AnalysisIssue[] => {\n\t\t\t\tconst issues: AnalysisIssue[] = [];\n\n\t\t\t\t// Check for daemon start code\n\t\t\t\tconst isDaemonStart =\n\t\t\t\t\tcontent.includes(\"daemon.start\") ||\n\t\t\t\t\tcontent.includes(\"startDaemon\") ||\n\t\t\t\t\tcontent.includes(\"spawnDaemon\") ||\n\t\t\t\t\t(file.includes(\"daemon\") && content.includes(\".start(\"));\n\n\t\t\t\tif (!isDaemonStart) {\n\t\t\t\t\treturn issues;\n\t\t\t\t}\n\n\t\t\t\t// Check for lock/pid file\n\t\t\t\tconst hasLock =\n\t\t\t\t\tcontent.includes(\"acquireLock\") ||\n\t\t\t\t\tcontent.includes(\".pid\") ||\n\t\t\t\t\tcontent.includes(\"pidFile\") ||\n\t\t\t\t\tcontent.includes(\"lockFile\") ||\n\t\t\t\t\tcontent.includes(\"proper-lockfile\") ||\n\t\t\t\t\t(content.includes(\"fs.writeFileSync\") && content.includes(\"process.pid\"));\n\n\t\t\t\tif (!hasLock) {\n\t\t\t\t\tissues.push({\n\t\t\t\t\t\tid: createIssueId(\"lock-acquisition\", file),\n\t\t\t\t\t\tseverity: \"medium\" as Severity,\n\t\t\t\t\t\ttype: \"MISSING_PATTERN\",\n\t\t\t\t\t\tmessage: \"Daemon starts without lock file (may allow multiple instances)\",\n\t\t\t\t\t\tfile,\n\t\t\t\t\t\tfix: \"Acquire lock via PID file before starting daemon to prevent duplicates\",\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\treturn issues;\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tid: \"daemon/error-recovery\",\n\t\t\tname: \"Error Recovery\",\n\t\t\tdetect: (content: string, file: string): AnalysisIssue[] => {\n\t\t\t\tconst issues: AnalysisIssue[] = [];\n\n\t\t\t\t// Check if this is daemon/server code\n\t\t\t\tconst isDaemon =\n\t\t\t\t\tcontent.includes(\".listen(\") ||\n\t\t\t\t\tfile.includes(\"daemon\") ||\n\t\t\t\t\tfile.includes(\"server\") ||\n\t\t\t\t\tcontent.includes(\"net.createServer\");\n\n\t\t\t\tif (!isDaemon) {\n\t\t\t\t\treturn issues;\n\t\t\t\t}\n\n\t\t\t\t// Check for uncaughtException handler\n\t\t\t\tconst hasUncaughtHandler =\n\t\t\t\t\tcontent.includes(\"process.on('uncaughtException'\") ||\n\t\t\t\t\tcontent.includes('process.on(\"uncaughtException\"') ||\n\t\t\t\t\tcontent.includes(\"process.on('unhandledRejection'\") ||\n\t\t\t\t\tcontent.includes('process.on(\"unhandledRejection\"');\n\n\t\t\t\tif (!hasUncaughtHandler) {\n\t\t\t\t\tissues.push({\n\t\t\t\t\t\tid: createIssueId(\"error-recovery\", file),\n\t\t\t\t\t\tseverity: \"medium\" as Severity,\n\t\t\t\t\t\ttype: \"MISSING_PATTERN\",\n\t\t\t\t\t\tmessage: \"Daemon missing uncaughtException/unhandledRejection handlers\",\n\t\t\t\t\t\tfile,\n\t\t\t\t\t\tfix: \"Add handlers to log errors and optionally restart gracefully\",\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\treturn issues;\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tid: \"daemon/health-check\",\n\t\t\tname: \"Health Check Endpoint\",\n\t\t\tdetect: (content: string, file: string): AnalysisIssue[] => {\n\t\t\t\tconst issues: AnalysisIssue[] = [];\n\n\t\t\t\t// Check if this is HTTP server code\n\t\t\t\tconst isHttpServer =\n\t\t\t\t\tcontent.includes(\"http.createServer\") ||\n\t\t\t\t\tcontent.includes(\"express()\") ||\n\t\t\t\t\tcontent.includes(\"fastify\") ||\n\t\t\t\t\tcontent.includes(\"Hono\") ||\n\t\t\t\t\tcontent.includes(\"koa\");\n\n\t\t\t\tif (!isHttpServer) {\n\t\t\t\t\treturn issues;\n\t\t\t\t}\n\n\t\t\t\t// Check for health endpoint\n\t\t\t\tconst hasHealthEndpoint =\n\t\t\t\t\tcontent.includes(\"/health\") ||\n\t\t\t\t\tcontent.includes(\"/healthz\") ||\n\t\t\t\t\tcontent.includes(\"/ready\") ||\n\t\t\t\t\tcontent.includes(\"/live\") ||\n\t\t\t\t\tcontent.includes(\"healthCheck\");\n\n\t\t\t\tif (!hasHealthEndpoint) {\n\t\t\t\t\tissues.push({\n\t\t\t\t\t\tid: createIssueId(\"health-check\", file),\n\t\t\t\t\t\tseverity: \"low\" as Severity,\n\t\t\t\t\t\ttype: \"MISSING_PATTERN\",\n\t\t\t\t\t\tmessage: \"HTTP server missing health check endpoint\",\n\t\t\t\t\t\tfile,\n\t\t\t\t\t\tfix: \"Add /health or /healthz endpoint for monitoring and orchestration\",\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\treturn issues;\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tid: \"daemon/graceful-shutdown\",\n\t\t\tname: \"Graceful Shutdown\",\n\t\t\tdetect: (content: string, file: string): AnalysisIssue[] => {\n\t\t\t\tconst issues: AnalysisIssue[] = [];\n\n\t\t\t\t// Check if this is server code with connections\n\t\t\t\tconst hasServer =\n\t\t\t\t\tcontent.includes(\".listen(\") ||\n\t\t\t\t\tcontent.includes(\"server.close\") ||\n\t\t\t\t\tcontent.includes(\"createServer\");\n\n\t\t\t\tif (!hasServer) {\n\t\t\t\t\treturn issues;\n\t\t\t\t}\n\n\t\t\t\t// Check for graceful shutdown implementation\n\t\t\t\tconst hasGracefulShutdown =\n\t\t\t\t\tcontent.includes(\"server.close\") ||\n\t\t\t\t\tcontent.includes(\"gracefulShutdown\") ||\n\t\t\t\t\tcontent.includes(\"drainConnections\") ||\n\t\t\t\t\tcontent.includes(\"closeAllConnections\") ||\n\t\t\t\t\t(content.includes(\"SIGTERM\") && content.includes(\".close(\"));\n\n\t\t\t\tif (!hasGracefulShutdown) {\n\t\t\t\t\tissues.push({\n\t\t\t\t\t\tid: createIssueId(\"graceful-shutdown\", file),\n\t\t\t\t\t\tseverity: \"medium\" as Severity,\n\t\t\t\t\t\ttype: \"MISSING_PATTERN\",\n\t\t\t\t\t\tmessage: \"Server may not shut down gracefully (in-flight requests may be dropped)\",\n\t\t\t\t\t\tfile,\n\t\t\t\t\t\tfix: \"Implement graceful shutdown: stop accepting new connections, drain existing ones\",\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\treturn issues;\n\t\t\t},\n\t\t},\n\t],\n};\n","/**\n * Astro Framework Configuration\n *\n * Pattern expectations and risk zones for Astro applications.\n *\n * @module knowledge/frameworks/astro\n */\n\nimport type { FrameworkConfig } from \"../types.js\";\n\nexport const astroConfig: FrameworkConfig = {\n\tid: \"astro\",\n\tname: \"Astro\",\n\tcategory: \"static\",\n\n\tindicators: [\n\t\t{ type: \"dependency\", pattern: \"astro\", weight: 0.95 },\n\t\t{ type: \"file\", pattern: \"astro.config.{js,ts,mjs}\", weight: 0.95 },\n\t\t{ type: \"file\", pattern: \"src/pages/**/*.astro\", weight: 0.9 },\n\t\t{ type: \"file\", pattern: \"src/layouts/*.astro\", weight: 0.85 },\n\t],\n\n\texpectedPatterns: [\n\t\t// Error Handling\n\t\t{\n\t\t\tid: \"astro-error-page\",\n\t\t\tname: \"Error Page\",\n\t\t\tdescription: \"Custom 404 and 500 error pages\",\n\t\t\tcategory: \"error-handling\",\n\t\t\timportance: \"recommended\",\n\t\t\tdetection: {\n\t\t\t\tmethod: \"file-exists\",\n\t\t\t\tpattern: \"src/pages/404.astro\",\n\t\t\t},\n\t\t\tdocs: \"https://docs.astro.build/en/core-concepts/astro-pages/#custom-404-error-page\",\n\t\t},\n\t\t{\n\t\t\tid: \"astro-error-boundary\",\n\t\t\tname: \"Island Error Boundaries\",\n\t\t\tdescription: \"Error handling for interactive islands\",\n\t\t\tcategory: \"error-handling\",\n\t\t\timportance: \"recommended\",\n\t\t\tdetection: {\n\t\t\t\tmethod: \"content-match\",\n\t\t\t\tpattern: \"client:only|client:load|client:visible\",\n\t\t\t\tfiles: [\"src/**/*.astro\"],\n\t\t\t},\n\t\t},\n\n\t\t// Data Fetching\n\t\t{\n\t\t\tid: \"astro-content-collections\",\n\t\t\tname: \"Content Collections\",\n\t\t\tdescription: \"Type-safe content with collections\",\n\t\t\tcategory: \"data-fetching\",\n\t\t\timportance: \"recommended\",\n\t\t\tdetection: {\n\t\t\t\tmethod: \"file-exists\",\n\t\t\t\tpattern: \"src/content/config.ts\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tid: \"astro-data-fetching\",\n\t\t\tname: \"Data Fetching\",\n\t\t\tdescription: \"Server-side data fetching in frontmatter\",\n\t\t\tcategory: \"data-fetching\",\n\t\t\timportance: \"optional\",\n\t\t\tdetection: {\n\t\t\t\tmethod: \"content-match\",\n\t\t\t\tpattern: \"await fetch|Astro\\\\.glob\",\n\t\t\t\tfiles: [\"src/**/*.astro\"],\n\t\t\t},\n\t\t},\n\n\t\t// Routing\n\t\t{\n\t\t\tid: \"astro-dynamic-routes\",\n\t\t\tname: \"Dynamic Routes\",\n\t\t\tdescription: \"Dynamic routing with getStaticPaths\",\n\t\t\tcategory: \"routing\",\n\t\t\timportance: \"optional\",\n\t\t\tdetection: {\n\t\t\t\tmethod: \"content-match\",\n\t\t\t\tpattern: \"getStaticPaths\",\n\t\t\t\tfiles: [\"src/pages/**/*.astro\"],\n\t\t\t},\n\t\t},\n\n\t\t// Performance\n\t\t{\n\t\t\tid: \"astro-image-optimization\",\n\t\t\tname: \"Image Optimization\",\n\t\t\tdescription: \"Using astro:assets for optimized images\",\n\t\t\tcategory: \"performance\",\n\t\t\timportance: \"recommended\",\n\t\t\tdetection: {\n\t\t\t\tmethod: \"content-match\",\n\t\t\t\tpattern: \"astro:assets|<Image\",\n\t\t\t\tfiles: [\"src/**/*.astro\"],\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tid: \"astro-view-transitions\",\n\t\t\tname: \"View Transitions\",\n\t\t\tdescription: \"SPA-like navigation with View Transitions\",\n\t\t\tcategory: \"performance\",\n\t\t\timportance: \"optional\",\n\t\t\tdetection: {\n\t\t\t\tmethod: \"content-match\",\n\t\t\t\tpattern: \"ViewTransitions|view-transitions\",\n\t\t\t\tfiles: [\"src/**/*.astro\"],\n\t\t\t},\n\t\t},\n\n\t\t// Security\n\t\t{\n\t\t\tid: \"astro-csp\",\n\t\t\tname: \"Content Security Policy\",\n\t\t\tdescription: \"CSP headers configuration\",\n\t\t\tcategory: \"security\",\n\t\t\timportance: \"recommended\",\n\t\t\tdetection: {\n\t\t\t\tmethod: \"content-match\",\n\t\t\t\tpattern: \"Content-Security-Policy\",\n\t\t\t\tfiles: [\"astro.config.*\", \"src/middleware.*\"],\n\t\t\t},\n\t\t},\n\n\t\t// Testing\n\t\t{\n\t\t\tid: \"astro-testing\",\n\t\t\tname: \"Testing Setup\",\n\t\t\tdescription: \"Playwright or other testing framework\",\n\t\t\tcategory: \"testing\",\n\t\t\timportance: \"recommended\",\n\t\t\tdetection: {\n\t\t\t\tmethod: \"dependency\",\n\t\t\t\tpattern: \"@playwright/test|vitest\",\n\t\t\t},\n\t\t},\n\n\t\t// Configuration\n\t\t{\n\t\t\tid: \"astro-integrations\",\n\t\t\tname: \"Integrations\",\n\t\t\tdescription: \"Astro integrations for extended functionality\",\n\t\t\tcategory: \"configuration\",\n\t\t\timportance: \"optional\",\n\t\t\tdetection: {\n\t\t\t\tmethod: \"content-match\",\n\t\t\t\tpattern: \"integrations:\",\n\t\t\t\tfiles: [\"astro.config.*\"],\n\t\t\t},\n\t\t},\n\n\t\t// State Management (for islands)\n\t\t{\n\t\t\tid: \"astro-islands-state\",\n\t\t\tname: \"Island State Management\",\n\t\t\tdescription: \"State sharing between islands\",\n\t\t\tcategory: \"state-management\",\n\t\t\timportance: \"optional\",\n\t\t\tdetection: {\n\t\t\t\tmethod: \"dependency\",\n\t\t\t\tpattern: \"nanostores|@nanostores\",\n\t\t\t},\n\t\t},\n\t],\n\n\triskZones: [\n\t\t{\n\t\t\tid: \"api-endpoints\",\n\t\t\tname: \"API Endpoints\",\n\t\t\treason: \"Server-side logic in SSR mode\",\n\t\t\tpatterns: [\"src/pages/api/**\"],\n\t\t\tseverity: \"high\",\n\t\t\trequiredDocumentation: [\"Endpoint contracts\", \"Authentication\", \"Error handling\"],\n\t\t},\n\t\t{\n\t\t\tid: \"middleware\",\n\t\t\tname: \"Middleware\",\n\t\t\treason: \"Request processing, auth, redirects\",\n\t\t\tpatterns: [\"src/middleware.*\"],\n\t\t\tseverity: \"high\",\n\t\t\trequiredDocumentation: [\"Middleware logic\", \"Auth flow\", \"Redirects\"],\n\t\t},\n\t\t{\n\t\t\tid: \"content-config\",\n\t\t\tname: \"Content Configuration\",\n\t\t\treason: \"Schema definitions for content\",\n\t\t\tpatterns: [\"src/content/config.ts\"],\n\t\t\tseverity: \"medium\",\n\t\t\trequiredDocumentation: [\"Collection schemas\", \"Validation rules\"],\n\t\t},\n\t\t{\n\t\t\tid: \"islands\",\n\t\t\tname: \"Interactive Islands\",\n\t\t\treason: \"Client-side JavaScript components\",\n\t\t\tpatterns: [\"src/components/**/*.{tsx,jsx,vue,svelte}\"],\n\t\t\tseverity: \"medium\",\n\t\t\trequiredDocumentation: [\"Hydration strategy\", \"State management\"],\n\t\t},\n\t],\n\n\tcontextFiles: [\n\t\t{\n\t\t\tpath: \".llm-context/ARCHITECTURE.md\",\n\t\t\tpurpose: \"Site architecture and content structure\",\n\t\t\trequired: true,\n\t\t\texpectedSections: [\"Overview\", \"Directory Structure\", \"Content Collections\", \"Islands Architecture\"],\n\t\t},\n\t\t{\n\t\t\tpath: \".llm-context/PATTERNS.md\",\n\t\t\tpurpose: \"Astro patterns and conventions\",\n\t\t\trequired: true,\n\t\t\texpectedSections: [\"Component Patterns\", \"Data Fetching\", \"Island Hydration\"],\n\t\t},\n\t\t{\n\t\t\tpath: \".llm-context/CONSTRAINTS.md\",\n\t\t\tpurpose: \"Technical constraints\",\n\t\t\trequired: true,\n\t\t\texpectedSections: [\"Performance Budgets\", \"Browser Support\", \"Build Configuration\"],\n\t\t},\n\t],\n\n\trecommendedStructure: {\n\t\troot: \".llm-context\",\n\t\tdirectories: [\"patterns\"],\n\t\tfiles: [\n\t\t\t{\n\t\t\t\tpath: \".llm-context/ARCHITECTURE.md\",\n\t\t\t\tpurpose: \"Astro architecture\",\n\t\t\t\trequired: true,\n\t\t\t\ttemplate: `# Architecture\n\n## Overview\n[Brief description of the site]\n\n## Directory Structure\n\\`\\`\\`\nsrc/\n├── pages/ # File-based routing\n├── layouts/ # Page layouts\n├── components/ # Astro + framework components\n├── content/ # Content collections\n├── styles/ # Global styles\n└── assets/ # Static assets\n\\`\\`\\`\n\n## Content Collections\n[Describe content structure]\n\n## Islands Architecture\n[Describe interactive components and hydration strategy]\n`,\n\t\t\t},\n\t\t\t{\n\t\t\t\tpath: \".llm-context/PATTERNS.md\",\n\t\t\t\tpurpose: \"Astro patterns\",\n\t\t\t\trequired: true,\n\t\t\t\ttemplate: `# Patterns\n\n## Component Patterns\n- .astro for static components\n- Framework components for interactivity\n- Slots for composition\n\n## Data Fetching\n- Content collections for typed content\n- fetch() in frontmatter for external data\n- getStaticPaths for dynamic routes\n\n## Island Hydration\n- client:load for immediate interactivity\n- client:visible for lazy loading\n- client:only for client-only components\n`,\n\t\t\t},\n\t\t],\n\t},\n};\n","/**\n * Express Framework Configuration\n *\n * Pattern expectations and risk zones for Express.js applications.\n *\n * @module knowledge/frameworks/express\n */\n\nimport type { FrameworkConfig } from \"../types.js\";\n\nexport const expressConfig: FrameworkConfig = {\n\tid: \"express\",\n\tname: \"Express\",\n\tcategory: \"backend\",\n\n\tindicators: [\n\t\t{ type: \"dependency\", pattern: \"express\", weight: 0.95 },\n\t\t{ type: \"file\", pattern: \"app.{js,ts}\", weight: 0.5 },\n\t],\n\n\texpectedPatterns: [\n\t\t// Error Handling\n\t\t{\n\t\t\tid: \"express-error-middleware\",\n\t\t\tname: \"Error Middleware\",\n\t\t\tdescription: \"Centralized error handling middleware\",\n\t\t\tcategory: \"error-handling\",\n\t\t\timportance: \"critical\",\n\t\t\tdetection: {\n\t\t\t\tmethod: \"content-match\",\n\t\t\t\tpattern: \"err.*req.*res.*next|error.*request.*response.*next\",\n\t\t\t\tfiles: [\"**/*.{js,ts}\"],\n\t\t\t},\n\t\t\tdocs: \"https://expressjs.com/en/guide/error-handling.html\",\n\t\t},\n\t\t{\n\t\t\tid: \"express-async-errors\",\n\t\t\tname: \"Async Error Handling\",\n\t\t\tdescription: \"Proper async/await error handling with express-async-errors or wrapper\",\n\t\t\tcategory: \"error-handling\",\n\t\t\timportance: \"critical\",\n\t\t\tdetection: {\n\t\t\t\tmethod: \"dependency\",\n\t\t\t\tpattern: \"express-async-errors|express-async-handler\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tid: \"express-not-found\",\n\t\t\tname: \"404 Handler\",\n\t\t\tdescription: \"Catch-all 404 handler for unmatched routes\",\n\t\t\tcategory: \"error-handling\",\n\t\t\timportance: \"recommended\",\n\t\t\tdetection: {\n\t\t\t\tmethod: \"content-match\",\n\t\t\t\tpattern: \"404|Not Found\",\n\t\t\t\tfiles: [\"**/*.{js,ts}\"],\n\t\t\t},\n\t\t},\n\n\t\t// Security\n\t\t{\n\t\t\tid: \"express-helmet\",\n\t\t\tname: \"Helmet Security\",\n\t\t\tdescription: \"Security headers with Helmet\",\n\t\t\tcategory: \"security\",\n\t\t\timportance: \"critical\",\n\t\t\tdetection: {\n\t\t\t\tmethod: \"dependency\",\n\t\t\t\tpattern: \"helmet\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tid: \"express-cors\",\n\t\t\tname: \"CORS Configuration\",\n\t\t\tdescription: \"Cross-origin resource sharing setup\",\n\t\t\tcategory: \"security\",\n\t\t\timportance: \"critical\",\n\t\t\tdetection: {\n\t\t\t\tmethod: \"dependency\",\n\t\t\t\tpattern: \"cors\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tid: \"express-rate-limiting\",\n\t\t\tname: \"Rate Limiting\",\n\t\t\tdescription: \"Request rate limiting to prevent abuse\",\n\t\t\tcategory: \"security\",\n\t\t\timportance: \"critical\",\n\t\t\tdetection: {\n\t\t\t\tmethod: \"dependency\",\n\t\t\t\tpattern: \"express-rate-limit|rate-limiter-flexible\",\n\t\t\t},\n\t\t},\n\n\t\t// Validation\n\t\t{\n\t\t\tid: \"express-input-validation\",\n\t\t\tname: \"Input Validation\",\n\t\t\tdescription: \"Request body/params validation\",\n\t\t\tcategory: \"validation\",\n\t\t\timportance: \"critical\",\n\t\t\tdetection: {\n\t\t\t\tmethod: \"dependency\",\n\t\t\t\tpattern: \"express-validator|joi|zod|yup\",\n\t\t\t},\n\t\t},\n\n\t\t// Logging\n\t\t{\n\t\t\tid: \"express-request-logging\",\n\t\t\tname: \"Request Logging\",\n\t\t\tdescription: \"HTTP request logging middleware\",\n\t\t\tcategory: \"logging\",\n\t\t\timportance: \"recommended\",\n\t\t\tdetection: {\n\t\t\t\tmethod: \"dependency\",\n\t\t\t\tpattern: \"morgan|pino-http|express-winston\",\n\t\t\t},\n\t\t},\n\n\t\t// Authentication\n\t\t{\n\t\t\tid: \"express-auth-middleware\",\n\t\t\tname: \"Auth Middleware\",\n\t\t\tdescription: \"Authentication middleware for protected routes\",\n\t\t\tcategory: \"authentication\",\n\t\t\timportance: \"critical\",\n\t\t\tdetection: {\n\t\t\t\tmethod: \"content-match\",\n\t\t\t\tpattern: \"passport|jwt|authenticate|isAuthenticated\",\n\t\t\t\tfiles: [\"**/middleware/**/*.{js,ts}\", \"**/auth/**/*.{js,ts}\"],\n\t\t\t},\n\t\t},\n\n\t\t// Testing\n\t\t{\n\t\t\tid: \"express-testing\",\n\t\t\tname: \"API Testing\",\n\t\t\tdescription: \"Integration tests with supertest or similar\",\n\t\t\tcategory: \"testing\",\n\t\t\timportance: \"recommended\",\n\t\t\tdetection: {\n\t\t\t\tmethod: \"dependency\",\n\t\t\t\tpattern: \"supertest\",\n\t\t\t},\n\t\t},\n\n\t\t// Performance\n\t\t{\n\t\t\tid: \"express-compression\",\n\t\t\tname: \"Response Compression\",\n\t\t\tdescription: \"Gzip/brotli compression middleware\",\n\t\t\tcategory: \"performance\",\n\t\t\timportance: \"recommended\",\n\t\t\tdetection: {\n\t\t\t\tmethod: \"dependency\",\n\t\t\t\tpattern: \"compression\",\n\t\t\t},\n\t\t},\n\n\t\t// Configuration\n\t\t{\n\t\t\tid: \"express-env-config\",\n\t\t\tname: \"Environment Configuration\",\n\t\t\tdescription: \"Environment-based configuration management\",\n\t\t\tcategory: \"configuration\",\n\t\t\timportance: \"recommended\",\n\t\t\tdetection: {\n\t\t\t\tmethod: \"dependency\",\n\t\t\t\tpattern: \"dotenv|config\",\n\t\t\t},\n\t\t},\n\t],\n\n\triskZones: [\n\t\t{\n\t\t\tid: \"route-handlers\",\n\t\t\tname: \"Route Handlers\",\n\t\t\treason: \"Business logic, data access, response formatting\",\n\t\t\tpatterns: [\"routes/**\", \"controllers/**\", \"**/router.*\"],\n\t\t\tseverity: \"high\",\n\t\t\trequiredDocumentation: [\"Endpoint contracts\", \"Request/response schemas\", \"Error responses\"],\n\t\t},\n\t\t{\n\t\t\tid: \"middleware\",\n\t\t\tname: \"Middleware Chain\",\n\t\t\treason: \"Request processing, auth, validation\",\n\t\t\tpatterns: [\"middleware/**\", \"**/middleware.*\"],\n\t\t\tseverity: \"critical\",\n\t\t\trequiredDocumentation: [\"Middleware order\", \"Auth flow\", \"Error propagation\"],\n\t\t},\n\t\t{\n\t\t\tid: \"database-layer\",\n\t\t\tname: \"Database Layer\",\n\t\t\treason: \"Data persistence, queries, transactions\",\n\t\t\tpatterns: [\"models/**\", \"db/**\", \"repositories/**\"],\n\t\t\tseverity: \"critical\",\n\t\t\trequiredDocumentation: [\"Schema definitions\", \"Query patterns\", \"Transaction handling\"],\n\t\t},\n\t\t{\n\t\t\tid: \"auth-module\",\n\t\t\tname: \"Authentication Module\",\n\t\t\treason: \"User identity, sessions, tokens\",\n\t\t\tpatterns: [\"auth/**\", \"**/passport.*\", \"**/jwt.*\"],\n\t\t\tseverity: \"critical\",\n\t\t\trequiredDocumentation: [\"Auth strategies\", \"Token lifecycle\", \"Session management\"],\n\t\t},\n\t],\n\n\tcontextFiles: [\n\t\t{\n\t\t\tpath: \".llm-context/ARCHITECTURE.md\",\n\t\t\tpurpose: \"API architecture and component relationships\",\n\t\t\trequired: true,\n\t\t\texpectedSections: [\"Overview\", \"Directory Structure\", \"Middleware Chain\", \"Route Structure\"],\n\t\t},\n\t\t{\n\t\t\tpath: \".llm-context/PATTERNS.md\",\n\t\t\tpurpose: \"Coding patterns for Express development\",\n\t\t\trequired: true,\n\t\t\texpectedSections: [\"Error Handling\", \"Validation\", \"Authentication\", \"Response Format\"],\n\t\t},\n\t\t{\n\t\t\tpath: \".llm-context/API.md\",\n\t\t\tpurpose: \"API endpoint documentation\",\n\t\t\trequired: true,\n\t\t\texpectedSections: [\"Endpoints\", \"Authentication\", \"Error Codes\", \"Rate Limits\"],\n\t\t},\n\t\t{\n\t\t\tpath: \".llm-context/CONSTRAINTS.md\",\n\t\t\tpurpose: \"Technical constraints and requirements\",\n\t\t\trequired: true,\n\t\t\texpectedSections: [\"Security Requirements\", \"Performance Targets\", \"Dependencies\"],\n\t\t},\n\t],\n\n\trecommendedStructure: {\n\t\troot: \".llm-context\",\n\t\tdirectories: [\"patterns\", \"constraints\"],\n\t\tfiles: [\n\t\t\t{\n\t\t\t\tpath: \".llm-context/ARCHITECTURE.md\",\n\t\t\t\tpurpose: \"API architecture\",\n\t\t\t\trequired: true,\n\t\t\t\ttemplate: `# Architecture\n\n## Overview\n[Brief description of the API]\n\n## Directory Structure\n\\`\\`\\`\nsrc/\n├── routes/ # Route definitions\n├── controllers/ # Request handlers\n├── middleware/ # Express middleware\n├── models/ # Data models\n├── services/ # Business logic\n└── utils/ # Utilities\n\\`\\`\\`\n\n## Middleware Chain\n1. Helmet (security headers)\n2. CORS\n3. Body parser\n4. Request logging\n5. Authentication\n6. Route handlers\n7. Error handler\n\n## Route Structure\n[Describe route organization]\n`,\n\t\t\t},\n\t\t\t{\n\t\t\t\tpath: \".llm-context/PATTERNS.md\",\n\t\t\t\tpurpose: \"Express patterns\",\n\t\t\t\trequired: true,\n\t\t\t\ttemplate: `# Patterns\n\n## Error Handling\n- All async handlers wrapped with asyncHandler\n- Centralized error middleware at end of chain\n- Structured error responses\n\n## Validation\n- Request validation using [library]\n- Schema-first approach\n\n## Authentication\n- [Describe auth approach]\n\n## Response Format\n\\`\\`\\`json\n{\n \"success\": true,\n \"data\": {},\n \"meta\": {}\n}\n\\`\\`\\`\n`,\n\t\t\t},\n\t\t\t{\n\t\t\t\tpath: \".llm-context/API.md\",\n\t\t\t\tpurpose: \"API documentation\",\n\t\t\t\trequired: true,\n\t\t\t\ttemplate: `# API Documentation\n\n## Base URL\n\\`/api/v1\\`\n\n## Authentication\n[Describe auth mechanism]\n\n## Endpoints\n\n### GET /endpoint\n[Description]\n\n## Error Codes\n| Code | Description |\n|------|-------------|\n| 400 | Bad Request |\n| 401 | Unauthorized |\n| 404 | Not Found |\n| 500 | Internal Error |\n`,\n\t\t\t},\n\t\t],\n\t},\n};\n","/**\n * NestJS Framework Configuration\n *\n * Pattern expectations and risk zones for NestJS applications.\n *\n * @module knowledge/frameworks/nestjs\n */\n\nimport type { FrameworkConfig } from \"../types.js\";\n\nexport const nestjsConfig: FrameworkConfig = {\n\tid: \"nestjs\",\n\tname: \"NestJS\",\n\tcategory: \"backend\",\n\n\tindicators: [\n\t\t{ type: \"dependency\", pattern: \"@nestjs/core\", weight: 0.95 },\n\t\t{ type: \"dependency\", pattern: \"@nestjs/common\", weight: 0.9 },\n\t\t{ type: \"file\", pattern: \"nest-cli.json\", weight: 0.95 },\n\t\t{ type: \"file\", pattern: \"src/main.ts\", weight: 0.5 },\n\t],\n\n\texpectedPatterns: [\n\t\t// Error Handling\n\t\t{\n\t\t\tid: \"nestjs-exception-filter\",\n\t\t\tname: \"Exception Filters\",\n\t\t\tdescription: \"Global and local exception filters\",\n\t\t\tcategory: \"error-handling\",\n\t\t\timportance: \"critical\",\n\t\t\tdetection: {\n\t\t\t\tmethod: \"content-match\",\n\t\t\t\tpattern: \"@Catch|ExceptionFilter|HttpException\",\n\t\t\t\tfiles: [\"src/**/*.ts\"],\n\t\t\t},\n\t\t\tdocs: \"https://docs.nestjs.com/exception-filters\",\n\t\t},\n\t\t{\n\t\t\tid: \"nestjs-http-exceptions\",\n\t\t\tname: \"HTTP Exceptions\",\n\t\t\tdescription: \"Proper use of built-in HTTP exceptions\",\n\t\t\tcategory: \"error-handling\",\n\t\t\timportance: \"recommended\",\n\t\t\tdetection: {\n\t\t\t\tmethod: \"content-match\",\n\t\t\t\tpattern: \"throw new (Http|Bad|Unauthorized|Forbidden|NotFound)Exception\",\n\t\t\t\tfiles: [\"src/**/*.ts\"],\n\t\t\t},\n\t\t},\n\n\t\t// Validation\n\t\t{\n\t\t\tid: \"nestjs-validation-pipe\",\n\t\t\tname: \"Validation Pipe\",\n\t\t\tdescription: \"Global validation with class-validator\",\n\t\t\tcategory: \"validation\",\n\t\t\timportance: \"critical\",\n\t\t\tdetection: {\n\t\t\t\tmethod: \"dependency\",\n\t\t\t\tpattern: \"class-validator\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tid: \"nestjs-dto-validation\",\n\t\t\tname: \"DTO Validation\",\n\t\t\tdescription: \"DTOs with validation decorators\",\n\t\t\tcategory: \"validation\",\n\t\t\timportance: \"critical\",\n\t\t\tdetection: {\n\t\t\t\tmethod: \"content-match\",\n\t\t\t\tpattern: \"@IsString|@IsNumber|@IsEmail|@IsNotEmpty\",\n\t\t\t\tfiles: [\"src/**/*.dto.ts\", \"src/**/dto/*.ts\"],\n\t\t\t},\n\t\t},\n\n\t\t// Authentication\n\t\t{\n\t\t\tid: \"nestjs-guards\",\n\t\t\tname: \"Authentication Guards\",\n\t\t\tdescription: \"Route protection with Guards\",\n\t\t\tcategory: \"authentication\",\n\t\t\timportance: \"critical\",\n\t\t\tdetection: {\n\t\t\t\tmethod: \"content-match\",\n\t\t\t\tpattern: \"@UseGuards|CanActivate|AuthGuard\",\n\t\t\t\tfiles: [\"src/**/*.ts\"],\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tid: \"nestjs-passport\",\n\t\t\tname: \"Passport Integration\",\n\t\t\tdescription: \"Passport strategies for auth\",\n\t\t\tcategory: \"authentication\",\n\t\t\timportance: \"recommended\",\n\t\t\tdetection: {\n\t\t\t\tmethod: \"dependency\",\n\t\t\t\tpattern: \"@nestjs/passport\",\n\t\t\t},\n\t\t},\n\n\t\t// Security\n\t\t{\n\t\t\tid: \"nestjs-helmet\",\n\t\t\tname: \"Helmet Security\",\n\t\t\tdescription: \"Security headers with Helmet\",\n\t\t\tcategory: \"security\",\n\t\t\timportance: \"critical\",\n\t\t\tdetection: {\n\t\t\t\tmethod: \"dependency\",\n\t\t\t\tpattern: \"helmet\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tid: \"nestjs-throttler\",\n\t\t\tname: \"Rate Limiting\",\n\t\t\tdescription: \"Rate limiting with @nestjs/throttler\",\n\t\t\tcategory: \"security\",\n\t\t\timportance: \"critical\",\n\t\t\tdetection: {\n\t\t\t\tmethod: \"dependency\",\n\t\t\t\tpattern: \"@nestjs/throttler\",\n\t\t\t},\n\t\t},\n\n\t\t// Testing\n\t\t{\n\t\t\tid: \"nestjs-testing-module\",\n\t\t\tname: \"Testing Module\",\n\t\t\tdescription: \"NestJS testing utilities\",\n\t\t\tcategory: \"testing\",\n\t\t\timportance: \"recommended\",\n\t\t\tdetection: {\n\t\t\t\tmethod: \"dependency\",\n\t\t\t\tpattern: \"@nestjs/testing\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tid: \"nestjs-e2e-tests\",\n\t\t\tname: \"E2E Tests\",\n\t\t\tdescription: \"End-to-end API tests\",\n\t\t\tcategory: \"testing\",\n\t\t\timportance: \"recommended\",\n\t\t\tdetection: {\n\t\t\t\tmethod: \"file-exists\",\n\t\t\t\tpattern: \"test/**/*.e2e-spec.ts\",\n\t\t\t},\n\t\t},\n\n\t\t// Logging\n\t\t{\n\t\t\tid: \"nestjs-logger\",\n\t\t\tname: \"Logger Service\",\n\t\t\tdescription: \"Structured logging with NestJS Logger\",\n\t\t\tcategory: \"logging\",\n\t\t\timportance: \"recommended\",\n\t\t\tdetection: {\n\t\t\t\tmethod: \"content-match\",\n\t\t\t\tpattern: \"Logger|@nestjs/common.*Logger\",\n\t\t\t\tfiles: [\"src/**/*.ts\"],\n\t\t\t},\n\t\t},\n\n\t\t// Configuration\n\t\t{\n\t\t\tid: \"nestjs-config-module\",\n\t\t\tname: \"Config Module\",\n\t\t\tdescription: \"Environment configuration with @nestjs/config\",\n\t\t\tcategory: \"configuration\",\n\t\t\timportance: \"recommended\",\n\t\t\tdetection: {\n\t\t\t\tmethod: \"dependency\",\n\t\t\t\tpattern: \"@nestjs/config\",\n\t\t\t},\n\t\t},\n\n\t\t// Performance\n\t\t{\n\t\t\tid: \"nestjs-caching\",\n\t\t\tname: \"Caching\",\n\t\t\tdescription: \"Cache manager integration\",\n\t\t\tcategory: \"performance\",\n\t\t\timportance: \"optional\",\n\t\t\tdetection: {\n\t\t\t\tmethod: \"dependency\",\n\t\t\t\tpattern: \"@nestjs/cache-manager|cache-manager\",\n\t\t\t},\n\t\t},\n\t],\n\n\triskZones: [\n\t\t{\n\t\t\tid: \"controllers\",\n\t\t\tname: \"Controllers\",\n\t\t\treason: \"Request handling, input processing, response formatting\",\n\t\t\tpatterns: [\"src/**/*.controller.ts\"],\n\t\t\tseverity: \"high\",\n\t\t\trequiredDocumentation: [\"Endpoint documentation\", \"Request/response DTOs\", \"Error responses\"],\n\t\t},\n\t\t{\n\t\t\tid: \"services\",\n\t\t\tname: \"Services\",\n\t\t\treason: \"Business logic, data access, external integrations\",\n\t\t\tpatterns: [\"src/**/*.service.ts\"],\n\t\t\tseverity: \"high\",\n\t\t\trequiredDocumentation: [\"Service responsibilities\", \"Dependencies\", \"Error handling\"],\n\t\t},\n\t\t{\n\t\t\tid: \"guards\",\n\t\t\tname: \"Guards\",\n\t\t\treason: \"Authentication, authorization, access control\",\n\t\t\tpatterns: [\"src/**/*.guard.ts\", \"src/auth/**\"],\n\t\t\tseverity: \"critical\",\n\t\t\trequiredDocumentation: [\"Guard logic\", \"Protected routes\", \"Role requirements\"],\n\t\t},\n\t\t{\n\t\t\tid: \"entities\",\n\t\t\tname: \"Entities/Models\",\n\t\t\treason: \"Database schema, relationships\",\n\t\t\tpatterns: [\"src/**/*.entity.ts\", \"src/**/*.model.ts\"],\n\t\t\tseverity: \"critical\",\n\t\t\trequiredDocumentation: [\"Schema design\", \"Relationships\", \"Constraints\"],\n\t\t},\n\t\t{\n\t\t\tid: \"modules\",\n\t\t\tname: \"Module Definitions\",\n\t\t\treason: \"Dependency injection, module boundaries\",\n\t\t\tpatterns: [\"src/**/*.module.ts\"],\n\t\t\tseverity: \"medium\",\n\t\t\trequiredDocumentation: [\"Module responsibilities\", \"Exports\", \"Dependencies\"],\n\t\t},\n\t],\n\n\tcontextFiles: [\n\t\t{\n\t\t\tpath: \".llm-context/ARCHITECTURE.md\",\n\t\t\tpurpose: \"NestJS module architecture\",\n\t\t\trequired: true,\n\t\t\texpectedSections: [\"Overview\", \"Module Structure\", \"Dependency Injection\", \"Data Flow\"],\n\t\t},\n\t\t{\n\t\t\tpath: \".llm-context/PATTERNS.md\",\n\t\t\tpurpose: \"NestJS patterns and conventions\",\n\t\t\trequired: true,\n\t\t\texpectedSections: [\"Error Handling\", \"Validation\", \"Authentication\", \"Testing\"],\n\t\t},\n\t\t{\n\t\t\tpath: \".llm-context/API.md\",\n\t\t\tpurpose: \"API endpoint documentation\",\n\t\t\trequired: true,\n\t\t\texpectedSections: [\"Endpoints\", \"DTOs\", \"Error Codes\"],\n\t\t},\n\t\t{\n\t\t\tpath: \".llm-context/CONSTRAINTS.md\",\n\t\t\tpurpose: \"Technical constraints\",\n\t\t\trequired: true,\n\t\t\texpectedSections: [\"Security\", \"Performance\", \"Dependencies\"],\n\t\t},\n\t],\n\n\trecommendedStructure: {\n\t\troot: \".llm-context\",\n\t\tdirectories: [\"patterns\", \"modules\"],\n\t\tfiles: [\n\t\t\t{\n\t\t\t\tpath: \".llm-context/ARCHITECTURE.md\",\n\t\t\t\tpurpose: \"NestJS architecture\",\n\t\t\t\trequired: true,\n\t\t\t\ttemplate: `# Architecture\n\n## Overview\n[Brief description of the API]\n\n## Module Structure\n\\`\\`\\`\nsrc/\n├── app.module.ts # Root module\n├── auth/ # Auth module\n│ ├── auth.module.ts\n│ ├── auth.controller.ts\n│ ├── auth.service.ts\n│ └── guards/\n├── users/ # Users module\n├── common/ # Shared utilities\n│ ├── filters/\n│ ├── guards/\n│ ├── interceptors/\n│ └── pipes/\n└── config/ # Configuration\n\\`\\`\\`\n\n## Dependency Injection\n[Describe DI patterns]\n\n## Data Flow\nRequest → Guards → Interceptors → Pipes → Controller → Service → Repository\n`,\n\t\t\t},\n\t\t\t{\n\t\t\t\tpath: \".llm-context/PATTERNS.md\",\n\t\t\t\tpurpose: \"NestJS patterns\",\n\t\t\t\trequired: true,\n\t\t\t\ttemplate: `# Patterns\n\n## Error Handling\n- Global exception filter for HTTP exceptions\n- Custom exceptions extend HttpException\n- Structured error responses\n\n## Validation\n- Global ValidationPipe with whitelist\n- DTOs with class-validator decorators\n- Transform enabled for type coercion\n\n## Authentication\n- JWT strategy with Passport\n- Guards on controllers/routes\n- Role-based access control\n\n## Testing\n- Unit tests for services\n- E2E tests for controllers\n- Test database for integration tests\n`,\n\t\t\t},\n\t\t],\n\t},\n};\n","/**\n * Next.js Framework Configuration\n *\n * Pattern expectations and risk zones for Next.js applications.\n *\n * @module knowledge/frameworks/nextjs\n */\n\nimport type { FrameworkConfig } from \"../types.js\";\n\nexport const nextjsConfig: FrameworkConfig = {\n\tid: \"nextjs\",\n\tname: \"Next.js\",\n\tcategory: \"fullstack\",\n\n\tindicators: [\n\t\t{ type: \"dependency\", pattern: \"next\", weight: 0.95 },\n\t\t{ type: \"file\", pattern: \"next.config.{js,mjs,ts}\", weight: 0.9 },\n\t\t{ type: \"file\", pattern: \"app/layout.{tsx,jsx,js,ts}\", weight: 0.85 },\n\t\t{ type: \"file\", pattern: \"pages/_app.{tsx,jsx,js,ts}\", weight: 0.8 },\n\t\t{ type: \"script\", pattern: \"next dev\", weight: 0.7 },\n\t],\n\n\texpectedPatterns: [\n\t\t// Error Handling\n\t\t{\n\t\t\tid: \"nextjs-error-boundary\",\n\t\t\tname: \"Error Boundary\",\n\t\t\tdescription: \"App-level error boundary using error.tsx\",\n\t\t\tcategory: \"error-handling\",\n\t\t\timportance: \"critical\",\n\t\t\tdetection: {\n\t\t\t\tmethod: \"file-exists\",\n\t\t\t\tpattern: \"app/error.tsx\",\n\t\t\t\tfiles: [\"app/**/error.tsx\"],\n\t\t\t},\n\t\t\tdocs: \"https://nextjs.org/docs/app/building-your-application/routing/error-handling\",\n\t\t},\n\t\t{\n\t\t\tid: \"nextjs-not-found\",\n\t\t\tname: \"Not Found Handler\",\n\t\t\tdescription: \"Custom 404 page using not-found.tsx\",\n\t\t\tcategory: \"error-handling\",\n\t\t\timportance: \"recommended\",\n\t\t\tdetection: {\n\t\t\t\tmethod: \"file-exists\",\n\t\t\t\tpattern: \"app/not-found.tsx\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tid: \"nextjs-global-error\",\n\t\t\tname: \"Global Error Handler\",\n\t\t\tdescription: \"Root error boundary in app/global-error.tsx\",\n\t\t\tcategory: \"error-handling\",\n\t\t\timportance: \"critical\",\n\t\t\tdetection: {\n\t\t\t\tmethod: \"file-exists\",\n\t\t\t\tpattern: \"app/global-error.tsx\",\n\t\t\t},\n\t\t},\n\n\t\t// Data Fetching\n\t\t{\n\t\t\tid: \"nextjs-server-actions\",\n\t\t\tname: \"Server Actions\",\n\t\t\tdescription: \"Form handling with 'use server' directive\",\n\t\t\tcategory: \"data-fetching\",\n\t\t\timportance: \"recommended\",\n\t\t\tdetection: {\n\t\t\t\tmethod: \"content-match\",\n\t\t\t\tpattern: '\"use server\"',\n\t\t\t\tfiles: [\"app/**/*.{ts,tsx}\", \"actions/**/*.ts\"],\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tid: \"nextjs-loading-state\",\n\t\t\tname: \"Loading States\",\n\t\t\tdescription: \"Suspense-based loading with loading.tsx\",\n\t\t\tcategory: \"data-fetching\",\n\t\t\timportance: \"recommended\",\n\t\t\tdetection: {\n\t\t\t\tmethod: \"file-exists\",\n\t\t\t\tpattern: \"app/**/loading.tsx\",\n\t\t\t},\n\t\t},\n\n\t\t// Routing\n\t\t{\n\t\t\tid: \"nextjs-middleware\",\n\t\t\tname: \"Middleware\",\n\t\t\tdescription: \"Edge middleware for auth/redirects\",\n\t\t\tcategory: \"routing\",\n\t\t\timportance: \"recommended\",\n\t\t\tdetection: {\n\t\t\t\tmethod: \"file-exists\",\n\t\t\t\tpattern: \"middleware.ts\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tid: \"nextjs-parallel-routes\",\n\t\t\tname: \"Parallel Routes\",\n\t\t\tdescription: \"Simultaneous route rendering with @folder convention\",\n\t\t\tcategory: \"routing\",\n\t\t\timportance: \"optional\",\n\t\t\tdetection: {\n\t\t\t\tmethod: \"file-exists\",\n\t\t\t\tpattern: \"app/**/@*\",\n\t\t\t},\n\t\t},\n\n\t\t// Authentication\n\t\t{\n\t\t\tid: \"nextjs-auth-middleware\",\n\t\t\tname: \"Auth Middleware\",\n\t\t\tdescription: \"Protected routes via middleware\",\n\t\t\tcategory: \"authentication\",\n\t\t\timportance: \"critical\",\n\t\t\tdetection: {\n\t\t\t\tmethod: \"content-match\",\n\t\t\t\tpattern: \"getToken|getSession|auth\\\\(\",\n\t\t\t\tfiles: [\"middleware.ts\"],\n\t\t\t},\n\t\t},\n\n\t\t// Validation\n\t\t{\n\t\t\tid: \"nextjs-zod-validation\",\n\t\t\tname: \"Zod Validation\",\n\t\t\tdescription: \"Schema validation with Zod\",\n\t\t\tcategory: \"validation\",\n\t\t\timportance: \"recommended\",\n\t\t\tdetection: {\n\t\t\t\tmethod: \"ast\",\n\t\t\t\tpattern: \"import.*zod|z\\\\.object\",\n\t\t\t\tfiles: [\"**/*.{ts,tsx}\"],\n\t\t\t},\n\t\t},\n\n\t\t// Security\n\t\t{\n\t\t\tid: \"nextjs-csp-headers\",\n\t\t\tname: \"CSP Headers\",\n\t\t\tdescription: \"Content Security Policy configuration\",\n\t\t\tcategory: \"security\",\n\t\t\timportance: \"recommended\",\n\t\t\tdetection: {\n\t\t\t\tmethod: \"content-match\",\n\t\t\t\tpattern: \"Content-Security-Policy|contentSecurityPolicy\",\n\t\t\t\tfiles: [\"next.config.*\", \"middleware.ts\"],\n\t\t\t},\n\t\t},\n\n\t\t// Testing\n\t\t{\n\t\t\tid: \"nextjs-testing-setup\",\n\t\t\tname: \"Testing Setup\",\n\t\t\tdescription: \"Jest or Vitest configuration for Next.js\",\n\t\t\tcategory: \"testing\",\n\t\t\timportance: \"recommended\",\n\t\t\tdetection: {\n\t\t\t\tmethod: \"file-exists\",\n\t\t\t\tpattern: \"{jest,vitest}.config.{js,ts,mjs}\",\n\t\t\t},\n\t\t},\n\n\t\t// Performance\n\t\t{\n\t\t\tid: \"nextjs-image-optimization\",\n\t\t\tname: \"Image Optimization\",\n\t\t\tdescription: \"Using next/image for optimized images\",\n\t\t\tcategory: \"performance\",\n\t\t\timportance: \"recommended\",\n\t\t\tdetection: {\n\t\t\t\tmethod: \"content-match\",\n\t\t\t\tpattern: \"import.*Image.*from ['\\\"]next/image['\\\"]\",\n\t\t\t\tfiles: [\"**/*.{tsx,jsx}\"],\n\t\t\t},\n\t\t},\n\n\t\t// Logging\n\t\t{\n\t\t\tid: \"nextjs-structured-logging\",\n\t\t\tname: \"Structured Logging\",\n\t\t\tdescription: \"Consistent logging with pino or similar\",\n\t\t\tcategory: \"logging\",\n\t\t\timportance: \"recommended\",\n\t\t\tdetection: {\n\t\t\t\tmethod: \"dependency\",\n\t\t\t\tpattern: \"pino|winston|bunyan\",\n\t\t\t},\n\t\t},\n\t],\n\n\triskZones: [\n\t\t{\n\t\t\tid: \"api-routes\",\n\t\t\tname: \"API Routes\",\n\t\t\treason: \"Direct database access, authentication, authorization logic\",\n\t\t\tpatterns: [\"app/api/**\", \"pages/api/**\"],\n\t\t\tseverity: \"critical\",\n\t\t\trequiredDocumentation: [\n\t\t\t\t\"Authentication requirements\",\n\t\t\t\t\"Rate limiting configuration\",\n\t\t\t\t\"Input validation schemas\",\n\t\t\t\t\"Error response formats\",\n\t\t\t],\n\t\t},\n\t\t{\n\t\t\tid: \"middleware\",\n\t\t\tname: \"Middleware\",\n\t\t\treason: \"Request interception, auth checks, redirects\",\n\t\t\tpatterns: [\"middleware.ts\", \"middleware.js\"],\n\t\t\tseverity: \"critical\",\n\t\t\trequiredDocumentation: [\"Protected routes list\", \"Auth token handling\", \"Redirect logic\"],\n\t\t},\n\t\t{\n\t\t\tid: \"server-actions\",\n\t\t\tname: \"Server Actions\",\n\t\t\treason: \"Direct server mutations, data modifications\",\n\t\t\tpatterns: [\"app/**/actions.*\", \"actions/**\"],\n\t\t\tseverity: \"high\",\n\t\t\trequiredDocumentation: [\"Action permissions\", \"Validation requirements\", \"Error handling strategy\"],\n\t\t},\n\t\t{\n\t\t\tid: \"env-config\",\n\t\t\tname: \"Environment Configuration\",\n\t\t\treason: \"Secrets and environment-specific settings\",\n\t\t\tpatterns: [\".env*\", \"next.config.*\"],\n\t\t\tseverity: \"high\",\n\t\t\trequiredDocumentation: [\n\t\t\t\t\"Required environment variables\",\n\t\t\t\t\"Default values\",\n\t\t\t\t\"Production vs development differences\",\n\t\t\t],\n\t\t},\n\t\t{\n\t\t\tid: \"database-layer\",\n\t\t\tname: \"Database Layer\",\n\t\t\treason: \"Data persistence, migrations, schema\",\n\t\t\tpatterns: [\"prisma/**\", \"drizzle/**\", \"db/**\", \"lib/db*\"],\n\t\t\tseverity: \"critical\",\n\t\t\trequiredDocumentation: [\"Schema overview\", \"Migration strategy\", \"Connection pooling\", \"Query patterns\"],\n\t\t},\n\t],\n\n\tcontextFiles: [\n\t\t{\n\t\t\tpath: \".llm-context/ARCHITECTURE.md\",\n\t\t\tpurpose: \"High-level system architecture and component relationships\",\n\t\t\trequired: true,\n\t\t\texpectedSections: [\"Overview\", \"Directory Structure\", \"Data Flow\", \"Key Components\"],\n\t\t},\n\t\t{\n\t\t\tpath: \".llm-context/PATTERNS.md\",\n\t\t\tpurpose: \"Coding patterns and conventions\",\n\t\t\trequired: true,\n\t\t\texpectedSections: [\"Error Handling\", \"Data Fetching\", \"Authentication\", \"Validation\"],\n\t\t},\n\t\t{\n\t\t\tpath: \".llm-context/CONSTRAINTS.md\",\n\t\t\tpurpose: \"Technical constraints and non-negotiables\",\n\t\t\trequired: true,\n\t\t\texpectedSections: [\"Performance Budgets\", \"Security Requirements\", \"Dependencies\"],\n\t\t},\n\t\t{\n\t\t\tpath: \".llm-context/API.md\",\n\t\t\tpurpose: \"API routes documentation\",\n\t\t\trequired: false,\n\t\t\texpectedSections: [\"Endpoints\", \"Authentication\", \"Error Codes\"],\n\t\t},\n\t\t{\n\t\t\tpath: \".llm-context/DATABASE.md\",\n\t\t\tpurpose: \"Database schema and patterns\",\n\t\t\trequired: false,\n\t\t\texpectedSections: [\"Schema\", \"Relationships\", \"Migrations\"],\n\t\t},\n\t],\n\n\trecommendedStructure: {\n\t\troot: \".llm-context\",\n\t\tdirectories: [\"patterns\", \"constraints\", \"examples\"],\n\t\tfiles: [\n\t\t\t{\n\t\t\t\tpath: \".llm-context/ARCHITECTURE.md\",\n\t\t\t\tpurpose: \"System architecture documentation\",\n\t\t\t\trequired: true,\n\t\t\t\ttemplate: `# Architecture\n\n## Overview\n[Brief description of the application]\n\n## Directory Structure\n\\`\\`\\`\napp/\n├── (auth)/ # Auth-related routes\n├── (dashboard)/ # Dashboard routes\n├── api/ # API routes\n└── layout.tsx # Root layout\n\\`\\`\\`\n\n## Data Flow\n[Describe how data flows through the application]\n\n## Key Components\n[List and describe major components]\n`,\n\t\t\t},\n\t\t\t{\n\t\t\t\tpath: \".llm-context/PATTERNS.md\",\n\t\t\t\tpurpose: \"Coding patterns and conventions\",\n\t\t\t\trequired: true,\n\t\t\t\ttemplate: `# Patterns\n\n## Error Handling\n[Describe error handling approach]\n\n## Data Fetching\n[Describe data fetching patterns]\n\n## Authentication\n[Describe auth patterns]\n\n## Validation\n[Describe validation approach]\n`,\n\t\t\t},\n\t\t\t{\n\t\t\t\tpath: \".llm-context/CONSTRAINTS.md\",\n\t\t\t\tpurpose: \"Technical constraints\",\n\t\t\t\trequired: true,\n\t\t\t\ttemplate: `# Constraints\n\n## Performance Budgets\n- FCP < 1.8s\n- LCP < 2.5s\n- Bundle < 500KB initial\n\n## Security Requirements\n- [List security requirements]\n\n## Dependencies\n- [List dependency constraints]\n`,\n\t\t\t},\n\t\t],\n\t},\n};\n","/**\n * React + Vite Framework Configuration\n *\n * Pattern expectations and risk zones for React applications using Vite.\n *\n * @module knowledge/frameworks/react-vite\n */\n\nimport type { FrameworkConfig } from \"../types.js\";\n\nexport const reactViteConfig: FrameworkConfig = {\n\tid: \"react-vite\",\n\tname: \"React (Vite)\",\n\tcategory: \"frontend\",\n\n\tindicators: [\n\t\t{ type: \"dependency\", pattern: \"vite\", weight: 0.5 },\n\t\t{ type: \"dependency\", pattern: \"react\", weight: 0.5 },\n\t\t{ type: \"dependency\", pattern: \"@vitejs/plugin-react\", weight: 0.9 },\n\t\t{ type: \"file\", pattern: \"vite.config.{js,ts,mjs}\", weight: 0.85 },\n\t\t{ type: \"file\", pattern: \"index.html\", weight: 0.3 },\n\t],\n\n\texpectedPatterns: [\n\t\t// Error Handling\n\t\t{\n\t\t\tid: \"react-error-boundary\",\n\t\t\tname: \"Error Boundary\",\n\t\t\tdescription: \"React Error Boundary for graceful error handling\",\n\t\t\tcategory: \"error-handling\",\n\t\t\timportance: \"critical\",\n\t\t\tdetection: {\n\t\t\t\tmethod: \"ast\",\n\t\t\t\tpattern: \"componentDidCatch|ErrorBoundary|react-error-boundary\",\n\t\t\t\tfiles: [\"src/**/*.{tsx,jsx}\"],\n\t\t\t},\n\t\t\tdocs: \"https://react.dev/reference/react/Component#catching-rendering-errors-with-an-error-boundary\",\n\t\t},\n\t\t{\n\t\t\tid: \"react-suspense\",\n\t\t\tname: \"Suspense Boundaries\",\n\t\t\tdescription: \"Suspense for async component loading\",\n\t\t\tcategory: \"error-handling\",\n\t\t\timportance: \"recommended\",\n\t\t\tdetection: {\n\t\t\t\tmethod: \"content-match\",\n\t\t\t\tpattern: \"<Suspense\",\n\t\t\t\tfiles: [\"src/**/*.{tsx,jsx}\"],\n\t\t\t},\n\t\t},\n\n\t\t// State Management\n\t\t{\n\t\t\tid: \"react-state-management\",\n\t\t\tname: \"State Management\",\n\t\t\tdescription: \"Consistent state management approach\",\n\t\t\tcategory: \"state-management\",\n\t\t\timportance: \"recommended\",\n\t\t\tdetection: {\n\t\t\t\tmethod: \"dependency\",\n\t\t\t\tpattern: \"zustand|jotai|recoil|redux|@tanstack/react-query\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tid: \"react-query\",\n\t\t\tname: \"Server State Management\",\n\t\t\tdescription: \"TanStack Query for server state\",\n\t\t\tcategory: \"data-fetching\",\n\t\t\timportance: \"recommended\",\n\t\t\tdetection: {\n\t\t\t\tmethod: \"dependency\",\n\t\t\t\tpattern: \"@tanstack/react-query\",\n\t\t\t},\n\t\t},\n\n\t\t// Routing\n\t\t{\n\t\t\tid: \"react-router\",\n\t\t\tname: \"Client Routing\",\n\t\t\tdescription: \"React Router for navigation\",\n\t\t\tcategory: \"routing\",\n\t\t\timportance: \"recommended\",\n\t\t\tdetection: {\n\t\t\t\tmethod: \"dependency\",\n\t\t\t\tpattern: \"react-router-dom|@tanstack/react-router\",\n\t\t\t},\n\t\t},\n\n\t\t// Validation\n\t\t{\n\t\t\tid: \"react-form-validation\",\n\t\t\tname: \"Form Validation\",\n\t\t\tdescription: \"Form handling with validation\",\n\t\t\tcategory: \"validation\",\n\t\t\timportance: \"recommended\",\n\t\t\tdetection: {\n\t\t\t\tmethod: \"dependency\",\n\t\t\t\tpattern: \"react-hook-form|formik\",\n\t\t\t},\n\t\t},\n\n\t\t// Testing\n\t\t{\n\t\t\tid: \"react-testing-library\",\n\t\t\tname: \"Testing Library\",\n\t\t\tdescription: \"React Testing Library setup\",\n\t\t\tcategory: \"testing\",\n\t\t\timportance: \"recommended\",\n\t\t\tdetection: {\n\t\t\t\tmethod: \"dependency\",\n\t\t\t\tpattern: \"@testing-library/react\",\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tid: \"react-vitest\",\n\t\t\tname: \"Vitest Configuration\",\n\t\t\tdescription: \"Vitest for unit testing\",\n\t\t\tcategory: \"testing\",\n\t\t\timportance: \"recommended\",\n\t\t\tdetection: {\n\t\t\t\tmethod: \"dependency\",\n\t\t\t\tpattern: \"vitest\",\n\t\t\t},\n\t\t},\n\n\t\t// Performance\n\t\t{\n\t\t\tid: \"react-lazy-loading\",\n\t\t\tname: \"Lazy Loading\",\n\t\t\tdescription: \"Code splitting with React.lazy\",\n\t\t\tcategory: \"performance\",\n\t\t\timportance: \"recommended\",\n\t\t\tdetection: {\n\t\t\t\tmethod: \"content-match\",\n\t\t\t\tpattern: \"React\\\\.lazy|lazy\\\\(\",\n\t\t\t\tfiles: [\"src/**/*.{tsx,jsx}\"],\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tid: \"react-memo\",\n\t\t\tname: \"Memoization\",\n\t\t\tdescription: \"Performance optimization with memo/useMemo/useCallback\",\n\t\t\tcategory: \"performance\",\n\t\t\timportance: \"optional\",\n\t\t\tdetection: {\n\t\t\t\tmethod: \"content-match\",\n\t\t\t\tpattern: \"React\\\\.memo|useMemo|useCallback\",\n\t\t\t\tfiles: [\"src/**/*.{tsx,jsx}\"],\n\t\t\t},\n\t\t},\n\n\t\t// Security\n\t\t{\n\t\t\tid: \"react-xss-prevention\",\n\t\t\tname: \"XSS Prevention\",\n\t\t\tdescription: \"Avoiding dangerouslySetInnerHTML or sanitizing\",\n\t\t\tcategory: \"security\",\n\t\t\timportance: \"critical\",\n\t\t\tdetection: {\n\t\t\t\tmethod: \"content-match\",\n\t\t\t\tpattern: \"dangerouslySetInnerHTML\",\n\t\t\t\tfiles: [\"src/**/*.{tsx,jsx}\"],\n\t\t\t},\n\t\t},\n\n\t\t// Configuration\n\t\t{\n\t\t\tid: \"vite-env-types\",\n\t\t\tname: \"Environment Types\",\n\t\t\tdescription: \"Typed environment variables\",\n\t\t\tcategory: \"configuration\",\n\t\t\timportance: \"recommended\",\n\t\t\tdetection: {\n\t\t\t\tmethod: \"file-exists\",\n\t\t\t\tpattern: \"src/vite-env.d.ts\",\n\t\t\t},\n\t\t},\n\t],\n\n\triskZones: [\n\t\t{\n\t\t\tid: \"api-calls\",\n\t\t\tname: \"API Integration\",\n\t\t\treason: \"Data fetching, error handling, auth headers\",\n\t\t\tpatterns: [\"src/api/**\", \"src/services/**\", \"src/lib/api*\"],\n\t\t\tseverity: \"high\",\n\t\t\trequiredDocumentation: [\"API client setup\", \"Error handling strategy\", \"Authentication flow\"],\n\t\t},\n\t\t{\n\t\t\tid: \"auth-context\",\n\t\t\tname: \"Authentication Context\",\n\t\t\treason: \"User state, tokens, permissions\",\n\t\t\tpatterns: [\"src/context/auth*\", \"src/providers/auth*\", \"src/hooks/useAuth*\"],\n\t\t\tseverity: \"critical\",\n\t\t\trequiredDocumentation: [\"Auth flow\", \"Token storage\", \"Protected routes\"],\n\t\t},\n\t\t{\n\t\t\tid: \"global-state\",\n\t\t\tname: \"Global State\",\n\t\t\treason: \"Shared application state\",\n\t\t\tpatterns: [\"src/store/**\", \"src/state/**\", \"src/atoms/**\"],\n\t\t\tseverity: \"high\",\n\t\t\trequiredDocumentation: [\"State structure\", \"Update patterns\", \"Persistence\"],\n\t\t},\n\t\t{\n\t\t\tid: \"env-config\",\n\t\t\tname: \"Environment Configuration\",\n\t\t\treason: \"API URLs, feature flags\",\n\t\t\tpatterns: [\".env*\", \"vite.config.*\"],\n\t\t\tseverity: \"medium\",\n\t\t\trequiredDocumentation: [\"Required variables\", \"Build-time vs runtime\"],\n\t\t},\n\t],\n\n\tcontextFiles: [\n\t\t{\n\t\t\tpath: \".llm-context/ARCHITECTURE.md\",\n\t\t\tpurpose: \"Component architecture and data flow\",\n\t\t\trequired: true,\n\t\t\texpectedSections: [\"Overview\", \"Directory Structure\", \"Component Hierarchy\", \"Data Flow\"],\n\t\t},\n\t\t{\n\t\t\tpath: \".llm-context/PATTERNS.md\",\n\t\t\tpurpose: \"React patterns and conventions\",\n\t\t\trequired: true,\n\t\t\texpectedSections: [\"Component Patterns\", \"Hook Patterns\", \"State Management\", \"Error Handling\"],\n\t\t},\n\t\t{\n\t\t\tpath: \".llm-context/CONSTRAINTS.md\",\n\t\t\tpurpose: \"Technical constraints\",\n\t\t\trequired: true,\n\t\t\texpectedSections: [\"Performance Budgets\", \"Browser Support\", \"Dependencies\"],\n\t\t},\n\t],\n\n\trecommendedStructure: {\n\t\troot: \".llm-context\",\n\t\tdirectories: [\"patterns\", \"constraints\"],\n\t\tfiles: [\n\t\t\t{\n\t\t\t\tpath: \".llm-context/ARCHITECTURE.md\",\n\t\t\t\tpurpose: \"React architecture\",\n\t\t\t\trequired: true,\n\t\t\t\ttemplate: `# Architecture\n\n## Overview\n[Brief description of the application]\n\n## Directory Structure\n\\`\\`\\`\nsrc/\n├── components/ # Reusable UI components\n├── pages/ # Route pages\n├── hooks/ # Custom hooks\n├── context/ # React context providers\n├── services/ # API services\n├── store/ # State management\n└── utils/ # Utilities\n\\`\\`\\`\n\n## Component Hierarchy\n[Describe component organization]\n\n## Data Flow\n[Describe data flow patterns]\n`,\n\t\t\t},\n\t\t\t{\n\t\t\t\tpath: \".llm-context/PATTERNS.md\",\n\t\t\t\tpurpose: \"React patterns\",\n\t\t\t\trequired: true,\n\t\t\t\ttemplate: `# Patterns\n\n## Component Patterns\n- Composition over inheritance\n- Container/Presentational split\n- Custom hooks for logic\n\n## Hook Patterns\n[Describe hook conventions]\n\n## State Management\n[Describe state approach]\n\n## Error Handling\n- Error boundaries for UI errors\n- Try-catch for async operations\n- User-friendly error messages\n`,\n\t\t\t},\n\t\t],\n\t},\n};\n","/**\n * Framework Registry\n *\n * Central registry for framework configurations with detection and lookup.\n *\n * @module knowledge/registry\n */\n\nimport { astroConfig } from \"./frameworks/astro.js\";\nimport { expressConfig } from \"./frameworks/express.js\";\nimport { nestjsConfig } from \"./frameworks/nestjs.js\";\nimport { nextjsConfig } from \"./frameworks/nextjs.js\";\nimport { reactViteConfig } from \"./frameworks/react-vite.js\";\nimport type { DetectedFramework, FrameworkConfig, FrameworkId } from \"./types.js\";\n\n// =============================================================================\n// FRAMEWORK REGISTRY\n// =============================================================================\n\n/**\n * All registered framework configurations\n */\nconst FRAMEWORK_CONFIGS: FrameworkConfig[] = [nextjsConfig, reactViteConfig, expressConfig, nestjsConfig, astroConfig];\n\n/**\n * Framework lookup by ID\n */\nconst FRAMEWORK_MAP = new Map<FrameworkId, FrameworkConfig>(FRAMEWORK_CONFIGS.map((config) => [config.id, config]));\n\n// =============================================================================\n// REGISTRY API\n// =============================================================================\n\n/**\n * Get all registered framework configurations\n */\nexport function getAllFrameworks(): FrameworkConfig[] {\n\treturn [...FRAMEWORK_CONFIGS];\n}\n\n/**\n * Get a framework configuration by ID\n */\nexport function getFramework(id: FrameworkId): FrameworkConfig | undefined {\n\treturn FRAMEWORK_MAP.get(id);\n}\n\n/**\n * Get frameworks by category\n */\nexport function getFrameworksByCategory(category: FrameworkConfig[\"category\"]): FrameworkConfig[] {\n\treturn FRAMEWORK_CONFIGS.filter((config) => config.category === category);\n}\n\n/**\n * Check if a framework ID is valid\n */\nexport function isValidFramework(id: string): id is FrameworkId {\n\treturn FRAMEWORK_MAP.has(id as FrameworkId);\n}\n\n// =============================================================================\n// FRAMEWORK DETECTION\n// =============================================================================\n\nexport interface FrameworkDetectionContext {\n\t/** Contents of package.json if it exists */\n\tpackageJson?: {\n\t\tdependencies?: Record<string, string>;\n\t\tdevDependencies?: Record<string, string>;\n\t\tscripts?: Record<string, string>;\n\t};\n\t/** List of file paths in the workspace (relative) */\n\tfilePaths: string[];\n\t/** Function to check file content for a pattern */\n\tcheckFileContent?: (pattern: string, files: string[]) => Promise<boolean>;\n}\n\n/**\n * Detect frameworks in a workspace\n *\n * Returns all detected frameworks sorted by confidence\n */\nexport async function detectFrameworks(context: FrameworkDetectionContext): Promise<DetectedFramework[]> {\n\tconst detectedFrameworks: DetectedFramework[] = [];\n\n\tfor (const config of FRAMEWORK_CONFIGS) {\n\t\tconst detection = await evaluateFramework(config, context);\n\n\t\tif (detection.confidence > 0.3) {\n\t\t\tdetectedFrameworks.push(detection);\n\t\t}\n\t}\n\n\t// Sort by confidence (highest first)\n\treturn detectedFrameworks.sort((a, b) => b.confidence - a.confidence);\n}\n\n/**\n * Detect the primary framework in a workspace\n *\n * Returns the framework with highest confidence, or unknown\n */\nexport async function detectPrimaryFramework(context: FrameworkDetectionContext): Promise<DetectedFramework> {\n\tconst frameworks = await detectFrameworks(context);\n\n\tif (frameworks.length === 0) {\n\t\treturn {\n\t\t\tid: \"unknown\",\n\t\t\tname: \"Unknown\",\n\t\t\tconfidence: 0,\n\t\t\tindicators: [],\n\t\t};\n\t}\n\n\treturn frameworks[0];\n}\n\n/**\n * Evaluate a single framework against the detection context\n */\nasync function evaluateFramework(\n\tconfig: FrameworkConfig,\n\tcontext: FrameworkDetectionContext,\n): Promise<DetectedFramework> {\n\tlet totalWeight = 0;\n\tlet matchedWeight = 0;\n\tconst matchedIndicators: string[] = [];\n\tlet detectedVersion: string | undefined;\n\n\tfor (const indicator of config.indicators) {\n\t\ttotalWeight += indicator.weight;\n\n\t\tconst matched = await checkIndicator(indicator, context);\n\n\t\tif (matched.match) {\n\t\t\tmatchedWeight += indicator.weight;\n\t\t\tmatchedIndicators.push(indicator.pattern);\n\n\t\t\tif (matched.version) {\n\t\t\t\tdetectedVersion = matched.version;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Calculate confidence as ratio of matched to total weight\n\tconst confidence = totalWeight > 0 ? matchedWeight / totalWeight : 0;\n\n\treturn {\n\t\tid: config.id,\n\t\tname: config.name,\n\t\tconfidence,\n\t\tversion: detectedVersion,\n\t\tindicators: matchedIndicators,\n\t};\n}\n\n/**\n * Check a single indicator\n */\nasync function checkIndicator(\n\tindicator: FrameworkConfig[\"indicators\"][0],\n\tcontext: FrameworkDetectionContext,\n): Promise<{ match: boolean; version?: string }> {\n\tswitch (indicator.type) {\n\t\tcase \"dependency\": {\n\t\t\tconst deps = {\n\t\t\t\t...context.packageJson?.dependencies,\n\t\t\t\t...context.packageJson?.devDependencies,\n\t\t\t};\n\t\t\tconst version = deps[indicator.pattern];\n\t\t\treturn {\n\t\t\t\tmatch: Boolean(version),\n\t\t\t\tversion: version?.replace(/^[\\^~]/, \"\"),\n\t\t\t};\n\t\t}\n\n\t\tcase \"file\": {\n\t\t\t// Convert glob pattern to regex for simple matching\n\t\t\tconst regex = new RegExp(\n\t\t\t\t`^${indicator.pattern\n\t\t\t\t\t.replace(/\\./g, \"\\\\.\")\n\t\t\t\t\t.replace(/\\{([^}]+)\\}/g, \"($1)\")\n\t\t\t\t\t.replace(/,/g, \"|\")\n\t\t\t\t\t.replace(/\\*\\*/g, \".*\")\n\t\t\t\t\t.replace(/\\*/g, \"[^/]*\")}$`,\n\t\t\t);\n\n\t\t\tconst match = context.filePaths.some((path) => regex.test(path));\n\t\t\treturn { match };\n\t\t}\n\n\t\tcase \"script\": {\n\t\t\tconst scripts = context.packageJson?.scripts || {};\n\t\t\tconst match = Object.values(scripts).some((script) => script.includes(indicator.pattern));\n\t\t\treturn { match };\n\t\t}\n\n\t\tcase \"config\": {\n\t\t\t// Config type would need file content checking\n\t\t\tif (context.checkFileContent) {\n\t\t\t\tconst match = await context.checkFileContent(indicator.pattern, [\"*.config.*\"]);\n\t\t\t\treturn { match };\n\t\t\t}\n\t\t\treturn { match: false };\n\t\t}\n\n\t\tdefault:\n\t\t\treturn { match: false };\n\t}\n}\n\n// =============================================================================\n// EXPORTS\n// =============================================================================\n\nexport { FRAMEWORK_CONFIGS };\n","/**\n * Gap Analyzer\n *\n * Analyzes gaps between expected patterns and detected patterns.\n * Provides recommendations for improving workspace quality.\n *\n * @module patterns/GapAnalyzer\n */\n\nimport type {\n\tExpectedPattern,\n\tFrameworkConfig,\n\tOnboardingRecommendation,\n\tPatternGap,\n\tWorkspaceProfile,\n} from \"../knowledge/types.js\";\nimport type { FoundPattern, PatternDetectionResult } from \"./types.js\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\n/**\n * Configuration for the gap analyzer\n */\nexport interface GapAnalyzerConfig {\n\t/** Minimum coverage threshold for patterns (0-1) */\n\tcoverageThreshold?: number;\n\t/** Whether to include optional patterns in analysis */\n\tincludeOptional?: boolean;\n\t/** Framework configuration for expected patterns */\n\tframeworkConfig?: FrameworkConfig;\n}\n\n/**\n * Result from gap analysis\n */\nexport interface GapAnalysisResult {\n\t/** Gaps between expected and detected patterns */\n\tgaps: PatternGap[];\n\t/** Patterns that are well-implemented */\n\tstrengths: FoundPattern[];\n\t/** Anti-patterns detected */\n\tantiPatterns: FoundPattern[];\n\t/** Overall score (0-100) */\n\tscore: number;\n\t/** Recommendations for improvement */\n\trecommendations: OnboardingRecommendation[];\n\t/** Summary statistics */\n\tsummary: GapAnalysisSummary;\n}\n\n/**\n * Summary statistics for gap analysis\n */\nexport interface GapAnalysisSummary {\n\t/** Total expected patterns */\n\ttotalExpected: number;\n\t/** Patterns found */\n\tpatternsFound: number;\n\t/** Patterns missing */\n\tpatternsMissing: number;\n\t/** Anti-patterns found */\n\tantiPatternsFound: number;\n\t/** Critical gaps */\n\tcriticalGaps: number;\n\t/** Recommended gaps */\n\trecommendedGaps: number;\n\t/** Optional gaps */\n\toptionalGaps: number;\n}\n\n// =============================================================================\n// GAP ANALYZER\n// =============================================================================\n\n/**\n * Gap Analyzer - compares detected patterns against expectations\n *\n * @example\n * ```typescript\n * const analyzer = new GapAnalyzer({\n * frameworkConfig: nextjsConfig,\n * });\n *\n * const result = await analyzer.analyze(detectionResult);\n * console.log(result.gaps);\n * ```\n */\nexport class GapAnalyzer {\n\tprivate readonly config: Required<GapAnalyzerConfig>;\n\n\tconstructor(config: GapAnalyzerConfig = {}) {\n\t\tthis.config = {\n\t\t\tcoverageThreshold: config.coverageThreshold ?? 0.3,\n\t\t\tincludeOptional: config.includeOptional ?? false,\n\t\t\tframeworkConfig: config.frameworkConfig as FrameworkConfig,\n\t\t};\n\t}\n\n\t/**\n\t * Analyze gaps between detected and expected patterns\n\t */\n\tanalyze(detectionResult: PatternDetectionResult, expectedPatterns?: ExpectedPattern[]): GapAnalysisResult {\n\t\t// Use framework patterns or provided patterns\n\t\tconst expected = expectedPatterns || this.config.frameworkConfig?.expectedPatterns || [];\n\n\t\t// Filter by importance if not including optional\n\t\tconst relevantExpected = this.config.includeOptional\n\t\t\t? expected\n\t\t\t: expected.filter((p) => p.importance !== \"optional\");\n\n\t\t// Identify gaps\n\t\tconst gaps = this.identifyGaps(detectionResult, relevantExpected);\n\n\t\t// Identify strengths\n\t\tconst strengths = detectionResult.foundPatterns.filter(\n\t\t\t(p) => p.isPositive && p.strength >= this.config.coverageThreshold,\n\t\t);\n\n\t\t// Identify anti-patterns\n\t\tconst antiPatterns = detectionResult.foundPatterns.filter((p) => !p.isPositive);\n\n\t\t// Calculate score\n\t\tconst score = this.calculateScore(relevantExpected, strengths, gaps, antiPatterns);\n\n\t\t// Generate recommendations\n\t\tconst recommendations = this.generateRecommendations(gaps, antiPatterns);\n\n\t\t// Create summary\n\t\tconst summary: GapAnalysisSummary = {\n\t\t\ttotalExpected: relevantExpected.length,\n\t\t\tpatternsFound: strengths.length,\n\t\t\tpatternsMissing: gaps.length,\n\t\t\tantiPatternsFound: antiPatterns.length,\n\t\t\tcriticalGaps: gaps.filter((g) => g.severity === \"critical\").length,\n\t\t\trecommendedGaps: gaps.filter((g) => g.severity === \"high\").length,\n\t\t\toptionalGaps: gaps.filter((g) => g.severity === \"medium\" || g.severity === \"low\").length,\n\t\t};\n\n\t\treturn {\n\t\t\tgaps,\n\t\t\tstrengths,\n\t\t\tantiPatterns,\n\t\t\tscore,\n\t\t\trecommendations,\n\t\t\tsummary,\n\t\t};\n\t}\n\n\t/**\n\t * Analyze a workspace profile for gaps\n\t */\n\tanalyzeWorkspace(profile: WorkspaceProfile, frameworkConfig?: FrameworkConfig): GapAnalysisResult {\n\t\tconst config = frameworkConfig || this.config.frameworkConfig;\n\n\t\tif (!config) {\n\t\t\treturn {\n\t\t\t\tgaps: [],\n\t\t\t\tstrengths: [],\n\t\t\t\tantiPatterns: [],\n\t\t\t\tscore: 0,\n\t\t\t\trecommendations: [],\n\t\t\t\tsummary: {\n\t\t\t\t\ttotalExpected: 0,\n\t\t\t\t\tpatternsFound: 0,\n\t\t\t\t\tpatternsMissing: 0,\n\t\t\t\t\tantiPatternsFound: 0,\n\t\t\t\t\tcriticalGaps: 0,\n\t\t\t\t\trecommendedGaps: 0,\n\t\t\t\t\toptionalGaps: 0,\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\n\t\t// Convert workspace profile to detection result format\n\t\tconst detectionResult: PatternDetectionResult = {\n\t\t\tfoundPatterns: profile.detectedPatterns.map((p) => ({\n\t\t\t\tid: p.id,\n\t\t\t\tname: p.name,\n\t\t\t\tcategory: p.category,\n\t\t\t\tlocations: p.locations.map((loc) => ({\n\t\t\t\t\tfile: loc.file,\n\t\t\t\t\tline: loc.line ?? 0,\n\t\t\t\t\tcolumn: loc.column,\n\t\t\t\t\tsnippet: loc.snippet ?? \"\",\n\t\t\t\t\tconfidence: 1.0,\n\t\t\t\t})),\n\t\t\t\tstrength: p.strength,\n\t\t\t\tisPositive: true, // Assume positive unless we know otherwise\n\t\t\t})),\n\t\t\tmissingPatterns: [],\n\t\t\tscannedFiles: profile.structure.totalFiles,\n\t\t\tduration: 0,\n\t\t\terrors: [],\n\t\t};\n\n\t\treturn this.analyze(detectionResult, config.expectedPatterns);\n\t}\n\n\t// =========================================================================\n\t// PRIVATE METHODS\n\t// =========================================================================\n\n\tprivate identifyGaps(detection: PatternDetectionResult, expected: ExpectedPattern[]): PatternGap[] {\n\t\tconst gaps: PatternGap[] = [];\n\n\t\tfor (const pattern of expected) {\n\t\t\tconst found = detection.foundPatterns.find((p) => p.id === pattern.id);\n\n\t\t\tif (!found) {\n\t\t\t\t// Pattern completely missing\n\t\t\t\tgaps.push({\n\t\t\t\t\tpatternId: pattern.id,\n\t\t\t\t\tpatternName: pattern.name,\n\t\t\t\t\ttype: \"missing\",\n\t\t\t\t\tseverity: this.importanceToSeverity(pattern.importance),\n\t\t\t\t\tdescription: `Missing ${pattern.name}: ${pattern.description}`,\n\t\t\t\t\trecommendation: this.getRecommendation(pattern),\n\t\t\t\t\teffort: this.estimateEffort(pattern),\n\t\t\t\t\tautoFixable: false,\n\t\t\t\t});\n\t\t\t} else if (found.strength < this.config.coverageThreshold) {\n\t\t\t\t// Pattern present but weak\n\t\t\t\tgaps.push({\n\t\t\t\t\tpatternId: pattern.id,\n\t\t\t\t\tpatternName: pattern.name,\n\t\t\t\t\ttype: \"incomplete\",\n\t\t\t\t\tseverity: this.importanceToSeverity(pattern.importance),\n\t\t\t\t\tdescription: `Incomplete ${pattern.name}: Only ${Math.round(found.strength * 100)}% coverage`,\n\t\t\t\t\trecommendation: `Improve coverage of ${pattern.name}`,\n\t\t\t\t\teffort: \"small\",\n\t\t\t\t\taffectedFiles: found.locations.map((l) => l.file),\n\t\t\t\t\tautoFixable: false,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\treturn gaps;\n\t}\n\n\tprivate importanceToSeverity(importance: ExpectedPattern[\"importance\"]): PatternGap[\"severity\"] {\n\t\tswitch (importance) {\n\t\t\tcase \"critical\":\n\t\t\t\treturn \"critical\";\n\t\t\tcase \"recommended\":\n\t\t\t\treturn \"high\";\n\t\t\tcase \"optional\":\n\t\t\t\treturn \"low\";\n\t\t}\n\t}\n\n\tprivate getRecommendation(pattern: ExpectedPattern): string {\n\t\tswitch (pattern.category) {\n\t\t\tcase \"error-handling\":\n\t\t\t\treturn `Add ${pattern.name} to handle errors gracefully`;\n\t\t\tcase \"security\":\n\t\t\t\treturn `Implement ${pattern.name} to improve security`;\n\t\t\tcase \"testing\":\n\t\t\t\treturn `Add ${pattern.name} for better test coverage`;\n\t\t\tcase \"performance\":\n\t\t\t\treturn `Optimize with ${pattern.name}`;\n\t\t\tdefault:\n\t\t\t\treturn `Implement ${pattern.name}`;\n\t\t}\n\t}\n\n\tprivate estimateEffort(pattern: ExpectedPattern): PatternGap[\"effort\"] {\n\t\t// Heuristic based on pattern type\n\t\tswitch (pattern.importance) {\n\t\t\tcase \"critical\":\n\t\t\t\treturn \"medium\";\n\t\t\tcase \"recommended\":\n\t\t\t\treturn \"small\";\n\t\t\tcase \"optional\":\n\t\t\t\treturn \"trivial\";\n\t\t}\n\t}\n\n\tprivate calculateScore(\n\t\texpected: ExpectedPattern[],\n\t\tstrengths: FoundPattern[],\n\t\tgaps: PatternGap[],\n\t\tantiPatterns: FoundPattern[],\n\t): number {\n\t\tif (expected.length === 0) {\n\t\t\treturn 100;\n\t\t}\n\n\t\t// Base score from pattern coverage\n\t\tconst coverageScore = (strengths.length / expected.length) * 100;\n\n\t\t// Penalty for critical gaps\n\t\tconst criticalPenalty = gaps.filter((g) => g.severity === \"critical\").length * 10;\n\n\t\t// Penalty for high gaps\n\t\tconst highPenalty = gaps.filter((g) => g.severity === \"high\").length * 5;\n\n\t\t// Penalty for anti-patterns\n\t\tconst antiPatternPenalty = antiPatterns.length * 8;\n\n\t\t// Calculate final score\n\t\tconst score = Math.max(0, Math.min(100, coverageScore - criticalPenalty - highPenalty - antiPatternPenalty));\n\n\t\treturn Math.round(score);\n\t}\n\n\tprivate generateRecommendations(gaps: PatternGap[], antiPatterns: FoundPattern[]): OnboardingRecommendation[] {\n\t\tconst recommendations: OnboardingRecommendation[] = [];\n\t\tlet priority = 1;\n\n\t\t// Critical gaps first\n\t\tfor (const gap of gaps.filter((g) => g.severity === \"critical\")) {\n\t\t\trecommendations.push({\n\t\t\t\tid: `gap-${gap.patternId}`,\n\t\t\t\tcategory: this.patternCategoryToRecommendationCategory(gap),\n\t\t\t\tpriority: priority++,\n\t\t\t\ttitle: `Add ${gap.patternName}`,\n\t\t\t\tdescription: gap.description,\n\t\t\t\tactions: [\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: \"add-pattern\",\n\t\t\t\t\t\ttarget: gap.patternId,\n\t\t\t\t\t\tdescription: gap.recommendation,\n\t\t\t\t\t\tautoApply: gap.autoFixable,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\testimatedTime: this.effortToTime(gap.effort),\n\t\t\t\thealthImpact: 15,\n\t\t\t});\n\t\t}\n\n\t\t// Anti-patterns\n\t\tfor (const antiPattern of antiPatterns) {\n\t\t\trecommendations.push({\n\t\t\t\tid: `fix-${antiPattern.id}`,\n\t\t\t\tcategory: \"pattern\",\n\t\t\t\tpriority: priority++,\n\t\t\t\ttitle: `Fix ${antiPattern.name}`,\n\t\t\t\tdescription: `Found ${antiPattern.locations.length} instances of ${antiPattern.name}`,\n\t\t\t\tactions: antiPattern.locations.slice(0, 5).map((loc) => ({\n\t\t\t\t\ttype: \"update-file\" as const,\n\t\t\t\t\ttarget: loc.file,\n\t\t\t\t\tdescription: `Fix at line ${loc.line}`,\n\t\t\t\t\tautoApply: false,\n\t\t\t\t})),\n\t\t\t\testimatedTime: `${antiPattern.locations.length * 5} minutes`,\n\t\t\t\thealthImpact: 10,\n\t\t\t});\n\t\t}\n\n\t\t// High gaps\n\t\tfor (const gap of gaps.filter((g) => g.severity === \"high\")) {\n\t\t\trecommendations.push({\n\t\t\t\tid: `gap-${gap.patternId}`,\n\t\t\t\tcategory: this.patternCategoryToRecommendationCategory(gap),\n\t\t\t\tpriority: priority++,\n\t\t\t\ttitle: `Add ${gap.patternName}`,\n\t\t\t\tdescription: gap.description,\n\t\t\t\tactions: [\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: \"add-pattern\",\n\t\t\t\t\t\ttarget: gap.patternId,\n\t\t\t\t\t\tdescription: gap.recommendation,\n\t\t\t\t\t\tautoApply: gap.autoFixable,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\testimatedTime: this.effortToTime(gap.effort),\n\t\t\t\thealthImpact: 8,\n\t\t\t});\n\t\t}\n\n\t\treturn recommendations;\n\t}\n\n\tprivate patternCategoryToRecommendationCategory(_gap: PatternGap): OnboardingRecommendation[\"category\"] {\n\t\t// This is a simplified mapping - in practice would need access to pattern category\n\t\treturn \"pattern\";\n\t}\n\n\tprivate effortToTime(effort: PatternGap[\"effort\"]): string {\n\t\tswitch (effort) {\n\t\t\tcase \"trivial\":\n\t\t\t\treturn \"5 minutes\";\n\t\t\tcase \"small\":\n\t\t\t\treturn \"15 minutes\";\n\t\t\tcase \"medium\":\n\t\t\t\treturn \"1 hour\";\n\t\t\tcase \"large\":\n\t\t\t\treturn \"4 hours\";\n\t\t}\n\t}\n}\n","/**\n * Error Handling Pattern Matchers\n *\n * Detects error handling patterns in the codebase.\n *\n * @module patterns/matchers/error-handling\n */\n\nimport type { PatternMatch, PatternMatcher } from \"../types.js\";\n\n/**\n * Create line-based match from regex match\n */\nfunction createMatch(content: string, filePath: string, regexMatch: RegExpExecArray, confidence = 0.9): PatternMatch {\n\tconst beforeMatch = content.slice(0, regexMatch.index);\n\tconst line = (beforeMatch.match(/\\n/g) || []).length + 1;\n\n\t// Get snippet (the matched line)\n\tconst lines = content.split(\"\\n\");\n\tconst snippet = lines[line - 1]?.trim() || regexMatch[0];\n\n\treturn {\n\t\tfile: filePath,\n\t\tline,\n\t\tsnippet: snippet.slice(0, 100),\n\t\tconfidence,\n\t};\n}\n\n/**\n * Matcher for React Error Boundaries\n */\nexport const errorBoundaryMatcher: PatternMatcher = {\n\tid: \"error-boundary\",\n\tname: \"Error Boundary\",\n\tcategory: \"error-handling\",\n\tfiles: [\"**/*.{tsx,jsx}\"],\n\tisPositive: true,\n\timportance: \"critical\",\n\tdescription: \"React Error Boundary for graceful error handling\",\n\tmatch: (content, filePath) => {\n\t\tconst matches: PatternMatch[] = [];\n\n\t\t// Check for ErrorBoundary component usage\n\t\tconst patterns = [\n\t\t\t/class\\s+\\w+\\s+extends\\s+\\w*Error.*\\{[\\s\\S]*?componentDidCatch/g,\n\t\t\t/ErrorBoundary/g,\n\t\t\t/react-error-boundary/g,\n\t\t];\n\n\t\tfor (const pattern of patterns) {\n\t\t\tlet match: RegExpExecArray | null;\n\t\t\twhile ((match = pattern.exec(content)) !== null) {\n\t\t\t\tmatches.push(createMatch(content, filePath, match));\n\t\t\t}\n\t\t}\n\n\t\treturn matches;\n\t},\n};\n\n/**\n * Matcher for try-catch blocks\n */\nexport const tryCatchMatcher: PatternMatcher = {\n\tid: \"try-catch\",\n\tname: \"Try-Catch Error Handling\",\n\tcategory: \"error-handling\",\n\tfiles: [\"**/*.{ts,tsx,js,jsx}\"],\n\tisPositive: true,\n\timportance: \"recommended\",\n\tdescription: \"Proper try-catch error handling for async operations\",\n\tmatch: (content, filePath) => {\n\t\tconst matches: PatternMatch[] = [];\n\n\t\t// Look for try-catch blocks, especially with async\n\t\tconst pattern = /try\\s*\\{[\\s\\S]*?\\}\\s*catch\\s*\\(/g;\n\n\t\tlet match: RegExpExecArray | null;\n\t\twhile ((match = pattern.exec(content)) !== null) {\n\t\t\tmatches.push(createMatch(content, filePath, match, 0.85));\n\t\t}\n\n\t\treturn matches;\n\t},\n};\n\n/**\n * Matcher for Express error middleware\n */\nexport const expressErrorMiddlewareMatcher: PatternMatcher = {\n\tid: \"express-error-middleware\",\n\tname: \"Express Error Middleware\",\n\tcategory: \"error-handling\",\n\tfiles: [\"**/*.{ts,js}\"],\n\tisPositive: true,\n\timportance: \"critical\",\n\tdescription: \"Centralized error handling middleware for Express\",\n\tmatch: (content, filePath) => {\n\t\tconst matches: PatternMatch[] = [];\n\n\t\t// Express error middleware signature: (err, req, res, next)\n\t\tconst patterns = [\n\t\t\t/\\(\\s*err\\s*,\\s*req\\s*,\\s*res\\s*,\\s*next\\s*\\)/g,\n\t\t\t/\\(\\s*error\\s*:\\s*\\w+\\s*,\\s*req\\s*:\\s*\\w+\\s*,\\s*res\\s*:\\s*\\w+\\s*,\\s*next\\s*:\\s*\\w+\\s*\\)/g,\n\t\t\t/errorHandler|ErrorHandler/g,\n\t\t];\n\n\t\tfor (const pattern of patterns) {\n\t\t\tlet match: RegExpExecArray | null;\n\t\t\twhile ((match = pattern.exec(content)) !== null) {\n\t\t\t\tmatches.push(createMatch(content, filePath, match));\n\t\t\t}\n\t\t}\n\n\t\treturn matches;\n\t},\n};\n\n/**\n * Matcher for NestJS exception filters\n */\nexport const nestjsExceptionFilterMatcher: PatternMatcher = {\n\tid: \"nestjs-exception-filter\",\n\tname: \"NestJS Exception Filter\",\n\tcategory: \"error-handling\",\n\tfiles: [\"**/*.ts\"],\n\tisPositive: true,\n\timportance: \"critical\",\n\tdescription: \"NestJS exception filters for error handling\",\n\tmatch: (content, filePath) => {\n\t\tconst matches: PatternMatch[] = [];\n\n\t\tconst patterns = [/@Catch\\s*\\(/g, /ExceptionFilter/g, /HttpException/g];\n\n\t\tfor (const pattern of patterns) {\n\t\t\tlet match: RegExpExecArray | null;\n\t\t\twhile ((match = pattern.exec(content)) !== null) {\n\t\t\t\tmatches.push(createMatch(content, filePath, match));\n\t\t\t}\n\t\t}\n\n\t\treturn matches;\n\t},\n};\n\n/**\n * Matcher for unhandled promise rejections (anti-pattern)\n */\nexport const unhandledPromiseMatcher: PatternMatcher = {\n\tid: \"unhandled-promise\",\n\tname: \"Unhandled Promise\",\n\tcategory: \"error-handling\",\n\tfiles: [\"**/*.{ts,tsx,js,jsx}\"],\n\tisPositive: false, // This is an anti-pattern\n\timportance: \"critical\",\n\tdescription: \"Promises without .catch() or try-catch (potential unhandled rejection)\",\n\tmatch: (content, filePath) => {\n\t\tconst matches: PatternMatch[] = [];\n\n\t\t// Look for .then() without .catch()\n\t\t// This is a simplified heuristic\n\t\tconst thenPattern = /\\.then\\s*\\([^)]+\\)(?!\\s*\\.catch)/g;\n\n\t\tlet match: RegExpExecArray | null;\n\t\twhile ((match = thenPattern.exec(content)) !== null) {\n\t\t\t// Check if there's a .catch on the same line or next\n\t\t\tconst afterMatch = content.slice(match.index);\n\t\t\tif (!afterMatch.slice(0, 200).includes(\".catch\")) {\n\t\t\t\tmatches.push(createMatch(content, filePath, match, 0.6));\n\t\t\t}\n\t\t}\n\n\t\treturn matches;\n\t},\n};\n\n/**\n * Matcher for global error handlers\n */\nexport const globalErrorHandlerMatcher: PatternMatcher = {\n\tid: \"global-error-handler\",\n\tname: \"Global Error Handler\",\n\tcategory: \"error-handling\",\n\tfiles: [\"**/*.{ts,tsx,js,jsx}\"],\n\tisPositive: true,\n\timportance: \"recommended\",\n\tdescription: \"Global error handler for uncaught exceptions\",\n\tmatch: (content, filePath) => {\n\t\tconst matches: PatternMatch[] = [];\n\n\t\tconst patterns = [\n\t\t\t/process\\.on\\s*\\(\\s*['\"]uncaughtException['\"]/g,\n\t\t\t/process\\.on\\s*\\(\\s*['\"]unhandledRejection['\"]/g,\n\t\t\t/window\\.onerror/g,\n\t\t\t/window\\.addEventListener\\s*\\(\\s*['\"]error['\"]/g,\n\t\t];\n\n\t\tfor (const pattern of patterns) {\n\t\t\tlet match: RegExpExecArray | null;\n\t\t\twhile ((match = pattern.exec(content)) !== null) {\n\t\t\t\tmatches.push(createMatch(content, filePath, match));\n\t\t\t}\n\t\t}\n\n\t\treturn matches;\n\t},\n};\n\n/**\n * All error handling matchers\n */\nexport const errorHandlingMatchers: PatternMatcher[] = [\n\terrorBoundaryMatcher,\n\ttryCatchMatcher,\n\texpressErrorMiddlewareMatcher,\n\tnestjsExceptionFilterMatcher,\n\tunhandledPromiseMatcher,\n\tglobalErrorHandlerMatcher,\n];\n","/**\n * Performance Pattern Matchers\n *\n * Detects performance patterns and anti-patterns in the codebase.\n *\n * @module patterns/matchers/performance\n */\n\nimport type { PatternMatch, PatternMatcher } from \"../types.js\";\n\n/**\n * Create line-based match from regex match\n */\nfunction createMatch(content: string, filePath: string, regexMatch: RegExpExecArray, confidence = 0.9): PatternMatch {\n\tconst beforeMatch = content.slice(0, regexMatch.index);\n\tconst line = (beforeMatch.match(/\\n/g) || []).length + 1;\n\tconst lines = content.split(\"\\n\");\n\tconst snippet = lines[line - 1]?.trim() || regexMatch[0];\n\n\treturn {\n\t\tfile: filePath,\n\t\tline,\n\t\tsnippet: snippet.slice(0, 100),\n\t\tconfidence,\n\t};\n}\n\n/**\n * Matcher for React memoization\n */\nexport const reactMemoMatcher: PatternMatcher = {\n\tid: \"react-memo\",\n\tname: \"React Memoization\",\n\tcategory: \"performance\",\n\tfiles: [\"**/*.{tsx,jsx}\"],\n\tisPositive: true,\n\timportance: \"optional\",\n\tdescription: \"Performance optimization with React.memo, useMemo, useCallback\",\n\tmatch: (content, filePath) => {\n\t\tconst matches: PatternMatch[] = [];\n\n\t\tconst patterns = [/React\\.memo\\s*\\(/g, /memo\\s*\\(/g, /useMemo\\s*\\(/g, /useCallback\\s*\\(/g];\n\n\t\tfor (const pattern of patterns) {\n\t\t\tlet match: RegExpExecArray | null;\n\t\t\twhile ((match = pattern.exec(content)) !== null) {\n\t\t\t\tmatches.push(createMatch(content, filePath, match));\n\t\t\t}\n\t\t}\n\n\t\treturn matches;\n\t},\n};\n\n/**\n * Matcher for lazy loading\n */\nexport const lazyLoadingMatcher: PatternMatcher = {\n\tid: \"lazy-loading\",\n\tname: \"Lazy Loading\",\n\tcategory: \"performance\",\n\tfiles: [\"**/*.{tsx,jsx,ts,js}\"],\n\tisPositive: true,\n\timportance: \"recommended\",\n\tdescription: \"Code splitting with lazy loading\",\n\tmatch: (content, filePath) => {\n\t\tconst matches: PatternMatch[] = [];\n\n\t\tconst patterns = [\n\t\t\t/React\\.lazy\\s*\\(/g,\n\t\t\t/lazy\\s*\\(/g,\n\t\t\t/dynamic\\s*\\(\\s*\\(\\s*\\)\\s*=>/g,\n\t\t\t/import\\s*\\(\\s*['\"][^'\"]+['\"]\\s*\\)/g,\n\t\t];\n\n\t\tfor (const pattern of patterns) {\n\t\t\tlet match: RegExpExecArray | null;\n\t\t\twhile ((match = pattern.exec(content)) !== null) {\n\t\t\t\tmatches.push(createMatch(content, filePath, match));\n\t\t\t}\n\t\t}\n\n\t\treturn matches;\n\t},\n};\n\n/**\n * Matcher for image optimization\n */\nexport const imageOptimizationMatcher: PatternMatcher = {\n\tid: \"image-optimization\",\n\tname: \"Image Optimization\",\n\tcategory: \"performance\",\n\tfiles: [\"**/*.{tsx,jsx}\"],\n\tisPositive: true,\n\timportance: \"recommended\",\n\tdescription: \"Optimized images with next/image or similar\",\n\tmatch: (content, filePath) => {\n\t\tconst matches: PatternMatch[] = [];\n\n\t\tconst patterns = [\n\t\t\t/import.*Image.*from ['\"]next\\/image['\"]/g,\n\t\t\t/import.*Image.*from ['\"]@astro\\/assets['\"]/g,\n\t\t\t/<Image[^>]+/g,\n\t\t\t/loading\\s*=\\s*['\"]lazy['\"]/g,\n\t\t];\n\n\t\tfor (const pattern of patterns) {\n\t\t\tlet match: RegExpExecArray | null;\n\t\t\twhile ((match = pattern.exec(content)) !== null) {\n\t\t\t\tmatches.push(createMatch(content, filePath, match));\n\t\t\t}\n\t\t}\n\n\t\treturn matches;\n\t},\n};\n\n/**\n * Matcher for bundle size issues (anti-pattern)\n */\nexport const largeBundleMatcher: PatternMatcher = {\n\tid: \"large-bundle-imports\",\n\tname: \"Large Bundle Imports\",\n\tcategory: \"performance\",\n\tfiles: [\"**/*.{tsx,jsx,ts,js}\"],\n\tisPositive: false,\n\timportance: \"recommended\",\n\tdescription: \"Imports that may cause large bundle sizes\",\n\tmatch: (content, filePath) => {\n\t\t// Skip config files\n\t\tif (filePath.includes(\"config\") || filePath.includes(\".config.\")) {\n\t\t\treturn [];\n\t\t}\n\n\t\tconst matches: PatternMatch[] = [];\n\n\t\tconst patterns = [\n\t\t\t/import\\s+\\*\\s+as\\s+\\w+\\s+from\\s+['\"]lodash['\"]/g,\n\t\t\t/import\\s+\\{\\s*\\}\\s+from\\s+['\"]moment['\"]/g,\n\t\t\t/import\\s+moment\\s+from\\s+['\"]moment['\"]/g,\n\t\t\t/import\\s+\\*\\s+as\\s+\\w+\\s+from\\s+['\"]rxjs['\"]/g,\n\t\t];\n\n\t\tfor (const pattern of patterns) {\n\t\t\tlet match: RegExpExecArray | null;\n\t\t\twhile ((match = pattern.exec(content)) !== null) {\n\t\t\t\tmatches.push(createMatch(content, filePath, match, 0.7));\n\t\t\t}\n\t\t}\n\n\t\treturn matches;\n\t},\n};\n\n/**\n * Matcher for caching\n */\nexport const cachingMatcher: PatternMatcher = {\n\tid: \"caching\",\n\tname: \"Data Caching\",\n\tcategory: \"performance\",\n\tfiles: [\"**/*.{ts,js}\"],\n\tisPositive: true,\n\timportance: \"recommended\",\n\tdescription: \"Caching for improved performance\",\n\tmatch: (content, filePath) => {\n\t\tconst matches: PatternMatch[] = [];\n\n\t\tconst patterns = [\n\t\t\t/cache-manager/g,\n\t\t\t/@nestjs\\/cache-manager/g,\n\t\t\t/redis/g,\n\t\t\t/lru-cache/g,\n\t\t\t/quick-lru/g,\n\t\t\t/unstable_cache/g,\n\t\t\t/revalidate\\s*:/g,\n\t\t];\n\n\t\tfor (const pattern of patterns) {\n\t\t\tlet match: RegExpExecArray | null;\n\t\t\twhile ((match = pattern.exec(content)) !== null) {\n\t\t\t\tmatches.push(createMatch(content, filePath, match));\n\t\t\t}\n\t\t}\n\n\t\treturn matches;\n\t},\n};\n\n/**\n * Matcher for async state in loops (anti-pattern)\n */\nexport const asyncInLoopMatcher: PatternMatcher = {\n\tid: \"async-in-loop\",\n\tname: \"Async Operations in Loop\",\n\tcategory: \"performance\",\n\tfiles: [\"**/*.{ts,tsx,js,jsx}\"],\n\tisPositive: false,\n\timportance: \"recommended\",\n\tdescription: \"Sequential async operations that could be parallelized\",\n\tmatch: (content, filePath) => {\n\t\tconst matches: PatternMatch[] = [];\n\n\t\tconst patterns = [/for\\s*\\([^)]+\\)\\s*\\{[^}]*await\\s+/g, /\\.forEach\\s*\\(\\s*async/g];\n\n\t\tfor (const pattern of patterns) {\n\t\t\tlet match: RegExpExecArray | null;\n\t\t\twhile ((match = pattern.exec(content)) !== null) {\n\t\t\t\tmatches.push(createMatch(content, filePath, match, 0.6));\n\t\t\t}\n\t\t}\n\n\t\treturn matches;\n\t},\n};\n\n/**\n * Matcher for response compression\n */\nexport const compressionMatcher: PatternMatcher = {\n\tid: \"compression\",\n\tname: \"Response Compression\",\n\tcategory: \"performance\",\n\tfiles: [\"**/*.{ts,js}\"],\n\tisPositive: true,\n\timportance: \"recommended\",\n\tdescription: \"Gzip/Brotli compression for responses\",\n\tmatch: (content, filePath) => {\n\t\tconst matches: PatternMatch[] = [];\n\n\t\tconst patterns = [/compression/g, /brotli/g, /gzip/g, /Content-Encoding/g];\n\n\t\tfor (const pattern of patterns) {\n\t\t\tlet match: RegExpExecArray | null;\n\t\t\twhile ((match = pattern.exec(content)) !== null) {\n\t\t\t\tmatches.push(createMatch(content, filePath, match));\n\t\t\t}\n\t\t}\n\n\t\treturn matches;\n\t},\n};\n\n/**\n * All performance matchers\n */\nexport const performanceMatchers: PatternMatcher[] = [\n\treactMemoMatcher,\n\tlazyLoadingMatcher,\n\timageOptimizationMatcher,\n\tlargeBundleMatcher,\n\tcachingMatcher,\n\tasyncInLoopMatcher,\n\tcompressionMatcher,\n];\n","/**\n * Security Pattern Matchers\n *\n * Detects security patterns and anti-patterns in the codebase.\n *\n * @module patterns/matchers/security\n */\n\nimport type { PatternMatch, PatternMatcher } from \"../types.js\";\n\n/**\n * Create line-based match from regex match\n */\nfunction createMatch(content: string, filePath: string, regexMatch: RegExpExecArray, confidence = 0.9): PatternMatch {\n\tconst beforeMatch = content.slice(0, regexMatch.index);\n\tconst line = (beforeMatch.match(/\\n/g) || []).length + 1;\n\tconst lines = content.split(\"\\n\");\n\tconst snippet = lines[line - 1]?.trim() || regexMatch[0];\n\n\treturn {\n\t\tfile: filePath,\n\t\tline,\n\t\tsnippet: snippet.slice(0, 100),\n\t\tconfidence,\n\t};\n}\n\n/**\n * Matcher for Helmet security headers\n */\nexport const helmetMatcher: PatternMatcher = {\n\tid: \"helmet-security\",\n\tname: \"Helmet Security Headers\",\n\tcategory: \"security\",\n\tfiles: [\"**/*.{ts,js}\"],\n\tisPositive: true,\n\timportance: \"critical\",\n\tdescription: \"Security headers with Helmet middleware\",\n\tmatch: (content, filePath) => {\n\t\tconst matches: PatternMatch[] = [];\n\n\t\tconst patterns = [/import.*helmet/g, /require\\s*\\(\\s*['\"]helmet['\"]\\s*\\)/g, /app\\.use\\s*\\(\\s*helmet\\s*\\(/g];\n\n\t\tfor (const pattern of patterns) {\n\t\t\tlet match: RegExpExecArray | null;\n\t\t\twhile ((match = pattern.exec(content)) !== null) {\n\t\t\t\tmatches.push(createMatch(content, filePath, match));\n\t\t\t}\n\t\t}\n\n\t\treturn matches;\n\t},\n};\n\n/**\n * Matcher for CORS configuration\n */\nexport const corsMatcher: PatternMatcher = {\n\tid: \"cors-config\",\n\tname: \"CORS Configuration\",\n\tcategory: \"security\",\n\tfiles: [\"**/*.{ts,js}\"],\n\tisPositive: true,\n\timportance: \"critical\",\n\tdescription: \"Cross-origin resource sharing configuration\",\n\tmatch: (content, filePath) => {\n\t\tconst matches: PatternMatch[] = [];\n\n\t\tconst patterns = [\n\t\t\t/import.*cors/g,\n\t\t\t/require\\s*\\(\\s*['\"]cors['\"]\\s*\\)/g,\n\t\t\t/app\\.use\\s*\\(\\s*cors\\s*\\(/g,\n\t\t\t/Access-Control-Allow-Origin/g,\n\t\t];\n\n\t\tfor (const pattern of patterns) {\n\t\t\tlet match: RegExpExecArray | null;\n\t\t\twhile ((match = pattern.exec(content)) !== null) {\n\t\t\t\tmatches.push(createMatch(content, filePath, match));\n\t\t\t}\n\t\t}\n\n\t\treturn matches;\n\t},\n};\n\n/**\n * Matcher for rate limiting\n */\nexport const rateLimitMatcher: PatternMatcher = {\n\tid: \"rate-limiting\",\n\tname: \"Rate Limiting\",\n\tcategory: \"security\",\n\tfiles: [\"**/*.{ts,js}\"],\n\tisPositive: true,\n\timportance: \"critical\",\n\tdescription: \"Request rate limiting to prevent abuse\",\n\tmatch: (content, filePath) => {\n\t\tconst matches: PatternMatch[] = [];\n\n\t\tconst patterns = [\n\t\t\t/express-rate-limit/g,\n\t\t\t/rate-limiter-flexible/g,\n\t\t\t/rateLimit/g,\n\t\t\t/@nestjs\\/throttler/g,\n\t\t\t/ThrottlerModule/g,\n\t\t];\n\n\t\tfor (const pattern of patterns) {\n\t\t\tlet match: RegExpExecArray | null;\n\t\t\twhile ((match = pattern.exec(content)) !== null) {\n\t\t\t\tmatches.push(createMatch(content, filePath, match));\n\t\t\t}\n\t\t}\n\n\t\treturn matches;\n\t},\n};\n\n/**\n * Matcher for SQL injection vulnerabilities (anti-pattern)\n */\nexport const sqlInjectionMatcher: PatternMatcher = {\n\tid: \"sql-injection-risk\",\n\tname: \"SQL Injection Risk\",\n\tcategory: \"security\",\n\tfiles: [\"**/*.{ts,js}\"],\n\tisPositive: false,\n\timportance: \"critical\",\n\tdescription: \"Potential SQL injection vulnerability (string concatenation in queries)\",\n\tmatch: (content, filePath) => {\n\t\tconst matches: PatternMatch[] = [];\n\n\t\t// Look for string concatenation in SQL queries\n\t\tconst patterns = [\n\t\t\t/query\\s*\\(\\s*[`'\"].*\\$\\{/g,\n\t\t\t/execute\\s*\\(\\s*[`'\"].*\\+/g,\n\t\t\t/SELECT.*\\+.*WHERE/gi,\n\t\t\t/INSERT.*\\+.*VALUES/gi,\n\t\t];\n\n\t\tfor (const pattern of patterns) {\n\t\t\tlet match: RegExpExecArray | null;\n\t\t\twhile ((match = pattern.exec(content)) !== null) {\n\t\t\t\tmatches.push(createMatch(content, filePath, match, 0.7));\n\t\t\t}\n\t\t}\n\n\t\treturn matches;\n\t},\n};\n\n/**\n * Matcher for XSS vulnerabilities (anti-pattern)\n */\nexport const xssMatcher: PatternMatcher = {\n\tid: \"xss-risk\",\n\tname: \"XSS Risk\",\n\tcategory: \"security\",\n\tfiles: [\"**/*.{tsx,jsx}\"],\n\tisPositive: false,\n\timportance: \"critical\",\n\tdescription: \"Potential XSS vulnerability (dangerouslySetInnerHTML usage)\",\n\tmatch: (content, filePath) => {\n\t\tconst matches: PatternMatch[] = [];\n\n\t\tconst pattern = /dangerouslySetInnerHTML/g;\n\n\t\tlet match: RegExpExecArray | null;\n\t\twhile ((match = pattern.exec(content)) !== null) {\n\t\t\tmatches.push(createMatch(content, filePath, match, 0.8));\n\t\t}\n\n\t\treturn matches;\n\t},\n};\n\n/**\n * Matcher for hardcoded secrets (anti-pattern)\n */\nexport const hardcodedSecretsMatcher: PatternMatcher = {\n\tid: \"hardcoded-secrets\",\n\tname: \"Hardcoded Secrets\",\n\tcategory: \"security\",\n\tfiles: [\"**/*.{ts,tsx,js,jsx}\"],\n\tisPositive: false,\n\timportance: \"critical\",\n\tdescription: \"Potential hardcoded secrets or API keys\",\n\tmatch: (content, filePath) => {\n\t\t// Skip test files and fixtures\n\t\tif (filePath.includes(\"test\") || filePath.includes(\"fixture\") || filePath.includes(\"mock\")) {\n\t\t\treturn [];\n\t\t}\n\n\t\tconst matches: PatternMatch[] = [];\n\n\t\tconst patterns = [\n\t\t\t/(api_key|apiKey|API_KEY)\\s*[:=]\\s*['\"][^'\"]{20,}['\"]/gi,\n\t\t\t/(secret|SECRET)\\s*[:=]\\s*['\"][^'\"]{16,}['\"]/gi,\n\t\t\t/(password|PASSWORD)\\s*[:=]\\s*['\"][^'\"]{8,}['\"]/gi,\n\t\t\t/sk-[a-zA-Z0-9]{24,}/g, // OpenAI keys\n\t\t\t/ghp_[a-zA-Z0-9]{36}/g, // GitHub tokens\n\t\t];\n\n\t\tfor (const pattern of patterns) {\n\t\t\tlet match: RegExpExecArray | null;\n\t\t\twhile ((match = pattern.exec(content)) !== null) {\n\t\t\t\tmatches.push(createMatch(content, filePath, match, 0.75));\n\t\t\t}\n\t\t}\n\n\t\treturn matches;\n\t},\n};\n\n/**\n * Matcher for input validation\n */\nexport const inputValidationMatcher: PatternMatcher = {\n\tid: \"input-validation\",\n\tname: \"Input Validation\",\n\tcategory: \"security\",\n\tfiles: [\"**/*.{ts,js}\"],\n\tisPositive: true,\n\timportance: \"critical\",\n\tdescription: \"Request input validation with Zod, Yup, or similar\",\n\tmatch: (content, filePath) => {\n\t\tconst matches: PatternMatch[] = [];\n\n\t\tconst patterns = [\n\t\t\t/z\\.(object|string|number|array)/g,\n\t\t\t/yup\\.(object|string|number|array)/g,\n\t\t\t/@IsString|@IsNumber|@IsEmail/g,\n\t\t\t/Joi\\.(object|string|number|array)/g,\n\t\t\t/express-validator/g,\n\t\t];\n\n\t\tfor (const pattern of patterns) {\n\t\t\tlet match: RegExpExecArray | null;\n\t\t\twhile ((match = pattern.exec(content)) !== null) {\n\t\t\t\tmatches.push(createMatch(content, filePath, match));\n\t\t\t}\n\t\t}\n\n\t\treturn matches;\n\t},\n};\n\n/**\n * Matcher for authentication guards\n */\nexport const authGuardMatcher: PatternMatcher = {\n\tid: \"auth-guard\",\n\tname: \"Authentication Guard\",\n\tcategory: \"security\",\n\tfiles: [\"**/*.{ts,tsx,js,jsx}\"],\n\tisPositive: true,\n\timportance: \"critical\",\n\tdescription: \"Authentication middleware or guards for protected routes\",\n\tmatch: (content, filePath) => {\n\t\tconst matches: PatternMatch[] = [];\n\n\t\tconst patterns = [\n\t\t\t/@UseGuards/g,\n\t\t\t/AuthGuard/g,\n\t\t\t/isAuthenticated/g,\n\t\t\t/requireAuth/g,\n\t\t\t/withAuth/g,\n\t\t\t/useAuth/g,\n\t\t\t/getServerSession/g,\n\t\t\t/getToken/g,\n\t\t];\n\n\t\tfor (const pattern of patterns) {\n\t\t\tlet match: RegExpExecArray | null;\n\t\t\twhile ((match = pattern.exec(content)) !== null) {\n\t\t\t\tmatches.push(createMatch(content, filePath, match));\n\t\t\t}\n\t\t}\n\n\t\treturn matches;\n\t},\n};\n\n/**\n * All security matchers\n */\nexport const securityMatchers: PatternMatcher[] = [\n\thelmetMatcher,\n\tcorsMatcher,\n\trateLimitMatcher,\n\tsqlInjectionMatcher,\n\txssMatcher,\n\thardcodedSecretsMatcher,\n\tinputValidationMatcher,\n\tauthGuardMatcher,\n];\n","/**\n * Testing Pattern Matchers\n *\n * Detects testing patterns and anti-patterns in the codebase.\n *\n * @module patterns/matchers/testing\n */\n\nimport type { PatternMatch, PatternMatcher } from \"../types.js\";\n\n/**\n * Create line-based match from regex match\n */\nfunction createMatch(content: string, filePath: string, regexMatch: RegExpExecArray, confidence = 0.9): PatternMatch {\n\tconst beforeMatch = content.slice(0, regexMatch.index);\n\tconst line = (beforeMatch.match(/\\n/g) || []).length + 1;\n\tconst lines = content.split(\"\\n\");\n\tconst snippet = lines[line - 1]?.trim() || regexMatch[0];\n\n\treturn {\n\t\tfile: filePath,\n\t\tline,\n\t\tsnippet: snippet.slice(0, 100),\n\t\tconfidence,\n\t};\n}\n\n/**\n * Matcher for unit test files\n */\nexport const unitTestMatcher: PatternMatcher = {\n\tid: \"unit-tests\",\n\tname: \"Unit Tests\",\n\tcategory: \"testing\",\n\tfiles: [\"**/*.{test,spec}.{ts,tsx,js,jsx}\", \"**/__tests__/**/*.{ts,tsx,js,jsx}\"],\n\tisPositive: true,\n\timportance: \"recommended\",\n\tdescription: \"Unit test files with test assertions\",\n\tmatch: (content, filePath) => {\n\t\tconst matches: PatternMatch[] = [];\n\n\t\tconst patterns = [/describe\\s*\\(/g, /it\\s*\\(/g, /test\\s*\\(/g, /expect\\s*\\(/g];\n\n\t\tfor (const pattern of patterns) {\n\t\t\tlet match: RegExpExecArray | null;\n\t\t\twhile ((match = pattern.exec(content)) !== null) {\n\t\t\t\tmatches.push(createMatch(content, filePath, match));\n\t\t\t}\n\t\t}\n\n\t\treturn matches;\n\t},\n};\n\n/**\n * Matcher for vague assertions (anti-pattern)\n */\nexport const vagueAssertionMatcher: PatternMatcher = {\n\tid: \"vague-assertions\",\n\tname: \"Vague Assertions\",\n\tcategory: \"testing\",\n\tfiles: [\"**/*.{test,spec}.{ts,tsx,js,jsx}\", \"**/__tests__/**/*.{ts,tsx,js,jsx}\"],\n\tisPositive: false,\n\timportance: \"recommended\",\n\tdescription: \"Vague test assertions that don't provide meaningful validation\",\n\tmatch: (content, filePath) => {\n\t\tconst matches: PatternMatch[] = [];\n\n\t\tconst patterns = [\n\t\t\t/\\.toBeTruthy\\s*\\(\\s*\\)/g,\n\t\t\t/\\.toBeFalsy\\s*\\(\\s*\\)/g,\n\t\t\t/\\.toBeDefined\\s*\\(\\s*\\)/g,\n\t\t\t/\\.not\\.toBeUndefined\\s*\\(\\s*\\)/g,\n\t\t\t/expect\\s*\\(\\s*true\\s*\\)/g,\n\t\t];\n\n\t\tfor (const pattern of patterns) {\n\t\t\tlet match: RegExpExecArray | null;\n\t\t\twhile ((match = pattern.exec(content)) !== null) {\n\t\t\t\tmatches.push(createMatch(content, filePath, match, 0.8));\n\t\t\t}\n\t\t}\n\n\t\treturn matches;\n\t},\n};\n\n/**\n * Matcher for integration tests\n */\nexport const integrationTestMatcher: PatternMatcher = {\n\tid: \"integration-tests\",\n\tname: \"Integration Tests\",\n\tcategory: \"testing\",\n\tfiles: [\"**/*.{test,spec}.{ts,tsx,js,jsx}\", \"**/e2e/**/*.{ts,tsx,js,jsx}\"],\n\tisPositive: true,\n\timportance: \"recommended\",\n\tdescription: \"Integration tests with API or database interactions\",\n\tmatch: (content, filePath) => {\n\t\tconst matches: PatternMatch[] = [];\n\n\t\tconst patterns = [\n\t\t\t/supertest/g,\n\t\t\t/request\\s*\\(\\s*app\\s*\\)/g,\n\t\t\t/createTestClient/g,\n\t\t\t/TestingModule/g,\n\t\t\t/@nestjs\\/testing/g,\n\t\t];\n\n\t\tfor (const pattern of patterns) {\n\t\t\tlet match: RegExpExecArray | null;\n\t\t\twhile ((match = pattern.exec(content)) !== null) {\n\t\t\t\tmatches.push(createMatch(content, filePath, match));\n\t\t\t}\n\t\t}\n\n\t\treturn matches;\n\t},\n};\n\n/**\n * Matcher for React Testing Library usage\n */\nexport const reactTestingLibraryMatcher: PatternMatcher = {\n\tid: \"react-testing-library\",\n\tname: \"React Testing Library\",\n\tcategory: \"testing\",\n\tfiles: [\"**/*.{test,spec}.{tsx,jsx}\", \"**/__tests__/**/*.{tsx,jsx}\"],\n\tisPositive: true,\n\timportance: \"recommended\",\n\tdescription: \"React component testing with Testing Library\",\n\tmatch: (content, filePath) => {\n\t\tconst matches: PatternMatch[] = [];\n\n\t\tconst patterns = [\n\t\t\t/@testing-library\\/react/g,\n\t\t\t/render\\s*\\(/g,\n\t\t\t/screen\\./g,\n\t\t\t/userEvent\\./g,\n\t\t\t/fireEvent\\./g,\n\t\t\t/waitFor\\s*\\(/g,\n\t\t];\n\n\t\tfor (const pattern of patterns) {\n\t\t\tlet match: RegExpExecArray | null;\n\t\t\twhile ((match = pattern.exec(content)) !== null) {\n\t\t\t\tmatches.push(createMatch(content, filePath, match));\n\t\t\t}\n\t\t}\n\n\t\treturn matches;\n\t},\n};\n\n/**\n * Matcher for E2E tests\n */\nexport const e2eTestMatcher: PatternMatcher = {\n\tid: \"e2e-tests\",\n\tname: \"E2E Tests\",\n\tcategory: \"testing\",\n\tfiles: [\"**/e2e/**/*.{ts,js}\", \"**/*.e2e-spec.{ts,js}\", \"**/playwright/**/*.{ts,js}\"],\n\tisPositive: true,\n\timportance: \"recommended\",\n\tdescription: \"End-to-end tests with Playwright or Cypress\",\n\tmatch: (content, filePath) => {\n\t\tconst matches: PatternMatch[] = [];\n\n\t\tconst patterns = [/@playwright\\/test/g, /cypress/g, /page\\.(goto|click|fill)/g, /cy\\.(visit|get|click)/g];\n\n\t\tfor (const pattern of patterns) {\n\t\t\tlet match: RegExpExecArray | null;\n\t\t\twhile ((match = pattern.exec(content)) !== null) {\n\t\t\t\tmatches.push(createMatch(content, filePath, match));\n\t\t\t}\n\t\t}\n\n\t\treturn matches;\n\t},\n};\n\n/**\n * Matcher for mocking\n */\nexport const mockingMatcher: PatternMatcher = {\n\tid: \"mocking\",\n\tname: \"Test Mocking\",\n\tcategory: \"testing\",\n\tfiles: [\"**/*.{test,spec}.{ts,tsx,js,jsx}\", \"**/__tests__/**/*.{ts,tsx,js,jsx}\"],\n\tisPositive: true,\n\timportance: \"optional\",\n\tdescription: \"Mocking dependencies in tests\",\n\tmatch: (content, filePath) => {\n\t\tconst matches: PatternMatch[] = [];\n\n\t\tconst patterns = [\n\t\t\t/vi\\.mock\\s*\\(/g,\n\t\t\t/jest\\.mock\\s*\\(/g,\n\t\t\t/vi\\.spyOn\\s*\\(/g,\n\t\t\t/jest\\.spyOn\\s*\\(/g,\n\t\t\t/mockResolvedValue/g,\n\t\t\t/mockReturnValue/g,\n\t\t\t/msw/g,\n\t\t];\n\n\t\tfor (const pattern of patterns) {\n\t\t\tlet match: RegExpExecArray | null;\n\t\t\twhile ((match = pattern.exec(content)) !== null) {\n\t\t\t\tmatches.push(createMatch(content, filePath, match));\n\t\t\t}\n\t\t}\n\n\t\treturn matches;\n\t},\n};\n\n/**\n * Matcher for test coverage configuration\n */\nexport const coverageConfigMatcher: PatternMatcher = {\n\tid: \"coverage-config\",\n\tname: \"Test Coverage Configuration\",\n\tcategory: \"testing\",\n\tfiles: [\"**/vitest.config.{ts,js,mjs}\", \"**/jest.config.{ts,js,mjs}\", \"package.json\"],\n\tisPositive: true,\n\timportance: \"recommended\",\n\tdescription: \"Test coverage thresholds and configuration\",\n\tmatch: (content, filePath) => {\n\t\tconst matches: PatternMatch[] = [];\n\n\t\tconst patterns = [/coverage/g, /coverageThreshold/g, /@vitest\\/coverage/g, /collectCoverage/g];\n\n\t\tfor (const pattern of patterns) {\n\t\t\tlet match: RegExpExecArray | null;\n\t\t\twhile ((match = pattern.exec(content)) !== null) {\n\t\t\t\tmatches.push(createMatch(content, filePath, match));\n\t\t\t}\n\t\t}\n\n\t\treturn matches;\n\t},\n};\n\n/**\n * All testing matchers\n */\nexport const testingMatchers: PatternMatcher[] = [\n\tunitTestMatcher,\n\tvagueAssertionMatcher,\n\tintegrationTestMatcher,\n\treactTestingLibraryMatcher,\n\te2eTestMatcher,\n\tmockingMatcher,\n\tcoverageConfigMatcher,\n];\n","/**\n * Pattern Matchers Index\n *\n * Exports all built-in pattern matchers.\n *\n * @module patterns/matchers\n */\n\nimport type { PatternMatcher } from \"../types.js\";\nimport { errorHandlingMatchers } from \"./error-handling.js\";\nimport { performanceMatchers } from \"./performance.js\";\nimport { securityMatchers } from \"./security.js\";\nimport { testingMatchers } from \"./testing.js\";\n\n/**\n * Create all built-in matchers\n */\nexport function createBuiltInMatchers(): PatternMatcher[] {\n\treturn [...errorHandlingMatchers, ...securityMatchers, ...testingMatchers, ...performanceMatchers];\n}\n\n// Re-export individual matcher groups\nexport { errorHandlingMatchers } from \"./error-handling.js\";\nexport { performanceMatchers } from \"./performance.js\";\nexport { securityMatchers } from \"./security.js\";\nexport { testingMatchers } from \"./testing.js\";\n","/**\n * Pattern Detector\n *\n * Detects coding patterns in a workspace using regex and AST analysis.\n *\n * @module patterns/PatternDetector\n */\n\nimport { readFile, stat } from \"node:fs/promises\";\nimport { join, relative } from \"node:path\";\nimport fastGlob from \"fast-glob\";\nimport { createBuiltInMatchers } from \"./matchers/index.js\";\nimport type {\n\tDetectionError,\n\tFoundPattern,\n\tMissingPattern,\n\tPatternDetectionResult,\n\tPatternDetectorConfig,\n\tPatternMatch,\n\tPatternMatcher,\n} from \"./types.js\";\n\n// =============================================================================\n// PATTERN DETECTOR\n// =============================================================================\n\n/**\n * Pattern Detector - analyzes codebases for coding patterns\n *\n * Supports both regex-based and AST-based pattern detection.\n *\n * @example\n * ```typescript\n * const detector = new PatternDetector({\n * workspaceRoot: \"/path/to/project\",\n * useAst: true,\n * });\n *\n * const result = await detector.detect();\n * console.log(result.foundPatterns);\n * ```\n */\nexport class PatternDetector {\n\tprivate readonly config: Required<PatternDetectorConfig>;\n\tprivate readonly matchers: PatternMatcher[];\n\n\tconstructor(config: PatternDetectorConfig) {\n\t\tthis.config = {\n\t\t\tworkspaceRoot: config.workspaceRoot,\n\t\t\tinclude: config.include ?? [\"**/*.{ts,tsx,js,jsx}\"],\n\t\t\texclude: config.exclude ?? [\n\t\t\t\t\"**/node_modules/**\",\n\t\t\t\t\"**/dist/**\",\n\t\t\t\t\"**/build/**\",\n\t\t\t\t\"**/.git/**\",\n\t\t\t\t\"**/*.min.js\",\n\t\t\t\t\"**/*.d.ts\",\n\t\t\t],\n\t\t\tmaxFiles: config.maxFiles ?? 1000,\n\t\t\tuseAst: config.useAst ?? false,\n\t\t\tfileTimeout: config.fileTimeout ?? 5000,\n\t\t};\n\n\t\tthis.matchers = createBuiltInMatchers();\n\t}\n\n\t/**\n\t * Add a custom pattern matcher\n\t */\n\taddMatcher(matcher: PatternMatcher): void {\n\t\tthis.matchers.push(matcher);\n\t}\n\n\t/**\n\t * Detect patterns in the workspace\n\t */\n\tasync detect(matcherIds?: string[]): Promise<PatternDetectionResult> {\n\t\tconst startTime = Date.now();\n\t\tconst errors: DetectionError[] = [];\n\n\t\t// Get files to scan\n\t\tconst files = await this.getFilesToScan();\n\n\t\t// Filter matchers if specific IDs provided\n\t\tconst matchersToRun = matcherIds ? this.matchers.filter((m) => matcherIds.includes(m.id)) : this.matchers;\n\n\t\t// Group files by pattern for efficient matching\n\t\tconst fileContents = new Map<string, string>();\n\n\t\t// Read all files\n\t\tfor (const file of files.slice(0, this.config.maxFiles)) {\n\t\t\ttry {\n\t\t\t\tconst content = await this.readFileWithTimeout(file);\n\t\t\t\tfileContents.set(file, content);\n\t\t\t} catch (error) {\n\t\t\t\terrors.push({\n\t\t\t\t\tfile: relative(this.config.workspaceRoot, file),\n\t\t\t\t\tmessage: error instanceof Error ? error.message : String(error),\n\t\t\t\t\ttype: \"read\",\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\t// Run matchers\n\t\tconst foundPatterns: FoundPattern[] = [];\n\t\tconst checkedPatterns = new Set<string>();\n\n\t\tfor (const matcher of matchersToRun) {\n\t\t\tcheckedPatterns.add(matcher.id);\n\n\t\t\ttry {\n\t\t\t\tconst matches = await this.runMatcher(matcher, fileContents);\n\n\t\t\t\tif (matches.length > 0) {\n\t\t\t\t\tfoundPatterns.push({\n\t\t\t\t\t\tid: matcher.id,\n\t\t\t\t\t\tname: matcher.name,\n\t\t\t\t\t\tcategory: matcher.category,\n\t\t\t\t\t\tlocations: matches,\n\t\t\t\t\t\tstrength: this.calculateStrength(matches, fileContents.size),\n\t\t\t\t\t\tisPositive: matcher.isPositive,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\terrors.push({\n\t\t\t\t\tfile: \"N/A\",\n\t\t\t\t\tmessage: `Matcher ${matcher.id} failed: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t\t\ttype: \"unknown\",\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\t// Find missing patterns\n\t\tconst missingPatterns = this.findMissingPatterns(foundPatterns, matchersToRun);\n\n\t\treturn {\n\t\t\tfoundPatterns,\n\t\t\tmissingPatterns,\n\t\t\tscannedFiles: fileContents.size,\n\t\t\tduration: Date.now() - startTime,\n\t\t\terrors,\n\t\t};\n\t}\n\n\t/**\n\t * Detect patterns in a single file\n\t */\n\tasync detectInFile(filePath: string, matcherIds?: string[]): Promise<PatternDetectionResult> {\n\t\tconst startTime = Date.now();\n\t\tconst errors: DetectionError[] = [];\n\n\t\tconst matchersToRun = matcherIds ? this.matchers.filter((m) => matcherIds.includes(m.id)) : this.matchers;\n\n\t\tlet content: string;\n\t\ttry {\n\t\t\tcontent = await readFile(filePath, \"utf-8\");\n\t\t} catch (error) {\n\t\t\treturn {\n\t\t\t\tfoundPatterns: [],\n\t\t\t\tmissingPatterns: [],\n\t\t\t\tscannedFiles: 0,\n\t\t\t\tduration: Date.now() - startTime,\n\t\t\t\terrors: [\n\t\t\t\t\t{\n\t\t\t\t\t\tfile: filePath,\n\t\t\t\t\t\tmessage: error instanceof Error ? error.message : String(error),\n\t\t\t\t\t\ttype: \"read\",\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t};\n\t\t}\n\n\t\tconst fileContents = new Map([[filePath, content]]);\n\t\tconst foundPatterns: FoundPattern[] = [];\n\n\t\tfor (const matcher of matchersToRun) {\n\t\t\t// Check if this matcher should run on this file\n\t\t\tif (!this.matcherAppliesToFile(matcher, filePath)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tconst matches = await this.runMatcher(matcher, fileContents);\n\n\t\t\t\tif (matches.length > 0) {\n\t\t\t\t\tfoundPatterns.push({\n\t\t\t\t\t\tid: matcher.id,\n\t\t\t\t\t\tname: matcher.name,\n\t\t\t\t\t\tcategory: matcher.category,\n\t\t\t\t\t\tlocations: matches,\n\t\t\t\t\t\tstrength: 1.0, // Single file, so strength is binary\n\t\t\t\t\t\tisPositive: matcher.isPositive,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\terrors.push({\n\t\t\t\t\tfile: filePath,\n\t\t\t\t\tmessage: `Matcher ${matcher.id} failed: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t\t\ttype: \"unknown\",\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tconst missingPatterns = this.findMissingPatterns(\n\t\t\tfoundPatterns,\n\t\t\tmatchersToRun.filter((m) => this.matcherAppliesToFile(m, filePath)),\n\t\t);\n\n\t\treturn {\n\t\t\tfoundPatterns,\n\t\t\tmissingPatterns,\n\t\t\tscannedFiles: 1,\n\t\t\tduration: Date.now() - startTime,\n\t\t\terrors,\n\t\t};\n\t}\n\n\t/**\n\t * Get all registered matchers\n\t */\n\tgetMatchers(): PatternMatcher[] {\n\t\treturn [...this.matchers];\n\t}\n\n\t/**\n\t * Get matcher by ID\n\t */\n\tgetMatcher(id: string): PatternMatcher | undefined {\n\t\treturn this.matchers.find((m) => m.id === id);\n\t}\n\n\t// =========================================================================\n\t// PRIVATE METHODS\n\t// =========================================================================\n\n\tprivate async getFilesToScan(): Promise<string[]> {\n\t\tconst patterns = this.config.include.map((p) => join(this.config.workspaceRoot, p));\n\n\t\tconst files = await fastGlob(patterns, {\n\t\t\tignore: this.config.exclude,\n\t\t\tabsolute: true,\n\t\t\tonlyFiles: true,\n\t\t});\n\n\t\treturn files;\n\t}\n\n\tprivate async readFileWithTimeout(filePath: string): Promise<string> {\n\t\tconst controller = new AbortController();\n\t\tconst timeout = setTimeout(() => controller.abort(), this.config.fileTimeout);\n\n\t\ttry {\n\t\t\t// Check file size first\n\t\t\tconst stats = await stat(filePath);\n\t\t\tif (stats.size > 1024 * 1024) {\n\t\t\t\t// Skip files > 1MB\n\t\t\t\tthrow new Error(\"File too large\");\n\t\t\t}\n\n\t\t\tconst content = await readFile(filePath, { encoding: \"utf-8\" });\n\t\t\treturn content;\n\t\t} finally {\n\t\t\tclearTimeout(timeout);\n\t\t}\n\t}\n\n\tprivate async runMatcher(matcher: PatternMatcher, fileContents: Map<string, string>): Promise<PatternMatch[]> {\n\t\tconst allMatches: PatternMatch[] = [];\n\n\t\tfor (const [filePath, content] of fileContents) {\n\t\t\t// Check if this matcher applies to this file\n\t\t\tif (!this.matcherAppliesToFile(matcher, filePath)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Run the matcher\n\t\t\tconst matches = await matcher.match(content, filePath);\n\t\t\tallMatches.push(...matches);\n\t\t}\n\n\t\treturn allMatches;\n\t}\n\n\tprivate matcherAppliesToFile(matcher: PatternMatcher, filePath: string): boolean {\n\t\tconst relativePath = relative(this.config.workspaceRoot, filePath);\n\n\t\treturn matcher.files.some((pattern) => {\n\t\t\tconst regex = this.globToRegex(pattern);\n\t\t\treturn regex.test(relativePath);\n\t\t});\n\t}\n\n\tprivate globToRegex(pattern: string): RegExp {\n\t\tconst escaped = pattern\n\t\t\t.replace(/\\./g, \"\\\\.\")\n\t\t\t.replace(/\\{([^}]+)\\}/g, \"($1)\")\n\t\t\t.replace(/,/g, \"|\")\n\t\t\t.replace(/\\*\\*/g, \".*\")\n\t\t\t.replace(/\\*/g, \"[^/]*\");\n\n\t\treturn new RegExp(`^${escaped}$`);\n\t}\n\n\tprivate calculateStrength(matches: PatternMatch[], totalFiles: number): number {\n\t\tif (totalFiles === 0) {\n\t\t\treturn 0;\n\t\t}\n\n\t\t// Unique files with matches\n\t\tconst uniqueFiles = new Set(matches.map((m) => m.file)).size;\n\n\t\t// Base strength on coverage and confidence\n\t\tconst coverage = Math.min(uniqueFiles / totalFiles, 1);\n\t\tconst avgConfidence = matches.reduce((sum, m) => sum + m.confidence, 0) / matches.length;\n\n\t\t// Weighted combination\n\t\treturn coverage * 0.6 + avgConfidence * 0.4;\n\t}\n\n\tprivate findMissingPatterns(found: FoundPattern[], matchers: PatternMatcher[]): MissingPattern[] {\n\t\tconst foundIds = new Set(found.map((f) => f.id));\n\n\t\treturn matchers\n\t\t\t.filter((m) => !foundIds.has(m.id) && m.isPositive)\n\t\t\t.map((m) => ({\n\t\t\t\tid: m.id,\n\t\t\t\tname: m.name,\n\t\t\t\tcategory: m.category,\n\t\t\t\timportance: m.importance,\n\t\t\t\treason: m.description,\n\t\t\t}));\n\t}\n}\n","/**\n * Workspace Profiler\n *\n * Comprehensive workspace fingerprinting for framework detection,\n * language analysis, and context documentation discovery.\n *\n * @module fingerprint/WorkspaceProfiler\n */\n\nimport { access, constants, readFile, stat } from \"node:fs/promises\";\nimport { extname, join } from \"node:path\";\nimport fastGlob from \"fast-glob\";\nimport { detectPrimaryFramework, type FrameworkDetectionContext, getFramework } from \"../knowledge/registry.js\";\nimport type {\n\tDetectedFramework,\n\tDetectedLanguage,\n\tDetectedPattern,\n\tExistingContext,\n\tExistingContextFile,\n\tPackageManagerInfo,\n\tProjectStructure,\n\tWorkspaceProfile,\n} from \"../knowledge/types.js\";\nimport { GapAnalyzer } from \"../patterns/GapAnalyzer.js\";\nimport { PatternDetector } from \"../patterns/PatternDetector.js\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\n/**\n * Configuration for workspace profiling\n */\nexport interface WorkspaceProfilerConfig {\n\t/** Workspace root directory */\n\tworkspaceRoot: string;\n\t/** Whether to run pattern detection (slower but more complete) */\n\tdetectPatterns?: boolean;\n\t/** Maximum files to scan for language detection */\n\tmaxFilesForLanguageDetection?: number;\n\t/** Directories to skip */\n\tskipDirectories?: string[];\n\t/** Whether to include hidden files */\n\tincludeHidden?: boolean;\n}\n\n// =============================================================================\n// WORKSPACE PROFILER\n// =============================================================================\n\n/**\n * Workspace Profiler - comprehensive workspace analysis\n *\n * @example\n * ```typescript\n * const profiler = new WorkspaceProfiler({\n * workspaceRoot: \"/path/to/project\",\n * detectPatterns: true,\n * });\n *\n * const profile = await profiler.analyze();\n * console.log(profile.framework);\n * console.log(profile.gaps);\n * ```\n */\nexport class WorkspaceProfiler {\n\tprivate readonly config: Required<WorkspaceProfilerConfig>;\n\n\tconstructor(config: WorkspaceProfilerConfig) {\n\t\tthis.config = {\n\t\t\tworkspaceRoot: config.workspaceRoot,\n\t\t\tdetectPatterns: config.detectPatterns ?? true,\n\t\t\tmaxFilesForLanguageDetection: config.maxFilesForLanguageDetection ?? 5000,\n\t\t\tskipDirectories: config.skipDirectories ?? [\n\t\t\t\t\"node_modules\",\n\t\t\t\t\".git\",\n\t\t\t\t\"dist\",\n\t\t\t\t\"build\",\n\t\t\t\t\".next\",\n\t\t\t\t\".nuxt\",\n\t\t\t\t\"coverage\",\n\t\t\t\t\".cache\",\n\t\t\t],\n\t\t\tincludeHidden: config.includeHidden ?? false,\n\t\t};\n\t}\n\n\t/**\n\t * Analyze the workspace and create a complete profile\n\t */\n\tasync analyze(): Promise<WorkspaceProfile> {\n\t\t// Run analyses in parallel where possible\n\t\tconst [packageJson, filePaths, packageManager, existingContext] = await Promise.all([\n\t\t\tthis.readPackageJson(),\n\t\t\tthis.getFilePaths(),\n\t\t\tthis.detectPackageManager(),\n\t\t\tthis.analyzeExistingContext(),\n\t\t]);\n\n\t\t// Detect framework\n\t\tconst framework = await this.detectFramework(packageJson, filePaths);\n\n\t\t// Analyze languages\n\t\tconst languages = await this.analyzeLanguages(filePaths);\n\n\t\t// Analyze project structure\n\t\tconst structure = await this.analyzeStructure(filePaths);\n\n\t\t// Detect patterns (if enabled)\n\t\tlet detectedPatterns: DetectedPattern[] = [];\n\t\tif (this.config.detectPatterns) {\n\t\t\tdetectedPatterns = await this.detectPatterns();\n\t\t}\n\n\t\t// Get framework config for gap analysis\n\t\tconst frameworkConfig = getFramework(framework.id);\n\n\t\t// Analyze gaps\n\t\tconst gaps = frameworkConfig\n\t\t\t? new GapAnalyzer({ frameworkConfig }).analyzeWorkspace({\n\t\t\t\t\troot: this.config.workspaceRoot,\n\t\t\t\t\tframework,\n\t\t\t\t\tlanguages,\n\t\t\t\t\tpackageManager,\n\t\t\t\t\tstructure,\n\t\t\t\t\texistingContext,\n\t\t\t\t\tdetectedPatterns,\n\t\t\t\t\tgaps: [],\n\t\t\t\t\thealthScore: 0,\n\t\t\t\t\tcreatedAt: new Date().toISOString(),\n\t\t\t\t}).gaps\n\t\t\t: [];\n\n\t\t// Calculate health score\n\t\tconst healthScore = this.calculateHealthScore(existingContext, detectedPatterns, gaps, framework);\n\n\t\treturn {\n\t\t\troot: this.config.workspaceRoot,\n\t\t\tframework,\n\t\t\tlanguages,\n\t\t\tpackageManager,\n\t\t\tstructure,\n\t\t\texistingContext,\n\t\t\tdetectedPatterns,\n\t\t\tgaps,\n\t\t\thealthScore,\n\t\t\tcreatedAt: new Date().toISOString(),\n\t\t};\n\t}\n\n\t/**\n\t * Quick scan for framework and basic info only\n\t */\n\tasync quickScan(): Promise<Pick<WorkspaceProfile, \"framework\" | \"packageManager\" | \"languages\">> {\n\t\tconst [packageJson, filePaths, packageManager] = await Promise.all([\n\t\t\tthis.readPackageJson(),\n\t\t\tthis.getFilePaths(),\n\t\t\tthis.detectPackageManager(),\n\t\t]);\n\n\t\tconst framework = await this.detectFramework(packageJson, filePaths);\n\t\tconst languages = await this.analyzeLanguages(filePaths);\n\n\t\treturn {\n\t\t\tframework,\n\t\t\tpackageManager,\n\t\t\tlanguages,\n\t\t};\n\t}\n\n\t// =========================================================================\n\t// PRIVATE METHODS\n\t// =========================================================================\n\n\tprivate async readPackageJson(): Promise<Record<string, unknown> | null> {\n\t\tconst packageJsonPath = join(this.config.workspaceRoot, \"package.json\");\n\n\t\ttry {\n\t\t\tconst content = await readFile(packageJsonPath, \"utf-8\");\n\t\t\treturn JSON.parse(content);\n\t\t} catch {\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tprivate async getFilePaths(): Promise<string[]> {\n\t\tconst ignorePatterns = this.config.skipDirectories.map((dir) => `**/${dir}/**`);\n\n\t\tconst files = await fastGlob(\"**/*\", {\n\t\t\tcwd: this.config.workspaceRoot,\n\t\t\tignore: ignorePatterns,\n\t\t\tonlyFiles: true,\n\t\t\tdot: this.config.includeHidden,\n\t\t});\n\n\t\treturn files.slice(0, this.config.maxFilesForLanguageDetection);\n\t}\n\n\tprivate async detectFramework(\n\t\tpackageJson: Record<string, unknown> | null,\n\t\tfilePaths: string[],\n\t): Promise<DetectedFramework> {\n\t\tconst context: FrameworkDetectionContext = {\n\t\t\tpackageJson: packageJson as FrameworkDetectionContext[\"packageJson\"],\n\t\t\tfilePaths,\n\t\t\tcheckFileContent: async (pattern, files) => {\n\t\t\t\t// Simplified file content check\n\t\t\t\tfor (const file of filePaths) {\n\t\t\t\t\tif (files.some((f) => file.match(new RegExp(f.replace(\"*\", \".*\"))))) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst content = await readFile(join(this.config.workspaceRoot, file), \"utf-8\");\n\t\t\t\t\t\t\tif (content.includes(pattern)) {\n\t\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\t// Skip unreadable files\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t},\n\t\t};\n\n\t\treturn detectPrimaryFramework(context);\n\t}\n\n\tprivate async detectPackageManager(): Promise<PackageManagerInfo> {\n\t\tconst checks: Array<{\n\t\t\tfile: string;\n\t\t\tname: PackageManagerInfo[\"name\"];\n\t\t}> = [\n\t\t\t{ file: \"pnpm-lock.yaml\", name: \"pnpm\" },\n\t\t\t{ file: \"yarn.lock\", name: \"yarn\" },\n\t\t\t{ file: \"bun.lockb\", name: \"bun\" },\n\t\t\t{ file: \"package-lock.json\", name: \"npm\" },\n\t\t];\n\n\t\tfor (const { file, name } of checks) {\n\t\t\ttry {\n\t\t\t\tawait access(join(this.config.workspaceRoot, file), constants.F_OK);\n\t\t\t\treturn {\n\t\t\t\t\tname,\n\t\t\t\t\tlockfile: file,\n\t\t\t\t};\n\t\t\t} catch {\n\t\t\t\t// Continue checking\n\t\t\t}\n\t\t}\n\n\t\treturn { name: \"unknown\" };\n\t}\n\n\tprivate async analyzeLanguages(filePaths: string[]): Promise<DetectedLanguage[]> {\n\t\tconst languageMap: Record<string, { extensions: Set<string>; count: number }> = {};\n\n\t\t// Extension to language mapping\n\t\tconst extensionToLanguage: Record<string, string> = {\n\t\t\t\".ts\": \"TypeScript\",\n\t\t\t\".tsx\": \"TypeScript\",\n\t\t\t\".js\": \"JavaScript\",\n\t\t\t\".jsx\": \"JavaScript\",\n\t\t\t\".mjs\": \"JavaScript\",\n\t\t\t\".cjs\": \"JavaScript\",\n\t\t\t\".py\": \"Python\",\n\t\t\t\".rb\": \"Ruby\",\n\t\t\t\".go\": \"Go\",\n\t\t\t\".rs\": \"Rust\",\n\t\t\t\".java\": \"Java\",\n\t\t\t\".kt\": \"Kotlin\",\n\t\t\t\".swift\": \"Swift\",\n\t\t\t\".php\": \"PHP\",\n\t\t\t\".cs\": \"C#\",\n\t\t\t\".cpp\": \"C++\",\n\t\t\t\".c\": \"C\",\n\t\t\t\".vue\": \"Vue\",\n\t\t\t\".svelte\": \"Svelte\",\n\t\t\t\".astro\": \"Astro\",\n\t\t\t\".md\": \"Markdown\",\n\t\t\t\".mdx\": \"MDX\",\n\t\t\t\".css\": \"CSS\",\n\t\t\t\".scss\": \"SCSS\",\n\t\t\t\".less\": \"LESS\",\n\t\t\t\".html\": \"HTML\",\n\t\t\t\".json\": \"JSON\",\n\t\t\t\".yaml\": \"YAML\",\n\t\t\t\".yml\": \"YAML\",\n\t\t};\n\n\t\tfor (const file of filePaths) {\n\t\t\tconst ext = extname(file).toLowerCase();\n\t\t\tconst language = extensionToLanguage[ext];\n\n\t\t\tif (language) {\n\t\t\t\tif (!languageMap[language]) {\n\t\t\t\t\tlanguageMap[language] = { extensions: new Set(), count: 0 };\n\t\t\t\t}\n\t\t\t\tlanguageMap[language].extensions.add(ext);\n\t\t\t\tlanguageMap[language].count++;\n\t\t\t}\n\t\t}\n\n\t\tconst totalFiles = filePaths.length;\n\t\tconst languages: DetectedLanguage[] = Object.entries(languageMap)\n\t\t\t.map(([name, data]) => ({\n\t\t\t\tname,\n\t\t\t\tpercentage: Math.round((data.count / totalFiles) * 100),\n\t\t\t\tfileCount: data.count,\n\t\t\t\textensions: Array.from(data.extensions),\n\t\t\t}))\n\t\t\t.sort((a, b) => b.fileCount - a.fileCount);\n\n\t\treturn languages;\n\t}\n\n\tprivate async analyzeStructure(filePaths: string[]): Promise<ProjectStructure> {\n\t\tconst sourceDirectories = new Set<string>();\n\t\tconst testDirectories = new Set<string>();\n\t\tconst configFiles: string[] = [];\n\n\t\t// Check for monorepo indicators\n\t\tlet isMonorepo = false;\n\t\tlet monorepoTool: ProjectStructure[\"monorepoTool\"];\n\n\t\t// Check monorepo files\n\t\tconst monorepoChecks: Array<{\n\t\t\tfile: string;\n\t\t\ttool: ProjectStructure[\"monorepoTool\"];\n\t\t}> = [\n\t\t\t{ file: \"turbo.json\", tool: \"turborepo\" },\n\t\t\t{ file: \"nx.json\", tool: \"nx\" },\n\t\t\t{ file: \"lerna.json\", tool: \"lerna\" },\n\t\t\t{ file: \"pnpm-workspace.yaml\", tool: \"pnpm-workspaces\" },\n\t\t];\n\n\t\tfor (const { file, tool } of monorepoChecks) {\n\t\t\ttry {\n\t\t\t\tawait access(join(this.config.workspaceRoot, file), constants.F_OK);\n\t\t\t\tisMonorepo = true;\n\t\t\t\tmonorepoTool = tool;\n\t\t\t\tbreak;\n\t\t\t} catch {\n\t\t\t\t// Continue\n\t\t\t}\n\t\t}\n\n\t\t// Analyze file paths\n\t\tfor (const file of filePaths) {\n\t\t\tconst parts = file.split(\"/\");\n\t\t\tconst firstDir = parts[0];\n\n\t\t\t// Source directories\n\t\t\tif ([\"src\", \"lib\", \"app\", \"apps\", \"packages\", \"components\"].includes(firstDir)) {\n\t\t\t\tsourceDirectories.add(firstDir);\n\t\t\t}\n\n\t\t\t// Test directories\n\t\t\tif ([\"test\", \"tests\", \"__tests__\", \"e2e\", \"spec\"].includes(firstDir)) {\n\t\t\t\ttestDirectories.add(firstDir);\n\t\t\t}\n\n\t\t\t// Config files at root\n\t\t\tif (parts.length === 1 && (file.includes(\"config\") || file.includes(\"rc\") || file.startsWith(\".\"))) {\n\t\t\t\tconfigFiles.push(file);\n\t\t\t}\n\t\t}\n\n\t\t// Estimate lines of code (rough heuristic)\n\t\tconst codeExtensions = [\".ts\", \".tsx\", \".js\", \".jsx\", \".py\", \".go\", \".rs\"];\n\t\tconst codeFiles = filePaths.filter((f) => codeExtensions.includes(extname(f).toLowerCase()));\n\t\tconst totalLinesEstimate = codeFiles.length * 100; // Rough estimate\n\n\t\treturn {\n\t\t\tisMonorepo,\n\t\t\tmonorepoTool,\n\t\t\tsourceDirectories: Array.from(sourceDirectories),\n\t\t\ttestDirectories: Array.from(testDirectories),\n\t\t\tconfigFiles: configFiles.slice(0, 20), // Limit config files\n\t\t\ttotalFiles: filePaths.length,\n\t\t\ttotalLinesEstimate,\n\t\t};\n\t}\n\n\tprivate async analyzeExistingContext(): Promise<ExistingContext> {\n\t\tconst contextDirs = [\".llm-context\", \".ai-context\", \"ai_dev_utils\", \"docs/llm\"];\n\t\tlet contextPath: string | undefined;\n\t\tlet hasContextDirectory = false;\n\n\t\t// Find context directory\n\t\tfor (const dir of contextDirs) {\n\t\t\ttry {\n\t\t\t\tawait access(join(this.config.workspaceRoot, dir), constants.F_OK);\n\t\t\t\thasContextDirectory = true;\n\t\t\t\tcontextPath = dir;\n\t\t\t\tbreak;\n\t\t\t} catch {\n\t\t\t\t// Continue\n\t\t\t}\n\t\t}\n\n\t\tif (!hasContextDirectory || !contextPath) {\n\t\t\treturn {\n\t\t\t\thasContextDirectory: false,\n\t\t\t\tfiles: [],\n\t\t\t\tqualityScore: 0,\n\t\t\t};\n\t\t}\n\n\t\t// Analyze context files\n\t\tconst contextFiles: ExistingContextFile[] = [];\n\t\tconst fullContextPath = join(this.config.workspaceRoot, contextPath);\n\n\t\ttry {\n\t\t\tconst files = await fastGlob(\"**/*.md\", {\n\t\t\t\tcwd: fullContextPath,\n\t\t\t\tonlyFiles: true,\n\t\t\t});\n\n\t\t\tfor (const file of files) {\n\t\t\t\tconst filePath = join(fullContextPath, file);\n\n\t\t\t\ttry {\n\t\t\t\t\tconst [stats, content] = await Promise.all([stat(filePath), readFile(filePath, \"utf-8\")]);\n\n\t\t\t\t\tconst sections = this.extractSections(content);\n\t\t\t\t\tconst quality = this.assessFileQuality(content, sections);\n\n\t\t\t\t\tcontextFiles.push({\n\t\t\t\t\t\tpath: join(contextPath, file),\n\t\t\t\t\t\tsize: stats.size,\n\t\t\t\t\t\tlastModified: stats.mtime.toISOString(),\n\t\t\t\t\t\tsections,\n\t\t\t\t\t\tquality,\n\t\t\t\t\t});\n\t\t\t\t} catch {\n\t\t\t\t\t// Skip unreadable files\n\t\t\t\t}\n\t\t\t}\n\t\t} catch {\n\t\t\t// Context directory not readable\n\t\t}\n\n\t\t// Calculate overall quality score\n\t\tconst qualityScore = this.calculateContextQuality(contextFiles);\n\n\t\treturn {\n\t\t\thasContextDirectory,\n\t\t\tcontextPath,\n\t\t\tfiles: contextFiles,\n\t\t\tqualityScore,\n\t\t};\n\t}\n\n\tprivate extractSections(content: string): string[] {\n\t\tconst headingPattern = /^#{1,3}\\s+(.+)$/gm;\n\t\tconst sections: string[] = [];\n\n\t\tlet match: RegExpExecArray | null;\n\t\twhile ((match = headingPattern.exec(content)) !== null) {\n\t\t\tsections.push(match[1].trim());\n\t\t}\n\n\t\treturn sections;\n\t}\n\n\tprivate assessFileQuality(content: string, sections: string[]): ExistingContextFile[\"quality\"] {\n\t\tif (content.trim().length === 0) {\n\t\t\treturn \"empty\";\n\t\t}\n\n\t\tif (content.length < 100 || sections.length < 2) {\n\t\t\treturn \"needs-improvement\";\n\t\t}\n\n\t\t// Check for placeholder content\n\t\tconst placeholderPatterns = [/TODO/i, /FIXME/i, /\\[.*\\]/, /<.*>/];\n\n\t\tconst hasPlaceholders = placeholderPatterns.some((p) => p.test(content));\n\n\t\tif (hasPlaceholders && content.length < 500) {\n\t\t\treturn \"needs-improvement\";\n\t\t}\n\n\t\t// Check age (if possible to determine from content)\n\t\t// For now, assume good if it has content and sections\n\t\treturn \"good\";\n\t}\n\n\tprivate calculateContextQuality(files: ExistingContextFile[]): number {\n\t\tif (files.length === 0) {\n\t\t\treturn 0;\n\t\t}\n\n\t\tconst qualityScores: Record<ExistingContextFile[\"quality\"], number> = {\n\t\t\tgood: 100,\n\t\t\t\"needs-improvement\": 50,\n\t\t\toutdated: 30,\n\t\t\tempty: 0,\n\t\t};\n\n\t\tconst total = files.reduce((sum, file) => sum + qualityScores[file.quality], 0);\n\n\t\treturn Math.round(total / files.length);\n\t}\n\n\tprivate async detectPatterns(): Promise<DetectedPattern[]> {\n\t\tconst detector = new PatternDetector({\n\t\t\tworkspaceRoot: this.config.workspaceRoot,\n\t\t\tuseAst: false, // Use regex for speed\n\t\t\tmaxFiles: 500,\n\t\t});\n\n\t\tconst result = await detector.detect();\n\n\t\t// Convert to DetectedPattern format\n\t\treturn result.foundPatterns\n\t\t\t.filter((p) => p.isPositive)\n\t\t\t.map((p) => ({\n\t\t\t\tid: p.id,\n\t\t\t\tname: p.name,\n\t\t\t\tcategory: p.category,\n\t\t\t\tlocations: p.locations,\n\t\t\t\tstrength: p.strength,\n\t\t\t}));\n\t}\n\n\tprivate calculateHealthScore(\n\t\tcontext: ExistingContext,\n\t\tpatterns: DetectedPattern[],\n\t\tgaps: WorkspaceProfile[\"gaps\"],\n\t\tframework: DetectedFramework,\n\t): number {\n\t\tlet score = 50; // Base score\n\n\t\t// Context documentation (up to +20)\n\t\tif (context.hasContextDirectory) {\n\t\t\tscore += 10;\n\t\t\tscore += Math.min(10, context.qualityScore / 10);\n\t\t}\n\n\t\t// Pattern coverage (up to +20)\n\t\tconst patternScore = patterns.length * 2;\n\t\tscore += Math.min(20, patternScore);\n\n\t\t// Gap penalties\n\t\tconst criticalGaps = gaps.filter((g) => g.severity === \"critical\").length;\n\t\tconst highGaps = gaps.filter((g) => g.severity === \"high\").length;\n\t\tscore -= criticalGaps * 10;\n\t\tscore -= highGaps * 5;\n\n\t\t// Framework detection bonus\n\t\tif (framework.confidence > 0.8) {\n\t\t\tscore += 5;\n\t\t}\n\n\t\treturn Math.max(0, Math.min(100, Math.round(score)));\n\t}\n}\n","/**\n * Learning Types\n *\n * Types for the learning engine, feedback loop, and violation tracking.\n */\n\n/**\n * Logged AI interaction for analysis\n */\nexport interface Interaction {\n\tid: string;\n\ttimestamp: string;\n\tquery: string;\n\tcontextUsed: string[];\n\ttoolsCalled: string[];\n\toutput: string;\n\tvalidationPassed?: boolean;\n\tconfidence?: number;\n\thumanFeedback?: HumanFeedback;\n}\n\n/**\n * Human feedback on an interaction\n */\nexport interface HumanFeedback {\n\tcorrect: boolean;\n\tconfidence: number;\n\tcorrections?: string[];\n\ttimeSpent?: number;\n\ttimestamp: string;\n}\n\n/**\n * Input for recording feedback (without timestamp)\n */\nexport type FeedbackInput = Omit<HumanFeedback, \"timestamp\">;\n\n/**\n * Perfect interaction added to golden dataset\n */\nexport interface GoldenExample {\n\tid: string;\n\tqueryType: QueryType;\n\tquery: string;\n\toutput: string;\n\tcontextUsed: string[];\n\taddedAt: string;\n}\n\n/**\n * Query types for classification\n */\nexport type QueryType =\n\t| \"authentication\"\n\t| \"testing\"\n\t| \"api\"\n\t| \"database\"\n\t| \"ui\"\n\t| \"vscode\"\n\t| \"mcp\"\n\t| \"performance\"\n\t| \"architecture\"\n\t| \"general\";\n\n/**\n * Keywords for query classification\n */\nexport const QUERY_TYPE_KEYWORDS: Record<QueryType, string[]> = {\n\tauthentication: [\"auth\", \"login\", \"session\", \"token\", \"api-key\", \"verify\"],\n\ttesting: [\"test\", \"vitest\", \"coverage\", \"mock\", \"spec\", \"assertion\"],\n\tapi: [\"endpoint\", \"route\", \"handler\", \"request\", \"response\", \"http\"],\n\tdatabase: [\"db\", \"query\", \"sql\", \"drizzle\", \"migration\", \"schema\"],\n\tui: [\"component\", \"react\", \"css\", \"style\", \"layout\", \"render\"],\n\tvscode: [\"extension\", \"command\", \"webview\", \"activation\", \"disposable\"],\n\tmcp: [\"mcp\", \"tool\", \"server\", \"protocol\", \"context\"],\n\tperformance: [\"perf\", \"slow\", \"timeout\", \"budget\", \"latency\", \"optimize\"],\n\tarchitecture: [\"layer\", \"pattern\", \"structure\", \"boundary\", \"module\"],\n\tgeneral: [],\n};\n\n/**\n * Learning engine statistics\n */\nexport interface LearningStats {\n\ttotalInteractions: number;\n\tfeedbackReceived: number;\n\tcorrectRate: number;\n\tgoldenExamples: number;\n\tqueryTypeBreakdown: Record<QueryType, number>;\n}\n\n/**\n * Recorded violation for tracking\n */\nexport interface Violation {\n\tid: string;\n\ttype: string;\n\tfile: string;\n\tcontext?: string;\n\twhatHappened: string;\n\twhyItHappened: string;\n\tprevention: string;\n\twrongExample?: string;\n\tcorrectExample?: string;\n\tdetectionRule?: string;\n\ttimestamp: string;\n\tcount: number;\n\tpromotedAt?: string | null;\n\tautomatedAt?: string | null;\n}\n\n/**\n * Input for reporting a violation\n */\nexport interface ViolationInput {\n\ttype: string;\n\tfile: string;\n\tmessage: string;\n\treason: string;\n\tprevention: string;\n\twrongExample?: string;\n\tcorrectExample?: string;\n}\n\n/**\n * Status after reporting a violation\n */\nexport interface ViolationStatus {\n\tid: string;\n\tcount: number;\n\tshouldPromote: boolean;\n\tshouldAutomate: boolean;\n}\n\n/**\n * Summary of all violations\n */\nexport interface ViolationsSummary {\n\ttotal: number;\n\tbyType: Array<{\n\t\ttype: string;\n\t\tcount: number;\n\t\tstatus: \"tracking\" | \"ready_for_promotion\" | \"ready_for_automation\" | \"promoted\" | \"automated\";\n\t}>;\n\treadyForPromotion: string[];\n\treadyForAutomation: string[];\n}\n\n/**\n * Thresholds for violation promotion\n */\nexport const PROMOTION_THRESHOLDS = {\n\tPROMOTE_TO_PATTERN: 3,\n\tADD_AUTOMATION: 5,\n} as const;\n\n/**\n * Learning tier classification for tiered storage architecture\n * - hot: Always loaded (~10-15 entries, critical patterns)\n * - warm: Loaded based on intent/domain match (~20-30 per domain)\n * - cold: Query-only, never auto-loaded (archived learnings)\n */\nexport type LearningTier = \"hot\" | \"warm\" | \"cold\";\n\n/**\n * Learning priority for tier promotion\n */\nexport type LearningPriority = \"critical\" | \"high\" | \"medium\" | \"low\";\n\n/**\n * Recorded learning from a session\n */\nexport interface Learning {\n\tid: string;\n\ttype: LearningType;\n\ttrigger: string | string[];\n\tcontext?: string;\n\tproblem?: string;\n\tsolution: string;\n\taction: string;\n\trelated?: string[];\n\tsource: string;\n\ttimestamp: string;\n\n\t// Tiering metadata (optional for backward compatibility)\n\t/** Tier classification for loading strategy */\n\ttier?: LearningTier;\n\t/** Domain category (e.g., 'testing', 'vscode', 'architecture') */\n\tdomain?: string;\n\t/** Priority for tier promotion decisions */\n\tpriority?: LearningPriority;\n\t/** Keywords for improved matching */\n\tkeywords?: string[];\n\n\t// Usage tracking for auto-promotion/demotion\n\t/** Times this learning was surfaced to LLM */\n\taccessCount?: number;\n\t/** Last time this learning was accessed */\n\tlastAccessed?: string;\n\t/** Relevance score (0-1, decreases over time) */\n\trelevanceScore?: number;\n\t/** Date when learning was applied/marked complete */\n\tappliedDate?: string;\n}\n\n/**\n * Types of learnings\n */\nexport type LearningType =\n\t| \"pattern\"\n\t| \"pitfall\"\n\t| \"architecture\"\n\t| \"performance\"\n\t| \"efficiency\"\n\t| \"discovery\"\n\t| \"workflow\";\n\n/**\n * Input for recording a learning\n */\nexport interface LearningInput {\n\ttype: LearningType;\n\ttrigger: string;\n\taction: string;\n\tsource: string;\n}\n","/**\n * Learning Engine\n *\n * Feedback loop for continuous learning:\n * - Interaction logging for analysis\n * - Human feedback recording\n * - Golden dataset building (5+ perfect examples → context promotion)\n * - Query classification for pattern matching\n *\n * Accuracy Impact:\n * - Day 1: 60% accuracy\n * - Month 2: 95% accuracy (via continuous learning)\n */\n\nimport * as path from \"node:path\";\nimport { appendJsonl, generateId, loadJsonl, writeJsonl } from \"../storage/JsonlStore.js\";\nimport type { ResolvedConfig } from \"../types/config.js\";\nimport type {\n\tFeedbackInput,\n\tGoldenExample,\n\tInteraction,\n\tLearning,\n\tLearningInput,\n\tLearningStats,\n\tQueryType,\n} from \"../types/learning.js\";\nimport { QUERY_TYPE_KEYWORDS } from \"../types/learning.js\";\n\n/**\n * Learning Engine for feedback loop and golden dataset\n */\nexport class LearningEngine {\n\tprivate interactionsPath: string;\n\tprivate goldenPath: string;\n\tprivate learningsPath: string;\n\n\tconstructor(config: ResolvedConfig) {\n\t\tthis.interactionsPath = path.join(config.rootDir, config.learningsDir, \"interactions.jsonl\");\n\t\tthis.goldenPath = path.join(config.rootDir, config.learningsDir, \"golden.jsonl\");\n\t\tthis.learningsPath = path.join(config.rootDir, config.learningsDir, \"learnings.jsonl\");\n\t}\n\n\t/**\n\t * Log an interaction for analysis\n\t */\n\tasync logInteraction(data: {\n\t\tquery: string;\n\t\tcontextUsed: string[];\n\t\ttoolsCalled: string[];\n\t\toutput: string;\n\t\tvalidationPassed?: boolean;\n\t\tconfidence?: number;\n\t}): Promise<Interaction> {\n\t\tconst interaction: Interaction = {\n\t\t\tid: generateId(\"INT\"),\n\t\t\ttimestamp: new Date().toISOString(),\n\t\t\t...data,\n\t\t};\n\n\t\tappendJsonl(this.interactionsPath, interaction);\n\n\t\treturn interaction;\n\t}\n\n\t/**\n\t * Record human feedback on an interaction\n\t */\n\tasync recordFeedback(\n\t\tinteractionId: string,\n\t\tfeedback: FeedbackInput,\n\t): Promise<{ updated: boolean; addedToGolden: boolean }> {\n\t\tconst interactions = loadJsonl<Interaction>(this.interactionsPath);\n\t\tconst interaction = interactions.find((i) => i.id === interactionId);\n\n\t\tif (!interaction) {\n\t\t\treturn { updated: false, addedToGolden: false };\n\t\t}\n\n\t\t// Add feedback with timestamp\n\t\tinteraction.humanFeedback = {\n\t\t\t...feedback,\n\t\t\ttimestamp: new Date().toISOString(),\n\t\t};\n\n\t\t// Rewrite file with updated interaction\n\t\tawait writeJsonl(this.interactionsPath, interactions);\n\n\t\t// If correct with high confidence, add to golden dataset\n\t\tlet addedToGolden = false;\n\t\tif (feedback.correct && feedback.confidence >= 0.9) {\n\t\t\tawait this.addToGoldenDataset(interaction);\n\t\t\taddedToGolden = true;\n\t\t}\n\n\t\treturn { updated: true, addedToGolden };\n\t}\n\n\t/**\n\t * Add a perfect interaction to golden dataset\n\t */\n\tprivate async addToGoldenDataset(interaction: Interaction): Promise<void> {\n\t\tconst queryType = this.classifyQueryType(interaction.query);\n\n\t\tconst goldenExample: GoldenExample = {\n\t\t\tid: interaction.id,\n\t\t\tqueryType,\n\t\t\tquery: interaction.query,\n\t\t\toutput: interaction.output,\n\t\t\tcontextUsed: interaction.contextUsed,\n\t\t\taddedAt: new Date().toISOString(),\n\t\t};\n\n\t\tappendJsonl(this.goldenPath, goldenExample);\n\n\t\t// Check if we have enough examples to promote to context\n\t\tawait this.checkGoldenPromotion(queryType);\n\t}\n\n\t/**\n\t * Check if query type has enough golden examples to promote\n\t * Returns true if promotion threshold (5+) is reached\n\t */\n\tprivate async checkGoldenPromotion(queryType: QueryType): Promise<boolean> {\n\t\tconst golden = loadJsonl<GoldenExample>(this.goldenPath);\n\t\tconst forType = golden.filter((g) => g.queryType === queryType);\n\n\t\treturn forType.length >= 5;\n\t}\n\n\t/**\n\t * Classify query into category for pattern matching\n\t */\n\tclassifyQueryType(query: string): QueryType {\n\t\tconst q = query.toLowerCase();\n\n\t\tfor (const [type, keywords] of Object.entries(QUERY_TYPE_KEYWORDS) as [QueryType, string[]][]) {\n\t\t\tif (type === \"general\") {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (keywords.some((kw) => q.includes(kw))) {\n\t\t\t\treturn type;\n\t\t\t}\n\t\t}\n\n\t\treturn \"general\";\n\t}\n\n\t/**\n\t * Get golden examples for a query type\n\t */\n\tgetGoldenExamples(queryType: QueryType, limit = 3): GoldenExample[] {\n\t\tconst golden = loadJsonl<GoldenExample>(this.goldenPath);\n\t\treturn golden.filter((g) => g.queryType === queryType).slice(-limit);\n\t}\n\n\t/**\n\t * Query learnings by keywords\n\t */\n\tquery(keywords: string[]): Learning[] {\n\t\tconst learnings = loadJsonl<Learning>(this.learningsPath);\n\t\tconst lowerKeywords = keywords.map((k) => k.toLowerCase());\n\n\t\treturn learnings.filter((learning) => {\n\t\t\tconst triggers = Array.isArray(learning.trigger) ? learning.trigger : [learning.trigger];\n\t\t\tconst allText = [...triggers, learning.action, learning.solution || \"\"].join(\" \").toLowerCase();\n\n\t\t\treturn lowerKeywords.some((kw) => allText.includes(kw));\n\t\t});\n\t}\n\n\t/**\n\t * Record a new learning\n\t */\n\tasync record(input: LearningInput): Promise<{ id: string }> {\n\t\tconst learning: Learning = {\n\t\t\tid: generateId(\"L\"),\n\t\t\ttype: input.type,\n\t\t\ttrigger: input.trigger,\n\t\t\taction: input.action,\n\t\t\tsolution: input.action,\n\t\t\tsource: input.source,\n\t\t\ttimestamp: new Date().toISOString(),\n\t\t};\n\n\t\tappendJsonl(this.learningsPath, learning);\n\n\t\treturn { id: learning.id };\n\t}\n\n\t/**\n\t * Get learning statistics\n\t */\n\tgetStats(): LearningStats {\n\t\tconst interactions = loadJsonl<Interaction>(this.interactionsPath);\n\t\tconst golden = loadJsonl<GoldenExample>(this.goldenPath);\n\n\t\tconst withFeedback = interactions.filter((i) => i.humanFeedback);\n\t\tconst correct = withFeedback.filter((i) => i.humanFeedback?.correct);\n\n\t\t// Query type breakdown\n\t\tconst queryTypeBreakdown: Record<QueryType, number> = {} as Record<QueryType, number>;\n\t\tfor (const i of interactions) {\n\t\t\tconst type = this.classifyQueryType(i.query);\n\t\t\tqueryTypeBreakdown[type] = (queryTypeBreakdown[type] || 0) + 1;\n\t\t}\n\n\t\treturn {\n\t\t\ttotalInteractions: interactions.length,\n\t\t\tfeedbackReceived: withFeedback.length,\n\t\t\tcorrectRate: withFeedback.length > 0 ? correct.length / withFeedback.length : 0,\n\t\t\tgoldenExamples: golden.length,\n\t\t\tqueryTypeBreakdown,\n\t\t};\n\t}\n\n\t/**\n\t * Get recent interactions for review\n\t */\n\tgetRecentInteractions(limit = 10): Interaction[] {\n\t\tconst interactions = loadJsonl<Interaction>(this.interactionsPath);\n\t\treturn interactions.slice(-limit);\n\t}\n\n\t/**\n\t * Get interactions needing feedback\n\t */\n\tgetPendingFeedback(limit = 5): Interaction[] {\n\t\tconst interactions = loadJsonl<Interaction>(this.interactionsPath);\n\t\treturn interactions.filter((i) => !i.humanFeedback).slice(-limit);\n\t}\n}\n","/**\n * Violation Tracker\n *\n * Tracks violations and auto-promotes patterns:\n * - 1x seen → Store in violations.jsonl\n * - 3x seen → Promote to codebase-patterns.md\n * - 5x seen → Mark for automated detection\n */\n\nimport * as path from \"node:path\";\nimport { appendJsonlAsync, generateId, loadJsonl, writeJsonl } from \"../storage/JsonlStore.js\";\nimport type { ResolvedConfig } from \"../types/config.js\";\nimport type { Violation, ViolationInput, ViolationStatus, ViolationsSummary } from \"../types/learning.js\";\nimport { PROMOTION_THRESHOLDS } from \"../types/learning.js\";\n\n/**\n * Violation Tracker with auto-promotion\n */\nexport class ViolationTracker {\n\tprivate violationsPath: string;\n\n\tconstructor(config: ResolvedConfig) {\n\t\tthis.violationsPath = path.join(config.rootDir, config.violationsFile);\n\t}\n\n\t/**\n\t * Report a violation and update count\n\t */\n\tasync report(input: ViolationInput): Promise<ViolationStatus> {\n\t\tconst violations = loadJsonl<Violation>(this.violationsPath);\n\n\t\t// Check if violation type already exists\n\t\tconst existing = violations.find((v) => v.type === input.type);\n\n\t\tif (existing) {\n\t\t\t// Increment count\n\t\t\texisting.count += 1;\n\t\t\texisting.timestamp = new Date().toISOString();\n\n\t\t\t// Check promotion thresholds\n\t\t\tlet shouldPromote = false;\n\t\t\tlet shouldAutomate = false;\n\n\t\t\tif (existing.count >= PROMOTION_THRESHOLDS.ADD_AUTOMATION && !existing.automatedAt) {\n\t\t\t\tshouldAutomate = true;\n\t\t\t\texisting.automatedAt = new Date().toISOString();\n\t\t\t} else if (existing.count >= PROMOTION_THRESHOLDS.PROMOTE_TO_PATTERN && !existing.promotedAt) {\n\t\t\t\tshouldPromote = true;\n\t\t\t\texisting.promotedAt = new Date().toISOString();\n\t\t\t}\n\n\t\t\t// Save updated violations\n\t\t\tawait writeJsonl(this.violationsPath, violations);\n\n\t\t\treturn {\n\t\t\t\tid: existing.id,\n\t\t\t\tcount: existing.count,\n\t\t\t\tshouldPromote,\n\t\t\t\tshouldAutomate,\n\t\t\t};\n\t\t}\n\n\t\t// Create new violation\n\t\tconst violation: Violation = {\n\t\t\tid: generateId(\"V\"),\n\t\t\ttype: input.type,\n\t\t\tfile: input.file,\n\t\t\twhatHappened: input.message,\n\t\t\twhyItHappened: input.reason,\n\t\t\tprevention: input.prevention,\n\t\t\twrongExample: input.wrongExample,\n\t\t\tcorrectExample: input.correctExample,\n\t\t\ttimestamp: new Date().toISOString(),\n\t\t\tcount: 1,\n\t\t\tpromotedAt: null,\n\t\t\tautomatedAt: null,\n\t\t};\n\n\t\tawait appendJsonlAsync(this.violationsPath, violation);\n\n\t\treturn {\n\t\t\tid: violation.id,\n\t\t\tcount: 1,\n\t\t\tshouldPromote: false,\n\t\t\tshouldAutomate: false,\n\t\t};\n\t}\n\n\t/**\n\t * Get summary of all violations\n\t */\n\tgetSummary(): ViolationsSummary {\n\t\tconst violations = loadJsonl<Violation>(this.violationsPath);\n\n\t\tconst byType = violations.map((v) => ({\n\t\t\ttype: v.type,\n\t\t\tcount: v.count,\n\t\t\tstatus: this.getViolationStatus(v),\n\t\t}));\n\n\t\tconst readyForPromotion = violations\n\t\t\t.filter((v) => v.count >= PROMOTION_THRESHOLDS.PROMOTE_TO_PATTERN && !v.promotedAt)\n\t\t\t.map((v) => v.type);\n\n\t\tconst readyForAutomation = violations\n\t\t\t.filter((v) => v.count >= PROMOTION_THRESHOLDS.ADD_AUTOMATION && !v.automatedAt)\n\t\t\t.map((v) => v.type);\n\n\t\treturn {\n\t\t\ttotal: violations.length,\n\t\t\tbyType,\n\t\t\treadyForPromotion,\n\t\t\treadyForAutomation,\n\t\t};\n\t}\n\n\t/**\n\t * Get violation status based on count and flags\n\t */\n\tprivate getViolationStatus(\n\t\tviolation: Violation,\n\t): \"tracking\" | \"ready_for_promotion\" | \"ready_for_automation\" | \"promoted\" | \"automated\" {\n\t\tif (violation.automatedAt) {\n\t\t\treturn \"automated\";\n\t\t}\n\t\tif (violation.promotedAt) {\n\t\t\treturn \"promoted\";\n\t\t}\n\t\tif (violation.count >= PROMOTION_THRESHOLDS.ADD_AUTOMATION) {\n\t\t\treturn \"ready_for_automation\";\n\t\t}\n\t\tif (violation.count >= PROMOTION_THRESHOLDS.PROMOTE_TO_PATTERN) {\n\t\t\treturn \"ready_for_promotion\";\n\t\t}\n\t\treturn \"tracking\";\n\t}\n\n\t/**\n\t * Get violations by type\n\t */\n\tgetByType(type: string): Violation | undefined {\n\t\tconst violations = loadJsonl<Violation>(this.violationsPath);\n\t\treturn violations.find((v) => v.type === type);\n\t}\n\n\t/**\n\t * Get recent violations\n\t */\n\tgetRecent(limit = 10): Violation[] {\n\t\tconst violations = loadJsonl<Violation>(this.violationsPath);\n\t\treturn violations.slice(-limit);\n\t}\n\n\t/**\n\t * Get violations for a specific file\n\t */\n\tgetByFile(file: string): Violation[] {\n\t\tconst violations = loadJsonl<Violation>(this.violationsPath);\n\t\treturn violations.filter((v) => v.file.includes(file));\n\t}\n}\n","/**\n * Session Context Types\n *\n * Session-level intelligence for tracking LLM behavior, detecting loops,\n * and escalating risk based on patterns.\n *\n * Based on research:\n * - arXiv:2511.10650 - Unsupervised Cycle Detection in Agentic Applications\n * - Pedowitz Safety Playbook - AI Agent Loop Prevention\n * - LangChain Context Engineering patterns\n */\n\n/**\n * Tool call record for history tracking\n */\nexport interface ToolCall {\n\t/** Unique idempotency key */\n\tid: string;\n\t/** Tool name (e.g., 'check_patterns', 'validate_code') */\n\tname: string;\n\t/** Tool arguments */\n\targs: Record<string, unknown>;\n\t/** Timestamp */\n\ttimestamp: number;\n\t/** Result (success/error) */\n\tresult?: {\n\t\tsuccess: boolean;\n\t\toutput?: unknown;\n\t\terror?: string;\n\t};\n\t/** Semantic embedding of args (for cycle detection) */\n\tembedding?: number[];\n}\n\n/**\n * File modification record\n */\nexport interface FileModification {\n\t/** File path */\n\tpath: string;\n\t/** Modification timestamp */\n\ttimestamp: number;\n\t/** Type of modification */\n\ttype: \"create\" | \"update\" | \"delete\";\n\t/** Lines changed (for velocity tracking) */\n\tlinesChanged?: number;\n}\n\n/**\n * Loop detection state\n * Detects both structural (same tool) and semantic (similar args) cycles\n */\nexport interface LoopDetectionState {\n\t/** Sequential tool call pattern (last 5 calls) */\n\tsequence: string[];\n\t/** Idempotency key cache (prevent duplicate operations) */\n\tdedupKeys: Set<string>;\n\t/** Consecutive same-tool calls */\n\tconsecutiveSameTool: Map<string, number>;\n\t/** Semantic similarity cache (detect near-duplicate calls) */\n\tsemanticCache: Map<string, number[]>;\n\t/** Circuit breaker states */\n\tcircuitBreakers: Map<string, CircuitBreaker>;\n}\n\n/**\n * Circuit breaker for tool calls\n * Trips after N failures, requires cooldown before retry\n */\nexport interface CircuitBreaker {\n\t/** Tool name */\n\ttool: string;\n\t/** Current state */\n\tstate: \"closed\" | \"open\" | \"half-open\";\n\t/** Failure count */\n\tfailures: number;\n\t/** Failure threshold (default: 3) */\n\tthreshold: number;\n\t/** Last failure timestamp */\n\tlastFailure: number;\n\t/** Cooldown period in ms (default: 60000 = 1min) */\n\tcooldownMs: number;\n}\n\n/**\n * Session risk level\n * Escalates based on behavior patterns\n */\nexport type SessionRiskLevel = \"low\" | \"medium\" | \"high\" | \"critical\";\n\n/**\n * Session state for a single LLM conversation\n * Tracks all context needed for behavioral intelligence\n */\nexport interface SessionState {\n\t/** Unique session ID */\n\tsessionId: string;\n\t/** Session start time */\n\tstartedAt: number;\n\t/** Last activity timestamp */\n\tlastActivity: number;\n\t/** Total turn count */\n\tturnCount: number;\n\n\t/** Tool call history */\n\ttoolCalls: ToolCall[];\n\n\t/** File modifications this session */\n\tfileModifications: FileModification[];\n\n\t/** Files modified multiple times (velocity tracking) */\n\tconsecutiveModifications: Map<string, number>;\n\n\t/** Loop detection state */\n\tloopDetection: LoopDetectionState;\n\n\t/** Current risk level */\n\triskLevel: SessionRiskLevel;\n\n\t/** Risk escalation reasons */\n\triskReasons: string[];\n\n\t/** Session metadata */\n\tmetadata: {\n\t\tworkspaceId?: string;\n\t\tuserId?: string;\n\t\ttags?: string[];\n\t};\n}\n\n/**\n * Loop detection result\n */\nexport interface LoopDetectionResult {\n\t/** Is a loop detected? */\n\tdetected: boolean;\n\t/** Loop type */\n\ttype?: \"structural\" | \"semantic\" | \"both\";\n\t/** Confidence score (0-1) */\n\tconfidence: number;\n\t/** Evidence */\n\tevidence: string[];\n\t/** Recommended action */\n\taction: \"continue\" | \"warn\" | \"halt\";\n}\n\n/**\n * Session limits configuration\n */\nexport interface SessionLimits {\n\t/** Max tool calls per session */\n\tmaxToolCalls: number;\n\t/** Max consecutive same-tool calls */\n\tmaxConsecutiveSameTool: number;\n\t/** Max file modifications per session */\n\tmaxFileModifications: number;\n\t/** Max consecutive modifications to same file */\n\tmaxConsecutiveSameFile: number;\n\t/** Session timeout (ms) */\n\tsessionTimeoutMs: number;\n\t/** Turn limit (max back-and-forth exchanges) */\n\tmaxTurns: number;\n\t/** Circuit breaker failure threshold */\n\tcircuitBreakerThreshold: number;\n\t/** Circuit breaker cooldown (ms) */\n\tcircuitBreakerCooldownMs: number;\n}\n\n/**\n * Default session limits (safety-first)\n */\nexport const DEFAULT_SESSION_LIMITS: SessionLimits = {\n\tmaxToolCalls: 100,\n\tmaxConsecutiveSameTool: 3,\n\tmaxFileModifications: 50,\n\tmaxConsecutiveSameFile: 5,\n\tsessionTimeoutMs: 3600000, // 1 hour\n\tmaxTurns: 50,\n\tcircuitBreakerThreshold: 3,\n\tcircuitBreakerCooldownMs: 60000, // 1 minute\n};\n\n/**\n * Session analytics for reporting\n */\nexport interface SessionAnalytics {\n\t/** Session ID */\n\tsessionId: string;\n\t/** Duration (ms) */\n\tduration: number;\n\t/** Total tool calls */\n\ttotalToolCalls: number;\n\t/** Unique tools used */\n\tuniqueTools: string[];\n\t/** Most called tool */\n\tmostCalledTool: { name: string; count: number } | null;\n\t/** Files touched */\n\tfilesTouched: string[];\n\t/** Peak risk level */\n\tpeakRiskLevel: SessionRiskLevel;\n\t/** Loops detected */\n\tloopsDetected: number;\n\t/** Circuit breaker trips */\n\tcircuitBreakerTrips: number;\n\t/** Session outcome */\n\toutcome: \"completed\" | \"timeout\" | \"halted\" | \"error\";\n}\n","/**\n * Loop Detector\n *\n * Hybrid loop detection combining structural and semantic analysis.\n *\n * Based on arXiv:2511.10650 research:\n * - Structural: Call stack temporal patterns (F1: 0.08 alone)\n * - Semantic: Cosine similarity of tool args (F1: 0.28 alone)\n * - Hybrid: Combined approach (F1: 0.72, precision: 0.62, recall: 0.86)\n *\n * Thresholds calibrated from research findings.\n */\n\nimport type { LoopDetectionResult, SessionState } from \"../types/session.js\";\n\n/**\n * Loop Detector\n *\n * Detects infinite loops in LLM agent behavior using:\n * 1. Structural analysis - same tool called repeatedly\n * 2. Semantic analysis - similar args (redundant content generation)\n */\nexport class LoopDetector {\n\t// Thresholds from research (arXiv:2511.10650)\n\tprivate readonly STRUCTURAL_THRESHOLD = 3; // 3+ consecutive same tool = loop\n\tprivate readonly SEMANTIC_THRESHOLD = 0.9; // 90% similarity = redundant\n\tprivate readonly CONFIDENCE_THRESHOLD_HALT = 0.8; // Halt at 80%+ confidence\n\tprivate readonly CONFIDENCE_THRESHOLD_WARN = 0.5; // Warn at 50%+ confidence\n\n\t/**\n\t * Detect loops in session\n\t */\n\tdetect(session: SessionState): LoopDetectionResult {\n\t\t// Defensive check (L6256620335)\n\t\tif (!session || !session.loopDetection) {\n\t\t\treturn {\n\t\t\t\tdetected: false,\n\t\t\t\tconfidence: 0,\n\t\t\t\tevidence: [],\n\t\t\t\taction: \"continue\",\n\t\t\t};\n\t\t}\n\n\t\t// Run both detection methods\n\t\tconst structuralResult = this.detectStructuralLoop(session);\n\t\tconst semanticResult = this.detectSemanticLoop(session);\n\n\t\t// Combine results\n\t\tconst detected = structuralResult.detected || semanticResult.detected;\n\t\tconst type =\n\t\t\tstructuralResult.detected && semanticResult.detected\n\t\t\t\t? \"both\"\n\t\t\t\t: structuralResult.detected\n\t\t\t\t\t? \"structural\"\n\t\t\t\t\t: semanticResult.detected\n\t\t\t\t\t\t? \"semantic\"\n\t\t\t\t\t\t: undefined;\n\n\t\t// Combine evidence\n\t\tconst evidence = [...structuralResult.evidence, ...semanticResult.evidence];\n\n\t\t// Confidence = max of both methods (research shows hybrid is best)\n\t\tconst confidence = Math.max(structuralResult.confidence, semanticResult.confidence);\n\n\t\t// Determine action\n\t\tlet action: LoopDetectionResult[\"action\"];\n\t\tif (confidence >= this.CONFIDENCE_THRESHOLD_HALT) {\n\t\t\taction = \"halt\";\n\t\t} else if (confidence >= this.CONFIDENCE_THRESHOLD_WARN) {\n\t\t\taction = \"warn\";\n\t\t} else {\n\t\t\taction = \"continue\";\n\t\t}\n\n\t\treturn {\n\t\t\tdetected,\n\t\t\ttype,\n\t\t\tconfidence,\n\t\t\tevidence,\n\t\t\taction,\n\t\t};\n\t}\n\n\t/**\n\t * Structural loop detection\n\t * Detects: same tool called 3+ times in sequence\n\t */\n\tprivate detectStructuralLoop(session: SessionState): {\n\t\tdetected: boolean;\n\t\tconfidence: number;\n\t\tevidence: string[];\n\t} {\n\t\tconst evidence: string[] = [];\n\t\tlet maxConsecutive = 0;\n\t\tlet maxTool = \"\";\n\n\t\t// Check consecutive same-tool calls\n\t\tfor (const [tool, count] of session.loopDetection.consecutiveSameTool.entries()) {\n\t\t\tif (count > maxConsecutive) {\n\t\t\t\tmaxConsecutive = count;\n\t\t\t\tmaxTool = tool;\n\t\t\t}\n\t\t}\n\n\t\t// Check sequence pattern (last 5 calls)\n\t\tconst sequence = session.loopDetection.sequence;\n\t\tif (sequence.length >= 3) {\n\t\t\t// Pattern: A-B-A-B (alternating)\n\t\t\tconst isAlternating =\n\t\t\t\tsequence.length >= 4 &&\n\t\t\t\tsequence[sequence.length - 1] === sequence[sequence.length - 3] &&\n\t\t\t\tsequence[sequence.length - 2] === sequence[sequence.length - 4];\n\n\t\t\tif (isAlternating) {\n\t\t\t\tevidence.push(`Alternating pattern detected: ${sequence.slice(-4).join(\" → \")}`);\n\t\t\t}\n\t\t}\n\n\t\tconst detected = maxConsecutive >= this.STRUCTURAL_THRESHOLD;\n\n\t\tif (detected) {\n\t\t\tevidence.push(`Tool '${maxTool}' called ${maxConsecutive} times consecutively`);\n\t\t}\n\n\t\t// Confidence based on consecutive count\n\t\t// Research shows: 3+ consecutive = high confidence structural loop\n\t\tconst confidence = detected ? Math.min(0.6 + (maxConsecutive - this.STRUCTURAL_THRESHOLD) * 0.1, 1.0) : 0;\n\n\t\treturn { detected, confidence, evidence };\n\t}\n\n\t/**\n\t * Semantic loop detection\n\t * Detects: similar args (cosine similarity > 90%)\n\t */\n\tprivate detectSemanticLoop(session: SessionState): {\n\t\tdetected: boolean;\n\t\tconfidence: number;\n\t\tevidence: string[];\n\t} {\n\t\tconst evidence: string[] = [];\n\n\t\t// Need at least 2 tool calls to compare\n\t\tif (session.toolCalls.length < 2) {\n\t\t\treturn { detected: false, confidence: 0, evidence: [] };\n\t\t}\n\n\t\t// Get last 5 tool calls for comparison\n\t\tconst recentCalls = session.toolCalls.slice(-5);\n\n\t\tlet maxSimilarity = 0;\n\t\tconst similarityPairs: Array<[number, number]> = [];\n\n\t\t// Compare each pair\n\t\tfor (let i = 0; i < recentCalls.length - 1; i++) {\n\t\t\tfor (let j = i + 1; j < recentCalls.length; j++) {\n\t\t\t\tconst call1 = recentCalls[i];\n\t\t\t\tconst call2 = recentCalls[j];\n\n\t\t\t\t// Only compare same tool\n\t\t\t\tif (call1.name !== call2.name) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tconst similarity = this.calculateArgsSimilarity(call1.args, call2.args);\n\n\t\t\t\tif (similarity > maxSimilarity) {\n\t\t\t\t\tmaxSimilarity = similarity;\n\t\t\t\t}\n\n\t\t\t\tif (similarity >= this.SEMANTIC_THRESHOLD) {\n\t\t\t\t\tsimilarityPairs.push([i, j]);\n\t\t\t\t\tevidence.push(\n\t\t\t\t\t\t`Tool '${call1.name}' calls ${i} and ${j} are ${(similarity * 100).toFixed(1)}% similar`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst detected = maxSimilarity >= this.SEMANTIC_THRESHOLD;\n\n\t\t// Confidence based on similarity score\n\t\t// Research shows: >90% similarity = high confidence semantic loop\n\t\tconst confidence = detected ? Math.min(0.5 + (maxSimilarity - this.SEMANTIC_THRESHOLD) * 2, 1.0) : 0;\n\n\t\treturn { detected, confidence, evidence };\n\t}\n\n\t/**\n\t * Calculate similarity between tool arguments\n\t * Uses simple string-based similarity (could be enhanced with embeddings)\n\t */\n\tprivate calculateArgsSimilarity(args1: Record<string, unknown>, args2: Record<string, unknown>): number {\n\t\t// Convert args to comparable strings\n\t\tconst str1 = JSON.stringify(args1, Object.keys(args1).sort());\n\t\tconst str2 = JSON.stringify(args2, Object.keys(args2).sort());\n\n\t\t// Exact match\n\t\tif (str1 === str2) {\n\t\t\treturn 1.0;\n\t\t}\n\n\t\t// Jaccard similarity (simple but effective)\n\t\tconst tokens1 = new Set(str1.split(/\\W+/));\n\t\tconst tokens2 = new Set(str2.split(/\\W+/));\n\n\t\tconst intersection = new Set([...tokens1].filter((x) => tokens2.has(x)));\n\t\tconst union = new Set([...tokens1, ...tokens2]);\n\n\t\treturn intersection.size / union.size;\n\t}\n}\n","/**\n * Session Manager\n *\n * Tracks LLM session context: tool calls, file modifications, loop detection, risk escalation.\n *\n * Based on research:\n * - arXiv:2511.10650 - Hybrid loop detection (F1: 0.72)\n * - Pedowitz Safety Playbook - Circuit breakers + idempotency\n * - LangChain Context Engineering - Session state management\n */\n\nimport { existsSync } from \"node:fs\";\nimport { mkdir } from \"node:fs/promises\";\nimport { dirname } from \"node:path\";\nimport { readFile, writeFile } from \"atomically\";\nimport { z } from \"zod\";\nimport type {\n\tCircuitBreaker,\n\tFileModification,\n\tLoopDetectionResult,\n\tSessionAnalytics,\n\tSessionLimits,\n\tSessionRiskLevel,\n\tSessionState,\n\tToolCall,\n} from \"../types/session.js\";\nimport { DEFAULT_SESSION_LIMITS } from \"../types/session.js\";\nimport { logger } from \"../utils/logger.js\";\nimport { LoopDetector } from \"./LoopDetector.js\";\n\n/**\n * Runtime validation schemas (Zod best practice)\n */\nconst ToolCallSchema = z.object({\n\tid: z.string().min(1, \"Tool call ID required\"),\n\tname: z.string().min(1, \"Tool name required\"),\n\targs: z.record(z.unknown()),\n\ttimestamp: z.number().positive(\"Timestamp must be positive\"),\n\tresult: z\n\t\t.object({\n\t\t\tsuccess: z.boolean(),\n\t\t\toutput: z.unknown().optional(),\n\t\t\terror: z.string().optional(),\n\t\t})\n\t\t.optional(),\n\tembedding: z.array(z.number()).optional(),\n});\n\nconst FileModificationSchema = z.object({\n\tpath: z.string().min(1, \"File path required\"),\n\ttimestamp: z.number().positive(\"Timestamp must be positive\"),\n\ttype: z.enum([\"create\", \"update\", \"delete\"]),\n\tlinesChanged: z.number().nonnegative().optional(),\n});\n\n/**\n * Session Manager\n *\n * Manages multiple concurrent LLM sessions with:\n * - Tool call tracking with idempotency\n * - File modification velocity\n * - Loop detection (structural + semantic)\n * - Risk escalation\n * - Circuit breakers\n */\nexport class SessionManager {\n\tprivate sessions = new Map<string, SessionState>();\n\tprivate limits: SessionLimits;\n\tprivate loopDetector: LoopDetector;\n\tprivate persistencePath?: string;\n\tprivate autosaveEnabled: boolean;\n\n\tconstructor(limits: Partial<SessionLimits> = {}, options?: { persistencePath?: string; autosave?: boolean }) {\n\t\tthis.limits = { ...DEFAULT_SESSION_LIMITS, ...limits };\n\t\tthis.loopDetector = new LoopDetector();\n\t\tthis.persistencePath = options?.persistencePath;\n\t\tthis.autosaveEnabled = options?.autosave ?? false;\n\n\t\t// Auto-load sessions on startup if persistence enabled\n\t\tif (this.persistencePath) {\n\t\t\tthis.loadSessions().catch((error) => {\n\t\t\t\tlogger.error(\"Failed to load sessions on startup\", {\n\t\t\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\t}\n\n\t/**\n\t * Start a new session\n\t */\n\tstartSession(\n\t\tsessionId: string,\n\t\tmetadata?: {\n\t\t\tworkspaceId?: string;\n\t\t\tuserId?: string;\n\t\t\ttags?: string[];\n\t\t},\n\t): void {\n\t\t// Defensive check (L6256620335)\n\t\tif (!sessionId) {\n\t\t\tthrow new Error(\"SessionManager.startSession: sessionId is required\");\n\t\t}\n\n\t\t// Prevent duplicate sessions\n\t\tif (this.sessions.has(sessionId)) {\n\t\t\tlogger.warn(\"Session already exists\", { sessionId, action: \"rejected\" });\n\t\t\tthrow new Error(`SessionManager.startSession: Session ${sessionId} already exists`);\n\t\t}\n\n\t\tconst now = Date.now();\n\n\t\tlogger.info(\"Session started\", {\n\t\t\tsessionId,\n\t\t\tworkspaceId: metadata?.workspaceId,\n\t\t\tuserId: metadata?.userId,\n\t\t\ttimestamp: now,\n\t\t});\n\n\t\tthis.sessions.set(sessionId, {\n\t\t\tsessionId,\n\t\t\tstartedAt: now,\n\t\t\tlastActivity: now,\n\t\t\tturnCount: 0,\n\t\t\ttoolCalls: [],\n\t\t\tfileModifications: [],\n\t\t\tconsecutiveModifications: new Map(),\n\t\t\tloopDetection: {\n\t\t\t\tsequence: [],\n\t\t\t\tdedupKeys: new Set(),\n\t\t\t\tconsecutiveSameTool: new Map(),\n\t\t\t\tsemanticCache: new Map(),\n\t\t\t\tcircuitBreakers: new Map(),\n\t\t\t},\n\t\t\triskLevel: \"low\",\n\t\t\triskReasons: [],\n\t\t\tmetadata: metadata ?? {},\n\t\t});\n\n\t\t// Autosave if enabled\n\t\tvoid this.autoSave();\n\t}\n\n\t/**\n\t * Record a tool call\n\t * Returns true if call is allowed, false if blocked (circuit breaker/loop)\n\t */\n\trecordToolCall(sessionId: string, call: ToolCall): boolean {\n\t\tconst session = this.getSession(sessionId);\n\t\tif (!session) {\n\t\t\tthrow new Error(`SessionManager.recordToolCall: Session ${sessionId} not found`);\n\t\t}\n\n\t\t// Input validation (Zod runtime check)\n\t\ttry {\n\t\t\tToolCallSchema.parse(call);\n\t\t} catch (error) {\n\t\t\tif (error instanceof z.ZodError) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`SessionManager.recordToolCall: Invalid tool call - ${error.errors.map((e) => `${e.path.join(\".\")}: ${e.message}`).join(\", \")}`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tthrow error;\n\t\t}\n\n\t\t// Check idempotency (dedupe)\n\t\tif (session.loopDetection.dedupKeys.has(call.id)) {\n\t\t\treturn false; // Duplicate operation\n\t\t}\n\n\t\t// Check circuit breaker\n\t\tconst breaker = this.getOrCreateCircuitBreaker(session, call.name);\n\t\tif (breaker.state === \"open\") {\n\t\t\t// Check if cooldown expired\n\t\t\tconst cooldownExpired = Date.now() - breaker.lastFailure > breaker.cooldownMs;\n\t\t\tif (!cooldownExpired) {\n\t\t\t\tlogger.warn(\"Circuit breaker tripped\", {\n\t\t\t\t\tsessionId,\n\t\t\t\t\ttool: call.name,\n\t\t\t\t\tstate: breaker.state,\n\t\t\t\t\tfailures: breaker.failures,\n\t\t\t\t\tcooldownRemaining: breaker.cooldownMs - (Date.now() - breaker.lastFailure),\n\t\t\t\t});\n\t\t\t\treturn false; // Circuit breaker tripped\n\t\t\t}\n\t\t\t// Move to half-open for retry\n\t\t\tbreaker.state = \"half-open\";\n\t\t\tlogger.info(\"Circuit breaker half-open\", {\n\t\t\t\tsessionId,\n\t\t\t\ttool: call.name,\n\t\t\t\tstate: breaker.state,\n\t\t\t});\n\t\t}\n\n\t\t// Check consecutive same-tool limit\n\t\tconst consecutive = (session.loopDetection.consecutiveSameTool.get(call.name) ?? 0) + 1;\n\t\tif (consecutive > this.limits.maxConsecutiveSameTool) {\n\t\t\treturn false; // Too many consecutive calls\n\t\t}\n\n\t\t// Record call\n\t\tsession.toolCalls.push(call);\n\t\tsession.loopDetection.dedupKeys.add(call.id);\n\t\tsession.loopDetection.consecutiveSameTool.set(call.name, consecutive);\n\t\tsession.loopDetection.sequence.push(call.name);\n\n\t\t// Keep sequence limited to last 5\n\t\tif (session.loopDetection.sequence.length > 5) {\n\t\t\tsession.loopDetection.sequence.shift();\n\t\t}\n\n\t\t// Update turn count\n\t\tsession.turnCount++;\n\t\tsession.lastActivity = Date.now();\n\n\t\t// Update circuit breaker on result\n\t\tif (call.result) {\n\t\t\tif (call.result.success) {\n\t\t\t\tbreaker.failures = 0;\n\t\t\t\tif (breaker.state === \"half-open\") {\n\t\t\t\t\tbreaker.state = \"closed\";\n\t\t\t\t\tlogger.info(\"Circuit breaker closed (recovered)\", {\n\t\t\t\t\t\tsessionId,\n\t\t\t\t\t\ttool: call.name,\n\t\t\t\t\t\tstate: breaker.state,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tbreaker.failures++;\n\t\t\t\tbreaker.lastFailure = Date.now();\n\t\t\t\tif (breaker.failures >= breaker.threshold) {\n\t\t\t\t\tbreaker.state = \"open\";\n\t\t\t\t\tlogger.error(\"Circuit breaker opened\", {\n\t\t\t\t\t\tsessionId,\n\t\t\t\t\t\ttool: call.name,\n\t\t\t\t\t\tstate: breaker.state,\n\t\t\t\t\t\tfailures: breaker.failures,\n\t\t\t\t\t\tthreshold: breaker.threshold,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Cleanup: Remove old tool counters to prevent memory leak (WeakMap pattern)\n\t\t// Only keep last 10 tools to prevent unbounded growth\n\t\tif (session.loopDetection.consecutiveSameTool.size > 10) {\n\t\t\tconst toolNames = Array.from(session.loopDetection.consecutiveSameTool.keys());\n\t\t\t// Remove oldest entries (first in map)\n\t\t\tfor (let i = 0; i < toolNames.length - 10; i++) {\n\t\t\t\tsession.loopDetection.consecutiveSameTool.delete(toolNames[i]);\n\t\t\t}\n\t\t}\n\n\t\t// Recalculate risk\n\t\tthis.updateRiskLevel(session);\n\n\t\t// Autosave if enabled\n\t\tvoid this.autoSave();\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Record a file modification\n\t */\n\trecordFileModification(sessionId: string, mod: FileModification): void {\n\t\tconst session = this.getSession(sessionId);\n\t\tif (!session) {\n\t\t\tthrow new Error(`SessionManager.recordFileModification: Session ${sessionId} not found`);\n\t\t}\n\n\t\t// Input validation (Zod runtime check)\n\t\ttry {\n\t\t\tFileModificationSchema.parse(mod);\n\t\t} catch (error) {\n\t\t\tif (error instanceof z.ZodError) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`SessionManager.recordFileModification: Invalid modification - ${error.errors.map((e) => `${e.path.join(\".\")}: ${e.message}`).join(\", \")}`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tthrow error;\n\t\t}\n\n\t\tsession.fileModifications.push(mod);\n\n\t\t// Track consecutive modifications\n\t\tconst consecutiveCount = (session.consecutiveModifications.get(mod.path) ?? 0) + 1;\n\t\tsession.consecutiveModifications.set(mod.path, consecutiveCount);\n\n\t\tsession.lastActivity = Date.now();\n\n\t\t// Recalculate risk\n\t\tthis.updateRiskLevel(session);\n\n\t\t// Autosave if enabled\n\t\tvoid this.autoSave();\n\t}\n\n\t/**\n\t * Detect loops in session\n\t */\n\tdetectLoop(sessionId: string): LoopDetectionResult {\n\t\tconst session = this.getSession(sessionId);\n\t\tif (!session) {\n\t\t\treturn {\n\t\t\t\tdetected: false,\n\t\t\t\tconfidence: 0,\n\t\t\t\tevidence: [],\n\t\t\t\taction: \"continue\",\n\t\t\t};\n\t\t}\n\n\t\treturn this.loopDetector.detect(session);\n\t}\n\n\t/**\n\t * Calculate and update session risk level\n\t */\n\tprivate updateRiskLevel(session: SessionState): void {\n\t\tconst reasons: string[] = [];\n\t\tlet riskScore = 0;\n\n\t\t// Factor 1: Tool call velocity\n\t\tconst toolCallRate = session.toolCalls.length / Math.max((Date.now() - session.startedAt) / 60000, 1); // calls per minute\n\t\tif (toolCallRate > 10) {\n\t\t\triskScore += 30;\n\t\t\treasons.push(`High tool call rate: ${toolCallRate.toFixed(1)}/min`);\n\t\t} else if (toolCallRate > 5) {\n\t\t\triskScore += 15;\n\t\t\treasons.push(`Moderate tool call rate: ${toolCallRate.toFixed(1)}/min`);\n\t\t}\n\n\t\t// Factor 2: File modification velocity\n\t\tconst fileModCount = session.fileModifications.length;\n\t\tif (fileModCount > this.limits.maxFileModifications * 0.8) {\n\t\t\triskScore += 20;\n\t\t\treasons.push(`High file modification count: ${fileModCount}`);\n\t\t}\n\n\t\t// Factor 3: Consecutive modifications to same file\n\t\tfor (const [file, count] of session.consecutiveModifications.entries()) {\n\t\t\tif (count > this.limits.maxConsecutiveSameFile * 0.8) {\n\t\t\t\triskScore += 25;\n\t\t\t\treasons.push(`File modified ${count} times: ${file}`);\n\t\t\t}\n\t\t}\n\n\t\t// Factor 4: Loop detection\n\t\tconst loopResult = this.loopDetector.detect(session);\n\t\tif (loopResult.detected) {\n\t\t\triskScore += 40;\n\t\t\treasons.push(`Loop detected: ${loopResult.type}`);\n\t\t}\n\n\t\t// Factor 5: Circuit breaker trips\n\t\tconst circuitBreakerTrips = Array.from(session.loopDetection.circuitBreakers.values()).filter(\n\t\t\t(cb) => cb.state === \"open\",\n\t\t).length;\n\t\tif (circuitBreakerTrips > 0) {\n\t\t\triskScore += 20 * circuitBreakerTrips;\n\t\t\treasons.push(`${circuitBreakerTrips} circuit breaker(s) tripped`);\n\t\t}\n\n\t\t// Bound risk score to 0-100 range\n\t\triskScore = Math.min(Math.max(riskScore, 0), 100);\n\n\t\t// Calculate risk level\n\t\tlet riskLevel: SessionRiskLevel;\n\t\tif (riskScore >= 80) {\n\t\t\triskLevel = \"critical\";\n\t\t} else if (riskScore >= 50) {\n\t\t\triskLevel = \"high\";\n\t\t} else if (riskScore >= 25) {\n\t\t\triskLevel = \"medium\";\n\t\t} else {\n\t\t\triskLevel = \"low\";\n\t\t}\n\n\t\t// Log risk escalation\n\t\tif (riskLevel !== session.riskLevel && riskLevel !== \"low\") {\n\t\t\tlogger.warn(\"Risk level escalated\", {\n\t\t\t\tsessionId: session.sessionId,\n\t\t\t\tpreviousLevel: session.riskLevel,\n\t\t\t\tnewLevel: riskLevel,\n\t\t\t\triskScore,\n\t\t\t\treasons,\n\t\t\t});\n\t\t}\n\n\t\tsession.riskLevel = riskLevel;\n\t\tsession.riskReasons = reasons;\n\t}\n\n\t/**\n\t * Get session analytics\n\t */\n\tgetAnalytics(sessionId: string): SessionAnalytics | null {\n\t\tconst session = this.sessions.get(sessionId);\n\t\tif (!session) {\n\t\t\treturn null;\n\t\t}\n\n\t\t// Count tool usage\n\t\tconst toolCounts = new Map<string, number>();\n\t\tfor (const call of session.toolCalls) {\n\t\t\ttoolCounts.set(call.name, (toolCounts.get(call.name) ?? 0) + 1);\n\t\t}\n\n\t\tconst uniqueTools = Array.from(toolCounts.keys());\n\t\tconst mostCalledTool: { name: string; count: number } | null =\n\t\t\tuniqueTools.length > 0\n\t\t\t\t? Array.from(toolCounts.entries()).reduce<{ name: string; count: number }>(\n\t\t\t\t\t\t(max, [name, count]) => (count > max.count ? { name, count } : max),\n\t\t\t\t\t\t{ name: \"\", count: 0 },\n\t\t\t\t\t)\n\t\t\t\t: null;\n\n\t\t// Unique files\n\t\tconst filesTouched = Array.from(new Set(session.fileModifications.map((m) => m.path)));\n\n\t\t// Count loops (detect once, not per tool call)\n\t\tconst currentLoopResult = this.loopDetector.detect(session);\n\t\tconst loopsDetected = currentLoopResult.detected ? 1 : 0;\n\n\t\t// Count circuit breaker trips\n\t\tconst circuitBreakerTrips = Array.from(session.loopDetection.circuitBreakers.values()).filter(\n\t\t\t(cb) => cb.state === \"open\",\n\t\t).length;\n\n\t\t// Determine outcome\n\t\tconst now = Date.now();\n\t\tconst duration = now - session.startedAt;\n\t\tconst timedOut = duration > this.limits.sessionTimeoutMs;\n\t\tconst halted = session.riskLevel === \"critical\";\n\n\t\tlet outcome: SessionAnalytics[\"outcome\"];\n\t\tif (halted) {\n\t\t\toutcome = \"halted\";\n\t\t} else if (timedOut) {\n\t\t\toutcome = \"timeout\";\n\t\t} else {\n\t\t\toutcome = \"completed\";\n\t\t}\n\n\t\treturn {\n\t\t\tsessionId: session.sessionId,\n\t\t\tduration,\n\t\t\ttotalToolCalls: session.toolCalls.length,\n\t\t\tuniqueTools,\n\t\t\tmostCalledTool,\n\t\t\tfilesTouched,\n\t\t\tpeakRiskLevel: session.riskLevel,\n\t\t\tloopsDetected,\n\t\t\tcircuitBreakerTrips,\n\t\t\toutcome,\n\t\t};\n\t}\n\n\t/**\n\t * End a session and clean up\n\t */\n\tendSession(sessionId: string): SessionAnalytics | null {\n\t\tconst analytics = this.getAnalytics(sessionId);\n\t\tthis.sessions.delete(sessionId);\n\t\treturn analytics;\n\t}\n\n\t/**\n\t * Get session state (for debugging)\n\t */\n\tgetSessionState(sessionId: string): SessionState | null {\n\t\treturn this.sessions.get(sessionId) ?? null;\n\t}\n\n\t/**\n\t * Get file modifications for a session\n\t * @param sessionId - Session to query\n\t * @param since - Optional timestamp filter (return modifications >= since)\n\t * @returns File modifications array (empty if session not found)\n\t */\n\tgetFileModifications(sessionId: string, since?: number): FileModification[] {\n\t\tconst session = this.getSession(sessionId);\n\t\tif (!session) {\n\t\t\treturn [];\n\t\t}\n\n\t\tif (since !== undefined && since > 0) {\n\t\t\treturn session.fileModifications.filter((m) => m.timestamp >= since);\n\t\t}\n\n\t\treturn [...session.fileModifications];\n\t}\n\n\t/**\n\t * Prune stale sessions (older than timeout)\n\t */\n\tpruneStale(): number {\n\t\tconst now = Date.now();\n\t\tlet pruned = 0;\n\n\t\tfor (const [sessionId, session] of this.sessions.entries()) {\n\t\t\tconst age = now - session.lastActivity;\n\t\t\tif (age > this.limits.sessionTimeoutMs) {\n\t\t\t\tthis.sessions.delete(sessionId);\n\t\t\t\tpruned++;\n\t\t\t}\n\t\t}\n\n\t\treturn pruned;\n\t}\n\n\t/**\n\t * Get or create circuit breaker for tool\n\t */\n\tprivate getOrCreateCircuitBreaker(session: SessionState, toolName: string): CircuitBreaker {\n\t\tlet breaker = session.loopDetection.circuitBreakers.get(toolName);\n\n\t\tif (!breaker) {\n\t\t\tbreaker = {\n\t\t\t\ttool: toolName,\n\t\t\t\tstate: \"closed\",\n\t\t\t\tfailures: 0,\n\t\t\t\tthreshold: this.limits.circuitBreakerThreshold,\n\t\t\t\tlastFailure: 0,\n\t\t\t\tcooldownMs: this.limits.circuitBreakerCooldownMs,\n\t\t\t};\n\t\t\tsession.loopDetection.circuitBreakers.set(toolName, breaker);\n\t\t}\n\n\t\treturn breaker;\n\t}\n\n\t/**\n\t * Get session (null-safe)\n\t */\n\tprivate getSession(sessionId: string): SessionState | null {\n\t\treturn this.sessions.get(sessionId) ?? null;\n\t}\n\n\t/**\n\t * Get active session count\n\t */\n\tgetActiveSessionCount(): number {\n\t\treturn this.sessions.size;\n\t}\n\n\t// =========================================================================\n\t// PERSISTENCE (JSONL + Atomic Writes)\n\t// =========================================================================\n\n\t/**\n\t * Save all sessions to disk (atomic writes)\n\t * Based on web research best practices (GitHub jsonl-db, Claude Skills)\n\t */\n\tasync saveSessions(): Promise<void> {\n\t\tif (!this.persistencePath) {\n\t\t\tlogger.warn(\"saveSessions called but no persistencePath configured\");\n\t\t\treturn;\n\t\t}\n\n\t\ttry {\n\t\t\t// Ensure directory exists\n\t\t\tconst dir = dirname(this.persistencePath);\n\t\t\tif (!existsSync(dir)) {\n\t\t\t\tawait mkdir(dir, { recursive: true });\n\t\t\t}\n\n\t\t\t// Convert sessions to serializable format (Maps → Objects)\n\t\t\tconst serializable = Array.from(this.sessions.entries()).map(([_id, session]) => ({\n\t\t\t\t...session,\n\t\t\t\tconsecutiveModifications: Object.fromEntries(session.consecutiveModifications),\n\t\t\t\tloopDetection: {\n\t\t\t\t\tsequence: session.loopDetection.sequence,\n\t\t\t\t\tdedupKeys: Array.from(session.loopDetection.dedupKeys),\n\t\t\t\t\tconsecutiveSameTool: Object.fromEntries(session.loopDetection.consecutiveSameTool),\n\t\t\t\t\tsemanticCache: Object.fromEntries(session.loopDetection.semanticCache),\n\t\t\t\t\tcircuitBreakers: Object.fromEntries(session.loopDetection.circuitBreakers),\n\t\t\t\t},\n\t\t\t}));\n\n\t\t\t// Atomic write (temp file → rename)\n\t\t\tconst jsonl = serializable.map((s) => JSON.stringify(s)).join(\"\\n\");\n\t\t\tawait writeFile(this.persistencePath, jsonl);\n\n\t\t\tlogger.debug(\"Sessions saved\", {\n\t\t\t\tcount: this.sessions.size,\n\t\t\t\tpath: this.persistencePath,\n\t\t\t});\n\t\t} catch (error) {\n\t\t\tlogger.error(\"Failed to save sessions\", {\n\t\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\t\tpath: this.persistencePath,\n\t\t\t});\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\t/**\n\t * Load sessions from disk\n\t */\n\tasync loadSessions(): Promise<void> {\n\t\tif (!this.persistencePath) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (!existsSync(this.persistencePath)) {\n\t\t\tlogger.debug(\"No sessions file found, starting fresh\", {\n\t\t\t\tpath: this.persistencePath,\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\ttry {\n\t\t\tconst content = await readFile(this.persistencePath, \"utf-8\");\n\t\t\tconst lines = content.split(\"\\n\").filter((line) => line.trim());\n\n\t\t\tlet loaded = 0;\n\t\t\tfor (const line of lines) {\n\t\t\t\ttry {\n\t\t\t\t\tconst data = JSON.parse(line);\n\n\t\t\t\t\t// Reconstruct Maps from Objects\n\t\t\t\t\tconst session: SessionState = {\n\t\t\t\t\t\t...data,\n\t\t\t\t\t\tconsecutiveModifications: new Map(Object.entries(data.consecutiveModifications || {})),\n\t\t\t\t\t\tloopDetection: {\n\t\t\t\t\t\t\tsequence: data.loopDetection.sequence || [],\n\t\t\t\t\t\t\tdedupKeys: new Set(data.loopDetection.dedupKeys || []),\n\t\t\t\t\t\t\tconsecutiveSameTool: new Map(Object.entries(data.loopDetection.consecutiveSameTool || {})),\n\t\t\t\t\t\t\tsemanticCache: new Map(Object.entries(data.loopDetection.semanticCache || {})),\n\t\t\t\t\t\t\tcircuitBreakers: new Map(Object.entries(data.loopDetection.circuitBreakers || {})),\n\t\t\t\t\t\t},\n\t\t\t\t\t};\n\n\t\t\t\t\tthis.sessions.set(session.sessionId, session);\n\t\t\t\t\tloaded++;\n\t\t\t\t} catch (error) {\n\t\t\t\t\tlogger.warn(\"Failed to parse session line, skipping\", {\n\t\t\t\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlogger.info(\"Sessions loaded\", {\n\t\t\t\tcount: loaded,\n\t\t\t\tpath: this.persistencePath,\n\t\t\t});\n\t\t} catch (error) {\n\t\t\tlogger.error(\"Failed to load sessions\", {\n\t\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\t\tpath: this.persistencePath,\n\t\t\t});\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\t/**\n\t * Auto-save session after modifications (if enabled)\n\t */\n\tprivate async autoSave(): Promise<void> {\n\t\tif (this.autosaveEnabled && this.persistencePath) {\n\t\t\tawait this.saveSessions().catch((error) => {\n\t\t\t\tlogger.error(\"Autosave failed\", {\n\t\t\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\t}\n}\n","/**\n * Intelligence Package Configuration\n *\n * Defines the configuration interface for the Intelligence facade.\n * Same algorithms, different data sources based on config.\n */\n\nimport type { ValidationIssue } from \"@snapback/contracts\";\nimport { z } from \"zod\";\n\n/**\n * Issue detected during validation\n * Re-exported from contracts for backward compatibility\n */\nexport type Issue = ValidationIssue;\n\n/**\n * Validation layer interface for extensibility\n */\nexport interface ValidationLayer {\n\tname: string;\n\tvalidate(code: string, filePath: string): Promise<{ issues: Issue[] }>;\n}\n\n/**\n * Custom constraint for validation\n */\nexport interface Constraint {\n\tid: string;\n\tname: string;\n\tdescription: string;\n\tcheck: (code: string, filePath: string) => Issue[];\n}\n\n/**\n * Configuration schema for Intelligence\n */\nexport const IntelligenceConfigSchema = z.object({\n\t/**\n\t * Root directory for all intelligence data\n\t * Internal: 'ai_dev_utils'\n\t * Product: workspace root or .snapback/\n\t */\n\trootDir: z.string(),\n\n\t/**\n\t * Directory containing pattern definitions\n\t * @default 'patterns'\n\t */\n\tpatternsDir: z.string().optional().default(\"patterns\"),\n\n\t/**\n\t * Directory for learnings and feedback\n\t * @default 'feedback'\n\t */\n\tlearningsDir: z.string().optional().default(\"feedback\"),\n\n\t/**\n\t * File containing constraints/rules\n\t * @default 'CONSTRAINTS.md'\n\t */\n\tconstraintsFile: z.string().optional().default(\"CONSTRAINTS.md\"),\n\n\t/**\n\t * JSONL file for violation tracking\n\t * @default 'violations.jsonl'\n\t */\n\tviolationsFile: z.string().optional().default(\"patterns/violations.jsonl\"),\n\n\t/**\n\t * SQLite database for embeddings\n\t * @default 'embeddings.db'\n\t */\n\tembeddingsDb: z.string().optional().default(\"embeddings.db\"),\n\n\t/**\n\t * Files to index for semantic search\n\t */\n\tcontextFiles: z\n\t\t.array(z.string())\n\t\t.optional()\n\t\t.default([\"ARCHITECTURE.md\", \"CONSTRAINTS.md\", \"ROUTER.md\", \"patterns/codebase-patterns.md\"]),\n\n\t/**\n\t * Enable semantic search with embeddings\n\t * Requires @huggingface/transformers\n\t * @default false\n\t */\n\tenableSemanticSearch: z.boolean().optional().default(false),\n\n\t/**\n\t * Enable enhanced validation layers (Biome + TypeScript compiler + dynamic confidence)\n\t * Requires pnpm build to have completed successfully\n\t * @default false\n\t */\n\tenhancedValidation: z.boolean().optional().default(false),\n\n\t/**\n\t * Enable learning loop (violation tracking, feedback)\n\t * @default true\n\t */\n\tenableLearningLoop: z.boolean().optional().default(true),\n\n\t/**\n\t * Auto-promote patterns at 3x violations\n\t * @default true\n\t */\n\tenableAutoPromotion: z.boolean().optional().default(true),\n\n\t/**\n\t * Session limits configuration (Phase 1)\n\t */\n\tsessionLimits: z\n\t\t.object({\n\t\t\tmaxToolCalls: z.number().optional(),\n\t\t\tmaxConsecutiveSameTool: z.number().optional(),\n\t\t\tmaxFileModifications: z.number().optional(),\n\t\t\tmaxConsecutiveSameFile: z.number().optional(),\n\t\t\tsessionTimeoutMs: z.number().optional(),\n\t\t\tmaxTurns: z.number().optional(),\n\t\t\tcircuitBreakerThreshold: z.number().optional(),\n\t\t\tcircuitBreakerCooldownMs: z.number().optional(),\n\t\t})\n\t\t.optional(),\n\n\t/**\n\t * Session persistence configuration\n\t * Enables cross-surface session sharing (Extension, MCP, CLI)\n\t */\n\tsessionPersistence: z\n\t\t.object({\n\t\t\t/**\n\t\t\t * Path for session persistence (JSONL format)\n\t\t\t * @default '.snapback/session/sessions.jsonl'\n\t\t\t */\n\t\t\tpath: z.string().optional(),\n\t\t\t/**\n\t\t\t * Enable autosave on session changes\n\t\t\t * @default true\n\t\t\t */\n\t\t\tautosave: z.boolean().optional().default(true),\n\t\t})\n\t\t.optional(),\n\n\t/**\n\t * Advisory system configuration (Phase 2)\n\t */\n\tadvisoryConfig: z\n\t\t.object({\n\t\t\tenabled: z.boolean().optional(),\n\t\t\tmaxWarnings: z.number().optional(),\n\t\t\tmaxSuggestions: z.number().optional(),\n\t\t\tmaxRelatedFiles: z.number().optional(),\n\t\t\tincludeSessionContext: z.boolean().optional(),\n\t\t\tincludeFileHistory: z.boolean().optional(),\n\t\t})\n\t\t.optional(),\n});\n\nexport type IntelligenceConfig = z.input<typeof IntelligenceConfigSchema>;\nexport type ResolvedConfig = z.output<typeof IntelligenceConfigSchema>;\n\n/**\n * Cacheable context for Anthropic prompt caching\n *\n * Static context that changes rarely - ideal for prompt caching.\n * Use with `cache_control: { type: \"ephemeral\" }` for 90% cost reduction.\n *\n * @see https://docs.anthropic.com/claude/docs/prompt-caching\n */\nexport interface CacheableContext {\n\tarchitecture: string;\n\tconstraints: string;\n\tpatterns: string;\n\ttimestamp: string;\n\t/** Cache control metadata for Anthropic prompt caching */\n\t_cache_control?: { type: \"ephemeral\" };\n}\n","/**\n * Validation Types\n *\n * Types for the 7-layer validation pipeline.\n */\n\nimport type { ValidationSeverity } from \"@snapback/contracts\";\nimport type { Issue } from \"./config.js\";\n\n/**\n * Result from a single validation layer\n */\nexport interface ValidationResult {\n\tlayer: string;\n\tpassed: boolean;\n\tissues: Issue[];\n\tduration: number;\n}\n\n/**\n * Overall pipeline result with confidence scoring\n */\nexport interface PipelineResult {\n\toverall: {\n\t\tpassed: boolean;\n\t\tconfidence: number;\n\t\ttotalIssues: number;\n\t};\n\tlayers: ValidationResult[];\n\trecommendation: ReviewRecommendation;\n\tfocusPoints: string[];\n}\n\n/**\n * Review recommendation based on confidence\n */\nexport type ReviewRecommendation = \"auto_merge\" | \"quick_review\" | \"full_review\";\n\n/**\n * Confidence thresholds for review routing\n */\nexport const CONFIDENCE_THRESHOLDS = {\n\tAUTO_MERGE: 0.95,\n\tQUICK_REVIEW: 0.7,\n\tFULL_REVIEW: 0.5,\n} as const;\n\n/**\n * Issue count thresholds for review routing\n */\nexport const ISSUE_THRESHOLDS = {\n\tQUICK_REVIEW: 2,\n\tFULL_REVIEW: 5,\n} as const;\n\n/**\n * Pattern match result from constraint checking\n */\nexport interface PatternMatch {\n\tpattern: string;\n\tfile: string;\n\tline?: number;\n\tseverity: ValidationSeverity;\n}\n\n// Re-export Issue for convenience\nexport type { Issue } from \"./config.js\";\n","/**\n * DynamicConfidenceCalculator\n *\n * Calculates confidence scores using weighted severity scoring.\n * Different layers have different weights based on their impact on code quality.\n *\n * Weight rationale:\n * - Security (0.30 critical): Security issues are most impactful\n * - Syntax (0.25 critical): Broken code is unusable\n * - Types (0.20 critical): Type errors cause runtime failures\n * - Architecture (0.15 critical): Layer violations create tech debt\n * - Tests (0.05 critical): Test issues don't break production\n * - Dependencies (0.03 critical): Usually minor impact\n * - Performance (0.02 critical): Often informational\n *\n * @module validation/DynamicConfidenceCalculator\n */\n\nimport { applyAdditivePenalties, clampScore } from \"@snapback/core\";\nimport type { Issue } from \"../types/config.js\";\nimport type { ValidationResult } from \"../types/validation.js\";\n\n/**\n * Weight configuration for each layer\n */\ninterface LayerWeight {\n\tcritical: number;\n\twarning: number;\n\tinfo: number;\n}\n\n/**\n * Default weights for validation layers\n */\nconst DEFAULT_WEIGHTS: Record<string, LayerWeight> = {\n\t// Core code quality\n\tsyntax: { critical: 0.25, warning: 0.05, info: 0.01 },\n\ttypes: { critical: 0.2, warning: 0.03, info: 0.01 },\n\t\"typescript-compiler\": { critical: 0.2, warning: 0.03, info: 0.01 },\n\n\t// Security is paramount\n\tsecurity: { critical: 0.3, warning: 0.1, info: 0.02 },\n\n\t// Architecture matters for maintainability\n\tarchitecture: { critical: 0.15, warning: 0.05, info: 0.01 },\n\n\t// Test issues are less critical to production\n\ttests: { critical: 0.05, warning: 0.02, info: 0.005 },\n\n\t// Dependencies and performance are informational\n\tdependencies: { critical: 0.03, warning: 0.01, info: 0.005 },\n\tperformance: { critical: 0.02, warning: 0.01, info: 0.005 },\n\n\t// Biome catches style/lint issues - moderate weight\n\tbiome: { critical: 0.1, warning: 0.03, info: 0.01 },\n};\n\n/**\n * Default weight for unknown layers\n */\nconst UNKNOWN_LAYER_WEIGHT: LayerWeight = {\n\tcritical: 0.05,\n\twarning: 0.02,\n\tinfo: 0.01,\n};\n\n/**\n * DynamicConfidenceCalculator\n *\n * Calculates confidence using weighted penalties instead of hardcoded thresholds.\n * This provides more nuanced scoring where security issues matter more than style.\n */\nexport class DynamicConfidenceCalculator {\n\tprivate weights: Record<string, LayerWeight>;\n\n\tconstructor(customWeights?: Record<string, LayerWeight>) {\n\t\tthis.weights = { ...DEFAULT_WEIGHTS, ...customWeights };\n\t}\n\n\t/**\n\t * Calculate confidence score from validation results\n\t *\n\t * @param layers - Validation results from each layer\n\t * @returns Confidence score between 0.10 and 0.95\n\t */\n\tcalculate(layers: ValidationResult[]): number {\n\t\tif (layers.length === 0) {\n\t\t\treturn 0.95; // No validation = assume good (edge case)\n\t\t}\n\n\t\t// Collect all penalties using shared utility\n\t\tconst penalties: number[] = [];\n\n\t\tfor (const layer of layers) {\n\t\t\tconst layerWeight = this.weights[layer.layer] || UNKNOWN_LAYER_WEIGHT;\n\n\t\t\tfor (const issue of layer.issues) {\n\t\t\t\tconst severityWeight = this.getSeverityWeight(layerWeight, issue.severity);\n\t\t\t\tpenalties.push(severityWeight);\n\t\t\t}\n\t\t}\n\n\t\t// Apply penalties and clamp using shared utilities\n\t\tconst confidence = applyAdditivePenalties(1.0, penalties, 0.1);\n\t\treturn clampScore(confidence, 0.1, 0.95);\n\t}\n\n\t/**\n\t * Get weight for a severity level in a layer\n\t */\n\tprivate getSeverityWeight(layerWeight: LayerWeight, severity: Issue[\"severity\"]): number {\n\t\tswitch (severity) {\n\t\t\tcase \"critical\":\n\t\t\t\treturn layerWeight.critical;\n\t\t\tcase \"warning\":\n\t\t\t\treturn layerWeight.warning;\n\t\t\tcase \"info\":\n\t\t\t\treturn layerWeight.info;\n\t\t\tdefault:\n\t\t\t\treturn layerWeight.info;\n\t\t}\n\t}\n\n\t/**\n\t * Get weight for a specific layer\n\t */\n\tgetLayerWeight(layerName: string): LayerWeight {\n\t\treturn this.weights[layerName] || UNKNOWN_LAYER_WEIGHT;\n\t}\n\n\t/**\n\t * Update weights for a layer\n\t */\n\tsetLayerWeight(layerName: string, weight: LayerWeight): void {\n\t\tthis.weights[layerName] = weight;\n\t}\n\n\t/**\n\t * Get all configured weights\n\t */\n\tgetWeights(): Record<string, LayerWeight> {\n\t\treturn { ...this.weights };\n\t}\n}\n\n/**\n * Default instance for convenience\n */\nexport const defaultConfidenceCalculator = new DynamicConfidenceCalculator();\n","/**\n * Secret Detector - Identifies potential secrets in code\n * Uses pattern matching and entropy analysis\n */\n\nexport interface SecretPattern {\n\tname: string;\n\tpattern: RegExp;\n\tentropy?: number;\n\tseverity: \"low\" | \"medium\" | \"high\" | \"critical\";\n}\n\nexport interface SecretFinding {\n\ttype: string;\n\tline: number;\n\tcolumn: number;\n\tsnippet: string;\n\tseverity: \"low\" | \"medium\" | \"high\" | \"critical\";\n\tentropy?: number;\n\truleId: string;\n}\n\nexport interface SecretDetectionResult {\n\tfindings: SecretFinding[];\n\triskScore: number;\n}\n\n// Known secret patterns\nconst SECRET_PATTERNS: SecretPattern[] = [\n\t{\n\t\tname: \"AWS Access Key\",\n\t\tpattern: /AKIA[0-9A-Z]{16}/g,\n\t\tseverity: \"critical\",\n\t},\n\t{\n\t\tname: \"AWS Secret Key\",\n\t\tpattern: /aws_secret_access_key\\s*=\\s*[\"']?([A-Za-z0-9/+=]{40})[\"']?/gi,\n\t\tseverity: \"critical\",\n\t},\n\t{\n\t\tname: \"GitHub Token\",\n\t\tpattern: /gh[ps]_[a-zA-Z0-9]{36}/g,\n\t\tseverity: \"critical\",\n\t},\n\t{\n\t\tname: \"Stripe API Key\",\n\t\tpattern: /sk_(?:live|test)_[a-zA-Z0-9]{24}/g,\n\t\tseverity: \"critical\",\n\t},\n\t{\n\t\tname: \"Generic API Key\",\n\t\tpattern: /[\"']?api[_-]?key[\"']?\\s*[=:]\\s*[\"']([a-zA-Z0-9_-]{20,})[\"']/gi,\n\t\tseverity: \"high\",\n\t},\n\t{\n\t\tname: \"Private Key Header\",\n\t\tpattern: /-----BEGIN (?:RSA |DSA |EC |OPENSSH )?PRIVATE KEY-----/g,\n\t\tseverity: \"critical\",\n\t},\n\t{\n\t\tname: \"Bearer Token\",\n\t\tpattern: /Bearer\\s+[a-zA-Z0-9\\-._~+/]+=*/gi,\n\t\tseverity: \"high\",\n\t},\n\t{\n\t\tname: \"Password Assignment\",\n\t\tpattern: /password\\s*[=:]\\s*[\"']([^\"']{8,})[\"']/gi,\n\t\tseverity: \"medium\",\n\t},\n\t{\n\t\tname: \"OAuth Token\",\n\t\tpattern: /oauth[_-]?token\\s*[=:]\\s*[\"']([a-zA-Z0-9_-]{20,})[\"']/gi,\n\t\tseverity: \"high\",\n\t},\n];\n\nexport class SecretDetector {\n\t/**\n\t * Detect secrets in file content\n\t */\n\tdetect(content: string, filePath: string): SecretDetectionResult {\n\t\tconst findings: SecretFinding[] = [];\n\n\t\t// Skip test files to reduce false positives\n\t\tif (this.isTestFile(filePath)) {\n\t\t\treturn { findings: [], riskScore: 0 };\n\t\t}\n\n\t\t// Split content into lines for accurate reporting\n\t\tconst lines = content.split(\"\\n\");\n\n\t\t// Remove multi-line comments first\n\t\tconst cleanedLines = this.removeMultiLineComments(lines);\n\n\t\t// Check each pattern\n\t\tfor (const pattern of SECRET_PATTERNS) {\n\t\t\tfor (let lineNum = 0; lineNum < cleanedLines.length; lineNum++) {\n\t\t\t\tconst line = cleanedLines[lineNum];\n\t\t\t\tconst originalLine = lines[lineNum]; // Keep for snippet\n\t\t\t\tconst matches = line.matchAll(pattern.pattern);\n\n\t\t\t\tfor (const match of matches) {\n\t\t\t\t\t// Skip if it's in a single-line comment\n\t\t\t\t\tif (this.isInSingleLineComment(originalLine, match.index || 0)) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst snippet = match[0].substring(0, 50); // First 50 chars\n\t\t\t\t\tconst entropy = this.calculateEntropy(match[1] || match[0]);\n\n\t\t\t\t\tfindings.push({\n\t\t\t\t\t\ttype: pattern.name,\n\t\t\t\t\t\tline: lineNum + 1,\n\t\t\t\t\t\tcolumn: (match.index || 0) + 1,\n\t\t\t\t\t\tsnippet,\n\t\t\t\t\t\tseverity: pattern.severity,\n\t\t\t\t\t\tentropy,\n\t\t\t\t\t\truleId: `secret-detection/${pattern.name.toLowerCase().replace(/\\s+/g, \"-\")}`,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Check for high-entropy strings (potential secrets)\n\t\tthis.detectHighEntropyStrings(cleanedLines, lines, findings);\n\n\t\t// Calculate risk score (0-10)\n\t\tconst riskScore = this.calculateRiskScore(findings);\n\n\t\treturn { findings, riskScore };\n\t}\n\n\t/**\n\t * Calculate Shannon entropy of a string\n\t */\n\tprivate calculateEntropy(str: string): number {\n\t\tif (str.length === 0) {\n\t\t\treturn 0;\n\t\t}\n\n\t\tconst freq: Record<string, number> = {};\n\t\tfor (const char of str) {\n\t\t\tfreq[char] = (freq[char] || 0) + 1;\n\t\t}\n\n\t\tlet entropy = 0;\n\t\tconst len = str.length;\n\t\tfor (const char in freq) {\n\t\t\tconst p = freq[char] / len;\n\t\t\tentropy -= p * Math.log2(p);\n\t\t}\n\n\t\treturn entropy;\n\t}\n\n\t/**\n\t * Detect high-entropy strings that might be secrets\n\t */\n\tprivate detectHighEntropyStrings(\n\t\tcleanedLines: string[],\n\t\t_originalLines: string[],\n\t\tfindings: SecretFinding[],\n\t): void {\n\t\tconst stringPattern = /[\"']([a-zA-Z0-9+/=_-]{20,})[\"']/g;\n\n\t\tfor (let lineNum = 0; lineNum < cleanedLines.length; lineNum++) {\n\t\t\tconst line = cleanedLines[lineNum];\n\t\t\tconst matches = line.matchAll(stringPattern);\n\n\t\t\tfor (const match of matches) {\n\t\t\t\tconst str = match[1];\n\t\t\t\tconst entropy = this.calculateEntropy(str);\n\n\t\t\t\t// High entropy threshold: 4.5 (randomness indicator)\n\t\t\t\tif (entropy > 4.5 && str.length >= 20) {\n\t\t\t\t\tfindings.push({\n\t\t\t\t\t\ttype: \"High-Entropy String\",\n\t\t\t\t\t\tline: lineNum + 1,\n\t\t\t\t\t\tcolumn: (match.index || 0) + 1,\n\t\t\t\t\t\tsnippet: str.substring(0, 50),\n\t\t\t\t\t\tseverity: \"medium\",\n\t\t\t\t\t\tentropy,\n\t\t\t\t\t\truleId: \"secret-detection/high-entropy-string\",\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Check if file is a test file\n\t */\n\tprivate isTestFile(filePath: string): boolean {\n\t\tconst testPatterns = [\n\t\t\t/\\.test\\.[jt]sx?$/,\n\t\t\t/\\.spec\\.[jt]sx?$/,\n\t\t\t/__tests__\\//,\n\t\t\t/\\/test\\//,\n\t\t\t/\\/tests\\//,\n\t\t\t/\\.fixture\\.[jt]sx?$/,\n\t\t];\n\n\t\treturn testPatterns.some((pattern) => pattern.test(filePath));\n\t}\n\n\t/**\n\t * Remove multi-line comments from lines\n\t */\n\tprivate removeMultiLineComments(lines: string[]): string[] {\n\t\tconst result: string[] = [];\n\t\tlet inComment = false;\n\n\t\tfor (const line of lines) {\n\t\t\tlet cleanedLine = line;\n\n\t\t\tif (inComment) {\n\t\t\t\t// Check if comment ends on this line\n\t\t\t\tconst endIndex = line.indexOf(\"*/\");\n\t\t\t\tif (endIndex !== -1) {\n\t\t\t\t\tcleanedLine = line.substring(endIndex + 2);\n\t\t\t\t\tinComment = false;\n\t\t\t\t} else {\n\t\t\t\t\t// Entire line is in comment\n\t\t\t\t\tcleanedLine = \"\";\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Check for comment start\n\t\t\tconst startIndex = cleanedLine.indexOf(\"/*\");\n\t\t\tif (startIndex !== -1) {\n\t\t\t\tconst endIndex = cleanedLine.indexOf(\"*/\", startIndex);\n\t\t\t\tif (endIndex !== -1) {\n\t\t\t\t\t// Single-line /* */ comment\n\t\t\t\t\tcleanedLine = cleanedLine.substring(0, startIndex) + cleanedLine.substring(endIndex + 2);\n\t\t\t\t} else {\n\t\t\t\t\t// Multi-line comment starts\n\t\t\t\t\tcleanedLine = cleanedLine.substring(0, startIndex);\n\t\t\t\t\tinComment = true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tresult.push(cleanedLine);\n\t\t}\n\n\t\treturn result;\n\t}\n\n\t/**\n\t * Check if position is in a single-line comment\n\t */\n\tprivate isInSingleLineComment(line: string, position: number): boolean {\n\t\tconst beforePosition = line.substring(0, position);\n\t\t// Check for // comments\n\t\tif (beforePosition.includes(\"//\")) {\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\t/**\n\t * Calculate overall risk score (0-10)\n\t */\n\tprivate calculateRiskScore(findings: SecretFinding[]): number {\n\t\tif (findings.length === 0) {\n\t\t\treturn 0;\n\t\t}\n\n\t\t// Weight by severity\n\t\tconst severityWeights = {\n\t\t\tcritical: 10,\n\t\t\thigh: 7,\n\t\t\tmedium: 4,\n\t\t\tlow: 2,\n\t\t};\n\n\t\tlet totalScore = 0;\n\t\tfor (const finding of findings) {\n\t\t\ttotalScore += severityWeights[finding.severity];\n\t\t\t// Add entropy bonus for high-entropy findings\n\t\t\tif (finding.entropy && finding.entropy > 5) {\n\t\t\t\ttotalScore += 1;\n\t\t\t}\n\t\t}\n\n\t\t// Cap at 10\n\t\treturn Math.min(10, totalScore);\n\t}\n}\n","/**\n * BiomeLayer - Programmatic Biome Integration\n *\n * Runs Biome linter on code and returns structured issues.\n * Leverages the project's existing Biome configuration.\n *\n * This layer catches:\n * - Unused imports (noUnusedImports)\n * - Unused variables (noUnusedVariables)\n * - Style issues (noNonNullAssertion, etc.)\n * - A11y issues (noSvgWithoutTitle, etc.)\n *\n * @module validation/layers/BiomeLayer\n */\n\nimport { spawn } from \"node:child_process\";\nimport { mkdtemp, rm, writeFile } from \"node:fs/promises\";\nimport { tmpdir } from \"node:os\";\nimport { join } from \"node:path\";\nimport type { Issue, ValidationLayer } from \"../../types/config.js\";\n\ninterface BiomeDiagnostic {\n\tcategory?: string;\n\tseverity?: string;\n\tmessage?: string;\n\tdescription?: string;\n\tpath?: string;\n\tlocation?: {\n\t\tpath?: { file?: string };\n\t\tspan?: { start?: number; end?: number };\n\t};\n}\n\ninterface BiomeOutput {\n\tdiagnostics?: BiomeDiagnostic[];\n}\n\n/**\n * BiomeLayer - Validates code using Biome linter\n */\nexport class BiomeLayer implements ValidationLayer {\n\tname = \"biome\";\n\n\tconstructor(private workspaceRoot: string) {}\n\n\tasync validate(code: string, filePath: string): Promise<{ issues: Issue[] }> {\n\t\tconst issues: Issue[] = [];\n\n\t\t// Handle empty code\n\t\tif (!code || code.trim() === \"\") {\n\t\t\treturn { issues };\n\t\t}\n\n\t\ttry {\n\t\t\tconst result = await this.runBiome(code, filePath);\n\t\t\treturn { issues: result };\n\t\t} catch {\n\t\t\t// Biome not available or failed - return empty issues\n\t\t\t// Don't fail validation just because biome isn't available\n\t\t\treturn { issues };\n\t\t}\n\t}\n\n\t/**\n\t * Run Biome on the provided code\n\t */\n\tprivate async runBiome(code: string, filePath: string): Promise<Issue[]> {\n\t\t// Create a temp file with the code\n\t\tconst tempDir = await mkdtemp(join(tmpdir(), \"biome-validation-\"));\n\t\tconst tempFile = join(tempDir, filePath.replace(/^.*[\\\\/]/, \"\"));\n\n\t\ttry {\n\t\t\tawait writeFile(tempFile, code, \"utf8\");\n\n\t\t\tconst result = await this.execBiome(tempFile);\n\t\t\treturn this.parseBiomeOutput(result, code);\n\t\t} finally {\n\t\t\t// Cleanup temp directory\n\t\t\tawait rm(tempDir, { recursive: true, force: true }).catch(() => {});\n\t\t}\n\t}\n\n\t/**\n\t * Execute biome check command\n\t */\n\tprivate execBiome(filePath: string): Promise<string> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tlet stdout = \"\";\n\t\t\tlet stderr = \"\";\n\n\t\t\tconst proc = spawn(\"npx\", [\"biome\", \"check\", \"--reporter=json\", filePath], {\n\t\t\t\tcwd: this.workspaceRoot,\n\t\t\t\tshell: true,\n\t\t\t\tstdio: [\"pipe\", \"pipe\", \"pipe\"],\n\t\t\t});\n\n\t\t\tconst timeout = setTimeout(() => {\n\t\t\t\tproc.kill(\"SIGTERM\");\n\t\t\t\treject(new Error(\"Biome check timed out\"));\n\t\t\t}, 15000);\n\n\t\t\tproc.stdout?.on(\"data\", (data) => {\n\t\t\t\tstdout += data.toString();\n\t\t\t});\n\n\t\t\tproc.stderr?.on(\"data\", (data) => {\n\t\t\t\tstderr += data.toString();\n\t\t\t});\n\n\t\t\tproc.on(\"close\", (_code) => {\n\t\t\t\tclearTimeout(timeout);\n\t\t\t\t// Biome returns non-zero when there are issues, that's expected\n\t\t\t\tresolve(stdout || stderr);\n\t\t\t});\n\n\t\t\tproc.on(\"error\", (err) => {\n\t\t\t\tclearTimeout(timeout);\n\t\t\t\treject(err);\n\t\t\t});\n\t\t});\n\t}\n\n\t/**\n\t * Parse Biome JSON output into Issue array\n\t */\n\tprivate parseBiomeOutput(output: string, code: string): Issue[] {\n\t\tconst issues: Issue[] = [];\n\n\t\tif (!output) {\n\t\t\treturn issues;\n\t\t}\n\n\t\ttry {\n\t\t\t// Try to parse as JSON\n\t\t\tconst parsed = JSON.parse(output) as BiomeOutput;\n\n\t\t\tif (parsed.diagnostics && Array.isArray(parsed.diagnostics)) {\n\t\t\t\tfor (const diag of parsed.diagnostics) {\n\t\t\t\t\tissues.push(this.diagnosticToIssue(diag, code));\n\t\t\t\t}\n\t\t\t}\n\t\t} catch {\n\t\t\t// Try to extract diagnostics from non-JSON output\n\t\t\t// Biome sometimes outputs line-by-line diagnostics\n\t\t\tconst lines = output.split(\"\\n\").filter((l) => l.trim());\n\t\t\tfor (const line of lines) {\n\t\t\t\tif (line.includes(\"error\") || line.includes(\"warning\")) {\n\t\t\t\t\tissues.push({\n\t\t\t\t\t\tseverity: line.includes(\"error\") ? \"critical\" : \"warning\",\n\t\t\t\t\t\ttype: \"BIOME_ISSUE\",\n\t\t\t\t\t\tmessage: line.trim().slice(0, 200),\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn issues;\n\t}\n\n\t/**\n\t * Convert Biome diagnostic to Issue format\n\t */\n\tprivate diagnosticToIssue(diag: BiomeDiagnostic, code: string): Issue {\n\t\tconst severity = this.mapSeverity(diag.severity);\n\t\tconst type = diag.category || \"BIOME_ISSUE\";\n\t\tconst message = diag.message || diag.description || \"Unknown issue\";\n\n\t\t// Try to find line number from span\n\t\tlet line: number | undefined;\n\t\tif (diag.location?.span?.start !== undefined) {\n\t\t\tconst offset = diag.location.span.start;\n\t\t\tconst beforeOffset = code.slice(0, offset);\n\t\t\tline = (beforeOffset.match(/\\n/g) || []).length + 1;\n\t\t}\n\n\t\treturn {\n\t\t\tseverity,\n\t\t\ttype: this.normalizeType(type),\n\t\t\tmessage: message.slice(0, 300),\n\t\t\tline,\n\t\t\tfix: this.getSuggestedFix(type),\n\t\t};\n\t}\n\n\t/**\n\t * Map Biome severity to Issue severity\n\t */\n\tprivate mapSeverity(severity?: string): \"critical\" | \"warning\" | \"info\" {\n\t\tswitch (severity?.toLowerCase()) {\n\t\t\tcase \"error\":\n\t\t\t\treturn \"critical\";\n\t\t\tcase \"warning\":\n\t\t\t\treturn \"warning\";\n\t\t\tdefault:\n\t\t\t\treturn \"info\";\n\t\t}\n\t}\n\n\t/**\n\t * Normalize Biome rule name to type\n\t */\n\tprivate normalizeType(category: string): string {\n\t\t// Extract rule name from category like \"lint/correctness/noUnusedVariables\"\n\t\tconst parts = category.split(\"/\");\n\t\treturn parts[parts.length - 1] || category;\n\t}\n\n\t/**\n\t * Get suggested fix for common issues\n\t */\n\tprivate getSuggestedFix(type: string): string | undefined {\n\t\tconst fixes: Record<string, string> = {\n\t\t\tnoUnusedImports: \"Remove the unused import\",\n\t\t\tnoUnusedVariables: \"Remove or use the variable\",\n\t\t\tnoNonNullAssertion: \"Use proper null check instead of !\",\n\t\t\tnoExplicitAny: \"Use a specific type instead of any\",\n\t\t\tuseBlockStatements: \"Add braces around the statement\",\n\t\t\tnoConsole: \"Use a logger instead of console\",\n\t\t};\n\t\treturn fixes[type];\n\t}\n}\n","/**\n * TypeScriptCompilerLayer - Real TypeScript Compiler Integration\n *\n * Runs the actual TypeScript compiler (tsc) on code to detect type errors.\n * This is more accurate than regex-based type checking.\n *\n * This layer catches:\n * - Type mismatches\n * - Missing properties\n * - Incorrect function signatures\n * - Generic type errors\n *\n * @module validation/layers/TypeScriptCompilerLayer\n */\n\nimport { spawn } from \"node:child_process\";\nimport { mkdtemp, rm, writeFile } from \"node:fs/promises\";\nimport { tmpdir } from \"node:os\";\nimport { join } from \"node:path\";\nimport type { Issue, ValidationLayer } from \"../../types/config.js\";\n\n/**\n * TypeScriptCompilerLayer - Validates code using tsc\n */\nexport class TypeScriptCompilerLayer implements ValidationLayer {\n\tname = \"typescript-compiler\";\n\n\tconstructor(private workspaceRoot: string) {}\n\n\tasync validate(code: string, filePath: string): Promise<{ issues: Issue[] }> {\n\t\t// Handle empty code\n\t\tif (!code || code.trim() === \"\") {\n\t\t\treturn { issues: [] };\n\t\t}\n\n\t\ttry {\n\t\t\tconst result = await this.runTsc(code, filePath);\n\t\t\treturn { issues: result };\n\t\t} catch {\n\t\t\t// tsc not available or failed - return empty issues\n\t\t\treturn { issues: [] };\n\t\t}\n\t}\n\n\t/**\n\t * Run TypeScript compiler on the provided code\n\t */\n\tprivate async runTsc(code: string, filePath: string): Promise<Issue[]> {\n\t\t// Create a temp file with the code\n\t\tconst tempDir = await mkdtemp(join(tmpdir(), \"tsc-validation-\"));\n\t\tconst fileName = filePath.replace(/^.*[\\\\/]/, \"\") || \"temp.ts\";\n\t\tconst tempFile = join(tempDir, fileName);\n\n\t\ttry {\n\t\t\tawait writeFile(tempFile, code, \"utf8\");\n\n\t\t\tconst result = await this.execTsc(tempFile);\n\t\t\treturn this.parseTscOutput(result, code);\n\t\t} finally {\n\t\t\t// Cleanup temp directory\n\t\t\tawait rm(tempDir, { recursive: true, force: true }).catch(() => {});\n\t\t}\n\t}\n\n\t/**\n\t * Execute tsc command\n\t */\n\tprivate execTsc(filePath: string): Promise<string> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tlet stdout = \"\";\n\t\t\tlet stderr = \"\";\n\n\t\t\t// Use noEmit to just check types without generating output\n\t\t\tconst proc = spawn(\"npx\", [\"tsc\", \"--noEmit\", \"--pretty\", \"false\", \"--skipLibCheck\", filePath], {\n\t\t\t\tcwd: this.workspaceRoot,\n\t\t\t\tshell: true,\n\t\t\t\tstdio: [\"pipe\", \"pipe\", \"pipe\"],\n\t\t\t});\n\n\t\t\tconst timeout = setTimeout(() => {\n\t\t\t\tproc.kill(\"SIGTERM\");\n\t\t\t\treject(new Error(\"TypeScript check timed out\"));\n\t\t\t}, 15000);\n\n\t\t\tproc.stdout?.on(\"data\", (data) => {\n\t\t\t\tstdout += data.toString();\n\t\t\t});\n\n\t\t\tproc.stderr?.on(\"data\", (data) => {\n\t\t\t\tstderr += data.toString();\n\t\t\t});\n\n\t\t\tproc.on(\"close\", (_code) => {\n\t\t\t\tclearTimeout(timeout);\n\t\t\t\t// tsc returns non-zero when there are errors, that's expected\n\t\t\t\tresolve(stdout + stderr);\n\t\t\t});\n\n\t\t\tproc.on(\"error\", (err) => {\n\t\t\t\tclearTimeout(timeout);\n\t\t\t\treject(err);\n\t\t\t});\n\t\t});\n\t}\n\n\t/**\n\t * Parse tsc output into Issue array\n\t */\n\tprivate parseTscOutput(output: string, _code: string): Issue[] {\n\t\tconst issues: Issue[] = [];\n\n\t\tif (!output) {\n\t\t\treturn issues;\n\t\t}\n\n\t\tconst lines = output.split(\"\\n\");\n\n\t\tfor (const line of lines) {\n\t\t\t// Match tsc error format: file.ts(line,col): error TS1234: message\n\t\t\tconst match = line.match(/^(.+?)\\((\\d+),(\\d+)\\):\\s*(error|warning)\\s+(TS\\d+):\\s*(.+)$/);\n\n\t\t\tif (match) {\n\t\t\t\tconst [, , lineNum, , severity, tsCode, message] = match;\n\t\t\t\tissues.push({\n\t\t\t\t\tseverity: severity === \"error\" ? \"critical\" : \"warning\",\n\t\t\t\t\ttype: tsCode,\n\t\t\t\t\tmessage: message.trim(),\n\t\t\t\t\tline: Number.parseInt(lineNum, 10),\n\t\t\t\t\tfix: this.getSuggestedFix(tsCode),\n\t\t\t\t});\n\t\t\t} else if (line.includes(\"error TS\")) {\n\t\t\t\t// Fallback for other error formats\n\t\t\t\tconst codeMatch = line.match(/TS(\\d+)/);\n\t\t\t\tissues.push({\n\t\t\t\t\tseverity: \"critical\",\n\t\t\t\t\ttype: codeMatch ? `TS${codeMatch[1]}` : \"TS_ERROR\",\n\t\t\t\t\tmessage: line.trim().slice(0, 200),\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\treturn issues;\n\t}\n\n\t/**\n\t * Get suggested fix for common TypeScript errors\n\t */\n\tprivate getSuggestedFix(tsCode: string): string | undefined {\n\t\tconst fixes: Record<string, string> = {\n\t\t\tTS2322: \"Check type compatibility between the assigned value and variable type\",\n\t\t\tTS2339: \"Property does not exist - add it to the type or interface\",\n\t\t\tTS2345: \"Argument type mismatch - ensure function is called with correct types\",\n\t\t\tTS2304: \"Cannot find name - check import or variable declaration\",\n\t\t\tTS2531: \"Object is possibly null - add null check\",\n\t\t\tTS2532: \"Object is possibly undefined - add undefined check\",\n\t\t\tTS7006: \"Parameter implicitly has any type - add type annotation\",\n\t\t\tTS2307: \"Cannot find module - check import path or install package\",\n\t\t\tTS2341: \"Property is private - use public accessor or friend pattern\",\n\t\t\tTS2551: \"Property does not exist - did you mean a similar property?\",\n\t\t\tTS2769: \"No overload matches this call - check function signature\",\n\t\t};\n\t\treturn fixes[tsCode];\n\t}\n}\n","/**\n * Validation Layers\n *\n * Individual validation layers that run in parallel.\n * Each layer checks for a specific category of issues.\n *\n * Enhanced layers (BiomeLayer, TypeScriptCompilerLayer) are exported at bottom.\n *\n * SecurityLayer++: Integrated SecretDetector + unsafe function patterns\n * PerformanceLayer++: O(n²), memory leaks, ReDoS detection\n *\n * @see https://docs.github.com/en/code-security/secret-scanning/introduction/supported-secret-scanning-patterns\n */\n\nimport { SecretDetector, type SecretFinding } from \"../../policy/detectors/SecretDetector.js\";\nimport type { Issue, ValidationLayer } from \"../../types/config.js\";\n\n/**\n * Helper to find line number for an issue\n */\nfunction findLine(code: string, search: string): number {\n\tif (!code) {\n\t\treturn 0;\n\t}\n\tconst lines = code.split(\"\\n\");\n\treturn lines.findIndex((l) => l.includes(search)) + 1;\n}\n\n/**\n * Check if file is a test file (for false positive prevention)\n */\nfunction isTestFile(filePath: string): boolean {\n\tif (!filePath) {\n\t\treturn false;\n\t}\n\treturn (\n\t\tfilePath.includes(\".test.\") ||\n\t\tfilePath.includes(\".spec.\") ||\n\t\tfilePath.includes(\"__tests__\") ||\n\t\tfilePath.includes(\"/test/\") ||\n\t\tfilePath.includes(\"/tests/\")\n\t);\n}\n\n/**\n * Layer 1: Syntax Validation\n * Checks for basic syntax issues\n */\nexport class SyntaxLayer implements ValidationLayer {\n\tname = \"syntax\";\n\n\tasync validate(code: string, _filePath: string): Promise<{ issues: Issue[] }> {\n\t\tconst issues: Issue[] = [];\n\n\t\t// Defensive null check\n\t\tif (!code) {\n\t\t\treturn { issues };\n\t\t}\n\n\t\t// Check for unclosed brackets/parens\n\t\tconst openBrackets = (code.match(/\\{/g) || []).length;\n\t\tconst closeBrackets = (code.match(/\\}/g) || []).length;\n\t\tif (openBrackets !== closeBrackets) {\n\t\t\tissues.push({\n\t\t\t\tseverity: \"critical\",\n\t\t\t\ttype: \"SYNTAX_ERROR\",\n\t\t\t\tmessage: `Mismatched braces: ${openBrackets} open, ${closeBrackets} close`,\n\t\t\t\tfix: \"Balance opening and closing braces\",\n\t\t\t});\n\t\t}\n\n\t\tconst openParens = (code.match(/\\(/g) || []).length;\n\t\tconst closeParens = (code.match(/\\)/g) || []).length;\n\t\tif (openParens !== closeParens) {\n\t\t\tissues.push({\n\t\t\t\tseverity: \"critical\",\n\t\t\t\ttype: \"SYNTAX_ERROR\",\n\t\t\t\tmessage: `Mismatched parentheses: ${openParens} open, ${closeParens} close`,\n\t\t\t\tfix: \"Balance opening and closing parentheses\",\n\t\t\t});\n\t\t}\n\n\t\t// Check for common syntax mistakes\n\t\tif (code.includes(\";;\")) {\n\t\t\tissues.push({\n\t\t\t\tseverity: \"warning\",\n\t\t\t\ttype: \"SYNTAX_WARNING\",\n\t\t\t\tmessage: \"Double semicolon detected\",\n\t\t\t\tline: findLine(code, \";;\"),\n\t\t\t\tfix: \"Remove extra semicolon\",\n\t\t\t});\n\t\t}\n\n\t\treturn { issues };\n\t}\n}\n\n/**\n * Layer 2: Type Safety Checks\n * Checks for TypeScript type safety issues\n */\nexport class TypeLayer implements ValidationLayer {\n\tname = \"types\";\n\n\tasync validate(code: string, _filePath: string): Promise<{ issues: Issue[] }> {\n\t\tconst issues: Issue[] = [];\n\n\t\t// Defensive null check\n\t\tif (!code) {\n\t\t\treturn { issues };\n\t\t}\n\n\t\t// Check for `any` type usage\n\t\tconst anyMatches = code.match(/:\\s*any\\b/g) || [];\n\t\tif (anyMatches.length > 0) {\n\t\t\tissues.push({\n\t\t\t\tseverity: \"warning\",\n\t\t\t\ttype: \"TYPE_SAFETY_BYPASS\",\n\t\t\t\tmessage: `Found ${anyMatches.length} uses of 'any' type`,\n\t\t\t\tfix: \"Use specific types or generics instead of 'any'\",\n\t\t\t});\n\t\t}\n\n\t\t// Check for @ts-expect-error without explanation\n\t\tif (code.includes(\"@ts-ignore\") && !code.includes(\"@ts-ignore -\")) {\n\t\t\tissues.push({\n\t\t\t\tseverity: \"warning\",\n\t\t\t\ttype: \"TS_IGNORE_NO_REASON\",\n\t\t\t\tmessage: \"@ts-ignore used without explanation\",\n\t\t\t\tline: findLine(code, \"@ts-ignore\"),\n\t\t\t\tfix: \"Add reason: // @ts-ignore - <reason>\",\n\t\t\t});\n\t\t}\n\n\t\t// Check for non-null assertions\n\t\tconst nonNullMatches = code.match(/\\w+!/g) || [];\n\t\tif (nonNullMatches.length > 3) {\n\t\t\tissues.push({\n\t\t\t\tseverity: \"info\",\n\t\t\t\ttype: \"EXCESSIVE_NON_NULL\",\n\t\t\t\tmessage: `Found ${nonNullMatches.length} non-null assertions (!)`,\n\t\t\t\tfix: \"Consider proper null checks instead\",\n\t\t\t});\n\t\t}\n\n\t\treturn { issues };\n\t}\n}\n\n/**\n * Layer 3: Test Coverage Checks\n * Validates test file patterns per C-003 and C-004\n */\nexport class TestLayer implements ValidationLayer {\n\tname = \"tests\";\n\n\tasync validate(code: string, filePath: string): Promise<{ issues: Issue[] }> {\n\t\tconst issues: Issue[] = [];\n\n\t\t// Defensive null checks\n\t\tif (!code || !filePath) {\n\t\t\treturn { issues };\n\t\t}\n\n\t\t// Only check test files\n\t\tif (!filePath.includes(\".test.\") && !filePath.includes(\"/test/\")) {\n\t\t\treturn { issues };\n\t\t}\n\n\t\t// Check for vague assertions (from CONSTRAINTS.md C-003)\n\t\tconst vaguePatterns = [\".toBeTruthy()\", \".toBeDefined()\", \".toBeFalsy()\"];\n\t\tfor (const pattern of vaguePatterns) {\n\t\t\tif (code.includes(pattern)) {\n\t\t\t\tissues.push({\n\t\t\t\t\tseverity: \"warning\",\n\t\t\t\t\ttype: \"VAGUE_ASSERTION\",\n\t\t\t\t\tmessage: `Found vague assertion: ${pattern}`,\n\t\t\t\t\tline: findLine(code, pattern),\n\t\t\t\t\tfix: \"Use specific assertions: .toEqual(), .toBe(), .toMatchObject()\",\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\t// Check for 4-path coverage (C-004)\n\t\tconst hasHappyPath = code.includes(\"should\") && (code.includes(\"success\") || code.includes(\"correct\"));\n\t\tconst hasSadPath = code.includes(\"fail\") || code.includes(\"error\") || code.includes(\"invalid\");\n\t\tconst hasEdgeCase = code.includes(\"edge\") || code.includes(\"empty\") || code.includes(\"null\");\n\t\tconst hasErrorCase = code.includes(\"throw\") || code.includes(\"reject\");\n\n\t\tconst paths = [hasHappyPath, hasSadPath, hasEdgeCase, hasErrorCase].filter(Boolean).length;\n\t\tif (paths < 3) {\n\t\t\tissues.push({\n\t\t\t\tseverity: \"info\",\n\t\t\t\ttype: \"INCOMPLETE_COVERAGE\",\n\t\t\t\tmessage: `Only ${paths}/4 test paths covered (happy, sad, edge, error)`,\n\t\t\t\tfix: \"Add tests for missing paths\",\n\t\t\t});\n\t\t}\n\n\t\treturn { issues };\n\t}\n}\n\n/**\n * Layer 4: Architecture Validation\n * Checks for layer boundary and pattern violations per C-001, C-002\n */\nexport class ArchitectureLayer implements ValidationLayer {\n\tname = \"architecture\";\n\n\tasync validate(code: string, filePath: string): Promise<{ issues: Issue[] }> {\n\t\tconst issues: Issue[] = [];\n\n\t\t// Defensive null checks\n\t\tif (!code || !filePath) {\n\t\t\treturn { issues };\n\t\t}\n\n\t\t// C-001: Layer Boundary Enforcement\n\t\tif (\n\t\t\t(filePath.includes(\"apps/vscode/\") || filePath.includes(\"apps/web/\") || filePath.includes(\"apps/cli/\")) &&\n\t\t\tcode.includes(\"@snapback/infrastructure\")\n\t\t) {\n\t\t\tissues.push({\n\t\t\t\tseverity: \"critical\",\n\t\t\t\ttype: \"LAYER_BOUNDARY_VIOLATION\",\n\t\t\t\tmessage: \"Presentation layer cannot import @snapback/infrastructure\",\n\t\t\t\tline: findLine(code, \"@snapback/infrastructure\"),\n\t\t\t\tfix: \"Use @snapback/core instead\",\n\t\t\t});\n\t\t}\n\n\t\t// C-002: Service Layer for Business Logic\n\t\tif (filePath.includes(\"procedures/\") && (code.includes(\"db.query\") || code.includes(\"db.select\"))) {\n\t\t\tissues.push({\n\t\t\t\tseverity: \"critical\",\n\t\t\t\ttype: \"SERVICE_BYPASS\",\n\t\t\t\tmessage: \"Direct database access in procedure file\",\n\t\t\t\tline: findLine(code, \"db.\"),\n\t\t\t\tfix: \"Move business logic to apps/api/src/services/\",\n\t\t\t});\n\t\t}\n\n\t\t// Check for relative imports across package boundaries\n\t\tif (code.includes(\"from '../../../packages/\") || code.includes(\"from '../../packages/\")) {\n\t\t\tissues.push({\n\t\t\t\tseverity: \"warning\",\n\t\t\t\ttype: \"WRONG_IMPORT_PATTERN\",\n\t\t\t\tmessage: \"Relative imports across package boundaries\",\n\t\t\t\tline: findLine(code, \"../packages/\"),\n\t\t\t\tfix: \"Use @snapback/* package imports\",\n\t\t\t});\n\t\t}\n\n\t\treturn { issues };\n\t}\n}\n\n/**\n * Layer 5: Security Validation (Enhanced SecurityLayer++)\n *\n * Checks for security issues per C-006 with enhanced detection:\n * - SecretDetector integration (AWS, GitHub, Stripe, JWT, DB strings, private keys)\n * - Unsafe function detection (eval, exec, innerHTML, dangerouslySetInnerHTML)\n * - Privacy-first telemetry enforcement\n *\n * @see https://docs.github.com/en/code-security/secret-scanning/introduction/supported-secret-scanning-patterns\n */\nexport class SecurityLayer implements ValidationLayer {\n\tname = \"security\";\n\tprivate secretDetector = new SecretDetector();\n\n\t// Additional secret patterns not in SecretDetector\n\tprivate static readonly ADDITIONAL_SECRET_PATTERNS = [\n\t\t// GitHub Fine-Grained Token (github_pat_) - format: github_pat_{chars}_{rest}\n\t\t{\n\t\t\tname: \"GitHub Fine-Grained Token\",\n\t\t\tpattern: /github_pat_[A-Za-z0-9]+_[A-Za-z0-9_]{20,}/g,\n\t\t\tseverity: \"critical\" as const,\n\t\t},\n\t\t// JWT tokens\n\t\t{\n\t\t\tname: \"JWT Token\",\n\t\t\tpattern: /eyJ[A-Za-z0-9-_=]+\\.eyJ[A-Za-z0-9-_=]+\\.[A-Za-z0-9-_.+/=]*/g,\n\t\t\tseverity: \"critical\" as const,\n\t\t},\n\t\t// Database connection strings\n\t\t{\n\t\t\tname: \"PostgreSQL Connection String\",\n\t\t\tpattern: /postgres(?:ql)?:\\/\\/[^:]+:[^@]+@[^/]+/gi,\n\t\t\tseverity: \"critical\" as const,\n\t\t},\n\t\t{\n\t\t\tname: \"MongoDB Connection String\",\n\t\t\tpattern: /mongodb(?:\\+srv)?:\\/\\/[^:]+:[^@]+@[^/]+/gi,\n\t\t\tseverity: \"critical\" as const,\n\t\t},\n\t\t// EC Private Key (in addition to RSA)\n\t\t{\n\t\t\tname: \"EC Private Key\",\n\t\t\tpattern: /-----BEGIN EC PRIVATE KEY-----/g,\n\t\t\tseverity: \"critical\" as const,\n\t\t},\n\t\t// Stripe restricted key\n\t\t{\n\t\t\tname: \"Stripe Restricted Key\",\n\t\t\tpattern: /rk_(?:live|test)_[a-zA-Z0-9]{24}/g,\n\t\t\tseverity: \"critical\" as const,\n\t\t},\n\t];\n\n\t// Unsafe function patterns\n\tprivate static readonly UNSAFE_FUNCTION_PATTERNS = [\n\t\t{\n\t\t\tpattern: /child_process\\.exec\\s*\\(/,\n\t\t\ttype: \"COMMAND_INJECTION\",\n\t\t\tseverity: \"critical\" as const,\n\t\t\tmessage: \"child_process.exec() enables shell command injection\",\n\t\t\tfix: \"Use execFile() or spawn() with arguments array instead\",\n\t\t},\n\t\t{\n\t\t\tpattern: /\\bexec\\s*\\(\\s*`/,\n\t\t\ttype: \"COMMAND_INJECTION\",\n\t\t\tseverity: \"critical\" as const,\n\t\t\tmessage: \"exec() with template literal enables command injection\",\n\t\t\tfix: \"Use execFile() with arguments array\",\n\t\t},\n\t\t{\n\t\t\tpattern: /\\.innerHTML\\s*=/,\n\t\t\ttype: \"XSS_RISK\",\n\t\t\tseverity: \"warning\" as const,\n\t\t\tmessage: \"innerHTML assignment enables XSS attacks\",\n\t\t\tfix: \"Use textContent, createTextNode(), or sanitize with DOMPurify\",\n\t\t},\n\t\t{\n\t\t\tpattern: /dangerouslySetInnerHTML/,\n\t\t\ttype: \"XSS_RISK\",\n\t\t\tseverity: \"warning\" as const,\n\t\t\tmessage: \"dangerouslySetInnerHTML is a React XSS vector\",\n\t\t\tfix: \"Sanitize content with DOMPurify before rendering\",\n\t\t},\n\t\t{\n\t\t\tpattern: /spawn\\s*\\(\\s*['\"](?:sh|bash|cmd)['\"]/,\n\t\t\ttype: \"SHELL_INJECTION\",\n\t\t\tseverity: \"critical\" as const,\n\t\t\tmessage: \"Shell spawning enables command injection\",\n\t\t\tfix: \"Use direct program spawn: spawn('program', [args])\",\n\t\t},\n\t\t{\n\t\t\tpattern: /spawn\\s*\\([^)]+,\\s*\\[[^\\]]*\\]\\s*,\\s*\\{[^}]*shell\\s*:\\s*true/,\n\t\t\ttype: \"SHELL_INJECTION\",\n\t\t\tseverity: \"critical\" as const,\n\t\t\tmessage: \"spawn with shell:true enables command injection\",\n\t\t\tfix: \"Remove shell:true option and use arguments array\",\n\t\t},\n\t];\n\n\tasync validate(code: string, filePath: string): Promise<{ issues: Issue[] }> {\n\t\tconst issues: Issue[] = [];\n\n\t\t// Defensive null check\n\t\tif (!code) {\n\t\t\treturn { issues };\n\t\t}\n\n\t\t// 1. Run SecretDetector integration (skips test files automatically)\n\t\tthis.checkSecrets(code, filePath, issues);\n\n\t\t// 2. Check unsafe functions (applies to all files)\n\t\tthis.checkUnsafeFunctions(code, filePath, issues);\n\n\t\t// 3. C-006: Privacy-First Telemetry\n\t\tthis.checkPrivacyViolations(code, issues);\n\n\t\t// 4. Check for eval usage (existing)\n\t\tthis.checkEvalUsage(code, issues);\n\n\t\treturn { issues };\n\t}\n\n\t/**\n\t * Integrate SecretDetector + additional patterns\n\t */\n\tprivate checkSecrets(code: string, filePath: string, issues: Issue[]): void {\n\t\t// SecretDetector already skips test files\n\t\tconst secretResult = this.secretDetector.detect(code, filePath);\n\n\t\t// Convert SecretDetector findings to Issue format\n\t\tfor (const finding of secretResult.findings) {\n\t\t\tissues.push(this.adaptSecretFinding(finding));\n\t\t}\n\n\t\t// Skip additional pattern checks for test files\n\t\tif (isTestFile(filePath)) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Check additional patterns not in SecretDetector\n\t\tfor (const pattern of SecurityLayer.ADDITIONAL_SECRET_PATTERNS) {\n\t\t\tconst matches = code.matchAll(pattern.pattern);\n\t\t\tfor (const match of matches) {\n\t\t\t\tissues.push({\n\t\t\t\t\tseverity: pattern.severity,\n\t\t\t\t\ttype: `SECRET_${pattern.name.toUpperCase().replace(/\\s+/g, \"_\")}`,\n\t\t\t\t\tmessage: `${pattern.name} detected: ${match[0].substring(0, 20)}...`,\n\t\t\t\t\tline: this.findLineForMatch(code, match.index || 0),\n\t\t\t\t\tfix: \"Use environment variables for secrets\",\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Check for unsafe function calls\n\t */\n\tprivate checkUnsafeFunctions(code: string, _filePath: string, issues: Issue[]): void {\n\t\tfor (const unsafe of SecurityLayer.UNSAFE_FUNCTION_PATTERNS) {\n\t\t\tif (unsafe.pattern.test(code)) {\n\t\t\t\t// Reset lastIndex for global patterns\n\t\t\t\tunsafe.pattern.lastIndex = 0;\n\t\t\t\tconst match = unsafe.pattern.exec(code);\n\t\t\t\tissues.push({\n\t\t\t\t\tseverity: unsafe.severity,\n\t\t\t\t\ttype: unsafe.type,\n\t\t\t\t\tmessage: unsafe.message,\n\t\t\t\t\tline: match ? this.findLineForMatch(code, match.index) : undefined,\n\t\t\t\t\tfix: unsafe.fix,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * C-006: Privacy-First Telemetry\n\t */\n\tprivate checkPrivacyViolations(code: string, issues: Issue[]): void {\n\t\tif (code.includes(\"posthog\") && (code.includes(\"fileContent\") || code.includes(\"sourceCode\"))) {\n\t\t\tissues.push({\n\t\t\t\tseverity: \"critical\",\n\t\t\t\ttype: \"PRIVACY_VIOLATION\",\n\t\t\t\tmessage: \"File content must never be sent to external services\",\n\t\t\t\tfix: \"Only send metadata: file paths, timestamps, counts, hashes\",\n\t\t\t});\n\t\t}\n\t}\n\n\t/**\n\t * Check for eval usage\n\t */\n\tprivate checkEvalUsage(code: string, issues: Issue[]): void {\n\t\tif (code.includes(\"eval(\") || code.includes(\"new Function(\")) {\n\t\t\tissues.push({\n\t\t\t\tseverity: \"critical\",\n\t\t\t\ttype: \"UNSAFE_EVAL\",\n\t\t\t\tmessage: \"eval() or new Function() detected - security risk\",\n\t\t\t\tline: findLine(code, \"eval(\") || findLine(code, \"new Function(\"),\n\t\t\t\tfix: \"Avoid eval - use safer alternatives\",\n\t\t\t});\n\t\t}\n\t}\n\n\t/**\n\t * Convert SecretDetector finding to Issue format\n\t */\n\tprivate adaptSecretFinding(finding: SecretFinding): Issue {\n\t\treturn {\n\t\t\tseverity: finding.severity === \"critical\" || finding.severity === \"high\" ? \"critical\" : \"warning\",\n\t\t\ttype: `SECRET_${finding.type.toUpperCase().replace(/[\\s-]+/g, \"_\")}`,\n\t\t\tmessage: `${finding.type}: ${finding.snippet}...`,\n\t\t\tline: finding.line,\n\t\t\tfix: \"Use environment variables for secrets\",\n\t\t};\n\t}\n\n\t/**\n\t * Find line number for a match index\n\t */\n\tprivate findLineForMatch(code: string, index: number): number {\n\t\tconst beforeMatch = code.substring(0, index);\n\t\treturn (beforeMatch.match(/\\n/g) || []).length + 1;\n\t}\n}\n\n/**\n * Layer 6: Dependency Validation\n * Checks for dependency issues\n */\nexport class DependencyLayer implements ValidationLayer {\n\tname = \"dependencies\";\n\n\tasync validate(code: string, _filePath: string): Promise<{ issues: Issue[] }> {\n\t\tconst issues: Issue[] = [];\n\n\t\t// Defensive null check\n\t\tif (!code) {\n\t\t\treturn { issues };\n\t\t}\n\n\t\t// Check for deprecated packages\n\t\tconst deprecatedImports = [\"moment\", \"request\", \"node-fetch@2\"];\n\t\tfor (const pkg of deprecatedImports) {\n\t\t\tif (code.includes(`from \"${pkg}\"`) || code.includes(`from '${pkg}'`)) {\n\t\t\t\tissues.push({\n\t\t\t\t\tseverity: \"warning\",\n\t\t\t\t\ttype: \"DEPRECATED_DEPENDENCY\",\n\t\t\t\t\tmessage: `Deprecated package: ${pkg}`,\n\t\t\t\t\tline: findLine(code, pkg),\n\t\t\t\t\tfix: \"Use modern alternatives (dayjs, fetch, node-fetch@3)\",\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\treturn { issues };\n\t}\n}\n\n/**\n * Layer 7: Performance Validation (Enhanced PerformanceLayer++)\n *\n * Checks for performance issues per C-007 with enhanced detection:\n * - O(n²) nested loop detection\n * - Memory leak patterns (addEventListener without cleanup)\n * - ReDoS vulnerability detection\n * - N+1 query patterns\n */\nexport class PerformanceLayer implements ValidationLayer {\n\tname = \"performance\";\n\n\t// ReDoS patterns - regex with nested quantifiers\n\tprivate static readonly REDOS_PATTERNS = [\n\t\t// (a+)+ pattern - catastrophic backtracking\n\t\t/\\/[^/]*\\([^)]*[+*]\\)[^/]*[+*][^/]*\\//,\n\t\t// Nested groups with quantifiers\n\t\t/\\/[^/]*\\(\\?:[^)]*[+*]\\)[^/]*[+*][^/]*\\//,\n\t\t// Multiple adjacent quantifiers on groups\n\t\t/\\/[^/]*\\([^)]+\\)[+*]{2,}[^/]*\\//,\n\t];\n\n\tasync validate(code: string, filePath: string): Promise<{ issues: Issue[] }> {\n\t\tconst issues: Issue[] = [];\n\n\t\t// Defensive null checks\n\t\tif (!code || !filePath) {\n\t\t\treturn { issues };\n\t\t}\n\n\t\t// C-007: Console.log in Production\n\t\tthis.checkConsoleLog(code, filePath, issues);\n\n\t\t// Check for synchronous file operations\n\t\tthis.checkSyncFileIO(code, filePath, issues);\n\n\t\t// Check for await in loops (potential N+1)\n\t\tthis.checkAwaitInLoop(code, issues);\n\n\t\t// NEW: Check for O(n²) nested loops\n\t\tthis.checkNestedLoops(code, issues);\n\n\t\t// NEW: Check for memory leaks (addEventListener without cleanup)\n\t\tthis.checkMemoryLeaks(code, issues);\n\n\t\t// NEW: Check for ReDoS vulnerabilities\n\t\tthis.checkReDoS(code, issues);\n\n\t\t// NEW: Check for shell injection via spawn\n\t\tthis.checkSpawnShellOption(code, issues);\n\n\t\treturn { issues };\n\t}\n\n\t/**\n\t * C-007: Console.log in Production\n\t */\n\tprivate checkConsoleLog(code: string, filePath: string, issues: Issue[]): void {\n\t\tif (\n\t\t\t!filePath.includes(\".test.\") &&\n\t\t\t!filePath.includes(\"/test/\") &&\n\t\t\t!filePath.includes(\"scripts/\") &&\n\t\t\tcode.includes(\"console.log\")\n\t\t) {\n\t\t\tissues.push({\n\t\t\t\tseverity: \"warning\",\n\t\t\t\ttype: \"NO_CONSOLE\",\n\t\t\t\tmessage: \"console.log in production code\",\n\t\t\t\tline: findLine(code, \"console.log\"),\n\t\t\t\tfix: \"Use logger from @snapback/core\",\n\t\t\t});\n\t\t}\n\t}\n\n\t/**\n\t * Check for synchronous file operations\n\t */\n\tprivate checkSyncFileIO(code: string, filePath: string, issues: Issue[]): void {\n\t\tif (code.includes(\"fs.readFileSync\") || code.includes(\"fs.writeFileSync\")) {\n\t\t\tif (!filePath.includes(\"scripts/\") && !filePath.includes(\".test.\")) {\n\t\t\t\tissues.push({\n\t\t\t\t\tseverity: \"info\",\n\t\t\t\t\ttype: \"SYNC_FILE_IO\",\n\t\t\t\t\tmessage: \"Synchronous file operation may block event loop\",\n\t\t\t\t\tline: findLine(code, \"Sync(\"),\n\t\t\t\t\tfix: \"Use async file operations or defer to background\",\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Check for await in loops (potential N+1)\n\t */\n\tprivate checkAwaitInLoop(code: string, issues: Issue[]): void {\n\t\tif (code.includes(\"for\") && code.includes(\"await \")) {\n\t\t\tconst forAwaitPattern = /for\\s*\\([^)]+\\)\\s*\\{[^}]*await\\s+/s;\n\t\t\tif (forAwaitPattern.test(code)) {\n\t\t\t\tissues.push({\n\t\t\t\t\tseverity: \"info\",\n\t\t\t\t\ttype: \"AWAIT_IN_LOOP\",\n\t\t\t\t\tmessage: \"Await in loop may cause N+1 performance issue\",\n\t\t\t\t\tfix: \"Consider Promise.all() for parallel execution\",\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Check for O(n²) nested loops\n\t */\n\tprivate checkNestedLoops(code: string, issues: Issue[]): void {\n\t\t// Pattern 1: for inside for\n\t\tconst nestedForPattern = /for\\s*\\([^)]*\\)\\s*\\{[^{}]*for\\s*\\([^)]*\\)\\s*\\{/s;\n\t\tif (nestedForPattern.test(code)) {\n\t\t\tissues.push({\n\t\t\t\tseverity: \"warning\",\n\t\t\t\ttype: \"O_N2_ALGORITHM\",\n\t\t\t\tmessage: \"Nested for loops detected - potential O(n²) complexity\",\n\t\t\t\tfix: \"Consider using Map/Set for O(1) lookups or merge algorithm\",\n\t\t\t});\n\t\t}\n\n\t\t// Pattern 2: forEach inside for/forEach\n\t\tconst forWithForEachPattern = /for\\s*\\([^)]*\\)\\s*\\{[^{}]*\\.forEach\\s*\\(/s;\n\t\tif (forWithForEachPattern.test(code)) {\n\t\t\tissues.push({\n\t\t\t\tseverity: \"warning\",\n\t\t\t\ttype: \"O_N2_ALGORITHM\",\n\t\t\t\tmessage: \"forEach inside for loop - potential O(n²) complexity\",\n\t\t\t\tfix: \"Consider using Map/Set for O(1) lookups\",\n\t\t\t});\n\t\t}\n\n\t\t// Pattern 3: Nested forEach\n\t\tconst nestedForEachPattern = /\\.forEach\\s*\\([^)]*\\)\\s*\\{[^{}]*\\.forEach\\s*\\(/s;\n\t\tif (nestedForEachPattern.test(code)) {\n\t\t\tissues.push({\n\t\t\t\tseverity: \"warning\",\n\t\t\t\ttype: \"O_N2_ALGORITHM\",\n\t\t\t\tmessage: \"Nested forEach detected - potential O(n²) complexity\",\n\t\t\t\tfix: \"Consider using Map/Set for O(1) lookups\",\n\t\t\t});\n\t\t}\n\t}\n\n\t/**\n\t * Check for memory leaks - addEventListener without cleanup\n\t */\n\tprivate checkMemoryLeaks(code: string, issues: Issue[]): void {\n\t\t// Check if addEventListener is used\n\t\tif (code.includes(\"addEventListener\")) {\n\t\t\t// Check if removeEventListener is also present\n\t\t\tif (!code.includes(\"removeEventListener\")) {\n\t\t\t\tissues.push({\n\t\t\t\t\tseverity: \"warning\",\n\t\t\t\t\ttype: \"MEMORY_LEAK\",\n\t\t\t\t\tmessage: \"addEventListener without corresponding removeEventListener - potential memory leak\",\n\t\t\t\t\tline: findLine(code, \"addEventListener\"),\n\t\t\t\t\tfix: \"Add cleanup: useEffect(() => { ...; return () => element.removeEventListener(...) })\",\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Check for ReDoS vulnerabilities\n\t */\n\tprivate checkReDoS(code: string, issues: Issue[]): void {\n\t\tfor (const pattern of PerformanceLayer.REDOS_PATTERNS) {\n\t\t\tif (pattern.test(code)) {\n\t\t\t\tissues.push({\n\t\t\t\t\tseverity: \"critical\",\n\t\t\t\t\ttype: \"REDOS\",\n\t\t\t\t\tmessage: \"Regex with nested quantifiers - ReDoS vulnerability (catastrophic backtracking)\",\n\t\t\t\t\tfix: \"Simplify regex or use safe-regex library to validate patterns\",\n\t\t\t\t});\n\t\t\t\tbreak; // One ReDoS warning is enough\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Check for spawn with shell option\n\t */\n\tprivate checkSpawnShellOption(code: string, issues: Issue[]): void {\n\t\t// spawn with shell: true\n\t\tconst spawnShellPattern = /spawn\\s*\\([^)]+,\\s*\\[[^\\]]*\\]\\s*,\\s*\\{[^}]*shell\\s*:\\s*true/;\n\t\tif (spawnShellPattern.test(code)) {\n\t\t\tissues.push({\n\t\t\t\tseverity: \"warning\",\n\t\t\t\ttype: \"SPAWN_SHELL\",\n\t\t\t\tmessage: \"spawn with shell:true may cause performance issues and security risks\",\n\t\t\t\tline: findLine(code, \"shell: true\"),\n\t\t\t\tfix: \"Remove shell:true and use arguments array directly\",\n\t\t\t});\n\t\t}\n\t}\n}\n\n// =============================================================================\n// Enhanced Layers - External tool integration\n// =============================================================================\n\nexport { BiomeLayer } from \"./BiomeLayer.js\";\nexport { TypeScriptCompilerLayer } from \"./TypeScriptCompilerLayer.js\";\n","/**\n * Validation Pipeline\n *\n * Runs 7+ validation layers in parallel for fast code validation.\n * Returns confidence score and review recommendation.\n *\n * Enhanced mode adds:\n * - BiomeLayer: Real Biome linter integration\n * - TypeScriptCompilerLayer: Real tsc type checking\n * - DynamicConfidenceCalculator: Weighted confidence scoring\n *\n * Performance:\n * - Without pipeline: 24 min (manual review)\n * - With pipeline: <1 sec (automated)\n *\n * @module ValidationPipeline\n */\n\nimport type { Issue, ValidationLayer } from \"../types/config.js\";\nimport type { PipelineResult, ReviewRecommendation, ValidationResult } from \"../types/validation.js\";\nimport { CONFIDENCE_THRESHOLDS, ISSUE_THRESHOLDS } from \"../types/validation.js\";\nimport { DynamicConfidenceCalculator } from \"./DynamicConfidenceCalculator.js\";\n\n// =============================================================================\n// RESULT TYPE (inline to avoid circular deps)\n// =============================================================================\n\ntype Result<T, E = Error> = { success: true; value: T } | { success: false; error: E };\n\nfunction ok<T>(value: T): Result<T, never> {\n\treturn { success: true, value };\n}\n\nfunction err<E>(error: E): Result<never, E> {\n\treturn { success: false, error };\n}\n\n// =============================================================================\n// PIPELINE OPTIONS\n// =============================================================================\n\nexport interface PipelineOptions {\n\t/**\n\t * Enable enhanced mode with BiomeLayer and TypeScriptCompilerLayer.\n\t * Requires workspaceRoot when enabled.\n\t * @default false\n\t */\n\tenhanced?: boolean;\n\n\t/**\n\t * Workspace root for enhanced layers (Biome, TypeScript).\n\t * Required when enhanced mode is enabled.\n\t */\n\tworkspaceRoot?: string;\n\n\t/**\n\t * Use dynamic confidence scoring instead of hardcoded thresholds.\n\t * @default false (for backward compatibility)\n\t */\n\tuseDynamicConfidence?: boolean;\n\n\t/**\n\t * Custom validation layers to add\n\t */\n\tcustomLayers?: ValidationLayer[];\n}\n\n// =============================================================================\n// VALIDATION ERRORS\n// =============================================================================\n\n/** Base validation error */\nexport class ValidationError extends Error {\n\tconstructor(\n\t\tmessage: string,\n\t\tpublic readonly code: string,\n\t\tpublic readonly layer?: string,\n\t\tpublic readonly issues?: Issue[],\n\t) {\n\t\tsuper(message);\n\t\tthis.name = \"ValidationError\";\n\t}\n}\n\n/** Critical issues found - requires immediate attention */\nexport class CriticalValidationError extends ValidationError {\n\tconstructor(\n\t\tmessage: string,\n\t\tpublic readonly criticalIssues: Issue[],\n\t) {\n\t\tsuper(message, \"CRITICAL_ISSUES\", undefined, criticalIssues);\n\t\tthis.name = \"CriticalValidationError\";\n\t}\n}\n\nimport {\n\tArchitectureLayer,\n\tBiomeLayer,\n\tDependencyLayer,\n\tPerformanceLayer,\n\tSecurityLayer,\n\tSyntaxLayer,\n\tTestLayer,\n\tTypeLayer,\n\tTypeScriptCompilerLayer,\n} from \"./layers/index.js\";\n\n/**\n * Validation Pipeline\n *\n * Runs all validation layers in parallel and aggregates results\n * with confidence-based review routing.\n *\n * @example Basic usage (backward compatible)\n * ```typescript\n * const pipeline = new ValidationPipeline();\n * const result = await pipeline.validate(code, filePath);\n * ```\n *\n * @example Enhanced mode with real tooling\n * ```typescript\n * const pipeline = new ValidationPipeline({\n * enhanced: true,\n * workspaceRoot: '/path/to/project',\n * useDynamicConfidence: true,\n * });\n * const result = await pipeline.validate(code, filePath);\n * ```\n */\nexport class ValidationPipeline {\n\tprivate layers: ValidationLayer[] = [];\n\tprivate confidenceCalculator: DynamicConfidenceCalculator | null = null;\n\tprivate useDynamicConfidence: boolean;\n\n\tconstructor(options?: ValidationLayer[] | PipelineOptions) {\n\t\t// Handle backward compatibility: array of layers or options object\n\t\tconst opts: PipelineOptions = Array.isArray(options) ? { customLayers: options } : options || {};\n\n\t\tthis.useDynamicConfidence = opts.useDynamicConfidence ?? false;\n\n\t\t// Initialize confidence calculator if using dynamic mode\n\t\tif (this.useDynamicConfidence) {\n\t\t\tthis.confidenceCalculator = new DynamicConfidenceCalculator();\n\t\t}\n\n\t\t// Register default validation layers\n\t\tthis.layers = [\n\t\t\tnew SyntaxLayer(),\n\t\t\tnew TypeLayer(),\n\t\t\tnew TestLayer(),\n\t\t\tnew ArchitectureLayer(),\n\t\t\tnew SecurityLayer(),\n\t\t\tnew DependencyLayer(),\n\t\t\tnew PerformanceLayer(),\n\t\t];\n\n\t\t// Add enhanced layers if enabled\n\t\tif (opts.enhanced && opts.workspaceRoot) {\n\t\t\tthis.layers.push(new BiomeLayer(opts.workspaceRoot));\n\t\t\tthis.layers.push(new TypeScriptCompilerLayer(opts.workspaceRoot));\n\t\t}\n\n\t\t// Add custom layers if provided\n\t\tif (opts.customLayers) {\n\t\t\tthis.layers.push(...opts.customLayers);\n\t\t}\n\t}\n\n\t/**\n\t * Validate code through all layers\n\t */\n\tasync validate(code: string, filePath: string): Promise<PipelineResult> {\n\t\t// Run all layers in parallel (they're all fast)\n\t\tconst layerResults = await Promise.all(\n\t\t\tthis.layers.map(async (layer) => {\n\t\t\t\tconst start = Date.now();\n\t\t\t\tconst result = await layer.validate(code, filePath);\n\t\t\t\treturn {\n\t\t\t\t\tlayer: layer.name,\n\t\t\t\t\tpassed: result.issues.length === 0,\n\t\t\t\t\tissues: result.issues,\n\t\t\t\t\tduration: Date.now() - start,\n\t\t\t\t};\n\t\t\t}),\n\t\t);\n\n\t\t// Calculate totals\n\t\tconst totalIssues = layerResults.reduce((sum, r) => sum + r.issues.length, 0);\n\t\tconst criticalIssues = layerResults.flatMap((r) => r.issues).filter((i) => i.severity === \"critical\");\n\t\t// Pass layerResults for dynamic confidence calculation\n\t\tconst confidence = this.calculateConfidence(totalIssues, criticalIssues.length, layerResults);\n\t\tconst recommendation = this.getRecommendation(confidence, criticalIssues);\n\n\t\treturn {\n\t\t\toverall: {\n\t\t\t\tpassed: criticalIssues.length === 0,\n\t\t\t\tconfidence,\n\t\t\t\ttotalIssues,\n\t\t\t},\n\t\t\tlayers: layerResults,\n\t\t\trecommendation,\n\t\t\tfocusPoints: criticalIssues.map((i) => i.message),\n\t\t};\n\t}\n\n\t/**\n\t * Quick check - returns true if code passes all critical checks\n\t */\n\tasync quickCheck(code: string, filePath: string): Promise<boolean> {\n\t\tconst result = await this.validate(code, filePath);\n\t\treturn result.overall.passed;\n\t}\n\n\t/**\n\t * Result-based validation - returns Result<PipelineResult, CriticalValidationError>\n\t *\n\t * This is the recommended API for new code. Use validateSafe() when you want\n\t * to handle validation failures without exceptions.\n\t *\n\t * @example\n\t * ```typescript\n\t * const result = await pipeline.validateSafe(code, filePath);\n\t * if (!result.success) {\n\t * console.error('Critical issues:', result.error.criticalIssues);\n\t * return;\n\t * }\n\t * console.log('Confidence:', result.value.overall.confidence);\n\t * ```\n\t */\n\tasync validateSafe(\n\t\tcode: string,\n\t\tfilePath: string,\n\t\toptions?: { failFast?: boolean },\n\t): Promise<Result<PipelineResult, CriticalValidationError>> {\n\t\tconst result = await this.validate(code, filePath);\n\n\t\t// If failFast is enabled and there are critical issues, return error\n\t\tif (options?.failFast) {\n\t\t\tconst criticalIssues = ValidationPipeline.getIssuesBySeverity(result, \"critical\");\n\t\t\tif (criticalIssues.length > 0) {\n\t\t\t\treturn err(\n\t\t\t\t\tnew CriticalValidationError(\n\t\t\t\t\t\t`Validation failed: ${criticalIssues.length} critical issues`,\n\t\t\t\t\t\tcriticalIssues,\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\t// Return success with the pipeline result\n\t\treturn ok(result);\n\t}\n\n\t/**\n\t * Validate with fail-fast on critical issues\n\t *\n\t * Runs layers in sequence and stops immediately when a critical issue is found.\n\t * Use this for pre-commit hooks where early failure is desired.\n\t */\n\tasync validateFailFast(code: string, filePath: string): Promise<Result<PipelineResult, CriticalValidationError>> {\n\t\tconst layerResults: Array<{\n\t\t\tlayer: string;\n\t\t\tpassed: boolean;\n\t\t\tissues: Issue[];\n\t\t\tduration: number;\n\t\t}> = [];\n\n\t\t// Run layers sequentially for fail-fast behavior\n\t\tfor (const layer of this.layers) {\n\t\t\tconst start = Date.now();\n\t\t\tconst result = await layer.validate(code, filePath);\n\t\t\tconst layerResult = {\n\t\t\t\tlayer: layer.name,\n\t\t\t\tpassed: result.issues.length === 0,\n\t\t\t\tissues: result.issues,\n\t\t\t\tduration: Date.now() - start,\n\t\t\t};\n\t\t\tlayerResults.push(layerResult);\n\n\t\t\t// Fail fast on critical issues\n\t\t\tconst criticalIssues = result.issues.filter((i) => i.severity === \"critical\");\n\t\t\tif (criticalIssues.length > 0) {\n\t\t\t\treturn err(\n\t\t\t\t\tnew CriticalValidationError(\n\t\t\t\t\t\t`Validation failed in ${layer.name}: ${criticalIssues.length} critical issues`,\n\t\t\t\t\t\tcriticalIssues,\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\t// All layers passed - calculate full result\n\t\tconst totalIssues = layerResults.reduce((sum, r) => sum + r.issues.length, 0);\n\t\tconst confidence = this.calculateConfidence(totalIssues, 0, layerResults);\n\t\tconst recommendation = this.getRecommendation(confidence, []);\n\n\t\treturn ok({\n\t\t\toverall: {\n\t\t\t\tpassed: true,\n\t\t\t\tconfidence,\n\t\t\t\ttotalIssues,\n\t\t\t},\n\t\t\tlayers: layerResults,\n\t\t\trecommendation,\n\t\t\tfocusPoints: [],\n\t\t});\n\t}\n\n\t/**\n\t * Validate multiple files with aggregated results\n\t */\n\tasync validateFiles(\n\t\tfiles: Array<{ path: string; content: string }>,\n\t): Promise<Result<PipelineResult[], CriticalValidationError>> {\n\t\tconst results: PipelineResult[] = [];\n\t\tconst allCriticalIssues: Issue[] = [];\n\n\t\tfor (const file of files) {\n\t\t\tconst result = await this.validate(file.content, file.path);\n\t\t\tresults.push(result);\n\n\t\t\t// Collect critical issues\n\t\t\tconst criticalIssues = ValidationPipeline.getIssuesBySeverity(result, \"critical\");\n\t\t\tif (criticalIssues.length > 0) {\n\t\t\t\tallCriticalIssues.push(\n\t\t\t\t\t...criticalIssues.map((issue) => ({\n\t\t\t\t\t\t...issue,\n\t\t\t\t\t\tmessage: `[${file.path}] ${issue.message}`,\n\t\t\t\t\t})),\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\t// Return error if any critical issues found\n\t\tif (allCriticalIssues.length > 0) {\n\t\t\treturn err(\n\t\t\t\tnew CriticalValidationError(\n\t\t\t\t\t`Validation failed: ${allCriticalIssues.length} critical issues across ${files.length} files`,\n\t\t\t\t\tallCriticalIssues,\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\n\t\treturn ok(results);\n\t}\n\n\t/**\n\t * Calculate confidence score based on issues\n\t *\n\t * When useDynamicConfidence is enabled, uses weighted scoring per layer.\n\t * Otherwise falls back to hardcoded thresholds for backward compatibility.\n\t */\n\tprivate calculateConfidence(\n\t\ttotalIssues: number,\n\t\tcriticalIssues: number,\n\t\tlayerResults?: ValidationResult[],\n\t): number {\n\t\t// Use dynamic calculator if available and layer results provided\n\t\tif (this.confidenceCalculator && layerResults) {\n\t\t\treturn this.confidenceCalculator.calculate(layerResults);\n\t\t}\n\n\t\t// Fallback: hardcoded thresholds (backward compatible)\n\t\tif (criticalIssues > 0) {\n\t\t\treturn 0.1;\n\t\t}\n\t\tif (totalIssues === 0) {\n\t\t\treturn CONFIDENCE_THRESHOLDS.AUTO_MERGE;\n\t\t}\n\t\tif (totalIssues <= ISSUE_THRESHOLDS.QUICK_REVIEW) {\n\t\t\treturn CONFIDENCE_THRESHOLDS.QUICK_REVIEW;\n\t\t}\n\t\tif (totalIssues <= ISSUE_THRESHOLDS.FULL_REVIEW) {\n\t\t\treturn CONFIDENCE_THRESHOLDS.FULL_REVIEW;\n\t\t}\n\t\treturn 0.2;\n\t}\n\n\t/**\n\t * Determine review recommendation based on confidence\n\t */\n\tprivate getRecommendation(confidence: number, criticalIssues: Issue[]): ReviewRecommendation {\n\t\tif (criticalIssues.length > 0) {\n\t\t\treturn \"full_review\";\n\t\t}\n\t\tif (confidence >= 0.85) {\n\t\t\treturn \"auto_merge\";\n\t\t}\n\t\tif (confidence >= CONFIDENCE_THRESHOLDS.FULL_REVIEW) {\n\t\t\treturn \"quick_review\";\n\t\t}\n\t\treturn \"full_review\";\n\t}\n\n\t/**\n\t * Get layer names\n\t */\n\tgetLayerNames(): string[] {\n\t\treturn this.layers.map((l) => l.name);\n\t}\n\n\t/**\n\t * Add a custom validation layer\n\t */\n\taddLayer(layer: ValidationLayer): void {\n\t\tthis.layers.push(layer);\n\t}\n\n\t/**\n\t * Get all issues from a result, flattened\n\t */\n\tstatic flattenIssues(result: PipelineResult): Issue[] {\n\t\treturn result.layers.flatMap((l) => l.issues);\n\t}\n\n\t/**\n\t * Get issues by severity\n\t */\n\tstatic getIssuesBySeverity(result: PipelineResult, severity: \"critical\" | \"warning\" | \"info\"): Issue[] {\n\t\treturn ValidationPipeline.flattenIssues(result).filter((i) => i.severity === severity);\n\t}\n}\n\n// Re-export types for convenience\nexport type { PipelineResult, ValidationResult, ReviewRecommendation };\n","/**\n * BehaviorTracker - Collects behavioral metadata during dev sessions\n *\n * Phase 2 enhancement: Tracks developer workflow patterns\n * - Session duration\n * - AI acceptance rate\n * - Code churn\n * - Test pass rate\n */\n\nimport type { BehavioralMetadata } from \"../types/vitals.js\";\n\ninterface EditEvent {\n\ttimestamp: number;\n\tlinesAdded: number;\n\tlinesDeleted: number;\n}\n\ninterface TestEvent {\n\ttimestamp: number;\n\tpassed: boolean;\n}\n\ninterface AISuggestionEvent {\n\ttimestamp: number;\n\taccepted: boolean;\n}\n\nexport class BehaviorTracker {\n\tprivate sessionStart: number;\n\tprivate edits: EditEvent[] = [];\n\tprivate tests: TestEvent[] = [];\n\tprivate aiSuggestions: AISuggestionEvent[] = [];\n\tprivate fileSaves = 0;\n\n\tconstructor(initialTime: number = Date.now()) {\n\t\tthis.sessionStart = initialTime;\n\t}\n\n\t/**\n\t * Record a file edit event\n\t */\n\trecordEdit(linesAdded: number, linesDeleted: number, timestamp: number = Date.now()): void {\n\t\tthis.edits.push({ timestamp, linesAdded, linesDeleted });\n\t}\n\n\t/**\n\t * Record a file save\n\t */\n\trecordFileSave(): void {\n\t\tthis.fileSaves++;\n\t}\n\n\t/**\n\t * Record a test execution result\n\t */\n\trecordTest(passed: boolean, timestamp: number = Date.now()): void {\n\t\tthis.tests.push({ timestamp, passed });\n\t}\n\n\t/**\n\t * Record an AI suggestion event\n\t */\n\trecordAISuggestion(accepted: boolean, timestamp: number = Date.now()): void {\n\t\tthis.aiSuggestions.push({ timestamp, accepted });\n\t}\n\n\t/**\n\t * Record a snapshot creation (resets session)\n\t */\n\trecordSnapshot(timestamp: number = Date.now()): void {\n\t\tthis.sessionStart = timestamp;\n\t\t// Don't clear metrics - preserve for analytics\n\t}\n\n\t/**\n\t * Get current behavioral metadata\n\t */\n\tgetMetadata(now: number = Date.now()): BehavioralMetadata {\n\t\tconst sessionDuration = now - this.sessionStart;\n\n\t\t// Calculate AI acceptance rate\n\t\tconst totalSuggestions = this.aiSuggestions.length;\n\t\tconst acceptedSuggestions = this.aiSuggestions.filter((s) => s.accepted).length;\n\t\tconst rejectedSuggestions = totalSuggestions - acceptedSuggestions;\n\t\tconst aiAcceptanceRate = totalSuggestions > 0 ? acceptedSuggestions / totalSuggestions : 0;\n\n\t\t// Calculate code churn rate (lines per minute)\n\t\tconst totalLinesChanged = this.edits.reduce((sum, e) => sum + e.linesAdded + e.linesDeleted, 0);\n\t\tconst sessionMinutes = sessionDuration / (60 * 1000);\n\t\tconst churnRate = sessionMinutes > 0 ? totalLinesChanged / sessionMinutes : 0;\n\n\t\t// Calculate test pass rate\n\t\tconst totalTests = this.tests.length;\n\t\tconst passedTests = this.tests.filter((t) => t.passed).length;\n\t\tconst testPassRate = totalTests > 0 ? passedTests / totalTests : 1.0; // Default to 100% if no tests\n\n\t\t// Calculate average time between edits\n\t\tlet avgTimeBetweenEdits = 0;\n\t\tif (this.edits.length > 1) {\n\t\t\tconst intervals: number[] = [];\n\t\t\tfor (let i = 1; i < this.edits.length; i++) {\n\t\t\t\tintervals.push(this.edits[i].timestamp - this.edits[i - 1].timestamp);\n\t\t\t}\n\t\t\tavgTimeBetweenEdits = intervals.reduce((sum, interval) => sum + interval, 0) / intervals.length;\n\t\t}\n\n\t\treturn {\n\t\t\tsessionDuration,\n\t\t\taiAcceptanceRate,\n\t\t\tchurnRate,\n\t\t\ttestPassRate,\n\t\t\tfileSaveCount: this.fileSaves,\n\t\t\taiSuggestionsShown: totalSuggestions,\n\t\t\taiSuggestionsAccepted: acceptedSuggestions,\n\t\t\taiSuggestionsRejected: rejectedSuggestions,\n\t\t\tavgTimeBetweenEdits,\n\t\t};\n\t}\n\n\t/**\n\t * Reset all tracking data\n\t */\n\treset(timestamp: number = Date.now()): void {\n\t\tthis.sessionStart = timestamp;\n\t\tthis.edits = [];\n\t\tthis.tests = [];\n\t\tthis.aiSuggestions = [];\n\t\tthis.fileSaves = 0;\n\t}\n\n\t/**\n\t * Get raw metrics for testing\n\t */\n\tgetRawCounts(): {\n\t\tedits: number;\n\t\ttests: number;\n\t\tsuggestions: number;\n\t\tsaves: number;\n\t} {\n\t\treturn {\n\t\t\tedits: this.edits.length,\n\t\t\ttests: this.tests.length,\n\t\t\tsuggestions: this.aiSuggestions.length,\n\t\t\tsaves: this.fileSaves,\n\t\t};\n\t}\n}\n","/**\n * @snapback/intelligence/vitals/constants\n *\n * Centralized threshold constants for vitals system.\n * Single source of truth - ALL consumers MUST import from here.\n *\n * UX Principles (from industry best practices):\n * - Visual hierarchy: critical > high > moderate > low\n * - Consistency: same thresholds across UI, MCP, CLI\n * - Frictionless: clear actionable boundaries\n *\n * @module vitals/constants\n */\n\n// =============================================================================\n// PRESSURE THRESHOLDS (0-100 scale)\n// =============================================================================\n\n/**\n * Pressure thresholds for snapshot recommendations.\n *\n * @example\n * ```typescript\n * import { PRESSURE_THRESHOLDS } from '@snapback/intelligence/vitals';\n *\n * if (pressure > PRESSURE_THRESHOLDS.critical) {\n * // Immediate snapshot required\n * } else if (pressure > PRESSURE_THRESHOLDS.high) {\n * // Snapshot strongly recommended\n * }\n * ```\n */\nexport const PRESSURE_THRESHOLDS = {\n\t/** Low pressure - no action needed */\n\tlow: 25,\n\t/** Moderate pressure - consider snapshotting soon */\n\tmoderate: 50,\n\t/** High pressure - snapshot recommended */\n\thigh: 75,\n\t/** Critical pressure - immediate snapshot required */\n\tcritical: 80,\n} as const;\n\nexport type PressureThresholdLevel = keyof typeof PRESSURE_THRESHOLDS;\n\n// =============================================================================\n// OXYGEN THRESHOLDS (0-100% coverage)\n// =============================================================================\n\n/**\n * Oxygen (snapshot coverage) thresholds.\n * Higher is better - 100% means all modified files have recent snapshots.\n */\nexport const OXYGEN_THRESHOLDS = {\n\t/** Critical - very low coverage, high risk */\n\tcritical: 30,\n\t/** Low - needs attention */\n\tlow: 50,\n\t/** Moderate - acceptable but could improve */\n\tmoderate: 70,\n\t/** Good - healthy coverage */\n\tgood: 85,\n} as const;\n\nexport type OxygenThresholdLevel = keyof typeof OXYGEN_THRESHOLDS;\n\n// =============================================================================\n// TEMPERATURE THRESHOLDS (0-100% AI activity)\n// =============================================================================\n\n/**\n * Temperature (AI activity) thresholds.\n * Based on percentage of AI-assisted changes in the window.\n */\nexport const TEMPERATURE_THRESHOLDS = {\n\t/** Cold - minimal AI activity */\n\tcold: 0,\n\t/** Warm - some AI activity detected */\n\twarm: 20,\n\t/** Hot - significant AI activity */\n\thot: 50,\n\t/** Burning - heavy AI activity, extra caution needed */\n\tburning: 80,\n} as const;\n\nexport type TemperatureThresholdLevel = keyof typeof TEMPERATURE_THRESHOLDS;\n\n// =============================================================================\n// PULSE THRESHOLDS (changes per minute)\n// =============================================================================\n\n/**\n * Pulse (change velocity) thresholds.\n * Measured in file changes per minute.\n */\nexport const PULSE_THRESHOLDS = {\n\t/** Resting - minimal activity */\n\tresting: 0,\n\t/** Elevated - moderate activity */\n\televated: 15,\n\t/** Racing - high activity */\n\tracing: 30,\n\t/** Critical - very high activity, potential automation */\n\tcritical: 50,\n} as const;\n\nexport type PulseThresholdLevel = keyof typeof PULSE_THRESHOLDS;\n\n// =============================================================================\n// TRAJECTORY THRESHOLDS (combined metrics)\n// =============================================================================\n\n/**\n * Trajectory state thresholds - used for combined analysis.\n * These define when to transition between trajectory states.\n */\nexport const TRAJECTORY_THRESHOLDS = {\n\t/** Pressure level that contributes to escalating trajectory */\n\tescalatingPressure: 60,\n\t/** Oxygen level below which contributes to escalating trajectory */\n\tescalatingOxygen: 70,\n\t/** Pressure level for critical trajectory */\n\tcriticalPressure: 80,\n\t/** Oxygen level below which contributes to critical trajectory */\n\tcriticalOxygen: 50,\n\t/** Pressure drop required to enter recovering state */\n\trecoveringPressureDrop: 10,\n\t/** Oxygen level required for recovering state */\n\trecoveringOxygen: 70,\n} as const;\n\n// =============================================================================\n// URGENCY SCORING\n// =============================================================================\n\n/**\n * Urgency score thresholds for snapshot recommendations.\n * Scores are calculated from combined vitals.\n */\nexport const URGENCY_THRESHOLDS = {\n\t/** No urgency - healthy state */\n\tnone: 0,\n\t/** Low urgency - optional action */\n\tlow: 20,\n\t/** Medium urgency - should act soon */\n\tmedium: 40,\n\t/** High urgency - should act now */\n\thigh: 60,\n\t/** Critical urgency - immediate action required */\n\tcritical: 80,\n} as const;\n\nexport type UrgencyThresholdLevel = keyof typeof URGENCY_THRESHOLDS;\n\n// =============================================================================\n// TIME-BASED THRESHOLDS\n// =============================================================================\n\n/**\n * Time-based thresholds for staleness and recommendations.\n */\nexport const TIME_THRESHOLDS = {\n\t/** Minutes until snapshot considered stale */\n\tstaleSnapshotMinutes: 30,\n\t/** Minutes of no snapshot before optional recommendation */\n\toptionalSnapshotMinutes: 60,\n\t/** Sliding window for pulse calculation (seconds) */\n\tpulseWindowSeconds: 60,\n\t/** Sliding window for temperature decay (seconds) */\n\ttemperatureWindowSeconds: 300,\n} as const;\n\n// =============================================================================\n// HELPER FUNCTIONS\n// =============================================================================\n\n/**\n * Get pressure level name from value.\n */\nexport function getPressureLevel(value: number): PressureThresholdLevel {\n\tif (value >= PRESSURE_THRESHOLDS.critical) {\n\t\treturn \"critical\";\n\t}\n\tif (value >= PRESSURE_THRESHOLDS.high) {\n\t\treturn \"high\";\n\t}\n\tif (value >= PRESSURE_THRESHOLDS.moderate) {\n\t\treturn \"moderate\";\n\t}\n\treturn \"low\";\n}\n\n/**\n * Get oxygen level name from value.\n */\nexport function getOxygenLevel(value: number): OxygenThresholdLevel {\n\tif (value >= OXYGEN_THRESHOLDS.good) {\n\t\treturn \"good\";\n\t}\n\tif (value >= OXYGEN_THRESHOLDS.moderate) {\n\t\treturn \"moderate\";\n\t}\n\tif (value >= OXYGEN_THRESHOLDS.low) {\n\t\treturn \"low\";\n\t}\n\treturn \"critical\";\n}\n\n/**\n * Calculate urgency score from vitals.\n * Returns 0-100 score based on combined metrics.\n */\nexport function calculateUrgencyScore(vitals: {\n\tpressure: number;\n\toxygen: number;\n\ttemperatureLevel: \"cold\" | \"warm\" | \"hot\" | \"burning\";\n}): number {\n\tlet score = 0;\n\n\t// Pressure contributes up to 40 points\n\tscore += Math.min((vitals.pressure / 100) * 40, 40);\n\n\t// Low oxygen contributes up to 25 points\n\tif (vitals.oxygen < OXYGEN_THRESHOLDS.low) {\n\t\tscore += Math.min(((OXYGEN_THRESHOLDS.low - vitals.oxygen) / OXYGEN_THRESHOLDS.low) * 25, 25);\n\t}\n\n\t// Temperature contributes up to 20 points\n\tconst tempScores = { cold: 0, warm: 5, hot: 15, burning: 20 };\n\tscore += tempScores[vitals.temperatureLevel];\n\n\t// Cap at 100\n\treturn Math.min(Math.round(score), 100);\n}\n\n/**\n * Get urgency level from score.\n */\nexport function getUrgencyLevel(score: number): UrgencyThresholdLevel {\n\tif (score >= URGENCY_THRESHOLDS.critical) {\n\t\treturn \"critical\";\n\t}\n\tif (score >= URGENCY_THRESHOLDS.high) {\n\t\treturn \"high\";\n\t}\n\tif (score >= URGENCY_THRESHOLDS.medium) {\n\t\treturn \"medium\";\n\t}\n\tif (score >= URGENCY_THRESHOLDS.low) {\n\t\treturn \"low\";\n\t}\n\treturn \"none\";\n}\n\n/**\n * Check if snapshot should be recommended based on vitals.\n */\nexport function shouldRecommendSnapshot(vitals: {\n\tpressure: number;\n\toxygen: number;\n\ttrajectory: \"stable\" | \"escalating\" | \"critical\" | \"recovering\";\n}): { should: boolean; urgency: UrgencyThresholdLevel; reason: string } {\n\t// Critical trajectory always recommends\n\tif (vitals.trajectory === \"critical\") {\n\t\treturn {\n\t\t\tshould: true,\n\t\t\turgency: \"critical\",\n\t\t\treason: \"Critical workspace state - immediate snapshot required\",\n\t\t};\n\t}\n\n\t// High pressure recommends\n\tif (vitals.pressure >= PRESSURE_THRESHOLDS.high) {\n\t\treturn {\n\t\t\tshould: true,\n\t\t\turgency: \"high\",\n\t\t\treason: `High pressure (${vitals.pressure}%) - snapshot recommended`,\n\t\t};\n\t}\n\n\t// Escalating with moderate pressure recommends\n\tif (vitals.trajectory === \"escalating\" && vitals.pressure >= PRESSURE_THRESHOLDS.moderate) {\n\t\treturn {\n\t\t\tshould: true,\n\t\t\turgency: \"medium\",\n\t\t\treason: \"Escalating trajectory - consider creating a snapshot\",\n\t\t};\n\t}\n\n\t// Low oxygen with moderate pressure recommends\n\tif (vitals.oxygen < OXYGEN_THRESHOLDS.low && vitals.pressure >= PRESSURE_THRESHOLDS.moderate) {\n\t\treturn {\n\t\t\tshould: true,\n\t\t\turgency: \"medium\",\n\t\t\treason: `Low snapshot coverage (${vitals.oxygen}%) with unsaved changes`,\n\t\t};\n\t}\n\n\treturn {\n\t\tshould: false,\n\t\turgency: \"none\",\n\t\treason: \"Workspace healthy - no snapshot needed\",\n\t};\n}\n","/**\n * PhaseDetector - Development Phase Detection via Git Branch Analysis\n *\n * Analyzes git branch names to detect the current development phase and\n * adjusts snapshot thresholds accordingly. Different phases have different\n * risk profiles:\n *\n * - Hotfix: High risk, frequent snapshots (10 min intervals, 50 line max)\n * - Feature: Medium risk, moderate snapshots (15-30 min intervals, 300 line max)\n * - Refactor: Lower risk, less frequent (45-75 min intervals, 400 line max)\n * - Exploratory: Lowest urgency, milestone-based snapshots\n *\n * @packageDocumentation\n */\n\n/**\n * Development phase types detected from branch names\n */\nexport type DevelopmentPhase = \"hotfix\" | \"feature\" | \"refactor\" | \"exploratory\" | \"release\" | \"unknown\";\n\n/**\n * Threshold multipliers for each development phase\n * Lower multiplier = more protective (lower thresholds)\n */\nexport interface PhaseThresholds {\n\t/** Multiplier for snapshot interval (lower = more frequent) */\n\tintervalMultiplier: number;\n\t/** Maximum lines before forcing a snapshot */\n\tmaxLinesBeforeSnapshot: number;\n\t/** Risk multiplier for pressure calculations */\n\triskMultiplier: number;\n\t/** Recommended snapshot interval in minutes */\n\trecommendedIntervalMinutes: number;\n\t/** AI-adjusted interval in minutes */\n\taiAdjustedIntervalMinutes: number;\n}\n\n/**\n * Phase detection result\n */\nexport interface PhaseDetectionResult {\n\t/** Detected development phase */\n\tphase: DevelopmentPhase;\n\t/** Confidence score (0-1) */\n\tconfidence: number;\n\t/** Branch name that was analyzed */\n\tbranchName: string;\n\t/** Matched pattern (if any) */\n\tmatchedPattern?: string;\n\t/** Recommended thresholds for this phase */\n\tthresholds: PhaseThresholds;\n}\n\n/**\n * Branch patterns for phase detection\n */\nconst PHASE_PATTERNS: Record<DevelopmentPhase, RegExp[]> = {\n\thotfix: [/^hotfix\\//i, /^fix\\//i, /^bugfix\\//i, /^patch\\//i, /^urgent\\//i, /^emergency\\//i, /^critical\\//i],\n\tfeature: [/^feature\\//i, /^feat\\//i, /^add\\//i, /^implement\\//i, /^new\\//i, /^enhancement\\//i],\n\trefactor: [/^refactor\\//i, /^cleanup\\//i, /^tech-debt\\//i, /^improvement\\//i, /^optimize\\//i, /^chore\\//i],\n\trelease: [/^release\\//i, /^release-/i, /^v\\d+\\.\\d+/i, /^version\\//i],\n\texploratory: [/^experiment\\//i, /^spike\\//i, /^poc\\//i, /^prototype\\//i, /^try\\//i, /^test\\//i, /^wip\\//i],\n\tunknown: [], // No patterns - fallback\n};\n\n/**\n * Default thresholds per development phase\n * Based on research: different phases have different risk profiles\n */\nconst PHASE_THRESHOLDS: Record<DevelopmentPhase, PhaseThresholds> = {\n\thotfix: {\n\t\tintervalMultiplier: 0.5, // Most protective\n\t\tmaxLinesBeforeSnapshot: 50,\n\t\triskMultiplier: 1.5, // Higher risk sensitivity\n\t\trecommendedIntervalMinutes: 15,\n\t\taiAdjustedIntervalMinutes: 10,\n\t},\n\tfeature: {\n\t\tintervalMultiplier: 1.0, // Standard\n\t\tmaxLinesBeforeSnapshot: 300,\n\t\triskMultiplier: 1.0,\n\t\trecommendedIntervalMinutes: 45,\n\t\taiAdjustedIntervalMinutes: 20,\n\t},\n\trefactor: {\n\t\tintervalMultiplier: 1.5, // Less protective\n\t\tmaxLinesBeforeSnapshot: 400,\n\t\triskMultiplier: 0.8,\n\t\trecommendedIntervalMinutes: 90,\n\t\taiAdjustedIntervalMinutes: 60,\n\t},\n\trelease: {\n\t\tintervalMultiplier: 0.7, // More protective for releases\n\t\tmaxLinesBeforeSnapshot: 100,\n\t\triskMultiplier: 1.3,\n\t\trecommendedIntervalMinutes: 20,\n\t\taiAdjustedIntervalMinutes: 15,\n\t},\n\texploratory: {\n\t\tintervalMultiplier: 2.0, // Least protective\n\t\tmaxLinesBeforeSnapshot: 1000, // No effective limit\n\t\triskMultiplier: 0.5,\n\t\trecommendedIntervalMinutes: 120, // Milestone-based\n\t\taiAdjustedIntervalMinutes: 90,\n\t},\n\tunknown: {\n\t\tintervalMultiplier: 1.0, // Default/standard\n\t\tmaxLinesBeforeSnapshot: 300,\n\t\triskMultiplier: 1.0,\n\t\trecommendedIntervalMinutes: 45,\n\t\taiAdjustedIntervalMinutes: 25,\n\t},\n};\n\n/**\n * PhaseDetector - Detects development phase from git branch names\n *\n * @example\n * ```typescript\n * const detector = new PhaseDetector();\n * const result = detector.detectPhase('feature/add-user-auth');\n * console.log(result.phase); // 'feature'\n * console.log(result.thresholds.recommendedIntervalMinutes); // 45\n * ```\n */\n/**\n * Manual override configuration\n */\nexport interface PhaseOverride {\n\t/** Overridden phase */\n\tphase: DevelopmentPhase;\n\t/** Workspace ID this override applies to */\n\tworkspaceId: string;\n\t/** Expiry timestamp (null = never expires) */\n\texpiresAt: number | null;\n\t/** Reason for override */\n\treason?: string;\n}\n\nexport class PhaseDetector {\n\tprivate cachedPhase: PhaseDetectionResult | null = null;\n\tprivate lastBranch: string | null = null;\n\t/** Manual phase overrides by workspace */\n\tprivate overrides: Map<string, PhaseOverride> = new Map();\n\n\t/**\n\t * Detect development phase from branch name\n\t * Respects manual overrides when set for the workspace\n\t *\n\t * @param branchName - Git branch name (e.g., \"feature/add-auth\")\n\t * @param workspaceId - Optional workspace ID for override lookup\n\t * @returns Phase detection result with thresholds\n\t */\n\tdetectPhase(branchName: string, workspaceId?: string): PhaseDetectionResult {\n\t\t// Check for manual override first\n\t\tif (workspaceId) {\n\t\t\tconst override = this.getOverride(workspaceId);\n\t\t\tif (override) {\n\t\t\t\treturn {\n\t\t\t\t\tphase: override.phase,\n\t\t\t\t\tconfidence: 1.0, // Manual override is 100% confident\n\t\t\t\t\tbranchName,\n\t\t\t\t\tmatchedPattern: `manual:${override.reason ?? \"user-override\"}`,\n\t\t\t\t\tthresholds: PHASE_THRESHOLDS[override.phase],\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\t// Use cache if branch hasn't changed\n\t\tif (this.lastBranch === branchName && this.cachedPhase) {\n\t\t\treturn this.cachedPhase;\n\t\t}\n\n\t\t// Check each phase pattern\n\t\tfor (const [phase, patterns] of Object.entries(PHASE_PATTERNS) as [DevelopmentPhase, RegExp[]][]) {\n\t\t\tfor (const pattern of patterns) {\n\t\t\t\tif (pattern.test(branchName)) {\n\t\t\t\t\tconst result: PhaseDetectionResult = {\n\t\t\t\t\t\tphase,\n\t\t\t\t\t\tconfidence: 0.9, // High confidence for pattern match\n\t\t\t\t\t\tbranchName,\n\t\t\t\t\t\tmatchedPattern: pattern.source,\n\t\t\t\t\t\tthresholds: PHASE_THRESHOLDS[phase],\n\t\t\t\t\t};\n\t\t\t\t\tthis.cachedPhase = result;\n\t\t\t\t\tthis.lastBranch = branchName;\n\t\t\t\t\treturn result;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Fallback: try to infer from branch structure\n\t\tconst inferredPhase = this.inferPhaseFromStructure(branchName);\n\t\tconst result: PhaseDetectionResult = {\n\t\t\tphase: inferredPhase.phase,\n\t\t\tconfidence: inferredPhase.confidence,\n\t\t\tbranchName,\n\t\t\tthresholds: PHASE_THRESHOLDS[inferredPhase.phase],\n\t\t};\n\n\t\tthis.cachedPhase = result;\n\t\tthis.lastBranch = branchName;\n\t\treturn result;\n\t}\n\n\t/**\n\t * Infer phase from branch structure when no pattern matches\n\t */\n\tprivate inferPhaseFromStructure(branchName: string): { phase: DevelopmentPhase; confidence: number } {\n\t\t// Main/master branches are typically feature work\n\t\tif (branchName === \"main\" || branchName === \"master\" || branchName === \"develop\") {\n\t\t\treturn { phase: \"feature\", confidence: 0.6 };\n\t\t}\n\n\t\t// Branches with ticket numbers often indicate feature work\n\t\tif (/[A-Z]+-\\d+/.test(branchName)) {\n\t\t\treturn { phase: \"feature\", confidence: 0.5 };\n\t\t}\n\n\t\t// Branches with \"fix\" or \"bug\" in the name\n\t\tif (/fix|bug/i.test(branchName)) {\n\t\t\treturn { phase: \"hotfix\", confidence: 0.6 };\n\t\t}\n\n\t\t// Branches with version numbers\n\t\tif (/\\d+\\.\\d+/.test(branchName)) {\n\t\t\treturn { phase: \"release\", confidence: 0.5 };\n\t\t}\n\n\t\treturn { phase: \"unknown\", confidence: 0.3 };\n\t}\n\n\t/**\n\t * Get threshold multiplier for current phase\n\t * Used by ThresholdCalibrator to adjust vitals thresholds\n\t */\n\tgetThresholdMultiplier(branchName: string): number {\n\t\tconst detection = this.detectPhase(branchName);\n\t\treturn detection.thresholds.intervalMultiplier;\n\t}\n\n\t/**\n\t * Get risk multiplier for current phase\n\t * Used to adjust pressure calculations\n\t */\n\tgetRiskMultiplier(branchName: string): number {\n\t\tconst detection = this.detectPhase(branchName);\n\t\treturn detection.thresholds.riskMultiplier;\n\t}\n\n\t/**\n\t * Check if current phase requires more frequent snapshots\n\t */\n\trequiresFrequentSnapshots(branchName: string): boolean {\n\t\tconst detection = this.detectPhase(branchName);\n\t\treturn detection.phase === \"hotfix\" || detection.phase === \"release\";\n\t}\n\n\t/**\n\t * Get recommended snapshot interval based on phase\n\t * @param aiActive - Whether AI tools are currently active\n\t */\n\tgetRecommendedInterval(branchName: string, aiActive: boolean): number {\n\t\tconst detection = this.detectPhase(branchName);\n\t\treturn aiActive\n\t\t\t? detection.thresholds.aiAdjustedIntervalMinutes\n\t\t\t: detection.thresholds.recommendedIntervalMinutes;\n\t}\n\n\t/**\n\t * Check if lines changed exceeds phase threshold\n\t */\n\texceedsLineThreshold(branchName: string, linesChanged: number): boolean {\n\t\tconst detection = this.detectPhase(branchName);\n\t\treturn linesChanged >= detection.thresholds.maxLinesBeforeSnapshot;\n\t}\n\n\t/**\n\t * Clear cached detection (for testing or branch changes)\n\t */\n\tclearCache(): void {\n\t\tthis.cachedPhase = null;\n\t\tthis.lastBranch = null;\n\t}\n\n\t// =========================================================================\n\t// MANUAL PHASE OVERRIDE (workspace-scoped with expiry)\n\t// =========================================================================\n\n\t/**\n\t * Set manual phase override for a workspace\n\t * Useful when cross-branch work doesn't match branch name\n\t *\n\t * @param workspaceId - Workspace identifier\n\t * @param phase - Phase to force\n\t * @param expiryMinutes - Minutes until override expires (null = never)\n\t * @param reason - Optional reason for the override\n\t */\n\tsetOverride(\n\t\tworkspaceId: string,\n\t\tphase: DevelopmentPhase,\n\t\texpiryMinutes: number | null = 120, // Default 2 hours\n\t\treason?: string,\n\t): void {\n\t\tconst expiresAt = expiryMinutes !== null ? Date.now() + expiryMinutes * 60 * 1000 : null;\n\t\tthis.overrides.set(workspaceId, {\n\t\t\tphase,\n\t\t\tworkspaceId,\n\t\t\texpiresAt,\n\t\t\treason,\n\t\t});\n\t\t// Clear cache to force re-detection\n\t\tthis.clearCache();\n\t}\n\n\t/**\n\t * Remove manual phase override for a workspace\n\t */\n\tclearOverride(workspaceId: string): void {\n\t\tthis.overrides.delete(workspaceId);\n\t\tthis.clearCache();\n\t}\n\n\t/**\n\t * Get current override for a workspace (if valid)\n\t * Automatically clears expired overrides\n\t */\n\tgetOverride(workspaceId: string): PhaseOverride | null {\n\t\tconst override = this.overrides.get(workspaceId);\n\t\tif (!override) {\n\t\t\treturn null;\n\t\t}\n\n\t\t// Check expiry\n\t\tif (override.expiresAt !== null && Date.now() > override.expiresAt) {\n\t\t\tthis.overrides.delete(workspaceId);\n\t\t\treturn null;\n\t\t}\n\n\t\treturn override;\n\t}\n\n\t/**\n\t * Check if workspace has an active override\n\t */\n\thasOverride(workspaceId: string): boolean {\n\t\treturn this.getOverride(workspaceId) !== null;\n\t}\n\n\t/**\n\t * Get all active overrides (for debugging/UI)\n\t */\n\tgetAllOverrides(): PhaseOverride[] {\n\t\tconst now = Date.now();\n\t\tconst active: PhaseOverride[] = [];\n\n\t\tfor (const [id, override] of this.overrides) {\n\t\t\tif (override.expiresAt !== null && now > override.expiresAt) {\n\t\t\t\tthis.overrides.delete(id);\n\t\t\t} else {\n\t\t\t\tactive.push(override);\n\t\t\t}\n\t\t}\n\n\t\treturn active;\n\t}\n\n\t// =========================================================================\n\t// PERSISTENCE (Workspace State)\n\t// =========================================================================\n\n\t/**\n\t * Serialize overrides to JSON-safe format for workspace state persistence\n\t * Automatically removes expired overrides during serialization\n\t *\n\t * @returns Record of active workspace overrides\n\t */\n\tserializeOverrides(): Record<string, PhaseOverride> {\n\t\tconst now = Date.now();\n\t\tconst active: Record<string, PhaseOverride> = {};\n\n\t\tfor (const [id, override] of this.overrides) {\n\t\t\t// Skip expired overrides\n\t\t\tif (override.expiresAt !== null && now > override.expiresAt) {\n\t\t\t\tthis.overrides.delete(id);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tactive[id] = override;\n\t\t}\n\n\t\treturn active;\n\t}\n\n\t/**\n\t * Restore overrides from persisted workspace state\n\t * Validates structure and removes already-expired entries\n\t *\n\t * @param data Persisted overrides record\n\t */\n\tdeserializeOverrides(data: Record<string, PhaseOverride>): void {\n\t\tconst now = Date.now();\n\t\tthis.overrides.clear();\n\n\t\tfor (const [id, override] of Object.entries(data)) {\n\t\t\t// Validate structure\n\t\t\tif (!override.phase || !override.workspaceId) {\n\t\t\t\tcontinue; // Skip invalid entries\n\t\t\t}\n\n\t\t\t// Skip already-expired\n\t\t\tif (override.expiresAt !== null && now > override.expiresAt) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tthis.overrides.set(id, override);\n\t\t}\n\t}\n\n\t/**\n\t * Get all available thresholds for reference\n\t */\n\tstatic getPhaseThresholds(): Record<DevelopmentPhase, PhaseThresholds> {\n\t\treturn { ...PHASE_THRESHOLDS };\n\t}\n\n\t/**\n\t * Get all available patterns for reference\n\t */\n\tstatic getPhasePatterns(): Record<DevelopmentPhase, string[]> {\n\t\tconst result: Record<DevelopmentPhase, string[]> = {} as any;\n\t\tfor (const [phase, patterns] of Object.entries(PHASE_PATTERNS)) {\n\t\t\tresult[phase as DevelopmentPhase] = patterns.map((p) => p.source);\n\t\t}\n\t\treturn result;\n\t}\n}\n","/**\n * @snapback/intelligence - Vitals Learning Types\n *\n * Type definitions for Phase 4: Learning & Calibration\n * - User behavior learning\n * - Per-workspace threshold calibration\n * - Trajectory prediction\n */\n\nimport type { Trajectory, Urgency, VitalsSnapshot } from \"./vitals.js\";\n\n// =============================================================================\n// USER BEHAVIOR LEARNING\n// =============================================================================\n\n/** Risk tolerance profile inferred from user behavior */\nexport type RiskProfile = \"conservative\" | \"balanced\" | \"aggressive\";\n\n/** Timing classification for snapshot events */\nexport type SnapshotTiming = \"early\" | \"aligned\" | \"late\" | \"missed\";\n\n/** A recorded observation of user snapshot behavior */\nexport interface SnapshotObservation {\n\t/** Unique observation ID */\n\tid: string;\n\t/** Workspace this observation belongs to */\n\tworkspaceId: string;\n\t/** Timestamp when observation was recorded */\n\ttimestamp: number;\n\t/** Vitals snapshot at time of observation */\n\tvitals: VitalsSnapshot;\n\t/** Whether user created a snapshot */\n\tuserCreatedSnapshot: boolean;\n\t/** Whether vitals recommended a snapshot at this moment */\n\tvitalsRecommended: boolean;\n\t/** Urgency level when observation was made */\n\turgencyAtTime: Urgency;\n\t/** Timing classification */\n\ttiming: SnapshotTiming;\n}\n\n/** User behavior statistics derived from observations */\nexport interface BehaviorStats {\n\t/** Total observations recorded */\n\ttotalObservations: number;\n\t/** Times user created snapshot when recommended */\n\talignedSnapshots: number;\n\t/** Times user created snapshot before recommendation (early) */\n\tearlySnapshots: number;\n\t/** Times user created snapshot after recommendation (late) */\n\tlateSnapshots: number;\n\t/** Times vitals recommended but user didn't snapshot */\n\tmissedRecommendations: number;\n\t/** Inferred risk profile */\n\triskProfile: RiskProfile;\n\t/** Average pressure when user snapshots */\n\tavgPressureAtSnapshot: number;\n\t/** Average oxygen when user snapshots */\n\tavgOxygenAtSnapshot: number;\n}\n\n// =============================================================================\n// THRESHOLD CALIBRATION\n// =============================================================================\n\n/** Calibration status */\nexport type CalibrationStatus = \"uncalibrated\" | \"learning\" | \"calibrated\" | \"locked\";\n\n/** Per-workspace threshold calibration profile */\nexport interface WorkspaceProfile {\n\t/** Workspace identifier */\n\tworkspaceId: string;\n\t/** Calibration status */\n\tstatus: CalibrationStatus;\n\t/** Number of observations used for calibration */\n\tobservationCount: number;\n\t/** Learned threshold adjustments (multipliers applied to defaults) */\n\tthresholdAdjustments: ThresholdAdjustments;\n\t/** Inferred risk tolerance (0-1 scale, 0=conservative, 1=aggressive) */\n\triskTolerance: number;\n\t/** Typical pulse level for this workspace */\n\ttypicalPulseLevel: number;\n\t/** Average snapshots per hour */\n\tsnapshotFrequency: number;\n\t/** Last calibration timestamp */\n\tlastCalibratedAt: number;\n\t/** Confidence in calibration (0-1) */\n\tconfidence: number;\n}\n\n/** Threshold adjustment multipliers */\nexport interface ThresholdAdjustments {\n\t/** Multiplier for pulse thresholds */\n\tpulseMultiplier: number;\n\t/** Multiplier for temperature thresholds */\n\ttemperatureMultiplier: number;\n\t/** Multiplier for pressure warning threshold */\n\tpressureMultiplier: number;\n\t/** Multiplier for oxygen warning threshold */\n\toxygenMultiplier: number;\n}\n\n/** Default (neutral) threshold adjustments */\nexport const DEFAULT_THRESHOLD_ADJUSTMENTS: ThresholdAdjustments = {\n\tpulseMultiplier: 1.0,\n\ttemperatureMultiplier: 1.0,\n\tpressureMultiplier: 1.0,\n\toxygenMultiplier: 1.0,\n};\n\n/** Calibration thresholds */\nexport const CALIBRATION_THRESHOLDS = {\n\t/** Minimum observations before starting calibration */\n\tMIN_OBSERVATIONS_TO_START: 5,\n\t/** Observations needed for full calibration */\n\tOBSERVATIONS_FOR_CALIBRATION: 20,\n\t/** Observations to lock calibration (stable) */\n\tOBSERVATIONS_TO_LOCK: 50,\n\t/** Confidence threshold to apply adjustments */\n\tCONFIDENCE_THRESHOLD: 0.7,\n} as const;\n\n// =============================================================================\n// TRAJECTORY PREDICTION\n// =============================================================================\n\n/** Predicted trajectory state */\nexport interface TrajectoryForecast {\n\t/** Current trajectory */\n\tcurrent: Trajectory;\n\t/** Predicted trajectory in 5 minutes */\n\tin5Minutes: Trajectory;\n\t/** Predicted trajectory in 10 minutes */\n\tin10Minutes: Trajectory;\n\t/** Confidence in predictions (0-1) */\n\tconfidence: number;\n\t/** Trend direction */\n\ttrend: \"improving\" | \"stable\" | \"worsening\";\n\t/** Time until next predicted state change (ms), null if stable */\n\ttimeToStateChange: number | null;\n}\n\n/** Prediction context used for forecasting */\nexport interface PredictionContext {\n\t/** Recent history (last N snapshots) */\n\trecentHistory: VitalsSnapshot[];\n\t/** Rate of pressure change (per minute) */\n\tpressureRate: number;\n\t/** Rate of oxygen change (per minute) */\n\toxygenRate: number;\n\t/** Temperature trend */\n\ttemperatureTrend: \"cooling\" | \"stable\" | \"heating\";\n\t/** Pulse trend */\n\tpulseTrend: \"slowing\" | \"stable\" | \"accelerating\";\n}\n\n// =============================================================================\n// PROACTIVE SUGGESTIONS\n// =============================================================================\n\n/** Urgency level for suggestions */\nexport type SuggestionUrgency = \"info\" | \"nudge\" | \"warning\" | \"urgent\";\n\n/** A proactive suggestion for the user */\nexport interface ProactiveSuggestion {\n\t/** Unique suggestion ID */\n\tid: string;\n\t/** Type of suggestion */\n\ttype: \"snapshot\" | \"pause\" | \"review\" | \"acknowledge\";\n\t/** Human-readable message */\n\tmessage: string;\n\t/** Urgency level */\n\turgency: SuggestionUrgency;\n\t/** Predicted time until critical (ms), null if not applicable */\n\ttimeUntilCritical: number | null;\n\t/** Whether user has dismissed this suggestion */\n\tdismissed: boolean;\n\t/** Timestamp when suggestion was generated */\n\tgeneratedAt: number;\n}\n\n// =============================================================================\n// STORAGE TYPES\n// =============================================================================\n\n/** Learning store for a workspace */\nexport interface VitalsLearningStore {\n\t/** Path to observations JSONL file */\n\tobservationsPath: string;\n\t/** Path to workspace profile JSON file */\n\tprofilePath: string;\n}\n\n// =============================================================================\n// EVENTS\n// =============================================================================\n\n/** Calibration event emitted when profile is updated */\nexport interface CalibrationEvent {\n\tworkspaceId: string;\n\tstatus: CalibrationStatus;\n\tprofile: WorkspaceProfile;\n}\n\n/** Suggestion event emitted when proactive suggestion is generated */\nexport interface SuggestionEvent {\n\tsuggestion: ProactiveSuggestion;\n\tforecast: TrajectoryForecast;\n}\n","/**\n * ThresholdCalibrator - Per-workspace threshold calibration\n *\n * Adjusts vitals thresholds based on observed user behavior patterns.\n * Conservative users get stricter thresholds, aggressive users get relaxed thresholds.\n *\n * @lifecycle uncalibrated → learning → calibrated → locked\n * @performance Budget: <10ms for updateFromBehavior(), <5ms for getAdjustedThresholds()\n */\n\nimport type { CalibrationStatus, ThresholdAdjustments, WorkspaceProfile } from \"../../types/vitals-learning.js\";\nimport { CALIBRATION_THRESHOLDS, DEFAULT_THRESHOLD_ADJUSTMENTS } from \"../../types/vitals-learning.js\";\nimport type { UserBehaviorLearner } from \"./UserBehaviorLearner.js\";\n\n/** Clamp value to range */\nfunction clamp(value: number, min: number, max: number): number {\n\treturn Math.max(min, Math.min(max, value));\n}\n\n/**\n * Calibrates per-workspace thresholds based on user behavior.\n */\nexport class ThresholdCalibrator {\n\tprivate readonly workspaceId: string;\n\tprivate readonly learner: UserBehaviorLearner;\n\n\tprivate profile: WorkspaceProfile;\n\n\tconstructor(workspaceId: string, learner: UserBehaviorLearner) {\n\t\tthis.workspaceId = workspaceId;\n\t\tthis.learner = learner;\n\n\t\t// Initialize with uncalibrated profile\n\t\tthis.profile = this.createInitialProfile();\n\t}\n\n\t/**\n\t * Create initial uncalibrated profile.\n\t */\n\tprivate createInitialProfile(): WorkspaceProfile {\n\t\treturn {\n\t\t\tworkspaceId: this.workspaceId,\n\t\t\tstatus: \"uncalibrated\",\n\t\t\tobservationCount: 0,\n\t\t\tthresholdAdjustments: { ...DEFAULT_THRESHOLD_ADJUSTMENTS },\n\t\t\triskTolerance: 0.5, // Neutral\n\t\t\ttypicalPulseLevel: 0,\n\t\t\tsnapshotFrequency: 0,\n\t\t\tlastCalibratedAt: 0,\n\t\t\tconfidence: 0,\n\t\t};\n\t}\n\n\t/**\n\t * Update calibration from behavior learner's observations.\n\t */\n\tupdateFromBehavior(): void {\n\t\tconst stats = this.learner.getStats();\n\t\tconst observations = this.learner.getObservations();\n\n\t\tthis.profile.observationCount = stats.totalObservations;\n\n\t\t// Update status based on observation count\n\t\tthis.profile.status = this.calculateStatus(stats.totalObservations);\n\n\t\t// Calculate risk tolerance (0 = conservative, 1 = aggressive)\n\t\tthis.profile.riskTolerance = this.calculateRiskTolerance(stats);\n\n\t\t// Calculate confidence\n\t\tthis.profile.confidence = this.calculateConfidence(stats);\n\n\t\t// Calculate typical pulse level\n\t\tthis.profile.typicalPulseLevel = this.calculateTypicalPulseLevel(observations);\n\n\t\t// Update threshold adjustments if we have enough data\n\t\tif (this.profile.status !== \"uncalibrated\") {\n\t\t\tthis.profile.thresholdAdjustments = this.calculateAdjustments(stats);\n\t\t\tthis.profile.lastCalibratedAt = Date.now();\n\t\t}\n\t}\n\n\t/**\n\t * Calculate calibration status from observation count.\n\t */\n\tprivate calculateStatus(count: number): CalibrationStatus {\n\t\tif (count >= CALIBRATION_THRESHOLDS.OBSERVATIONS_TO_LOCK) {\n\t\t\treturn \"locked\";\n\t\t}\n\t\tif (count >= CALIBRATION_THRESHOLDS.OBSERVATIONS_FOR_CALIBRATION) {\n\t\t\treturn \"calibrated\";\n\t\t}\n\t\tif (count >= CALIBRATION_THRESHOLDS.MIN_OBSERVATIONS_TO_START) {\n\t\t\treturn \"learning\";\n\t\t}\n\t\treturn \"uncalibrated\";\n\t}\n\n\t/**\n\t * Calculate risk tolerance from behavior stats.\n\t * 0 = conservative (early snapshots), 0.5 = balanced, 1 = aggressive (missed/late)\n\t */\n\tprivate calculateRiskTolerance(stats: {\n\t\ttotalObservations: number;\n\t\tearlySnapshots: number;\n\t\tlateSnapshots: number;\n\t\tmissedRecommendations: number;\n\t}): number {\n\t\tif (stats.totalObservations === 0) {\n\t\t\treturn 0.5;\n\t\t}\n\n\t\t// Early → conservative (0), Late/Missed → aggressive (1)\n\t\tconst earlyRatio = stats.earlySnapshots / stats.totalObservations;\n\t\tconst aggressiveRatio = (stats.lateSnapshots + stats.missedRecommendations) / stats.totalObservations;\n\n\t\t// Scale: 0 (all early) → 0.5 (balanced) → 1 (all missed/late)\n\t\tif (earlyRatio > aggressiveRatio) {\n\t\t\t// Conservative bias\n\t\t\treturn 0.5 - earlyRatio * 0.5;\n\t\t}\n\t\tif (aggressiveRatio > earlyRatio) {\n\t\t\t// Aggressive bias\n\t\t\treturn 0.5 + aggressiveRatio * 0.5;\n\t\t}\n\t\treturn 0.5; // Balanced\n\t}\n\n\t/**\n\t * Calculate confidence in calibration.\n\t */\n\tprivate calculateConfidence(stats: {\n\t\ttotalObservations: number;\n\t\tearlySnapshots: number;\n\t\talignedSnapshots: number;\n\t\tlateSnapshots: number;\n\t\tmissedRecommendations: number;\n\t\triskProfile: string;\n\t}): number {\n\t\tif (stats.totalObservations === 0) {\n\t\t\treturn 0;\n\t\t}\n\n\t\tconst count = stats.totalObservations;\n\n\t\t// Base confidence from observation count\n\t\tconst countConfidence = Math.min(count / CALIBRATION_THRESHOLDS.OBSERVATIONS_FOR_CALIBRATION, 1.0);\n\n\t\t// Consistency confidence - how dominant is the primary behavior?\n\t\tconst behaviors = [\n\t\t\tstats.earlySnapshots,\n\t\t\tstats.alignedSnapshots,\n\t\t\tstats.lateSnapshots,\n\t\t\tstats.missedRecommendations,\n\t\t];\n\t\tconst maxBehavior = Math.max(...behaviors);\n\t\tconst consistency = count > 0 ? maxBehavior / count : 0;\n\n\t\t// Entropy penalty: penalize when multiple behaviors are present\n\t\t// A truly consistent user should have >60% in one category\n\t\tconst entropyPenalty = consistency < 0.6 ? 0.15 : 0;\n\n\t\t// Combined confidence (weight count more initially, consistency more later)\n\t\tconst confidence = countConfidence * 0.6 + consistency * 0.4 - entropyPenalty;\n\n\t\treturn clamp(confidence, 0, 1);\n\t}\n\n\t/**\n\t * Calculate typical pulse level from observations.\n\t */\n\tprivate calculateTypicalPulseLevel(\n\t\tobservations: Array<{ vitals: { pulse: { changesPerMinute: number } } }>,\n\t): number {\n\t\tif (observations.length === 0) {\n\t\t\treturn 0;\n\t\t}\n\n\t\tconst total = observations.reduce((sum, obs) => sum + obs.vitals.pulse.changesPerMinute, 0);\n\t\treturn total / observations.length;\n\t}\n\n\t/**\n\t * Calculate threshold adjustments based on risk profile.\n\t */\n\tprivate calculateAdjustments(stats: { riskProfile: string }): ThresholdAdjustments {\n\t\t// Base multiplier from risk profile\n\t\tlet baseMultiplier: number;\n\n\t\tswitch (stats.riskProfile) {\n\t\t\tcase \"conservative\":\n\t\t\t\t// Lower thresholds = more sensitive/protective\n\t\t\t\tbaseMultiplier = 0.7;\n\t\t\t\tbreak;\n\t\t\tcase \"aggressive\":\n\t\t\t\t// Higher thresholds = less nagging\n\t\t\t\tbaseMultiplier = 1.3;\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tbaseMultiplier = 1.0;\n\t\t}\n\n\t\t// Clamp to safe range\n\t\tconst clampedMultiplier = clamp(baseMultiplier, 0.5, 2.0);\n\n\t\treturn {\n\t\t\tpulseMultiplier: clampedMultiplier,\n\t\t\ttemperatureMultiplier: clampedMultiplier,\n\t\t\tpressureMultiplier: clampedMultiplier,\n\t\t\toxygenMultiplier: clampedMultiplier,\n\t\t};\n\t}\n\n\t/**\n\t * Get the current workspace profile.\n\t */\n\tgetProfile(): WorkspaceProfile {\n\t\treturn { ...this.profile };\n\t}\n\n\t/**\n\t * Get adjusted thresholds for use in vitals calculations.\n\t * Returns defaults if uncalibrated.\n\t */\n\tgetAdjustedThresholds(): ThresholdAdjustments {\n\t\tif (this.profile.status === \"uncalibrated\") {\n\t\t\treturn { ...DEFAULT_THRESHOLD_ADJUSTMENTS };\n\t\t}\n\t\treturn { ...this.profile.thresholdAdjustments };\n\t}\n\n\t/**\n\t * Reset calibration to initial state.\n\t */\n\treset(): void {\n\t\tthis.profile = this.createInitialProfile();\n\t\tthis.learner.reset();\n\t}\n}\n","/**\n * TrajectoryPredictor - Forecasts trajectory changes\n *\n * Analyzes vitals history to predict future states and time to critical.\n * Uses simple linear regression on pressure/oxygen rates.\n *\n * @performance Budget: <10ms for predict()\n */\n\nimport type { Trajectory, VitalsSnapshot } from \"../../types/vitals.js\";\nimport type { PredictionContext, TrajectoryForecast } from \"../../types/vitals-learning.js\";\n\n/** Clamp value to range */\nfunction clamp(value: number, min: number, max: number): number {\n\treturn Math.max(min, Math.min(max, value));\n}\n\n/**\n * Predicts trajectory changes based on vitals history.\n */\nexport class TrajectoryPredictor {\n\t// biome-ignore lint/correctness/noUnusedPrivateClassMembers: stored for context/debugging\n\tprivate readonly workspaceId: string;\n\tprivate history: VitalsSnapshot[] = [];\n\tprivate readonly maxHistory = 100;\n\n\tconstructor(workspaceId: string) {\n\t\tthis.workspaceId = workspaceId;\n\t}\n\n\t/**\n\t * Record vitals snapshots for prediction.\n\t */\n\trecordSnapshots(snapshots: VitalsSnapshot[]): void {\n\t\tthis.history.push(...snapshots);\n\n\t\t// Limit history size\n\t\tif (this.history.length > this.maxHistory) {\n\t\t\tthis.history = this.history.slice(-this.maxHistory);\n\t\t}\n\t}\n\n\t/**\n\t * Predict trajectory changes.\n\t */\n\tpredict(): TrajectoryForecast {\n\t\tif (this.history.length === 0) {\n\t\t\treturn this.createDefaultForecast();\n\t\t}\n\n\t\tconst context = this.calculateContext();\n\t\tconst current = this.getCurrentTrajectory();\n\t\tconst trend = this.calculateTrend(context);\n\t\tconst confidence = this.calculateConfidence();\n\n\t\t// Predict future trajectories\n\t\tconst in5Minutes = this.predictTrajectoryAt(context, 5);\n\t\tconst in10Minutes = this.predictTrajectoryAt(context, 10);\n\n\t\t// Calculate time to state change\n\t\tconst timeToStateChange = this.calculateTimeToStateChange(context, current);\n\n\t\treturn {\n\t\t\tcurrent,\n\t\t\tin5Minutes,\n\t\t\tin10Minutes,\n\t\t\tconfidence,\n\t\t\ttrend,\n\t\t\ttimeToStateChange,\n\t\t};\n\t}\n\n\t/**\n\t * Get prediction context.\n\t */\n\tgetContext(): PredictionContext {\n\t\treturn this.calculateContext();\n\t}\n\n\t/**\n\t * Reset history.\n\t */\n\treset(): void {\n\t\tthis.history = [];\n\t}\n\n\t/**\n\t * Create default forecast when no data.\n\t */\n\tprivate createDefaultForecast(): TrajectoryForecast {\n\t\treturn {\n\t\t\tcurrent: \"stable\",\n\t\t\tin5Minutes: \"stable\",\n\t\t\tin10Minutes: \"stable\",\n\t\t\tconfidence: 0,\n\t\t\ttrend: \"stable\",\n\t\t\ttimeToStateChange: null,\n\t\t};\n\t}\n\n\t/**\n\t * Get current trajectory from most recent snapshot.\n\t */\n\tprivate getCurrentTrajectory(): Trajectory {\n\t\tif (this.history.length === 0) {\n\t\t\treturn \"stable\";\n\t\t}\n\t\treturn this.history[this.history.length - 1].trajectory;\n\t}\n\n\t/**\n\t * Calculate prediction context from history.\n\t */\n\tprivate calculateContext(): PredictionContext {\n\t\tconst recentHistory = this.history.slice(-10); // Last 10 snapshots\n\n\t\tif (recentHistory.length < 2) {\n\t\t\treturn {\n\t\t\t\trecentHistory,\n\t\t\t\tpressureRate: 0,\n\t\t\t\toxygenRate: 0,\n\t\t\t\ttemperatureTrend: \"stable\",\n\t\t\t\tpulseTrend: \"stable\",\n\t\t\t};\n\t\t}\n\n\t\t// Calculate rates (per minute)\n\t\tconst pressureRate = this.calculateRate(recentHistory, (s) => s.pressure.value);\n\t\tconst oxygenRate = this.calculateRate(recentHistory, (s) => s.oxygen.value);\n\n\t\t// Calculate trends\n\t\tconst temperatureTrend = this.calculateTemperatureTrend(recentHistory);\n\t\tconst pulseTrend = this.calculatePulseTrend(recentHistory);\n\n\t\treturn {\n\t\t\trecentHistory,\n\t\t\tpressureRate,\n\t\t\toxygenRate,\n\t\t\ttemperatureTrend,\n\t\t\tpulseTrend,\n\t\t};\n\t}\n\n\t/**\n\t * Calculate rate of change per minute.\n\t */\n\tprivate calculateRate(snapshots: VitalsSnapshot[], getValue: (s: VitalsSnapshot) => number): number {\n\t\tif (snapshots.length < 2) {\n\t\t\treturn 0;\n\t\t}\n\n\t\tconst first = snapshots[0];\n\t\tconst last = snapshots[snapshots.length - 1];\n\n\t\tconst valueDelta = getValue(last) - getValue(first);\n\t\tconst timeDeltaMinutes = (last.timestamp - first.timestamp) / 60000;\n\n\t\tif (timeDeltaMinutes === 0) {\n\t\t\treturn 0;\n\t\t}\n\n\t\treturn valueDelta / timeDeltaMinutes;\n\t}\n\n\t/**\n\t * Calculate temperature trend.\n\t */\n\tprivate calculateTemperatureTrend(snapshots: VitalsSnapshot[]): \"cooling\" | \"stable\" | \"heating\" {\n\t\tif (snapshots.length < 2) {\n\t\t\treturn \"stable\";\n\t\t}\n\n\t\tconst first = snapshots[0].temperature.aiPercentage;\n\t\tconst last = snapshots[snapshots.length - 1].temperature.aiPercentage;\n\t\tconst delta = last - first;\n\n\t\tif (delta > 5) {\n\t\t\treturn \"heating\";\n\t\t}\n\t\tif (delta < -5) {\n\t\t\treturn \"cooling\";\n\t\t}\n\t\treturn \"stable\";\n\t}\n\n\t/**\n\t * Calculate pulse trend.\n\t */\n\tprivate calculatePulseTrend(snapshots: VitalsSnapshot[]): \"slowing\" | \"stable\" | \"accelerating\" {\n\t\tif (snapshots.length < 2) {\n\t\t\treturn \"stable\";\n\t\t}\n\n\t\tconst first = snapshots[0].pulse.changesPerMinute;\n\t\tconst last = snapshots[snapshots.length - 1].pulse.changesPerMinute;\n\t\tconst delta = last - first;\n\n\t\tif (delta > 5) {\n\t\t\treturn \"accelerating\";\n\t\t}\n\t\tif (delta < -5) {\n\t\t\treturn \"slowing\";\n\t\t}\n\t\treturn \"stable\";\n\t}\n\n\t/**\n\t * Calculate overall trend from context.\n\t */\n\tprivate calculateTrend(context: PredictionContext): \"improving\" | \"stable\" | \"worsening\" {\n\t\t// Calculate recent pressure rate (last 3 snapshots) for better plateau detection\n\t\tconst recent = context.recentHistory.slice(-3);\n\t\tconst recentRate = this.calculateRate(recent, (s) => s.pressure.value);\n\n\t\t// Check if pressure is stable (rate near zero)\n\t\tif (Math.abs(recentRate) < 1) {\n\t\t\treturn \"stable\";\n\t\t}\n\n\t\tif (recentRate > 0) {\n\t\t\treturn \"worsening\";\n\t\t}\n\t\tif (recentRate < 0) {\n\t\t\treturn \"improving\";\n\t\t}\n\n\t\treturn \"stable\";\n\t}\n\n\t/**\n\t * Calculate confidence in predictions.\n\t */\n\tprivate calculateConfidence(): number {\n\t\tconst count = this.history.length;\n\n\t\tif (count === 0) {\n\t\t\treturn 0;\n\t\t}\n\t\tif (count === 1) {\n\t\t\treturn 0.2;\n\t\t}\n\t\tif (count < 3) {\n\t\t\treturn 0.4;\n\t\t}\n\t\tif (count < 5) {\n\t\t\treturn 0.6;\n\t\t}\n\t\tif (count < 10) {\n\t\t\treturn 0.75;\n\t\t}\n\n\t\treturn 0.9;\n\t}\n\n\t/**\n\t * Predict trajectory at a future time (in minutes).\n\t */\n\tprivate predictTrajectoryAt(context: PredictionContext, minutesAhead: number): Trajectory {\n\t\tif (this.history.length === 0) {\n\t\t\treturn \"stable\";\n\t\t}\n\n\t\tconst current = this.history[this.history.length - 1];\n\t\tconst currentPressure = current.pressure.value;\n\n\t\t// Project pressure based on rate\n\t\tconst projectedPressure = clamp(currentPressure + context.pressureRate * minutesAhead, 0, 100);\n\n\t\t// Convert to trajectory\n\t\tif (projectedPressure > 80) {\n\t\t\treturn \"critical\";\n\t\t}\n\t\tif (projectedPressure > 60) {\n\t\t\treturn \"escalating\";\n\t\t}\n\t\treturn \"stable\";\n\t}\n\n\t/**\n\t * Calculate time until trajectory state change.\n\t * Returns null if stable or already critical.\n\t */\n\tprivate calculateTimeToStateChange(context: PredictionContext, current: Trajectory): number | null {\n\t\tif (current === \"critical\") {\n\t\t\treturn null;\n\t\t}\n\t\tif (context.pressureRate <= 0) {\n\t\t\treturn null; // Improving or stable\n\t\t}\n\n\t\tconst currentPressure = this.history.length > 0 ? this.history[this.history.length - 1].pressure.value : 0;\n\n\t\t// Calculate time to reach next threshold\n\t\tlet targetPressure: number;\n\n\t\tif (current === \"stable\") {\n\t\t\ttargetPressure = 60; // Threshold to escalating\n\t\t} else {\n\t\t\ttargetPressure = 80; // Threshold to critical\n\t\t}\n\n\t\tif (currentPressure >= targetPressure) {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst pressureDelta = targetPressure - currentPressure;\n\t\tconst timeMinutes = pressureDelta / context.pressureRate;\n\n\t\t// Convert to milliseconds\n\t\treturn Math.round(timeMinutes * 60000);\n\t}\n}\n","/**\n * UserBehaviorLearner - Tracks user snapshot patterns\n *\n * Records observations of when users create snapshots relative to vitals recommendations.\n * Infers user's risk tolerance profile and provides statistics for threshold calibration.\n *\n * @performance Budget: <5ms for recordObservation(), <10ms for getStats()\n */\n\nimport type { Urgency, VitalsSnapshot } from \"../../types/vitals.js\";\nimport type { BehaviorStats, RiskProfile, SnapshotObservation, SnapshotTiming } from \"../../types/vitals-learning.js\";\n\n/** Input for recording an observation */\nexport interface ObservationInput {\n\tvitals: VitalsSnapshot;\n\tuserCreatedSnapshot: boolean;\n\tvitalsRecommended: boolean;\n}\n\n/** Generate unique ID */\nfunction generateId(): string {\n\treturn `obs-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;\n}\n\n/**\n * Learns from user snapshot behavior to calibrate thresholds.\n */\nexport class UserBehaviorLearner {\n\tprivate readonly workspaceId: string;\n\tprivate observations: SnapshotObservation[] = [];\n\tprivate readonly maxHistory = 100;\n\n\tconstructor(workspaceId: string) {\n\t\tthis.workspaceId = workspaceId;\n\t}\n\n\t/**\n\t * Record an observation of user behavior.\n\t */\n\trecordObservation(input: ObservationInput): SnapshotObservation {\n\t\tconst timing = this.classifyTiming(input);\n\t\tconst urgency = this.calculateUrgency(input.vitals);\n\n\t\tconst observation: SnapshotObservation = {\n\t\t\tid: generateId(),\n\t\t\tworkspaceId: this.workspaceId,\n\t\t\ttimestamp: Date.now(),\n\t\t\tvitals: input.vitals,\n\t\t\tuserCreatedSnapshot: input.userCreatedSnapshot,\n\t\t\tvitalsRecommended: input.vitalsRecommended,\n\t\t\turgencyAtTime: urgency,\n\t\t\ttiming,\n\t\t};\n\n\t\tthis.observations.push(observation);\n\n\t\t// Bound history\n\t\tif (this.observations.length > this.maxHistory) {\n\t\t\tthis.observations.shift();\n\t\t}\n\n\t\treturn observation;\n\t}\n\n\t/**\n\t * Classify the timing of the observation.\n\t */\n\tprivate classifyTiming(input: ObservationInput): SnapshotTiming {\n\t\tif (!input.userCreatedSnapshot && input.vitalsRecommended) {\n\t\t\treturn \"missed\";\n\t\t}\n\n\t\tif (input.userCreatedSnapshot && !input.vitalsRecommended) {\n\t\t\treturn \"early\";\n\t\t}\n\n\t\tif (input.userCreatedSnapshot && input.vitalsRecommended) {\n\t\t\t// Check if user was late (critical trajectory or very high pressure)\n\t\t\tif (input.vitals.trajectory === \"critical\" || input.vitals.pressure.value > 80) {\n\t\t\t\treturn \"late\";\n\t\t\t}\n\t\t\treturn \"aligned\";\n\t\t}\n\n\t\t// No snapshot, no recommendation = not tracked as significant\n\t\treturn \"aligned\";\n\t}\n\n\t/**\n\t * Calculate urgency from vitals.\n\t */\n\tprivate calculateUrgency(vitals: VitalsSnapshot): Urgency {\n\t\tif (vitals.trajectory === \"critical\") {\n\t\t\treturn \"critical\";\n\t\t}\n\t\tif (vitals.pressure.value > 80) {\n\t\t\treturn \"high\";\n\t\t}\n\t\tif (vitals.pressure.value > 60 || vitals.trajectory === \"escalating\") {\n\t\t\treturn \"medium\";\n\t\t}\n\t\tif (vitals.pressure.value > 40) {\n\t\t\treturn \"low\";\n\t\t}\n\t\treturn \"none\";\n\t}\n\n\t/**\n\t * Get behavior statistics.\n\t */\n\tgetStats(): BehaviorStats {\n\t\tconst total = this.observations.length;\n\n\t\tif (total === 0) {\n\t\t\treturn {\n\t\t\t\ttotalObservations: 0,\n\t\t\t\talignedSnapshots: 0,\n\t\t\t\tearlySnapshots: 0,\n\t\t\t\tlateSnapshots: 0,\n\t\t\t\tmissedRecommendations: 0,\n\t\t\t\triskProfile: \"balanced\",\n\t\t\t\tavgPressureAtSnapshot: 0,\n\t\t\t\tavgOxygenAtSnapshot: 0,\n\t\t\t};\n\t\t}\n\n\t\tconst aligned = this.observations.filter((o) => o.timing === \"aligned\" && o.userCreatedSnapshot).length;\n\t\tconst early = this.observations.filter((o) => o.timing === \"early\").length;\n\t\tconst late = this.observations.filter((o) => o.timing === \"late\").length;\n\t\tconst missed = this.observations.filter((o) => o.timing === \"missed\").length;\n\n\t\t// Calculate averages for snapshots only\n\t\tconst snapshotObs = this.observations.filter((o) => o.userCreatedSnapshot);\n\t\tconst avgPressure =\n\t\t\tsnapshotObs.length > 0\n\t\t\t\t? snapshotObs.reduce((sum, o) => sum + o.vitals.pressure.value, 0) / snapshotObs.length\n\t\t\t\t: 0;\n\t\tconst avgOxygen =\n\t\t\tsnapshotObs.length > 0\n\t\t\t\t? snapshotObs.reduce((sum, o) => sum + o.vitals.oxygen.value, 0) / snapshotObs.length\n\t\t\t\t: 0;\n\n\t\t// Infer risk profile\n\t\tconst riskProfile = this.inferRiskProfile(early, aligned, late, missed, total);\n\n\t\treturn {\n\t\t\ttotalObservations: total,\n\t\t\talignedSnapshots: aligned,\n\t\t\tearlySnapshots: early,\n\t\t\tlateSnapshots: late,\n\t\t\tmissedRecommendations: missed,\n\t\t\triskProfile,\n\t\t\tavgPressureAtSnapshot: Math.round(avgPressure),\n\t\t\tavgOxygenAtSnapshot: Math.round(avgOxygen),\n\t\t};\n\t}\n\n\t/**\n\t * Infer risk profile from observation patterns.\n\t */\n\tprivate inferRiskProfile(\n\t\tearly: number,\n\t\t_aligned: number,\n\t\tlate: number,\n\t\tmissed: number,\n\t\ttotal: number,\n\t): RiskProfile {\n\t\tif (total < 3) {\n\t\t\treturn \"balanced\"; // Not enough data\n\t\t}\n\n\t\tconst earlyRatio = early / total;\n\t\tconst missedRatio = missed / total;\n\t\tconst lateRatio = late / total;\n\n\t\t// Conservative: Early snapshots dominate (>50%)\n\t\tif (earlyRatio > 0.5) {\n\t\t\treturn \"conservative\";\n\t\t}\n\n\t\t// Aggressive: Missed + late dominate (>50%)\n\t\tif (missedRatio + lateRatio > 0.5) {\n\t\t\treturn \"aggressive\";\n\t\t}\n\n\t\t// Balanced: Mixed behavior\n\t\treturn \"balanced\";\n\t}\n\n\t/**\n\t * Get all observations.\n\t */\n\tgetObservations(): SnapshotObservation[] {\n\t\treturn [...this.observations];\n\t}\n\n\t/**\n\t * Reset all observations.\n\t */\n\treset(): void {\n\t\tthis.observations = [];\n\t}\n}\n","/**\n * OxygenSensor - Snapshot coverage tracking\n *\n * Measures how well-protected the workspace is based on:\n * - What percentage of modified files have snapshots\n * - How recent those snapshots are (stale = low oxygen)\n * - Critical file coverage weighted 2x\n *\n * @performance Budget: <1ms per operation\n */\n\nimport type { OxygenConfig } from \"../types/vitals.js\";\n\n/** Default oxygen configuration */\nexport const DEFAULT_OXYGEN_CONFIG: OxygenConfig = {\n\tstaleMinutes: 30, // Snapshots older than 30 min are stale\n\tcriticalWeight: 2, // Critical files count 2x\n};\n\n/** Oxygen state with metrics */\nexport interface OxygenState {\n\tvalue: number; // 0-100\n\tcoveragePercentage: number;\n\tstaleSnapshots: number;\n}\n\n/** Patterns for critical files */\nconst CRITICAL_FILE_PATTERNS: RegExp[] = [\n\t/package\\.json$/,\n\t/\\.env($|\\.)/,\n\t/tsconfig\\.json$/,\n\t/pnpm-lock\\.yaml$/,\n\t/\\.lock$/,\n\t/migrations?\\//,\n\t/schema\\.(sql|prisma|graphql)$/,\n];\n\n/**\n * Tracks snapshot coverage of modified files.\n *\n * Oxygen represents how \"protected\" the current work is.\n * Higher oxygen = more snapshots covering active files.\n */\nexport class OxygenSensor {\n\t/** Map of file path to snapshot timestamp */\n\tprivate snapshots: Map<string, number> = new Map();\n\t/** Set of files that have been modified */\n\tprivate modifiedFiles: Set<string> = new Set();\n\tprivate readonly config: OxygenConfig;\n\n\tconstructor(config: Partial<OxygenConfig> = {}) {\n\t\tthis.config = { ...DEFAULT_OXYGEN_CONFIG, ...config };\n\t}\n\n\t/**\n\t * Record a file modification.\n\t * @param filePath Path of the modified file\n\t */\n\trecordModification(filePath: string): void {\n\t\tthis.modifiedFiles.add(filePath);\n\t}\n\n\t/**\n\t * Record a snapshot creation for a file.\n\t * @param filePath Path of the snapshotted file\n\t * @param timestamp Optional: snapshot time for testing\n\t */\n\trecordSnapshot(filePath: string, timestamp: number = Date.now()): void {\n\t\tthis.snapshots.set(filePath, timestamp);\n\t\t// File is no longer \"modified without snapshot\"\n\t\tthis.modifiedFiles.delete(filePath);\n\t}\n\n\t/**\n\t * Record multiple snapshots at once (e.g., workspace-wide snapshot).\n\t * @param filePaths Paths of snapshotted files\n\t * @param timestamp Optional: snapshot time for testing\n\t */\n\trecordBulkSnapshot(filePaths: string[], timestamp: number = Date.now()): void {\n\t\tfor (const filePath of filePaths) {\n\t\t\tthis.recordSnapshot(filePath, timestamp);\n\t\t}\n\t}\n\n\t/**\n\t * Get current oxygen level and metrics.\n\t * @param now Optional: current time for testing\n\t */\n\tgetLevel(now: number = Date.now()): OxygenState {\n\t\tconst staleThreshold = now - this.config.staleMinutes * 60 * 1000;\n\n\t\tlet covered = 0;\n\t\tlet total = 0;\n\t\tlet stale = 0;\n\n\t\t// Calculate coverage based on modified files\n\t\tfor (const file of this.modifiedFiles) {\n\t\t\tconst isCritical = this.isCriticalFile(file);\n\t\t\tconst weight = isCritical ? this.config.criticalWeight : 1;\n\t\t\ttotal += weight;\n\n\t\t\tconst snapshotTime = this.snapshots.get(file);\n\t\t\tif (snapshotTime) {\n\t\t\t\tif (snapshotTime > staleThreshold) {\n\t\t\t\t\tcovered += weight;\n\t\t\t\t} else {\n\t\t\t\t\tstale++;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Note: Files with snapshots that aren't in modifiedFiles are fully protected\n\t\t// and don't need to be counted - they're already safe\n\n\t\t// If no modified files, oxygen is 100%\n\t\tconst coveragePercentage = total > 0 ? (covered / total) * 100 : 100;\n\n\t\treturn {\n\t\t\tvalue: Math.round(coveragePercentage),\n\t\t\tcoveragePercentage: Math.round(coveragePercentage),\n\t\t\tstaleSnapshots: stale,\n\t\t};\n\t}\n\n\t/**\n\t * Get list of modified files without snapshots.\n\t */\n\tgetUncoveredFiles(): string[] {\n\t\treturn Array.from(this.modifiedFiles).filter((file) => !this.snapshots.has(file));\n\t}\n\n\t/**\n\t * Get count of tracked files.\n\t */\n\tgetCounts(): { modified: number; snapshots: number } {\n\t\treturn {\n\t\t\tmodified: this.modifiedFiles.size,\n\t\t\tsnapshots: this.snapshots.size,\n\t\t};\n\t}\n\n\t/**\n\t * Clear all tracking data.\n\t */\n\treset(): void {\n\t\tthis.snapshots.clear();\n\t\tthis.modifiedFiles.clear();\n\t}\n\n\t/**\n\t * Check if a file path matches critical file patterns.\n\t */\n\tprivate isCriticalFile(filePath: string): boolean {\n\t\treturn CRITICAL_FILE_PATTERNS.some((pattern) => pattern.test(filePath));\n\t}\n}\n","/**\n * PressureGauge - Risk accumulation tracking\n *\n * Measures the buildup of risk over time when changes are made without snapshots.\n * Pressure increases with:\n * - Time since last snapshot\n * - Number of unsnapshot'd changes\n * - Critical file modifications (2x multiplier)\n *\n * Pressure decreases when:\n * - A snapshot is created (50% decay)\n *\n * @performance Budget: <1ms per operation\n */\n\nimport type { PressureConfig } from \"../types/vitals.js\";\n\n/** Default pressure configuration */\nexport const DEFAULT_PRESSURE_CONFIG: PressureConfig = {\n\tbaseRate: 5, // 5% pressure per minute\n\tcriticalMultiplier: 2, // 2x for critical files\n\tdecayOnSnapshot: 50, // Release 50% on snapshot\n\tmaxPressure: 100,\n};\n\n/** Pressure state result */\nexport interface PressureState {\n\tvalue: number; // 0-100\n\tunsnapshotedChanges: number;\n\ttimeSinceLastSnapshot: number; // minutes\n\tcriticalFilesTouched: string[];\n}\n\n/**\n * Structured snapshot recommendation based on pressure analysis\n * 2026 best practice: Actionable, context-aware recommendations\n */\nexport interface PressureRecommendation {\n\t/** Should a snapshot be created now? */\n\tshouldSnapshot: boolean;\n\t/** Urgency level (0-100) */\n\turgency: number;\n\t/** Primary reason for recommendation */\n\treason: string;\n\t/** Detailed context for the recommendation */\n\tcontext: {\n\t\t/** Current pressure value */\n\t\tpressure: number;\n\t\t/** Number of unsnapshot'd changes */\n\t\tchanges: number;\n\t\t/** Minutes since last snapshot */\n\t\tminutesSinceSnapshot: number;\n\t\t/** Critical files affected */\n\t\tcriticalFiles: string[];\n\t};\n\t/** Suggested action for the user */\n\taction: \"snapshot_now\" | \"snapshot_soon\" | \"monitor\" | \"none\";\n\t/** Educational message explaining why this matters */\n\teducational?: string;\n}\n\n/** Patterns for critical files that warrant extra protection */\nconst CRITICAL_FILE_PATTERNS: RegExp[] = [\n\t/package\\.json$/,\n\t/\\.env($|\\.)/,\n\t/tsconfig\\.json$/,\n\t/pnpm-lock\\.yaml$/,\n\t/\\.lock$/,\n\t/migrations?\\//,\n\t/schema\\.(sql|prisma|graphql)$/,\n\t/docker-compose\\.ya?ml$/,\n\t/Dockerfile$/,\n];\n\n/**\n * Tracks risk pressure accumulation.\n *\n * Pressure builds continuously:\n * - Base rate per minute of elapsed time\n * - Per-change rate (higher for critical files)\n *\n * Pressure releases on snapshot creation.\n */\nexport class PressureGauge {\n\tprivate changeBasedPressure = 0;\n\tprivate unsnapshotedChanges = 0;\n\tprivate lastSnapshotTime: number;\n\tprivate criticalFilesTouched: Set<string> = new Set();\n\tprivate readonly config: PressureConfig;\n\n\tconstructor(config: Partial<PressureConfig> = {}, initialTime: number = Date.now()) {\n\t\tthis.config = { ...DEFAULT_PRESSURE_CONFIG, ...config };\n\t\tthis.lastSnapshotTime = initialTime;\n\t}\n\n\t/**\n\t * Record a file change, accumulating pressure.\n\t * @param filePath Path of the modified file\n\t */\n\trecordChange(filePath: string): void {\n\t\tthis.unsnapshotedChanges++;\n\n\t\tconst isCritical = this.isCriticalFile(filePath);\n\t\tif (isCritical) {\n\t\t\tthis.criticalFilesTouched.add(filePath);\n\t\t}\n\n\t\t// Accumulate pressure per change\n\t\t// Each change adds baseRate/10 (so 10 changes = 1 minute worth of pressure)\n\t\tconst multiplier = isCritical ? this.config.criticalMultiplier : 1;\n\t\tconst increment = (this.config.baseRate * multiplier) / 10;\n\t\tthis.changeBasedPressure = Math.min(this.config.maxPressure, this.changeBasedPressure + increment);\n\t}\n\n\t/**\n\t * Record a snapshot, releasing pressure.\n\t * @param now Optional timestamp for testing\n\t */\n\trecordSnapshot(now: number = Date.now()): void {\n\t\t// Decay pressure by configured percentage\n\t\tthis.changeBasedPressure = Math.max(0, this.changeBasedPressure * (1 - this.config.decayOnSnapshot / 100));\n\t\tthis.unsnapshotedChanges = 0;\n\t\tthis.criticalFilesTouched.clear();\n\t\tthis.lastSnapshotTime = now;\n\t}\n\n\t/**\n\t * Get current pressure state.\n\t * @param now Optional timestamp for testing\n\t */\n\tgetState(now: number = Date.now()): PressureState {\n\t\tconst minutesSinceSnapshot = Math.max(0, (now - this.lastSnapshotTime) / 60000);\n\n\t\t// Time-based pressure ONLY accumulates when there are unsnapshot changes\n\t\t// This prevents false alarms when workspace is idle\n\t\tconst timePressure = this.unsnapshotedChanges > 0 ? minutesSinceSnapshot * this.config.baseRate : 0;\n\n\t\t// Total pressure is change-based + time-based, capped at max\n\t\tconst totalPressure = Math.min(this.config.maxPressure, this.changeBasedPressure + timePressure);\n\n\t\treturn {\n\t\t\tvalue: Math.round(totalPressure),\n\t\t\tunsnapshotedChanges: this.unsnapshotedChanges,\n\t\t\ttimeSinceLastSnapshot: Math.round(minutesSinceSnapshot),\n\t\t\tcriticalFilesTouched: Array.from(this.criticalFilesTouched),\n\t\t};\n\t}\n\n\t/**\n\t * Reset the gauge to initial state.\n\t * @param now Optional timestamp for testing\n\t */\n\treset(now: number = Date.now()): void {\n\t\tthis.changeBasedPressure = 0;\n\t\tthis.unsnapshotedChanges = 0;\n\t\tthis.criticalFilesTouched.clear();\n\t\tthis.lastSnapshotTime = now;\n\t}\n\n\t/**\n\t * Check if a file path matches critical file patterns.\n\t */\n\tprivate isCriticalFile(filePath: string): boolean {\n\t\treturn CRITICAL_FILE_PATTERNS.some((pattern) => pattern.test(filePath));\n\t}\n\n\t// =========================================================================\n\t// RECOMMENDATIONS API (2026 industry standard)\n\t// =========================================================================\n\n\t/**\n\t * Get structured snapshot recommendation based on current pressure state\n\t *\n\t * 2026 Best Practice: Recommendations should be:\n\t * - Actionable (clear next step)\n\t * - Context-aware (includes relevant data)\n\t * - Educational (explains why it matters)\n\t *\n\t * @param now Optional timestamp for testing\n\t * @returns Structured recommendation with action and context\n\t */\n\tgetRecommendation(now: number = Date.now()): PressureRecommendation {\n\t\tconst state = this.getState(now);\n\t\tconst { value, unsnapshotedChanges, timeSinceLastSnapshot, criticalFilesTouched } = state;\n\n\t\t// Determine urgency and action based on thresholds\n\t\tlet shouldSnapshot = false;\n\t\tlet urgency = 0;\n\t\tlet reason = \"\";\n\t\tlet action: PressureRecommendation[\"action\"] = \"none\";\n\t\tlet educational: string | undefined;\n\n\t\t// Critical pressure (>=80): Immediate action needed\n\t\tif (value >= 80) {\n\t\t\tshouldSnapshot = true;\n\t\t\turgency = 100;\n\t\t\treason = `Critical pressure (${value}%) - immediate snapshot recommended`;\n\t\t\taction = \"snapshot_now\";\n\t\t\teducational =\n\t\t\t\t\"High pressure indicates significant unsnapshot'd work. Creating a snapshot now protects against potential loss.\";\n\t\t}\n\t\t// High pressure (>=60): Snapshot soon\n\t\telse if (value >= 60) {\n\t\t\tshouldSnapshot = true;\n\t\t\turgency = 75;\n\t\t\treason = `High pressure (${value}%) - snapshot recommended`;\n\t\t\taction = \"snapshot_soon\";\n\t\t\teducational = \"Risk is accumulating. A snapshot within the next few minutes will keep your work protected.\";\n\t\t}\n\t\t// Moderate pressure (>=40): Monitor closely\n\t\telse if (value >= 40) {\n\t\t\tshouldSnapshot = false;\n\t\t\turgency = 50;\n\t\t\treason = `Moderate pressure (${value}%) - monitoring recommended`;\n\t\t\taction = \"monitor\";\n\t\t\teducational =\n\t\t\t\t\"Your session is progressing normally. Consider a snapshot if you're about to start risky changes.\";\n\t\t}\n\t\t// Low pressure (<40): No action needed\n\t\telse {\n\t\t\tshouldSnapshot = false;\n\t\t\turgency = value;\n\t\t\treason = \"Session health is good - no action needed\";\n\t\t\taction = \"none\";\n\t\t}\n\n\t\t// Boost urgency if critical files are touched\n\t\tif (criticalFilesTouched.length > 0 && value >= 30) {\n\t\t\turgency = Math.min(100, urgency + 20);\n\t\t\treason = `${reason} (critical files modified)`;\n\t\t\tif (action === \"monitor\") {\n\t\t\t\taction = \"snapshot_soon\";\n\t\t\t\tshouldSnapshot = true;\n\t\t\t}\n\t\t\teducational = `Critical files (${criticalFilesTouched.slice(0, 2).join(\", \")}) have been modified. These files typically require more protection.`;\n\t\t}\n\n\t\treturn {\n\t\t\tshouldSnapshot,\n\t\t\turgency,\n\t\t\treason,\n\t\t\tcontext: {\n\t\t\t\tpressure: value,\n\t\t\t\tchanges: unsnapshotedChanges,\n\t\t\t\tminutesSinceSnapshot: timeSinceLastSnapshot,\n\t\t\t\tcriticalFiles: criticalFilesTouched,\n\t\t\t},\n\t\t\taction,\n\t\t\teducational,\n\t\t};\n\t}\n\n\t/**\n\t * Get multiple recommendations for different scenarios\n\t * Useful for UI components that need to show options\n\t */\n\tgetRecommendations(now: number = Date.now()): PressureRecommendation[] {\n\t\tconst primary = this.getRecommendation(now);\n\t\tconst recommendations = [primary];\n\n\t\t// If monitoring is recommended, also suggest proactive snapshot\n\t\tif (primary.action === \"monitor\" && primary.context.changes > 5) {\n\t\t\trecommendations.push({\n\t\t\t\tshouldSnapshot: true,\n\t\t\t\turgency: 30,\n\t\t\t\treason: \"Proactive snapshot opportunity\",\n\t\t\t\tcontext: primary.context,\n\t\t\t\taction: \"snapshot_soon\",\n\t\t\t\teducational: \"You have unsnapshot'd work. A proactive snapshot now ensures you have a recovery point.\",\n\t\t\t});\n\t\t}\n\n\t\treturn recommendations;\n\t}\n}\n","/**\n * PulseTracker - Change velocity monitoring\n *\n * Tracks the rate of file changes to determine workspace \"pulse\" level.\n * Uses a sliding window to calculate changes per minute.\n *\n * @performance Budget: <1ms per operation (called on every file save)\n */\n\nimport type { PulseConfig, PulseLevel } from \"../types/vitals.js\";\n\n/** Default pulse configuration */\nexport const DEFAULT_PULSE_CONFIG: PulseConfig = {\n\televated: 15, // changes/min\n\tracing: 30,\n\tcritical: 50,\n\twindowSeconds: 60,\n};\n\n/** Pulse level result with metrics */\nexport interface PulseState {\n\tlevel: PulseLevel;\n\tchangesPerMinute: number;\n}\n\n/**\n * Tracks change velocity over a sliding time window.\n *\n * Uses timestamps array with O(n) pruning on read.\n * For performance, pruning happens lazily during getLevel().\n */\nexport class PulseTracker {\n\tprivate changes: number[] = [];\n\tprivate readonly config: PulseConfig;\n\n\tconstructor(config: Partial<PulseConfig> = {}) {\n\t\tthis.config = { ...DEFAULT_PULSE_CONFIG, ...config };\n\t}\n\n\t/**\n\t * Record a file change event.\n\t * @performance O(1) - just pushes timestamp\n\t */\n\trecordChange(timestamp: number = Date.now()): void {\n\t\tthis.changes.push(timestamp);\n\t}\n\n\t/**\n\t * Get current pulse level and changes per minute.\n\t * @performance O(n) where n = changes in window\n\t */\n\tgetLevel(now: number = Date.now()): PulseState {\n\t\tthis.pruneOld(now);\n\n\t\tconst changesPerMinute =\n\t\t\tthis.config.windowSeconds > 0 ? (this.changes.length / this.config.windowSeconds) * 60 : 0;\n\n\t\treturn {\n\t\t\tlevel: this.classifyLevel(changesPerMinute),\n\t\t\tchangesPerMinute: Math.round(changesPerMinute),\n\t\t};\n\t}\n\n\t/**\n\t * Get raw change count in current window (for testing).\n\t */\n\tgetChangeCount(now: number = Date.now()): number {\n\t\tthis.pruneOld(now);\n\t\treturn this.changes.length;\n\t}\n\n\t/**\n\t * Clear all recorded changes.\n\t */\n\treset(): void {\n\t\tthis.changes = [];\n\t}\n\n\t/**\n\t * Remove events outside the sliding window.\n\t */\n\tprivate pruneOld(now: number): void {\n\t\tconst cutoff = now - this.config.windowSeconds * 1000;\n\t\t// Filter in place for memory efficiency\n\t\tthis.changes = this.changes.filter((t) => t > cutoff);\n\t}\n\n\t/**\n\t * Classify changes/min into a pulse level.\n\t */\n\tprivate classifyLevel(changesPerMinute: number): PulseLevel {\n\t\tif (changesPerMinute >= this.config.critical) {\n\t\t\treturn \"critical\";\n\t\t}\n\t\tif (changesPerMinute >= this.config.racing) {\n\t\t\treturn \"racing\";\n\t\t}\n\t\tif (changesPerMinute >= this.config.elevated) {\n\t\t\treturn \"elevated\";\n\t\t}\n\t\treturn \"resting\";\n\t}\n}\n","/**\n * TemperatureMonitor - AI activity level tracking\n *\n * Monitors the ratio of AI vs human activity to determine \"temperature\".\n * Higher AI activity = hotter temperature = more need for protection.\n *\n * Uses a decay window to cool down over time when AI activity stops.\n *\n * @performance Budget: <1ms per operation\n */\n\nimport type { TemperatureConfig, TempLevel } from \"../types/vitals.js\";\n\n/** Default temperature configuration */\nexport const DEFAULT_TEMPERATURE_CONFIG: TemperatureConfig = {\n\twarm: 20, // 20% AI activity\n\thot: 50, // 50% AI activity\n\tburning: 80, // 80% AI activity\n\tdecaySeconds: 300, // 5 minutes to cool down\n};\n\n/** Temperature state with metrics */\nexport interface TemperatureState {\n\tlevel: TempLevel;\n\taiPercentage: number;\n\tdetectedTool?: string;\n}\n\ninterface AIEvent {\n\ttimestamp: number;\n\ttool?: string;\n}\n\n/**\n * Monitors AI vs human activity within a decay window.\n *\n * Temperature rises with AI activity and cools over time.\n */\nexport class TemperatureMonitor {\n\tprivate aiEvents: AIEvent[] = [];\n\tprivate humanEvents: number[] = [];\n\tprivate readonly config: TemperatureConfig;\n\n\tconstructor(config: Partial<TemperatureConfig> = {}) {\n\t\tthis.config = { ...DEFAULT_TEMPERATURE_CONFIG, ...config };\n\t}\n\n\t/**\n\t * Record AI-assisted activity.\n\t * @param tool Optional: which AI tool (e.g., \"Cursor\", \"Copilot\", \"Claude\")\n\t * @param timestamp Optional: event time for testing\n\t */\n\trecordAIActivity(tool?: string, timestamp: number = Date.now()): void {\n\t\tthis.aiEvents.push({ timestamp, tool });\n\t}\n\n\t/**\n\t * Record human (non-AI) activity.\n\t * @param timestamp Optional: event time for testing\n\t */\n\trecordHumanActivity(timestamp: number = Date.now()): void {\n\t\tthis.humanEvents.push(timestamp);\n\t}\n\n\t/**\n\t * Get current temperature level and metrics.\n\t * @param now Optional: current time for testing\n\t */\n\tgetLevel(now: number = Date.now()): TemperatureState {\n\t\tthis.pruneOld(now);\n\n\t\tconst total = this.aiEvents.length + this.humanEvents.length;\n\t\tconst aiPercentage = total > 0 ? (this.aiEvents.length / total) * 100 : 0;\n\n\t\t// Most recent AI tool\n\t\tconst detectedTool = this.aiEvents.length > 0 ? this.aiEvents[this.aiEvents.length - 1].tool : undefined;\n\n\t\treturn {\n\t\t\tlevel: this.classifyLevel(aiPercentage),\n\t\t\taiPercentage: Math.round(aiPercentage),\n\t\t\tdetectedTool,\n\t\t};\n\t}\n\n\t/**\n\t * Get counts for testing.\n\t */\n\tgetCounts(now: number = Date.now()): { ai: number; human: number } {\n\t\tthis.pruneOld(now);\n\t\treturn {\n\t\t\tai: this.aiEvents.length,\n\t\t\thuman: this.humanEvents.length,\n\t\t};\n\t}\n\n\t/**\n\t * Clear all recorded activity.\n\t */\n\treset(): void {\n\t\tthis.aiEvents = [];\n\t\tthis.humanEvents = [];\n\t}\n\n\t/**\n\t * Remove events outside the decay window.\n\t */\n\tprivate pruneOld(now: number): void {\n\t\tconst cutoff = now - this.config.decaySeconds * 1000;\n\t\tthis.aiEvents = this.aiEvents.filter((e) => e.timestamp > cutoff);\n\t\tthis.humanEvents = this.humanEvents.filter((t) => t > cutoff);\n\t}\n\n\t/**\n\t * Classify AI percentage into a temperature level.\n\t */\n\tprivate classifyLevel(aiPercentage: number): TempLevel {\n\t\tif (aiPercentage >= this.config.burning) {\n\t\t\treturn \"burning\";\n\t\t}\n\t\tif (aiPercentage >= this.config.hot) {\n\t\t\treturn \"hot\";\n\t\t}\n\t\tif (aiPercentage >= this.config.warm) {\n\t\t\treturn \"warm\";\n\t\t}\n\t\treturn \"cold\";\n\t}\n}\n","/**\n * WorkspaceVitals - Core vitals orchestrator\n *\n * Combines all four vital signs into a unified workspace health monitor:\n * - Pulse: Change velocity\n * - Temperature: AI activity level\n * - Pressure: Risk accumulation\n * - Oxygen: Snapshot coverage\n *\n * Phase 4 additions:\n * - User behavior learning\n * - Per-workspace threshold calibration\n * - Trajectory prediction\n *\n * Provides decision support for when to create snapshots and guides AI agents.\n *\n * @performance Budget: <10ms for current() snapshot\n */\n\nimport { EventEmitter } from \"node:events\";\nimport type {\n\tAgentGuidance,\n\tAIDetectionEvent,\n\tSnapshotDecision,\n\tSnapshotEvent,\n\tTrajectory,\n\tVitalsConfig,\n\tVitalsFileChangeEvent,\n\tVitalsSnapshot,\n} from \"../types/vitals.js\";\nimport type { ThresholdAdjustments, TrajectoryForecast } from \"../types/vitals-learning.js\";\nimport { BehaviorTracker } from \"./BehaviorTracker.js\";\nimport { OXYGEN_THRESHOLDS, PRESSURE_THRESHOLDS, TRAJECTORY_THRESHOLDS } from \"./constants.js\";\nimport { PhaseDetector } from \"./learning/PhaseDetector.js\";\nimport { ThresholdCalibrator } from \"./learning/ThresholdCalibrator.js\";\nimport { TrajectoryPredictor } from \"./learning/TrajectoryPredictor.js\";\nimport { UserBehaviorLearner } from \"./learning/UserBehaviorLearner.js\";\nimport { DEFAULT_OXYGEN_CONFIG, OxygenSensor } from \"./OxygenSensor.js\";\nimport { DEFAULT_PRESSURE_CONFIG, PressureGauge } from \"./PressureGauge.js\";\nimport { DEFAULT_PULSE_CONFIG, PulseTracker } from \"./PulseTracker.js\";\nimport { DEFAULT_TEMPERATURE_CONFIG, TemperatureMonitor } from \"./TemperatureMonitor.js\";\n\n/** Default vitals configuration */\nexport const DEFAULT_VITALS_CONFIG: VitalsConfig = {\n\tpulse: DEFAULT_PULSE_CONFIG,\n\ttemperature: DEFAULT_TEMPERATURE_CONFIG,\n\tpressure: DEFAULT_PRESSURE_CONFIG,\n\toxygen: DEFAULT_OXYGEN_CONFIG,\n};\n\n/**\n * Unified workspace vitals monitor.\n *\n * Singleton per workspace ID to maintain consistent state.\n * Emits events: 'update', 'warning', 'critical'\n */\nexport class WorkspaceVitals extends EventEmitter {\n\tprivate static instances: Map<string, WorkspaceVitals> = new Map();\n\n\tprivate readonly pulse: PulseTracker;\n\tprivate readonly temperature: TemperatureMonitor;\n\tprivate readonly pressure: PressureGauge;\n\tprivate readonly oxygen: OxygenSensor;\n\tprivate readonly config: VitalsConfig;\n\tprivate history: VitalsSnapshot[] = [];\n\tprivate readonly maxHistory = 100;\n\n\t// Phase 4: Learning components\n\t// biome-ignore lint/correctness/noUnusedPrivateClassMembers: stored for context/debugging\n\tprivate readonly workspaceId: string;\n\tprivate readonly learner: UserBehaviorLearner;\n\tprivate readonly calibrator: ThresholdCalibrator;\n\tprivate readonly predictor: TrajectoryPredictor;\n\tprivate readonly phaseDetector: PhaseDetector;\n\tprivate currentBranch = \"main\";\n\n\t// Phase 2: Behavioral metadata tracking\n\tprivate readonly behaviorTracker: BehaviorTracker;\n\n\tprivate constructor(workspaceId: string, config: Partial<VitalsConfig> = {}, initialTime: number = Date.now()) {\n\t\tsuper();\n\t\tthis.workspaceId = workspaceId;\n\t\tthis.config = {\n\t\t\tpulse: { ...DEFAULT_VITALS_CONFIG.pulse, ...config.pulse },\n\t\t\ttemperature: { ...DEFAULT_VITALS_CONFIG.temperature, ...config.temperature },\n\t\t\tpressure: { ...DEFAULT_VITALS_CONFIG.pressure, ...config.pressure },\n\t\t\toxygen: { ...DEFAULT_VITALS_CONFIG.oxygen, ...config.oxygen },\n\t\t};\n\n\t\tthis.pulse = new PulseTracker(this.config.pulse);\n\t\tthis.temperature = new TemperatureMonitor(this.config.temperature);\n\t\tthis.pressure = new PressureGauge(this.config.pressure, initialTime);\n\t\tthis.oxygen = new OxygenSensor(this.config.oxygen);\n\n\t\t// Initialize learning components\n\t\tthis.learner = new UserBehaviorLearner(workspaceId);\n\t\tthis.calibrator = new ThresholdCalibrator(workspaceId, this.learner);\n\t\tthis.predictor = new TrajectoryPredictor(workspaceId);\n\t\tthis.phaseDetector = new PhaseDetector();\n\n\t\t// Initialize behavior tracking\n\t\tthis.behaviorTracker = new BehaviorTracker(initialTime);\n\t}\n\n\t/**\n\t * Get or create WorkspaceVitals for a workspace.\n\t * Singleton per workspaceId.\n\t */\n\tstatic for(workspaceId: string, config?: Partial<VitalsConfig>): WorkspaceVitals {\n\t\tlet instance = WorkspaceVitals.instances.get(workspaceId);\n\t\tif (!instance) {\n\t\t\tinstance = new WorkspaceVitals(workspaceId, config);\n\t\t\tWorkspaceVitals.instances.set(workspaceId, instance);\n\t\t}\n\t\treturn instance;\n\t}\n\n\t/**\n\t * Create a new instance (for testing - bypasses singleton).\n\t */\n\tstatic create(config?: Partial<VitalsConfig>, initialTime?: number): WorkspaceVitals {\n\t\treturn new WorkspaceVitals(`test-${Date.now()}`, config, initialTime);\n\t}\n\n\t/**\n\t * Clear all singleton instances (for testing).\n\t */\n\tstatic clearInstances(): void {\n\t\tWorkspaceVitals.instances.clear();\n\t}\n\n\t/**\n\t * Try to get an existing WorkspaceVitals instance.\n\t * Returns undefined if none exists for the workspace.\n\t */\n\tstatic tryGet(workspaceId: string): WorkspaceVitals | undefined {\n\t\treturn WorkspaceVitals.instances.get(workspaceId);\n\t}\n\n\t// =========================================================================\n\t// EVENT HANDLERS\n\t// =========================================================================\n\n\t/**\n\t * Handle a file change event.\n\t */\n\tonFileChange(event: VitalsFileChangeEvent, now: number = Date.now()): void {\n\t\tthis.pulse.recordChange(now);\n\t\tthis.pressure.recordChange(event.path);\n\t\tthis.oxygen.recordModification(event.path);\n\n\t\tif (event.isAI) {\n\t\t\tthis.temperature.recordAIActivity(event.tool, now);\n\t\t} else {\n\t\t\tthis.temperature.recordHumanActivity(now);\n\t\t}\n\n\t\tthis.checkAndEmit(now);\n\t}\n\n\t/**\n\t * Handle a snapshot creation event.\n\t */\n\tonSnapshot(event: SnapshotEvent, now: number = Date.now()): void {\n\t\tthis.pressure.recordSnapshot(now);\n\t\tthis.oxygen.recordSnapshot(event.filePath, now);\n\t\tthis.behaviorTracker.recordSnapshot(now);\n\t\tthis.checkAndEmit(now);\n\t}\n\n\t/**\n\t * Handle AI detection event.\n\t */\n\tonAIDetected(detection: AIDetectionEvent, now: number = Date.now()): void {\n\t\tif (detection.confidence > 0.6) {\n\t\t\tthis.temperature.recordAIActivity(detection.tool, now);\n\t\t}\n\t\tthis.checkAndEmit(now);\n\t}\n\n\t// =========================================================================\n\t// CURRENT STATE\n\t// =========================================================================\n\n\t/**\n\t * Get current vitals snapshot.\n\t * NOTE: This is a pure getter - does NOT mutate history.\n\t * Use recordHistorySnapshot() for explicit history recording.\n\t */\n\tcurrent(now: number = Date.now()): VitalsSnapshot {\n\t\tconst pulseData = this.pulse.getLevel(now);\n\t\tconst tempData = this.temperature.getLevel(now);\n\t\tconst pressureData = this.pressure.getState(now);\n\t\tconst oxygenData = this.oxygen.getLevel(now);\n\n\t\tconst snapshot: VitalsSnapshot = {\n\t\t\ttimestamp: now,\n\t\t\tpulse: pulseData,\n\t\t\ttemperature: tempData,\n\t\t\tpressure: pressureData,\n\t\t\toxygen: oxygenData,\n\t\t\ttrajectory: this.calculateTrajectory(pulseData, tempData, pressureData, oxygenData),\n\t\t\t// Include behavioral metadata\n\t\t\tbehavior: this.behaviorTracker.getMetadata(now),\n\t\t};\n\n\t\treturn snapshot;\n\t}\n\n\t/**\n\t * Explicitly record a history snapshot.\n\t * Call this on meaningful state changes (e.g., after onFileChange, onSnapshot).\n\t * History is bounded FIFO with maxHistory limit.\n\t */\n\trecordHistorySnapshot(now: number = Date.now()): void {\n\t\tconst snapshot = this.current(now);\n\n\t\t// Record history (bounded FIFO)\n\t\tthis.history.push(snapshot);\n\t\tif (this.history.length > this.maxHistory) {\n\t\t\tthis.history.shift();\n\t\t}\n\t}\n\n\t/**\n\t * Get historical snapshots.\n\t */\n\tgetHistory(): VitalsSnapshot[] {\n\t\treturn [...this.history];\n\t}\n\n\t/**\n\t * Get structured pressure recommendation for snapshot decisions.\n\t *\n\t * This provides actionable, context-aware recommendations based on\n\t * current pressure state. Use this to enhance AutoDecisionEngine\n\t * with educational messaging and urgency levels.\n\t *\n\t * @param now Optional timestamp for testing\n\t * @returns PressureRecommendation with action, urgency, and educational context\n\t */\n\tgetPressureRecommendation(now: number = Date.now()) {\n\t\treturn this.pressure.getRecommendation(now);\n\t}\n\n\t// =========================================================================\n\t// DECISION SUPPORT\n\t// =========================================================================\n\n\t/**\n\t * Determine if a snapshot should be created.\n\t * Uses centralized thresholds from constants.ts\n\t */\n\tshouldSnapshot(now: number = Date.now()): SnapshotDecision {\n\t\tconst vitals = this.current(now);\n\n\t\tif (vitals.trajectory === \"critical\") {\n\t\t\treturn {\n\t\t\t\tshould: true,\n\t\t\t\treason: \"Critical risk state - immediate snapshot recommended\",\n\t\t\t\turgency: \"critical\",\n\t\t\t};\n\t\t}\n\n\t\tif (vitals.pressure.value >= PRESSURE_THRESHOLDS.critical) {\n\t\t\treturn {\n\t\t\t\tshould: true,\n\t\t\t\treason: `High pressure (${vitals.pressure.value}%) - ${vitals.pressure.unsnapshotedChanges} unsaved changes`,\n\t\t\t\turgency: \"high\",\n\t\t\t};\n\t\t}\n\n\t\tif (vitals.pressure.criticalFilesTouched.length > 0 && vitals.oxygen.value < OXYGEN_THRESHOLDS.low) {\n\t\t\treturn {\n\t\t\t\tshould: true,\n\t\t\t\treason: `Critical files modified without snapshot: ${vitals.pressure.criticalFilesTouched.join(\", \")}`,\n\t\t\t\turgency: \"high\",\n\t\t\t};\n\t\t}\n\n\t\tif (vitals.temperature.level === \"burning\" && vitals.oxygen.value < OXYGEN_THRESHOLDS.moderate) {\n\t\t\treturn {\n\t\t\t\tshould: true,\n\t\t\t\treason: \"Heavy AI activity with low snapshot coverage\",\n\t\t\t\turgency: \"medium\",\n\t\t\t};\n\t\t}\n\n\t\tif (vitals.pressure.value >= PRESSURE_THRESHOLDS.moderate) {\n\t\t\treturn {\n\t\t\t\tshould: false,\n\t\t\t\treason: \"Consider snapshotting soon\",\n\t\t\t\turgency: \"low\",\n\t\t\t};\n\t\t}\n\n\t\treturn {\n\t\t\tshould: false,\n\t\t\treason: \"No immediate action needed\",\n\t\t\turgency: \"none\",\n\t\t};\n\t}\n\n\t/**\n\t * Get guidance for AI agents.\n\t */\n\tgetAgentGuidance(now: number = Date.now()): AgentGuidance {\n\t\tconst vitals = this.current(now);\n\t\tconst snapshotDecision = this.shouldSnapshot(now);\n\n\t\tconst blockedOps: string[] = [];\n\t\tif (vitals.trajectory === \"critical\") {\n\t\t\tblockedOps.push(\"delete\", \"refactor-large\", \"mass-rename\");\n\t\t}\n\n\t\tconst safeOps = [\"read\", \"analyze\", \"suggest\"];\n\t\tif (vitals.oxygen.value > 80 && vitals.pressure.value < 40) {\n\t\t\tsafeOps.push(\"write\", \"modify\", \"refactor-small\");\n\t\t}\n\n\t\treturn {\n\t\t\tshouldSnapshot: snapshotDecision.should,\n\t\t\tsnapshotReason: snapshotDecision.should ? snapshotDecision.reason : undefined,\n\t\t\triskyFiles: vitals.pressure.criticalFilesTouched,\n\t\t\tsafeOperations: safeOps,\n\t\t\tblockedOperations: blockedOps,\n\t\t\tsuggestion: this.getSuggestion(vitals),\n\t\t};\n\t}\n\n\t/**\n\t * Get threshold multiplier for dynamic risk adjustment.\n\t */\n\tgetThresholdMultiplier(now: number = Date.now()): number {\n\t\tconst vitals = this.current(now);\n\n\t\t// High temperature → more protective (lower threshold)\n\t\tconst tempMultiplier = {\n\t\t\tcold: 1.2,\n\t\t\twarm: 1.0,\n\t\t\thot: 0.8,\n\t\t\tburning: 0.6,\n\t\t}[vitals.temperature.level];\n\n\t\t// High oxygen → less protective (higher threshold)\n\t\tconst oxygenMultiplier = vitals.oxygen.value > 80 ? 1.2 : 1.0;\n\n\t\t// High pressure → more protective\n\t\tconst pressureMultiplier = vitals.pressure.value > 60 ? 0.8 : 1.0;\n\n\t\treturn tempMultiplier * oxygenMultiplier * pressureMultiplier;\n\t}\n\n\t// =========================================================================\n\t// PHASE 4: LEARNING & CALIBRATION\n\t// =========================================================================\n\n\t/**\n\t * Record user behavior for learning.\n\t * Call when user creates a snapshot to learn their patterns.\n\t */\n\trecordBehavior(userCreatedSnapshot: boolean, now: number = Date.now()): void {\n\t\tconst vitals = this.current(now);\n\t\tconst decision = this.shouldSnapshot(now);\n\n\t\t// Record observation\n\t\tthis.learner.recordObservation({\n\t\t\tvitals,\n\t\t\tuserCreatedSnapshot,\n\t\t\tvitalsRecommended: decision.should,\n\t\t});\n\n\t\t// Update calibration\n\t\tthis.calibrator.updateFromBehavior();\n\n\t\t// Record for trajectory prediction\n\t\tthis.predictor.recordSnapshots([vitals]);\n\t}\n\n\t/**\n\t * Get calibrated threshold adjustments.\n\t * Returns per-workspace learned adjustments (multipliers).\n\t */\n\tgetCalibratedThresholds(): ThresholdAdjustments {\n\t\treturn this.calibrator.getAdjustedThresholds();\n\t}\n\n\t/**\n\t * Get trajectory forecast.\n\t * Predicts future trajectory based on recent history.\n\t */\n\tgetForecast(): TrajectoryForecast {\n\t\treturn this.predictor.predict();\n\t}\n\n\t/**\n\t * Get user behavior statistics.\n\t */\n\tgetBehaviorStats() {\n\t\treturn this.learner.getStats();\n\t}\n\n\t/**\n\t * Get workspace calibration profile.\n\t */\n\tgetCalibrationProfile() {\n\t\treturn this.calibrator.getProfile();\n\t}\n\n\t/**\n\t * Reset learning data for this workspace.\n\t */\n\tresetLearning(): void {\n\t\tthis.calibrator.reset();\n\t\tthis.predictor.reset();\n\t}\n\n\t// =========================================================================\n\t// PHASE 2: BEHAVIORAL METADATA TRACKING\n\t// =========================================================================\n\n\t/**\n\t * Record a file edit event for behavioral analytics.\n\t */\n\trecordEdit(linesAdded: number, linesDeleted: number, timestamp: number = Date.now()): void {\n\t\tthis.behaviorTracker.recordEdit(linesAdded, linesDeleted, timestamp);\n\t}\n\n\t/**\n\t * Record a file save event.\n\t */\n\trecordFileSave(): void {\n\t\tthis.behaviorTracker.recordFileSave();\n\t}\n\n\t/**\n\t * Record a test execution result.\n\t */\n\trecordTest(passed: boolean, timestamp: number = Date.now()): void {\n\t\tthis.behaviorTracker.recordTest(passed, timestamp);\n\t}\n\n\t/**\n\t * Record an AI suggestion event.\n\t * @param accepted Whether the user accepted the AI suggestion\n\t */\n\trecordAISuggestion(accepted: boolean, timestamp: number = Date.now()): void {\n\t\tthis.behaviorTracker.recordAISuggestion(accepted, timestamp);\n\t}\n\n\t/**\n\t * Get current behavioral metadata.\n\t */\n\tgetBehavioralMetadata(now: number = Date.now()) {\n\t\treturn this.behaviorTracker.getMetadata(now);\n\t}\n\n\t// =========================================================================\n\t// PHASE DETECTION (Development Phase-Aware Thresholds)\n\t// =========================================================================\n\n\t/**\n\t * Set the current git branch for phase-aware calculations.\n\t * PhaseDetector uses branch naming patterns to adjust thresholds.\n\t * - hotfix/* → More protective (0.7x intervals, 1.5x risk)\n\t * - feature/* → Standard thresholds\n\t * - release/* → More protective (0.75x intervals, 1.3x risk)\n\t */\n\tsetCurrentBranch(branchName: string): void {\n\t\tthis.currentBranch = branchName;\n\t\t// Clear cached phase detection\n\t\tthis.phaseDetector.clearCache();\n\t}\n\n\t/**\n\t * Get current branch name.\n\t */\n\tgetCurrentBranch(): string {\n\t\treturn this.currentBranch;\n\t}\n\n\t/**\n\t * Get phase-aware risk multiplier for pressure calculations.\n\t * Hotfix branches return higher multipliers (more protective).\n\t * Feature branches return standard multipliers.\n\t */\n\tgetPhaseRiskMultiplier(): number {\n\t\treturn this.phaseDetector.getRiskMultiplier(this.currentBranch);\n\t}\n\n\t/**\n\t * Get phase-aware threshold multiplier for intervals.\n\t * Hotfix branches return lower multipliers (more frequent checks).\n\t */\n\tgetPhaseThresholdMultiplier(): number {\n\t\treturn this.phaseDetector.getThresholdMultiplier(this.currentBranch);\n\t}\n\n\t/**\n\t * Get the detected development phase for current branch.\n\t */\n\tgetDetectedPhase(): ReturnType<typeof this.phaseDetector.detectPhase> {\n\t\treturn this.phaseDetector.detectPhase(this.currentBranch);\n\t}\n\n\t/**\n\t * Check if current phase requires more frequent snapshots.\n\t */\n\trequiresFrequentSnapshots(): boolean {\n\t\treturn this.phaseDetector.requiresFrequentSnapshots(this.currentBranch);\n\t}\n\n\t/**\n\t * Get combined threshold multiplier (calibrator + phase).\n\t * This is the primary method for adaptive thresholds.\n\t */\n\tgetCombinedThresholdMultiplier(now: number = Date.now()): number {\n\t\tconst baseMultiplier = this.getThresholdMultiplier(now);\n\t\tconst phaseMultiplier = this.getPhaseThresholdMultiplier();\n\t\treturn baseMultiplier * phaseMultiplier;\n\t}\n\n\t// =========================================================================\n\t// INTERNAL\n\t// =========================================================================\n\n\tprivate calculateTrajectory(\n\t\tpulse: VitalsSnapshot[\"pulse\"],\n\t\ttemp: VitalsSnapshot[\"temperature\"],\n\t\tpressure: VitalsSnapshot[\"pressure\"],\n\t\toxygen: VitalsSnapshot[\"oxygen\"],\n\t): Trajectory {\n\t\t// Critical: High pressure + Burning temp + Low oxygen\n\t\tif (\n\t\t\tpressure.value >= TRAJECTORY_THRESHOLDS.criticalPressure &&\n\t\t\ttemp.level === \"burning\" &&\n\t\t\toxygen.value < TRAJECTORY_THRESHOLDS.criticalOxygen\n\t\t) {\n\t\t\treturn \"critical\";\n\t\t}\n\n\t\t// Escalating: Rising pressure or heat without coverage\n\t\tif (\n\t\t\t(pressure.value >= TRAJECTORY_THRESHOLDS.escalatingPressure &&\n\t\t\t\toxygen.value < TRAJECTORY_THRESHOLDS.escalatingOxygen) ||\n\t\t\t(temp.level === \"hot\" && pulse.level === \"racing\")\n\t\t) {\n\t\t\treturn \"escalating\";\n\t\t}\n\n\t\t// Recovering: Decreasing pressure, good oxygen\n\t\tconst recentHistory = this.history.slice(-5);\n\t\tif (recentHistory.length >= 3) {\n\t\t\tconst latestPressure = recentHistory[recentHistory.length - 1]?.pressure.value ?? 0;\n\t\t\tconst earliestPressure = recentHistory[0]?.pressure.value ?? 0;\n\t\t\tconst pressureTrend = latestPressure - earliestPressure;\n\t\t\tif (\n\t\t\t\tpressureTrend < -TRAJECTORY_THRESHOLDS.recoveringPressureDrop &&\n\t\t\t\toxygen.value >= TRAJECTORY_THRESHOLDS.recoveringOxygen\n\t\t\t) {\n\t\t\t\treturn \"recovering\";\n\t\t\t}\n\t\t}\n\n\t\treturn \"stable\";\n\t}\n\n\tprivate getSuggestion(vitals: VitalsSnapshot): string {\n\t\tif (vitals.trajectory === \"critical\") {\n\t\t\treturn \"STOP: Create a checkpoint before making more changes\";\n\t\t}\n\t\tif (vitals.trajectory === \"escalating\") {\n\t\t\treturn \"Consider creating a snapshot - risk is accumulating\";\n\t\t}\n\t\tif (vitals.pressure.value >= PRESSURE_THRESHOLDS.critical) {\n\t\t\treturn \"High pressure - create a snapshot before continuing\";\n\t\t}\n\t\tif (vitals.pressure.value >= PRESSURE_THRESHOLDS.moderate) {\n\t\t\treturn \"Moderate pressure - consider creating a snapshot soon\";\n\t\t}\n\t\tif (vitals.temperature.level === \"burning\") {\n\t\t\treturn \"Heavy AI activity detected - extra caution recommended\";\n\t\t}\n\t\tif (vitals.oxygen.value < OXYGEN_THRESHOLDS.low) {\n\t\t\treturn \"Low snapshot coverage - protect your work\";\n\t\t}\n\t\treturn \"Proceed normally\";\n\t}\n\n\tprivate checkAndEmit(now: number): void {\n\t\tconst vitals = this.current(now);\n\t\tconst decision = this.shouldSnapshot(now);\n\n\t\tif (decision.urgency === \"critical\") {\n\t\t\tthis.emit(\"critical\", vitals);\n\t\t} else if (decision.urgency === \"high\") {\n\t\t\tthis.emit(\"warning\", vitals);\n\t\t}\n\n\t\tthis.emit(\"update\", vitals);\n\t}\n}\n","/**\n * Intelligence Facade\n *\n * Main entry point for @snapback/intelligence.\n * Provides unified access to all intelligence capabilities:\n * - Context retrieval (getContext, semanticSearch)\n * - Validation (checkPatterns, validateCode)\n * - Learning (reportViolation, queryLearnings, recordLearning)\n *\n * Same algorithms, different configs:\n * - Internal use: rootDir='ai_dev_utils'\n * - Product use: rootDir=workspace\n */\n\nimport {\n\ttype FileModification as ContractsFileModification,\n\tfromIntelligenceFileModification,\n} from \"@snapback/contracts\";\nimport { AdvisoryEngine } from \"./advisory/AdvisoryEngine.js\";\nimport { ContextEngine } from \"./context/ContextEngine.js\";\nimport { LearningEngine } from \"./learning/LearningEngine.js\";\nimport { ViolationTracker } from \"./learning/ViolationTracker.js\";\nimport { SessionManager } from \"./session/SessionManager.js\";\nimport { ConfigStore } from \"./storage/ConfigStore.js\";\nimport type { AdvisoryContext, AdvisoryTriggerContext, FileHistory } from \"./types/advisory.js\";\nimport type { CacheableContext, IntelligenceConfig, ResolvedConfig } from \"./types/config.js\";\nimport { IntelligenceConfigSchema } from \"./types/config.js\";\nimport type {\n\tContextInput,\n\tContextResult,\n\tFeedbackInput,\n\tInteraction,\n\tLearning,\n\tLearningInput,\n\tLearningStats,\n\tSearchResult,\n\tViolationInput,\n\tViolationStatus,\n\tViolationsSummary,\n} from \"./types/index.js\";\nimport type { AgentGuidance, SnapshotDecision, VitalsConfig, VitalsSnapshot } from \"./types/vitals.js\";\nimport type { ThresholdAdjustments, TrajectoryForecast, WorkspaceProfile } from \"./types/vitals-learning.js\";\nimport type { PipelineResult } from \"./validation/ValidationPipeline.js\";\nimport { ValidationPipeline } from \"./validation/ValidationPipeline.js\";\nimport { WorkspaceVitals } from \"./vitals/WorkspaceVitals.js\";\n\n/**\n * Intelligence - Unified AI-assisted development intelligence\n *\n * @example\n * ```typescript\n * const intel = new Intelligence({\n * rootDir: 'ai_dev_utils',\n * enableSemanticSearch: false,\n * enableLearningLoop: true,\n * });\n *\n * // Get context before implementing\n * const context = await intel.getContext({\n * task: \"Add authentication to MCP server\",\n * keywords: [\"auth\", \"api-key\"],\n * });\n *\n * // Validate code before committing\n * const validation = await intel.checkPatterns(code, \"apps/mcp-server/src/auth.ts\");\n *\n * // Report violations for learning\n * await intel.reportViolation({\n * type: \"layer-boundary-violation\",\n * file: \"apps/vscode/src/auth.ts\",\n * message: \"Imported infrastructure directly\",\n * reason: \"Didn't check layer boundaries\",\n * prevention: \"Use @snapback/core instead\",\n * });\n * ```\n */\nexport class Intelligence {\n\tprivate config: ResolvedConfig;\n\tprivate configStore: ConfigStore;\n\tprivate contextEngine: ContextEngine;\n\tprivate validationPipeline: ValidationPipeline;\n\tprivate learningEngine: LearningEngine;\n\tprivate violationTracker: ViolationTracker;\n\tprivate sessionManager: SessionManager;\n\tprivate advisoryEngine: AdvisoryEngine;\n\tprivate initialized = false;\n\n\tconstructor(config: IntelligenceConfig) {\n\t\tthis.config = this.resolveConfig(config);\n\t\tthis.configStore = new ConfigStore(this.config);\n\t\tthis.contextEngine = new ContextEngine(this.config, this.configStore);\n\n\t\t// Initialize ValidationPipeline with enhanced mode if requested\n\t\tthis.validationPipeline = new ValidationPipeline({\n\t\t\tenhanced: config.enhancedValidation ?? false,\n\t\t\tuseDynamicConfidence: config.enhancedValidation ?? false,\n\t\t\tworkspaceRoot: config.rootDir,\n\t\t});\n\n\t\tthis.learningEngine = new LearningEngine(this.config);\n\t\tthis.violationTracker = new ViolationTracker(this.config);\n\t\tthis.sessionManager = new SessionManager(config.sessionLimits, {\n\t\t\tpersistencePath: config.sessionPersistence?.path,\n\t\t\tautosave: config.sessionPersistence?.autosave ?? true,\n\t\t});\n\t\tthis.advisoryEngine = new AdvisoryEngine(config.advisoryConfig);\n\t}\n\n\t/**\n\t * Initialize async resources (embeddings, database)\n\t * Call once before using semantic features\n\t */\n\tasync initialize(): Promise<void> {\n\t\tif (this.initialized) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.config.enableSemanticSearch) {\n\t\t\tawait this.contextEngine.initialize();\n\t\t}\n\n\t\tthis.initialized = true;\n\t}\n\n\t// =========================================================================\n\t// CONTEXT RETRIEVAL\n\t// =========================================================================\n\n\t/**\n\t * Get relevant context for a task\n\t * Primary entry point - used before implementing anything\n\t */\n\tasync getContext(params: ContextInput): Promise<ContextResult> {\n\t\treturn this.contextEngine.getContext(params);\n\t}\n\n\t/**\n\t * Semantic search across indexed content\n\t * Requires initialization with enableSemanticSearch: true\n\t */\n\tasync semanticSearch(_query: string, _maxTokens?: number): Promise<SearchResult> {\n\t\tif (!this.config.enableSemanticSearch) {\n\t\t\tthrow new Error(\"Semantic search not enabled. Set enableSemanticSearch: true\");\n\t\t}\n\t\t// Semantic search implementation would go here\n\t\t// For now, return empty result\n\t\treturn {\n\t\t\tcontext: \"\",\n\t\t\ttokensUsed: 0,\n\t\t\tsectionsIncluded: 0,\n\t\t\tcompressionRatio: 0,\n\t\t};\n\t}\n\n\t// =========================================================================\n\t// VALIDATION\n\t// =========================================================================\n\n\t/**\n\t * Validate code against patterns and constraints\n\t * Used before committing\n\t */\n\tasync checkPatterns(code: string, filePath: string): Promise<PipelineResult> {\n\t\treturn this.validationPipeline.validate(code, filePath);\n\t}\n\n\t/**\n\t * Full 7-layer validation with confidence score\n\t * Alias for checkPatterns\n\t */\n\tasync validateCode(code: string, filePath: string): Promise<PipelineResult> {\n\t\treturn this.validationPipeline.validate(code, filePath);\n\t}\n\n\t/**\n\t * Quick check - returns true if code passes all critical checks\n\t */\n\tasync quickCheck(code: string, filePath: string): Promise<boolean> {\n\t\treturn this.validationPipeline.quickCheck(code, filePath);\n\t}\n\n\t// =========================================================================\n\t// LEARNING\n\t// =========================================================================\n\n\t/**\n\t * Report a violation for tracking\n\t * Auto-promotes at 3x, auto-marks for automation at 5x\n\t */\n\tasync reportViolation(violation: ViolationInput): Promise<ViolationStatus> {\n\t\treturn this.violationTracker.report(violation);\n\t}\n\n\t/**\n\t * Search learnings database\n\t */\n\tqueryLearnings(keywords: string[]): Learning[] {\n\t\treturn this.learningEngine.query(keywords);\n\t}\n\n\t/**\n\t * Record a new learning\n\t */\n\tasync recordLearning(learning: LearningInput): Promise<{ id: string }> {\n\t\treturn this.learningEngine.record(learning);\n\t}\n\n\t/**\n\t * Log an AI interaction for analysis\n\t */\n\tasync logInteraction(data: {\n\t\tquery: string;\n\t\tcontextUsed: string[];\n\t\ttoolsCalled: string[];\n\t\toutput: string;\n\t\tvalidationPassed?: boolean;\n\t\tconfidence?: number;\n\t}): Promise<Interaction> {\n\t\treturn this.learningEngine.logInteraction(data);\n\t}\n\n\t/**\n\t * Record human feedback on an interaction\n\t */\n\tasync recordFeedback(\n\t\tinteractionId: string,\n\t\tfeedback: FeedbackInput,\n\t): Promise<{ updated: boolean; addedToGolden: boolean }> {\n\t\treturn this.learningEngine.recordFeedback(interactionId, feedback);\n\t}\n\n\t/**\n\t * Get learning statistics\n\t */\n\tgetStats(): LearningStats {\n\t\treturn this.learningEngine.getStats();\n\t}\n\n\t/**\n\t * Get violations summary with promotion status\n\t */\n\tgetViolationsSummary(): ViolationsSummary {\n\t\treturn this.violationTracker.getSummary();\n\t}\n\n\t// =========================================================================\n\t// VITALS (Adaptive Risk Sensing)\n\t// =========================================================================\n\n\t/**\n\t * Get or create WorkspaceVitals instance for a workspace\n\t * Singleton per workspaceId\n\t */\n\tgetVitals(workspaceId: string, config?: Partial<VitalsConfig>): WorkspaceVitals {\n\t\treturn WorkspaceVitals.for(workspaceId, config);\n\t}\n\n\t/**\n\t * Get current vitals snapshot for a workspace\n\t */\n\tgetVitalsSnapshot(workspaceId: string): VitalsSnapshot | null {\n\t\tconst vitals = WorkspaceVitals.tryGet(workspaceId);\n\t\treturn vitals?.current() ?? null;\n\t}\n\n\t/**\n\t * Get snapshot decision based on current vitals\n\t */\n\tshouldSnapshot(workspaceId: string): SnapshotDecision | null {\n\t\tconst vitals = WorkspaceVitals.tryGet(workspaceId);\n\t\treturn vitals?.shouldSnapshot() ?? null;\n\t}\n\n\t/**\n\t * Get agent guidance based on current vitals\n\t */\n\tgetAgentGuidance(workspaceId: string): AgentGuidance | null {\n\t\tconst vitals = WorkspaceVitals.tryGet(workspaceId);\n\t\treturn vitals?.getAgentGuidance() ?? null;\n\t}\n\n\t// =========================================================================\n\t// VITALS PHASE 4: Learning & Calibration\n\t// =========================================================================\n\n\t/**\n\t * Record user behavior for learning\n\t * Call when user creates/acknowledges a snapshot\n\t */\n\trecordBehavior(workspaceId: string, userCreatedSnapshot: boolean): void {\n\t\tconst vitals = WorkspaceVitals.tryGet(workspaceId);\n\t\tvitals?.recordBehavior(userCreatedSnapshot);\n\t}\n\n\t/**\n\t * Get calibrated thresholds based on learned user behavior\n\t */\n\tgetCalibratedThresholds(workspaceId: string): ThresholdAdjustments | null {\n\t\tconst vitals = WorkspaceVitals.tryGet(workspaceId);\n\t\treturn vitals?.getCalibratedThresholds() ?? null;\n\t}\n\n\t/**\n\t * Get trajectory forecast (5/10 minute predictions)\n\t */\n\tgetForecast(workspaceId: string): TrajectoryForecast | null {\n\t\tconst vitals = WorkspaceVitals.tryGet(workspaceId);\n\t\treturn vitals?.getForecast() ?? null;\n\t}\n\n\t/**\n\t * Get user behavior statistics\n\t */\n\tgetBehaviorStats(workspaceId: string): ReturnType<WorkspaceVitals[\"getBehaviorStats\"]> | null {\n\t\tconst vitals = WorkspaceVitals.tryGet(workspaceId);\n\t\treturn vitals?.getBehaviorStats() ?? null;\n\t}\n\n\t/**\n\t * Get calibration profile for workspace\n\t */\n\tgetCalibrationProfile(workspaceId: string): WorkspaceProfile | null {\n\t\tconst vitals = WorkspaceVitals.tryGet(workspaceId);\n\t\treturn vitals?.getCalibrationProfile() ?? null;\n\t}\n\n\t/**\n\t * Reset learning data for workspace\n\t */\n\tresetLearning(workspaceId: string): void {\n\t\tconst vitals = WorkspaceVitals.tryGet(workspaceId);\n\t\tvitals?.resetLearning();\n\t}\n\n\t// =========================================================================\n\t// VITALS PHASE 2: Behavioral Metadata\n\t// =========================================================================\n\n\t/**\n\t * Record a file edit event\n\t * @param workspaceId Workspace identifier\n\t * @param linesAdded Number of lines added\n\t * @param linesDeleted Number of lines deleted\n\t */\n\trecordEdit(workspaceId: string, linesAdded: number, linesDeleted: number): void {\n\t\tconst vitals = WorkspaceVitals.tryGet(workspaceId);\n\t\tvitals?.recordEdit(linesAdded, linesDeleted);\n\t}\n\n\t/**\n\t * Record a file save event\n\t */\n\trecordFileSave(workspaceId: string): void {\n\t\tconst vitals = WorkspaceVitals.tryGet(workspaceId);\n\t\tvitals?.recordFileSave();\n\t}\n\n\t/**\n\t * Record a test execution result\n\t * @param workspaceId Workspace identifier\n\t * @param passed Whether the test passed\n\t */\n\trecordTestResult(workspaceId: string, passed: boolean): void {\n\t\tconst vitals = WorkspaceVitals.tryGet(workspaceId);\n\t\tvitals?.recordTest(passed);\n\t}\n\n\t/**\n\t * Record an AI suggestion event\n\t * @param workspaceId Workspace identifier\n\t * @param accepted Whether the user accepted the suggestion\n\t */\n\trecordAISuggestionResponse(workspaceId: string, accepted: boolean): void {\n\t\tconst vitals = WorkspaceVitals.tryGet(workspaceId);\n\t\tvitals?.recordAISuggestion(accepted);\n\t}\n\n\t/**\n\t * Get current behavioral metadata for a workspace\n\t */\n\tgetBehavioralMetadata(workspaceId: string): ReturnType<WorkspaceVitals[\"getBehavioralMetadata\"]> | null {\n\t\tconst vitals = WorkspaceVitals.tryGet(workspaceId);\n\t\treturn vitals?.getBehavioralMetadata() ?? null;\n\t}\n\n\t// =========================================================================\n\t// SESSION MANAGEMENT (Phase 1)\n\t// =========================================================================\n\n\t/**\n\t * Start a new LLM session\n\t */\n\tstartSession(\n\t\tsessionId: string,\n\t\tmetadata?: {\n\t\t\tworkspaceId?: string;\n\t\t\tuserId?: string;\n\t\t\ttags?: string[];\n\t\t},\n\t): void {\n\t\tthis.sessionManager.startSession(sessionId, metadata);\n\t}\n\n\t/**\n\t * Record a tool call in the session\n\t * Returns true if allowed, false if blocked (circuit breaker/loop)\n\t */\n\trecordToolCall(sessionId: string, call: import(\"./types/session.js\").ToolCall): boolean {\n\t\treturn this.sessionManager.recordToolCall(sessionId, call);\n\t}\n\n\t/**\n\t * Record a file modification\n\t */\n\trecordFileModification(sessionId: string, mod: import(\"./types/session.js\").FileModification): void {\n\t\tthis.sessionManager.recordFileModification(sessionId, mod);\n\t}\n\n\t/**\n\t * Detect loops in session behavior\n\t */\n\tdetectLoop(sessionId: string): import(\"./types/session.js\").LoopDetectionResult {\n\t\treturn this.sessionManager.detectLoop(sessionId);\n\t}\n\n\t/**\n\t * Get session analytics\n\t */\n\tgetSessionAnalytics(sessionId: string): import(\"./types/session.js\").SessionAnalytics | null {\n\t\treturn this.sessionManager.getAnalytics(sessionId);\n\t}\n\n\t/**\n\t * End a session and get analytics\n\t */\n\tendSession(sessionId: string): import(\"./types/session.js\").SessionAnalytics | null {\n\t\treturn this.sessionManager.endSession(sessionId);\n\t}\n\n\t/**\n\t * Get file modifications for a session\n\t * Returns canonical FileModification type from @snapback/contracts\n\t * @param sessionId - Session to query\n\t * @param since - Optional timestamp filter (return modifications >= since)\n\t */\n\tgetFileModifications(sessionId: string, since?: number): ContractsFileModification[] {\n\t\tconst mods = this.sessionManager.getFileModifications(sessionId, since);\n\t\treturn mods.map((mod) => fromIntelligenceFileModification(mod, \"extension\"));\n\t}\n\n\t// =========================================================================\n\t// ADVISORY CONTEXT\n\t// =========================================================================\n\n\t/**\n\t * Enrich context with advisory guidance\n\t * Used to add warnings/suggestions to tool responses\n\t */\n\tenrichAdvisory(context: AdvisoryTriggerContext): AdvisoryContext {\n\t\treturn this.advisoryEngine.enrich(context);\n\t}\n\n\t/**\n\t * Get file history for a specific file\n\t */\n\tgetFileHistory(file: string): FileHistory {\n\t\treturn this.advisoryEngine.getFileHistory(file);\n\t}\n\n\t// =========================================================================\n\t// CACHING (for Anthropic prompt caching)\n\t// =========================================================================\n\n\t/**\n\t * Get static context suitable for prompt caching\n\t * Content changes rarely - cache for 5+ minutes\n\t */\n\tgetStaticContext(): CacheableContext {\n\t\treturn this.configStore.getStaticContext();\n\t}\n\n\t// =========================================================================\n\t// UTILITIES\n\t// =========================================================================\n\n\t/**\n\t * Resolve config with defaults using Zod schema\n\t */\n\tprivate resolveConfig(config: IntelligenceConfig): ResolvedConfig {\n\t\treturn IntelligenceConfigSchema.parse(config);\n\t}\n\n\t/**\n\t * Get the resolved configuration\n\t */\n\tgetConfig(): ResolvedConfig {\n\t\treturn this.config;\n\t}\n\n\t/**\n\t * Dispose resources\n\t */\n\tasync dispose(): Promise<void> {\n\t\tawait this.contextEngine.dispose();\n\t\tthis.initialized = false;\n\t}\n}\n","/**\n * 3-Layer Confidence Scoring\n *\n * Per ADR specification, confidence is calculated from three signal layers:\n * Layer 1: Retrieval Confidence (from search results - semantic/keyword scores)\n * Layer 2: Historical Confidence (from outcomes - success rate, usage)\n * Layer 3: Action Confidence (from context - authority, status, recency)\n *\n * @module confidence\n */\n\nimport { calculateWeightedScore, clampScore } from \"@snapback/core\";\nimport type { Chunk, HistoricalSignals, KnowledgeStore, OutcomeType } from \"./store.js\";\n\nexport interface ConfidenceScore {\n\toverall: number;\n\tlayers: {\n\t\tretrieval: number;\n\t\thistorical: number;\n\t\taction: number;\n\t};\n\tfactors: {\n\t\tcrossAgreement: boolean;\n\t\tsemanticSimilarity: number;\n\t\tsuccessRate: number;\n\t\trecentUsage: boolean;\n\t\tcontextMatch: number;\n\t};\n}\n\nexport interface OutcomeStats {\n\ttotal: number;\n\taccepted: number;\n\tignored: number;\n\ttestPass: number;\n\ttestFail: number;\n\tviolationPrevented: number;\n\tsuccessRate: number;\n\tlastOutcome: string | null;\n}\n\nexport class ConfidenceCalculator {\n\tconstructor(private store: KnowledgeStore) {}\n\n\t/**\n\t * Calculate confidence for a retrieval result\n\t */\n\tcalculate(\n\t\tchunk: Chunk,\n\t\tretrievalFactors: {\n\t\t\tsemanticRank?: number;\n\t\t\tsemanticSimilarity?: number;\n\t\t\tkeywordRank?: number;\n\t\t\ttotalResults: number;\n\t\t},\n\t\tcontext?: {\n\t\t\ttaskType?: string;\n\t\t\tfileTypes?: string[];\n\t\t\trecentViolations?: string[];\n\t\t},\n\t): ConfidenceScore {\n\t\t// Layer 1: Retrieval Confidence\n\t\tconst retrieval = this.calculateRetrievalConfidence(retrievalFactors);\n\n\t\t// Layer 2: Historical Confidence\n\t\tconst historical = this.calculateHistoricalConfidence(chunk.id);\n\n\t\t// Layer 3: Action Confidence\n\t\tconst action = this.calculateActionConfidence(chunk, context);\n\n\t\t// Weighted combination using shared utility\n\t\tconst overall = calculateWeightedScore(\n\t\t\t{ retrieval: retrieval.score, historical: historical.score, action: action.score },\n\t\t\t{ retrieval: 0.4, historical: 0.35, action: 0.25 },\n\t\t);\n\n\t\treturn {\n\t\t\toverall: clampScore(overall),\n\t\t\tlayers: {\n\t\t\t\tretrieval: retrieval.score,\n\t\t\t\thistorical: historical.score,\n\t\t\t\taction: action.score,\n\t\t\t},\n\t\t\tfactors: {\n\t\t\t\tcrossAgreement: retrieval.crossAgreement,\n\t\t\t\tsemanticSimilarity: retrievalFactors.semanticSimilarity || 0,\n\t\t\t\tsuccessRate: historical.successRate,\n\t\t\t\trecentUsage: historical.recentUsage,\n\t\t\t\tcontextMatch: action.contextMatch,\n\t\t\t},\n\t\t};\n\t}\n\n\t/**\n\t * Layer 1: Retrieval Confidence\n\t */\n\tprivate calculateRetrievalConfidence(factors: {\n\t\tsemanticRank?: number;\n\t\tsemanticSimilarity?: number;\n\t\tkeywordRank?: number;\n\t\ttotalResults: number;\n\t}): { score: number; crossAgreement: boolean } {\n\t\tlet score = 0.5; // Base score\n\n\t\t// Cross-agreement: found by both semantic AND keyword\n\t\tconst crossAgreement = factors.semanticRank !== undefined && factors.keywordRank !== undefined;\n\t\tif (crossAgreement) {\n\t\t\tscore += 0.2;\n\t\t}\n\n\t\t// Semantic similarity bonus\n\t\tif (factors.semanticSimilarity) {\n\t\t\tif (factors.semanticSimilarity > 0.8) {\n\t\t\t\tscore += 0.2;\n\t\t\t} else if (factors.semanticSimilarity > 0.6) {\n\t\t\t\tscore += 0.1;\n\t\t\t} else if (factors.semanticSimilarity > 0.4) {\n\t\t\t\tscore += 0.05;\n\t\t\t}\n\t\t}\n\n\t\t// Rank bonus (top results get bonus)\n\t\tconst bestRank = Math.min(\n\t\t\tfactors.semanticRank || Number.POSITIVE_INFINITY,\n\t\t\tfactors.keywordRank || Number.POSITIVE_INFINITY,\n\t\t);\n\t\tif (bestRank === 1) {\n\t\t\tscore += 0.1;\n\t\t} else if (bestRank <= 3) {\n\t\t\tscore += 0.05;\n\t\t}\n\n\t\t// Score margin (if we're one of few results, more confident)\n\t\tif (factors.totalResults <= 3) {\n\t\t\tscore += 0.05;\n\t\t}\n\n\t\treturn { score: Math.min(1.0, score), crossAgreement };\n\t}\n\n\t/**\n\t * Layer 2: Historical Confidence\n\t */\n\tprivate calculateHistoricalConfidence(chunkId: string): {\n\t\tscore: number;\n\t\tsuccessRate: number;\n\t\trecentUsage: boolean;\n\t} {\n\t\tconst stats = this.getOutcomeStats(chunkId);\n\n\t\t// Not enough data - return neutral confidence\n\t\tif (stats.total < 3) {\n\t\t\treturn { score: 0.5, successRate: 0.5, recentUsage: false };\n\t\t}\n\n\t\t// Success rate (accepted + testPass + violationPrevented vs total)\n\t\tconst successes = stats.accepted + stats.testPass + stats.violationPrevented;\n\t\tconst failures = stats.ignored + stats.testFail;\n\t\tconst successRate = successes / (successes + failures) || 0.5;\n\n\t\t// Recent usage boost\n\t\tconst recentUsage = this.hasRecentOutcome(chunkId, 7); // Last 7 days\n\n\t\t// Calculate score\n\t\tlet score = 0.3 + successRate * 0.5; // 0.3 to 0.8 based on success rate\n\t\tif (recentUsage) {\n\t\t\tscore += 0.1;\n\t\t}\n\n\t\t// Penalty for high failure rate\n\t\tif (stats.testFail > stats.testPass) {\n\t\t\tscore -= 0.2;\n\t\t}\n\n\t\treturn {\n\t\t\tscore: Math.min(1.0, Math.max(0, score)),\n\t\t\tsuccessRate,\n\t\t\trecentUsage,\n\t\t};\n\t}\n\n\t/**\n\t * Layer 3: Action Confidence\n\t */\n\tprivate calculateActionConfidence(\n\t\tchunk: Chunk,\n\t\tcontext?: {\n\t\t\ttaskType?: string;\n\t\t\tfileTypes?: string[];\n\t\t\trecentViolations?: string[];\n\t\t},\n\t): { score: number; contextMatch: number } {\n\t\tlet score = 0.5;\n\t\tlet contextMatch = 0;\n\n\t\t// Status check\n\t\tif (chunk.status !== \"active\") {\n\t\t\tscore -= 0.3;\n\t\t}\n\n\t\t// Authority bonus\n\t\tscore += chunk.authority * 0.2;\n\n\t\t// Context matching (if provided)\n\t\tif (context) {\n\t\t\tconst chunkText = `${chunk.chunk_text} ${chunk.context_text || \"\"}`.toLowerCase();\n\n\t\t\t// Task type match\n\t\t\tif (context.taskType && chunkText.includes(context.taskType.toLowerCase())) {\n\t\t\t\tcontextMatch += 0.3;\n\t\t\t}\n\n\t\t\t// File type relevance\n\t\t\tif (context.fileTypes) {\n\t\t\t\tconst fileMatches = context.fileTypes.filter((ft) => chunkText.includes(ft.toLowerCase()));\n\t\t\t\tcontextMatch += Math.min(0.3, fileMatches.length * 0.1);\n\t\t\t}\n\n\t\t\t// Recent violation prevention\n\t\t\tif (context.recentViolations) {\n\t\t\t\tconst violationMatches = context.recentViolations.filter((v) => chunkText.includes(v.toLowerCase()));\n\t\t\t\tcontextMatch += Math.min(0.4, violationMatches.length * 0.2);\n\t\t\t}\n\n\t\t\tscore += contextMatch;\n\t\t}\n\n\t\treturn {\n\t\t\tscore: Math.min(1.0, Math.max(0, score)),\n\t\t\tcontextMatch,\n\t\t};\n\t}\n\n\t/**\n\t * Get outcome statistics for a chunk\n\t */\n\tgetOutcomeStats(chunkId: string): OutcomeStats {\n\t\tconst stmt = (this.store as any).db.prepare(`\n SELECT\n outcome_type,\n COUNT(*) as count,\n MAX(created_at) as last_at\n FROM outcomes\n WHERE chunk_id = ?\n GROUP BY outcome_type\n `);\n\n\t\tconst rows = stmt.all(chunkId) as Array<{\n\t\t\toutcome_type: string;\n\t\t\tcount: number;\n\t\t\tlast_at: string;\n\t\t}>;\n\n\t\tconst stats: OutcomeStats = {\n\t\t\ttotal: 0,\n\t\t\taccepted: 0,\n\t\t\tignored: 0,\n\t\t\ttestPass: 0,\n\t\t\ttestFail: 0,\n\t\t\tviolationPrevented: 0,\n\t\t\tsuccessRate: 0.5,\n\t\t\tlastOutcome: null,\n\t\t};\n\n\t\tlet latestDate = \"\";\n\n\t\tfor (const row of rows) {\n\t\t\tstats.total += row.count;\n\n\t\t\tswitch (row.outcome_type) {\n\t\t\t\tcase \"accepted\":\n\t\t\t\t\tstats.accepted = row.count;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"ignored\":\n\t\t\t\t\tstats.ignored = row.count;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"test_pass\":\n\t\t\t\t\tstats.testPass = row.count;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"test_fail\":\n\t\t\t\t\tstats.testFail = row.count;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"violation_prevented\":\n\t\t\t\t\tstats.violationPrevented = row.count;\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tif (row.last_at > latestDate) {\n\t\t\t\tlatestDate = row.last_at;\n\t\t\t\tstats.lastOutcome = row.outcome_type;\n\t\t\t}\n\t\t}\n\n\t\tif (stats.total > 0) {\n\t\t\tconst successes = stats.accepted + stats.testPass + stats.violationPrevented;\n\t\t\tstats.successRate = successes / stats.total;\n\t\t}\n\n\t\treturn stats;\n\t}\n\n\t/**\n\t * Check if chunk has recent outcome\n\t */\n\tprivate hasRecentOutcome(chunkId: string, days: number): boolean {\n\t\tconst stmt = (this.store as any).db.prepare(`\n SELECT 1 FROM outcomes\n WHERE chunk_id = ?\n AND created_at > datetime('now', '-' || ? || ' days')\n LIMIT 1\n `);\n\n\t\treturn stmt.get(chunkId, days) !== undefined;\n\t}\n\n\t/**\n\t * Record an outcome for a chunk\n\t */\n\trecordOutcome(\n\t\tchunkId: string,\n\t\toutcomeType: OutcomeType,\n\t\tcontext?: { task?: string; files?: string[]; query?: string; sessionId?: string },\n\t): void {\n\t\tconst stmt = (this.store as any).db.prepare(`\n INSERT INTO outcomes (id, chunk_id, outcome_type, context, session_id)\n VALUES (?, ?, ?, ?, ?)\n `);\n\n\t\tconst id = `out_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;\n\n\t\tstmt.run(id, chunkId, outcomeType, context ? JSON.stringify(context) : null, context?.sessionId || null);\n\t}\n}\n\n// ============================================================\n// METADATA-AWARE CONFIDENCE (Per ADR Specification)\n// ============================================================\n\n/**\n * Source type authority weights\n * Per ADR: adr > curated/pattern > user/learning > auto/violation\n */\nexport const SOURCE_TYPE_WEIGHTS: Record<string, number> = {\n\tadr: 1.0,\n\tpattern: 0.85,\n\tlearning: 0.7,\n\tviolation: 0.5,\n};\n\n/**\n * Status penalties for deprecated/superseded content\n */\nexport const STATUS_PENALTIES: Record<string, number> = {\n\tactive: 0,\n\tdeprecated: 0.3,\n\tsuperseded: 0.5,\n};\n\n/**\n * Recency half-life in days for time decay\n */\nexport const RECENCY_HALF_LIFE_DAYS = 30;\n\n/**\n * Calculate metadata-based reranking boost\n * Per ADR: combines authority, status, and recency signals\n */\nexport function calculateMetadataBoost(chunk: Chunk): number {\n\t// Base authority from source type\n\tconst sourceWeight = SOURCE_TYPE_WEIGHTS[chunk.source_type] ?? 0.5;\n\n\t// Blend with explicit authority field\n\tconst authorityScore = (chunk.authority + sourceWeight) / 2;\n\n\t// Apply status penalty\n\tconst statusPenalty = STATUS_PENALTIES[chunk.status] ?? 0;\n\tconst statusFactor = 1 - statusPenalty;\n\n\t// Calculate recency factor using exponential decay\n\tconst updatedDate = new Date(chunk.updated_at);\n\tconst daysSinceUpdate = (Date.now() - updatedDate.getTime()) / (1000 * 60 * 60 * 24);\n\tconst recencyFactor = Math.exp((-Math.LN2 * daysSinceUpdate) / RECENCY_HALF_LIFE_DAYS);\n\n\t// Combine: 60% authority, 20% status, 20% recency\n\tconst boost = authorityScore * 0.6 * statusFactor + statusFactor * 0.2 + recencyFactor * 0.2;\n\n\treturn Math.max(0.1, Math.min(1.0, boost));\n}\n\n/**\n * Calculate historical signals boost from outcome tracking\n * Per ADR: uses success_rate, violation_count, access_count\n */\nexport function calculateHistoricalBoost(signals: HistoricalSignals): number {\n\t// Base from success rate (already 0-1)\n\tlet boost = signals.successRate;\n\n\t// Bonus for violation prevention (high-value signal)\n\tif (signals.violationCount > 0) {\n\t\tboost += Math.min(0.15, signals.violationCount * 0.05);\n\t}\n\n\t// Usage factor: logarithmic scaling to prevent runaway\n\tconst usageBonus = Math.min(0.1, Math.log10(signals.accessCount + 1) * 0.05);\n\tboost += usageBonus;\n\n\t// Recent outcomes weighting (if available)\n\tif (signals.recentOutcomes.length > 0) {\n\t\tconst recentSuccess = signals.recentOutcomes.filter(\n\t\t\t(o) => o === \"accepted\" || o === \"test_pass\" || o === \"violation_prevented\",\n\t\t).length;\n\t\tconst recentRatio = recentSuccess / signals.recentOutcomes.length;\n\t\t// Blend: 70% historical, 30% recent\n\t\tboost = boost * 0.7 + recentRatio * 0.3;\n\t}\n\n\treturn Math.max(0, Math.min(1.0, boost));\n}\n\n/**\n * Combined reranking score that incorporates all signals\n * Per ADR: Three-layer confidence model\n *\n * @param baseScore - Original retrieval score (semantic/keyword fusion)\n * @param chunk - Chunk with metadata\n * @param historicalSignals - Optional historical signals from outcome tracking\n * @returns Adjusted score for reranking\n */\nexport function calculateRerankingScore(\n\tbaseScore: number,\n\tchunk: Chunk,\n\thistoricalSignals?: HistoricalSignals,\n): number {\n\t// Layer 1: Base retrieval score (40% weight)\n\tconst retrievalComponent = baseScore * 0.4;\n\n\t// Layer 2: Historical confidence (35% weight)\n\tconst historicalComponent = historicalSignals ? calculateHistoricalBoost(historicalSignals) * 0.35 : 0.5 * 0.35; // Default 0.5 if no history\n\n\t// Layer 3: Metadata confidence (25% weight)\n\tconst metadataComponent = calculateMetadataBoost(chunk) * 0.25;\n\n\t// Combined score\n\tconst combined = retrievalComponent + historicalComponent + metadataComponent;\n\n\treturn Math.max(0.1, Math.min(1.0, combined));\n}\n\n/**\n * Batch calculate reranking scores for multiple chunks\n * More efficient for large result sets\n */\nexport function batchRerankingScores(\n\titems: Array<{ chunk: Chunk; baseScore: number; historicalSignals?: HistoricalSignals }>,\n): Array<{ chunk: Chunk; originalScore: number; rerankScore: number }> {\n\treturn items\n\t\t.map((item) => ({\n\t\t\tchunk: item.chunk,\n\t\t\toriginalScore: item.baseScore,\n\t\t\trerankScore: calculateRerankingScore(item.baseScore, item.chunk, item.historicalSignals),\n\t\t}))\n\t\t.sort((a, b) => b.rerankScore - a.rerankScore);\n}\n\n/**\n * Get confidence level label from score\n */\nexport function getConfidenceLevel(score: number): \"high\" | \"medium\" | \"low\" {\n\tif (score >= 0.7) {\n\t\treturn \"high\";\n\t}\n\tif (score >= 0.4) {\n\t\treturn \"medium\";\n\t}\n\treturn \"low\";\n}\n","/**\n * @deprecated This module is deprecated. Use `@snapback/intelligence/embeddings` instead.\n *\n * Migration guide:\n * ```typescript\n * // Before\n * import { getEmbedding, batchEmbeddings } from \"@snapback/intelligence/knowledge\";\n *\n * // After\n * import { getEmbedding, batchEmbeddings } from \"@snapback/intelligence/embeddings\";\n * ```\n *\n * This shim will be removed in v0.3.0\n *\n * @module knowledge/embeddings\n */\n\n// Re-export everything from the new embeddings module\nexport {\n\tbatchEmbeddings,\n\tcosineSimilarity,\n\tgetEmbedding,\n\tgetEmbeddingDimension,\n\tisPipelineReady as isEmbeddingsReady,\n\tpreloadPipeline as preloadEmbeddings,\n} from \"../embeddings/index.js\";\n\n// Emit deprecation warning on first import\nlet deprecationWarned = false;\n\n/**\n * @deprecated Use imports from `@snapback/intelligence/embeddings` instead\n */\nexport function _emitDeprecationWarning(): void {\n\tif (!deprecationWarned) {\n\t\tconsole.warn(\n\t\t\t\"[DEPRECATED] Importing from @snapback/intelligence/knowledge embeddings is deprecated. \" +\n\t\t\t\t\"Please migrate to @snapback/intelligence/embeddings. \" +\n\t\t\t\t\"This shim will be removed in v0.3.0\",\n\t\t);\n\t\tdeprecationWarned = true;\n\t}\n}\n\n// Auto-emit warning on module load (side effect)\n_emitDeprecationWarning();\n","/**\n * Hybrid Retriever: Combines semantic and keyword search using RRF\n *\n * Strategy:\n * 1. Classify query type (factual, conceptual, exploratory)\n * 2. Run semantic search (embeddings) and keyword search (FTS5) in parallel\n * 3. Fuse results using Reciprocal Rank Fusion with adaptive weights\n * 4. Apply metadata reranking (authority, status, recency)\n * 5. Return ranked results with confidence scores\n *\n * @see https://superlinked.com/vectorhub/articles/optimizing-rag-with-hybrid-search-reranking\n * @see https://www.meilisearch.com/blog/adaptive-rag\n */\n\nimport { classifyQuery, type QueryClassification, type QueryType } from \"./query-classifier.js\";\nimport type { Chunk, KnowledgeStore } from \"./store.js\";\n\n// Re-export query classifier types for convenience\nexport type { QueryClassification, QueryType } from \"./query-classifier.js\";\nexport { classifyQuery, getWeightsForType, validateWeights } from \"./query-classifier.js\";\n\nexport interface RetrievalResult {\n\tchunk: Chunk;\n\tscore: number;\n\tconfidence: number;\n\tsources: {\n\t\tsemantic?: { rank: number; similarity: number };\n\t\tkeyword?: { rank: number };\n\t};\n}\n\nexport interface AdaptiveRetrievalResult {\n\tresults: RetrievalResult[];\n\tclassification: QueryClassification;\n\tstats: {\n\t\tsemanticCandidates: number;\n\t\tkeywordCandidates: number;\n\t\tfusedCount: number;\n\t\tlatencyMs: number;\n\t};\n}\n\nexport interface RetrievalConfig {\n\t// Weight for semantic vs keyword (must sum to 1)\n\tsemanticWeight: number;\n\tkeywordWeight: number;\n\t// RRF parameter (higher = more weight to lower ranks)\n\tk: number;\n\t// Maximum results to return\n\tlimit: number;\n\t// Minimum confidence threshold\n\tminConfidence: number;\n\t// Candidate multiplier (fetch more candidates for better fusion)\n\tcandidateMultiplier: number;\n}\n\nconst DEFAULT_CONFIG: RetrievalConfig = {\n\tsemanticWeight: 0.6,\n\tkeywordWeight: 0.4,\n\tk: 60,\n\tlimit: 10,\n\tminConfidence: 0.1,\n\tcandidateMultiplier: 3,\n};\n\nexport class HybridRetriever {\n\tprivate config: RetrievalConfig;\n\n\tconstructor(\n\t\tprivate store: KnowledgeStore,\n\t\tconfig: Partial<RetrievalConfig> = {},\n\t) {\n\t\tthis.config = { ...DEFAULT_CONFIG, ...config };\n\n\t\t// Validate weights\n\t\tconst totalWeight = this.config.semanticWeight + this.config.keywordWeight;\n\t\tif (Math.abs(totalWeight - 1.0) > 0.01) {\n\t\t\tconsole.warn(`Weights should sum to 1.0, got ${totalWeight}. Normalizing.`);\n\t\t\tthis.config.semanticWeight /= totalWeight;\n\t\t\tthis.config.keywordWeight /= totalWeight;\n\t\t}\n\t}\n\n\t/**\n\t * Main retrieval method (uses static weights from config)\n\t */\n\tasync retrieve(query: string): Promise<RetrievalResult[]> {\n\t\tconst startTime = performance.now();\n\t\tconst candidateLimit = this.config.limit * this.config.candidateMultiplier;\n\n\t\t// Run searches in parallel\n\t\tconst [semanticResults, keywordResults] = await Promise.all([\n\t\t\tthis.semanticSearch(query, candidateLimit),\n\t\t\tthis.keywordSearch(query, candidateLimit),\n\t\t]);\n\n\t\t// Reciprocal Rank Fusion\n\t\tconst fused = this.reciprocalRankFusion(semanticResults, keywordResults);\n\n\t\t// Calculate confidence scores\n\t\tconst withConfidence = this.calculateConfidence(fused, semanticResults, keywordResults);\n\n\t\t// Filter by minimum confidence and limit\n\t\tconst filtered = withConfidence\n\t\t\t.filter((r) => r.confidence >= this.config.minConfidence)\n\t\t\t.slice(0, this.config.limit);\n\n\t\tconst elapsed = performance.now() - startTime;\n\t\tconsole.log(`Hybrid retrieval: ${filtered.length} results in ${elapsed.toFixed(2)}ms`);\n\n\t\treturn filtered;\n\t}\n\n\t/**\n\t * Adaptive retrieval with automatic query classification\n\t *\n\t * This is the recommended method for production use. It:\n\t * 1. Classifies the query type (factual, conceptual, exploratory)\n\t * 2. Applies optimal weights based on query type\n\t * 3. Returns results with classification metadata\n\t *\n\t * @example\n\t * ```typescript\n\t * const { results, classification } = await retriever.retrieveAdaptive(\n\t * \"What is the import path for RuntimeRouter?\"\n\t * );\n\t * // classification.type === \"factual\"\n\t * // classification.weights === { semantic: 0.3, keyword: 0.7 }\n\t * ```\n\t */\n\tasync retrieveAdaptive(query: string): Promise<AdaptiveRetrievalResult> {\n\t\tconst startTime = performance.now();\n\n\t\t// Step 1: Classify the query\n\t\tconst classification = classifyQuery(query);\n\n\t\t// Step 2: Temporarily apply adaptive weights\n\t\tconst originalWeights = {\n\t\t\tsemantic: this.config.semanticWeight,\n\t\t\tkeyword: this.config.keywordWeight,\n\t\t};\n\n\t\tthis.config.semanticWeight = classification.weights.semantic;\n\t\tthis.config.keywordWeight = classification.weights.keyword;\n\n\t\tconst candidateLimit = this.config.limit * this.config.candidateMultiplier;\n\n\t\ttry {\n\t\t\t// Step 3: Run searches in parallel\n\t\t\tconst [semanticResults, keywordResults] = await Promise.all([\n\t\t\t\tthis.semanticSearch(query, candidateLimit),\n\t\t\t\tthis.keywordSearch(query, candidateLimit),\n\t\t\t]);\n\n\t\t\t// Step 4: RRF fusion with adaptive weights\n\t\t\tconst fused = this.reciprocalRankFusion(semanticResults, keywordResults);\n\n\t\t\t// Step 5: Calculate confidence scores\n\t\t\tconst withConfidence = this.calculateConfidence(fused, semanticResults, keywordResults);\n\n\t\t\t// Step 6: Filter and limit\n\t\t\tconst filtered = withConfidence\n\t\t\t\t.filter((r) => r.confidence >= this.config.minConfidence)\n\t\t\t\t.slice(0, this.config.limit);\n\n\t\t\tconst elapsed = performance.now() - startTime;\n\n\t\t\tconsole.log(\n\t\t\t\t`Adaptive retrieval [${classification.type}]: ${filtered.length} results in ${elapsed.toFixed(2)}ms ` +\n\t\t\t\t\t`(weights: sem=${classification.weights.semantic}, kw=${classification.weights.keyword})`,\n\t\t\t);\n\n\t\t\treturn {\n\t\t\t\tresults: filtered,\n\t\t\t\tclassification,\n\t\t\t\tstats: {\n\t\t\t\t\tsemanticCandidates: semanticResults.length,\n\t\t\t\t\tkeywordCandidates: keywordResults.length,\n\t\t\t\t\tfusedCount: fused.length,\n\t\t\t\t\tlatencyMs: elapsed,\n\t\t\t\t},\n\t\t\t};\n\t\t} finally {\n\t\t\t// Restore original weights\n\t\t\tthis.config.semanticWeight = originalWeights.semantic;\n\t\t\tthis.config.keywordWeight = originalWeights.keyword;\n\t\t}\n\t}\n\n\t/**\n\t * Retrieve with explicit query type (skip classification)\n\t *\n\t * Use this when you already know the query type or want to\n\t * override the automatic classification.\n\t */\n\tasync retrieveWithType(query: string, queryType: QueryType): Promise<AdaptiveRetrievalResult> {\n\t\tconst startTime = performance.now();\n\n\t\t// Get weights for the specified type\n\t\tconst { getWeightsForType } = await import(\"./query-classifier.js\");\n\t\tconst weights = getWeightsForType(queryType);\n\n\t\t// Create a synthetic classification\n\t\tconst { calculateComplexity } = await import(\"./query-classifier.js\");\n\t\tconst classification: QueryClassification = {\n\t\t\ttype: queryType,\n\t\t\tcomplexity: calculateComplexity(query),\n\t\t\tconfidence: 1.0, // Explicit type = full confidence\n\t\t\tweights,\n\t\t\treason: `Explicit type: ${queryType}`,\n\t\t};\n\n\t\t// Apply weights temporarily\n\t\tconst originalWeights = {\n\t\t\tsemantic: this.config.semanticWeight,\n\t\t\tkeyword: this.config.keywordWeight,\n\t\t};\n\n\t\tthis.config.semanticWeight = weights.semantic;\n\t\tthis.config.keywordWeight = weights.keyword;\n\n\t\tconst candidateLimit = this.config.limit * this.config.candidateMultiplier;\n\n\t\ttry {\n\t\t\tconst [semanticResults, keywordResults] = await Promise.all([\n\t\t\t\tthis.semanticSearch(query, candidateLimit),\n\t\t\t\tthis.keywordSearch(query, candidateLimit),\n\t\t\t]);\n\n\t\t\tconst fused = this.reciprocalRankFusion(semanticResults, keywordResults);\n\t\t\tconst withConfidence = this.calculateConfidence(fused, semanticResults, keywordResults);\n\n\t\t\tconst filtered = withConfidence\n\t\t\t\t.filter((r) => r.confidence >= this.config.minConfidence)\n\t\t\t\t.slice(0, this.config.limit);\n\n\t\t\tconst elapsed = performance.now() - startTime;\n\n\t\t\treturn {\n\t\t\t\tresults: filtered,\n\t\t\t\tclassification,\n\t\t\t\tstats: {\n\t\t\t\t\tsemanticCandidates: semanticResults.length,\n\t\t\t\t\tkeywordCandidates: keywordResults.length,\n\t\t\t\t\tfusedCount: fused.length,\n\t\t\t\t\tlatencyMs: elapsed,\n\t\t\t\t},\n\t\t\t};\n\t\t} finally {\n\t\t\tthis.config.semanticWeight = originalWeights.semantic;\n\t\t\tthis.config.keywordWeight = originalWeights.keyword;\n\t\t}\n\t}\n\n\t/**\n\t * Semantic search using embeddings\n\t */\n\tprivate async semanticSearch(\n\t\tquery: string,\n\t\tlimit: number,\n\t): Promise<Array<{ chunkId: string; similarity: number; rank: number }>> {\n\t\tconst results = await this.store.searchSemantic(query, limit);\n\n\t\treturn results.map((r, index) => ({\n\t\t\tchunkId: r.chunk.id,\n\t\t\tsimilarity: r.similarity,\n\t\t\trank: index + 1,\n\t\t}));\n\t}\n\n\t/**\n\t * Keyword search using FTS5\n\t */\n\tprivate keywordSearch(query: string, limit: number): Array<{ chunkId: string; rank: number }> {\n\t\tconst results = this.store.searchKeyword(query, limit);\n\n\t\treturn results.map((chunk, index) => ({\n\t\t\tchunkId: chunk.id,\n\t\t\trank: index + 1,\n\t\t}));\n\t}\n\n\t/**\n\t * Reciprocal Rank Fusion\n\t * Combines rankings from multiple sources into a unified score\n\t */\n\tprivate reciprocalRankFusion(\n\t\tsemantic: Array<{ chunkId: string; similarity: number; rank: number }>,\n\t\tkeyword: Array<{ chunkId: string; rank: number }>,\n\t): Array<{ chunkId: string; score: number; sources: RetrievalResult[\"sources\"] }> {\n\t\tconst scores = new Map<string, number>();\n\t\tconst sources = new Map<string, RetrievalResult[\"sources\"]>();\n\n\t\tconst { k, semanticWeight, keywordWeight } = this.config;\n\n\t\t// Score semantic results\n\t\tfor (const { chunkId, similarity, rank } of semantic) {\n\t\t\tconst rrfScore = semanticWeight * (1 / (k + rank));\n\t\t\tscores.set(chunkId, (scores.get(chunkId) || 0) + rrfScore);\n\n\t\t\tconst existing = sources.get(chunkId) || {};\n\t\t\texisting.semantic = { rank, similarity };\n\t\t\tsources.set(chunkId, existing);\n\t\t}\n\n\t\t// Score keyword results\n\t\tfor (const { chunkId, rank } of keyword) {\n\t\t\tconst rrfScore = keywordWeight * (1 / (k + rank));\n\t\t\tscores.set(chunkId, (scores.get(chunkId) || 0) + rrfScore);\n\n\t\t\tconst existing = sources.get(chunkId) || {};\n\t\t\texisting.keyword = { rank };\n\t\t\tsources.set(chunkId, existing);\n\t\t}\n\n\t\t// Sort by fused score\n\t\treturn Array.from(scores.entries())\n\t\t\t.map(([chunkId, score]) => ({\n\t\t\t\tchunkId,\n\t\t\t\tscore,\n\t\t\t\tsources: sources.get(chunkId) ?? {},\n\t\t\t}))\n\t\t\t.sort((a, b) => b.score - a.score);\n\t}\n\n\t/**\n\t * Calculate confidence scores using 3-layer model\n\t */\n\tprivate calculateConfidence(\n\t\tfused: Array<{ chunkId: string; score: number; sources: RetrievalResult[\"sources\"] }>,\n\t\tsemantic: Array<{ chunkId: string; similarity: number; rank: number }>,\n\t\tkeyword: Array<{ chunkId: string; rank: number }>,\n\t): RetrievalResult[] {\n\t\tconst results: RetrievalResult[] = [];\n\n\t\tfor (const { chunkId, score, sources } of fused) {\n\t\t\tconst chunk = this.store.getChunk(chunkId);\n\t\t\tif (!chunk) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Layer 1: Retrieval Confidence\n\t\t\tconst retrievalConfidence = this.calculateRetrievalConfidence(sources, semantic, keyword);\n\n\t\t\t// Layer 2: Historical Confidence (from outcomes - simplified for now)\n\t\t\tconst historicalConfidence = chunk.authority; // Use authority as proxy\n\n\t\t\t// Layer 3: Action Confidence (context-dependent - simplified)\n\t\t\tconst actionConfidence = chunk.status === \"active\" ? 1.0 : 0.5;\n\n\t\t\t// Combine layers (weighted average)\n\t\t\tconst confidence = retrievalConfidence * 0.5 + historicalConfidence * 0.3 + actionConfidence * 0.2;\n\n\t\t\tresults.push({\n\t\t\t\tchunk,\n\t\t\t\tscore,\n\t\t\t\tconfidence,\n\t\t\t\tsources,\n\t\t\t});\n\t\t}\n\n\t\treturn results;\n\t}\n\n\t/**\n\t * Layer 1: Retrieval Confidence\n\t * Based on: cross-agreement, score margin, semantic similarity\n\t */\n\tprivate calculateRetrievalConfidence(\n\t\tsources: RetrievalResult[\"sources\"],\n\t\t_semantic: Array<{ chunkId: string; similarity: number; rank: number }>,\n\t\t_keyword: Array<{ chunkId: string; rank: number }>,\n\t): number {\n\t\tlet confidence = 0.5; // Base confidence\n\n\t\t// Cross-agreement bonus: found in both semantic AND keyword\n\t\tconst inBoth = sources.semantic && sources.keyword;\n\t\tif (inBoth) {\n\t\t\tconfidence += 0.2;\n\t\t}\n\n\t\t// Semantic similarity bonus\n\t\tif (sources.semantic) {\n\t\t\tconst sim = sources.semantic.similarity;\n\t\t\tif (sim > 0.8) {\n\t\t\t\tconfidence += 0.2;\n\t\t\t} else if (sim > 0.6) {\n\t\t\t\tconfidence += 0.1;\n\t\t\t}\n\t\t}\n\n\t\t// High rank bonus\n\t\tconst bestRank = Math.min(\n\t\t\tsources.semantic?.rank || Number.POSITIVE_INFINITY,\n\t\t\tsources.keyword?.rank || Number.POSITIVE_INFINITY,\n\t\t);\n\t\tif (bestRank === 1) {\n\t\t\tconfidence += 0.1;\n\t\t} else if (bestRank <= 3) {\n\t\t\tconfidence += 0.05;\n\t\t}\n\n\t\treturn Math.min(1.0, confidence);\n\t}\n\n\t/**\n\t * Get retriever configuration\n\t */\n\tgetConfig(): RetrievalConfig {\n\t\treturn { ...this.config };\n\t}\n\n\t/**\n\t * Update retriever configuration\n\t */\n\tupdateConfig(config: Partial<RetrievalConfig>): void {\n\t\tthis.config = { ...this.config, ...config };\n\n\t\t// Re-validate weights\n\t\tconst totalWeight = this.config.semanticWeight + this.config.keywordWeight;\n\t\tif (Math.abs(totalWeight - 1.0) > 0.01) {\n\t\t\tconsole.warn(`Weights should sum to 1.0, got ${totalWeight}. Normalizing.`);\n\t\t\tthis.config.semanticWeight /= totalWeight;\n\t\t\tthis.config.keywordWeight /= totalWeight;\n\t\t}\n\t}\n}\n","import { existsSync, mkdirSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport path from \"node:path\";\nimport { cosineSimilarity, getEmbedding } from \"./embeddings.js\";\nimport { KNOWLEDGE_SCHEMA } from \"./schema.sql.js\";\n\n// Dynamic import for better-sqlite3 to avoid bundling native modules\n// This is critical for VS Code extension compatibility\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype DatabaseType = any;\nlet BetterSqlite3: typeof import(\"better-sqlite3\") | null = null;\n\nasync function loadBetterSqlite3(): Promise<typeof import(\"better-sqlite3\")> {\n\tif (BetterSqlite3) {\n\t\treturn BetterSqlite3;\n\t}\n\tBetterSqlite3 = (await import(\"better-sqlite3\")).default as unknown as typeof import(\"better-sqlite3\");\n\treturn BetterSqlite3;\n}\n\nexport interface Chunk {\n\tid: string;\n\tsource_type: \"learning\" | \"adr\" | \"pattern\" | \"violation\";\n\tsource_id: string;\n\tchunk_text: string;\n\tcontext_text?: string;\n\tauthority: number;\n\tstatus: \"active\" | \"deprecated\" | \"superseded\";\n\tcreated_at: string;\n\tupdated_at: string;\n\tmetadata?: Record<string, unknown>;\n}\n\n/**\n * Outcome types for confidence feedback loop.\n * Per ADR: outcomes table tracks accepted/ignored/test_pass/test_fail/violation_prevented\n */\nexport type OutcomeType = \"accepted\" | \"ignored\" | \"test_pass\" | \"test_fail\" | \"violation_prevented\";\n\nexport interface Outcome {\n\tid: string;\n\tchunk_id: string;\n\toutcome_type: OutcomeType;\n\tcontext?: Record<string, unknown>;\n\tcreated_at: string;\n}\n\n/**\n * Historical signals for three-layer confidence model.\n * Per ADR: HistoricalSignals includes success_rate, violation_count, access_count\n */\nexport interface HistoricalSignals {\n\tsuccessRate: number; // 0-1: (accepted + test_pass) / total outcomes\n\tviolationCount: number; // Count of violation_prevented outcomes\n\taccessCount: number; // Total outcome count (proxy for usage)\n\trecentOutcomes: OutcomeType[]; // Last 5 outcomes for recency weighting\n}\n\nexport interface KnowledgeStoreConfig {\n\tdbPath?: string;\n\tinMemory?: boolean;\n}\n\nexport class KnowledgeStore {\n\tprivate db: DatabaseType;\n\tprivate readonly dbPath: string;\n\n\t/**\n\t * Create a new KnowledgeStore instance (async factory method)\n\t * Uses dynamic import for better-sqlite3 to avoid bundling native modules.\n\t * This is the RECOMMENDED way to create a KnowledgeStore.\n\t */\n\tstatic async create(config: KnowledgeStoreConfig = {}): Promise<KnowledgeStore> {\n\t\tconst Database = await loadBetterSqlite3();\n\t\tconst dbPath = config.dbPath ?? path.join(homedir(), \".snapback\", \"knowledge.db\");\n\n\t\tlet db: DatabaseType;\n\t\tif (config.inMemory) {\n\t\t\tdb = new Database(\":memory:\");\n\t\t} else {\n\t\t\tconst dir = path.dirname(dbPath);\n\t\t\tif (!existsSync(dir)) {\n\t\t\t\tmkdirSync(dir, { recursive: true });\n\t\t\t}\n\t\t\tdb = new Database(dbPath);\n\t\t}\n\n\t\treturn new KnowledgeStore(db, dbPath);\n\t}\n\n\t/**\n\t * Constructor - use KnowledgeStore.create() for proper async initialization.\n\t * Direct instantiation requires better-sqlite3 to be pre-loaded.\n\t * @internal\n\t */\n\tconstructor(dbOrConfig: DatabaseType | KnowledgeStoreConfig, dbPath?: string) {\n\t\tif (dbPath !== undefined) {\n\t\t\t// Called from factory method with pre-initialized db\n\t\t\tthis.db = dbOrConfig as DatabaseType;\n\t\t\tthis.dbPath = dbPath;\n\t\t} else {\n\t\t\t// Legacy sync path - requires pre-loaded better-sqlite3\n\t\t\tconst config = dbOrConfig as KnowledgeStoreConfig;\n\t\t\tif (!BetterSqlite3) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t\"KnowledgeStore: better-sqlite3 not loaded. Use KnowledgeStore.create() for async initialization.\",\n\t\t\t\t);\n\t\t\t}\n\t\t\tthis.dbPath = config.dbPath ?? path.join(homedir(), \".snapback\", \"knowledge.db\");\n\n\t\t\tif (config.inMemory) {\n\t\t\t\tthis.db = new BetterSqlite3(\":memory:\");\n\t\t\t} else {\n\t\t\t\tconst dir = path.dirname(this.dbPath);\n\t\t\t\tif (!existsSync(dir)) {\n\t\t\t\t\tmkdirSync(dir, { recursive: true });\n\t\t\t\t}\n\t\t\t\tthis.db = new BetterSqlite3(this.dbPath);\n\t\t\t}\n\t\t}\n\n\t\tthis.db.pragma(\"journal_mode = WAL\");\n\t\tthis.db.pragma(\"synchronous = NORMAL\");\n\t\tthis.db.pragma(\"foreign_keys = ON\");\n\t\tthis.initSchema();\n\t}\n\n\tprivate initSchema(): void {\n\t\tthis.db.exec(KNOWLEDGE_SCHEMA);\n\t}\n\n\t// CRUD operations\n\tinsertChunk(chunk: Omit<Chunk, \"created_at\" | \"updated_at\">): void {\n\t\tconst stmt = this.db.prepare(`\n INSERT INTO chunks (id, source_type, source_id, chunk_text, context_text, authority, status, metadata)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?)\n `);\n\n\t\tstmt.run(\n\t\t\tchunk.id,\n\t\t\tchunk.source_type,\n\t\t\tchunk.source_id,\n\t\t\tchunk.chunk_text,\n\t\t\tchunk.context_text ?? null,\n\t\t\tchunk.authority,\n\t\t\tchunk.status,\n\t\t\tchunk.metadata ? JSON.stringify(chunk.metadata) : null,\n\t\t);\n\t}\n\n\tgetChunk(id: string): Chunk | null {\n\t\tconst stmt = this.db.prepare(\"SELECT * FROM chunks WHERE id = ?\");\n\t\tconst row = stmt.get(id) as Record<string, unknown> | undefined;\n\n\t\tif (!row) {\n\t\t\treturn null;\n\t\t}\n\n\t\treturn {\n\t\t\t...row,\n\t\t\tmetadata: row.metadata ? JSON.parse(row.metadata as string) : undefined,\n\t\t} as Chunk;\n\t}\n\n\t/**\n\t * Search chunks using FTS5 keyword matching\n\t * @param query - Search query (special characters will be escaped)\n\t * @param limit - Maximum results to return\n\t */\n\tsearchKeyword(query: string, limit = 10): Chunk[] {\n\t\t// Escape FTS5 special characters and extract meaningful keywords\n\t\tconst keywords = query\n\t\t\t.toLowerCase()\n\t\t\t// Remove FTS5 operators and special characters\n\t\t\t.replace(/[\"\\-*():@?!.,;'`~#$%^&+=[\\]{}|\\\\<>]/g, \" \")\n\t\t\t// Split into words\n\t\t\t.split(/\\s+/)\n\t\t\t// Filter short words and common stop words\n\t\t\t.filter((word) => {\n\t\t\t\tif (word.length < 3) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tconst stopWords = new Set([\n\t\t\t\t\t\"the\",\n\t\t\t\t\t\"and\",\n\t\t\t\t\t\"for\",\n\t\t\t\t\t\"how\",\n\t\t\t\t\t\"what\",\n\t\t\t\t\t\"why\",\n\t\t\t\t\t\"when\",\n\t\t\t\t\t\"where\",\n\t\t\t\t\t\"which\",\n\t\t\t\t\t\"does\",\n\t\t\t\t\t\"should\",\n\t\t\t\t\t\"would\",\n\t\t\t\t\t\"could\",\n\t\t\t\t\t\"can\",\n\t\t\t\t\t\"will\",\n\t\t\t\t\t\"has\",\n\t\t\t\t\t\"have\",\n\t\t\t\t\t\"been\",\n\t\t\t\t\t\"being\",\n\t\t\t\t\t\"was\",\n\t\t\t\t\t\"were\",\n\t\t\t\t\t\"are\",\n\t\t\t\t\t\"this\",\n\t\t\t\t\t\"that\",\n\t\t\t\t\t\"these\",\n\t\t\t\t\t\"those\",\n\t\t\t\t\t\"with\",\n\t\t\t\t\t\"from\",\n\t\t\t\t\t\"into\",\n\t\t\t\t\t\"about\",\n\t\t\t\t\t\"than\",\n\t\t\t\t\t\"then\",\n\t\t\t\t\t\"they\",\n\t\t\t\t]);\n\t\t\t\treturn !stopWords.has(word);\n\t\t\t});\n\n\t\t// Return empty if no valid keywords\n\t\tif (keywords.length === 0) {\n\t\t\treturn [];\n\t\t}\n\n\t\t// Build FTS5 query - use OR for broader matching\n\t\tconst ftsQuery = keywords.join(\" OR \");\n\n\t\ttry {\n\t\t\tconst stmt = this.db.prepare(`\n SELECT c.* FROM chunks c\n JOIN chunks_fts fts ON c.rowid = fts.rowid\n WHERE chunks_fts MATCH ?\n ORDER BY bm25(chunks_fts)\n LIMIT ?\n `);\n\n\t\t\tconst rows = stmt.all(ftsQuery, limit) as Array<Record<string, unknown>>;\n\n\t\t\treturn rows.map((row) => ({\n\t\t\t\t...row,\n\t\t\t\tmetadata: row.metadata ? JSON.parse(row.metadata as string) : undefined,\n\t\t\t})) as Chunk[];\n\t\t} catch (error) {\n\t\t\t// Log but don't crash on FTS5 errors\n\t\t\tconsole.warn(`FTS5 search failed for query \"${ftsQuery}\":`, error);\n\t\t\treturn [];\n\t\t}\n\t}\n\n\t/**\n\t * Store embedding for a chunk\n\t */\n\tstoreEmbedding(chunkId: string, embedding: Float32Array): void {\n\t\tconst stmt = this.db.prepare(`\n INSERT OR REPLACE INTO chunk_embeddings (chunk_id, embedding, dimension)\n VALUES (?, ?, ?)\n `);\n\n\t\t// Convert Float32Array to Buffer for SQLite BLOB\n\t\tconst buffer = Buffer.from(embedding.buffer);\n\t\tstmt.run(chunkId, buffer, embedding.length);\n\t}\n\n\t/**\n\t * Get embedding for a chunk\n\t */\n\tgetEmbedding(chunkId: string): Float32Array | null {\n\t\tconst stmt = this.db.prepare(`\n SELECT embedding, dimension FROM chunk_embeddings WHERE chunk_id = ?\n `);\n\n\t\tconst row = stmt.get(chunkId) as { embedding: Buffer; dimension: number } | undefined;\n\n\t\tif (!row) {\n\t\t\treturn null;\n\t\t}\n\n\t\t// Convert Buffer back to Float32Array\n\t\treturn new Float32Array(row.embedding.buffer, row.embedding.byteOffset, row.dimension);\n\t}\n\n\t/**\n\t * Get all embeddings (for brute-force search)\n\t */\n\tgetAllEmbeddings(): Array<{ chunkId: string; embedding: Float32Array }> {\n\t\tconst stmt = this.db.prepare(`\n SELECT chunk_id, embedding, dimension FROM chunk_embeddings\n `);\n\n\t\tconst rows = stmt.all() as Array<{ chunk_id: string; embedding: Buffer; dimension: number }>;\n\n\t\treturn rows.map((row) => ({\n\t\t\tchunkId: row.chunk_id,\n\t\t\tembedding: new Float32Array(row.embedding.buffer, row.embedding.byteOffset, row.dimension),\n\t\t}));\n\t}\n\n\t/**\n\t * Check if chunk has an embedding\n\t */\n\thasEmbedding(chunkId: string): boolean {\n\t\tconst stmt = this.db.prepare(`\n SELECT 1 FROM chunk_embeddings WHERE chunk_id = ? LIMIT 1\n `);\n\t\treturn stmt.get(chunkId) !== undefined;\n\t}\n\n\t/**\n\t * Get embedding statistics\n\t */\n\tgetEmbeddingStats(): { total: number; withEmbedding: number; missing: number } {\n\t\tconst totalStmt = this.db.prepare(\"SELECT COUNT(*) as count FROM chunks\");\n\t\tconst embeddedStmt = this.db.prepare(\"SELECT COUNT(*) as count FROM chunk_embeddings\");\n\n\t\tconst total = (totalStmt.get() as { count: number }).count;\n\t\tconst withEmbedding = (embeddedStmt.get() as { count: number }).count;\n\n\t\treturn {\n\t\t\ttotal,\n\t\t\twithEmbedding,\n\t\t\tmissing: total - withEmbedding,\n\t\t};\n\t}\n\n\t/**\n\t * Semantic search using embeddings (brute-force for now)\n\t * For <1000 chunks, brute-force is acceptable (~10-20ms)\n\t */\n\tasync searchSemantic(query: string, limit = 10): Promise<Array<{ chunk: Chunk; similarity: number }>> {\n\t\tconst queryEmbedding = await getEmbedding(query);\n\t\tconst allEmbeddings = this.getAllEmbeddings();\n\n\t\tif (allEmbeddings.length === 0) {\n\t\t\treturn [];\n\t\t}\n\n\t\t// Calculate similarities\n\t\tconst scored = allEmbeddings.map(({ chunkId, embedding }) => ({\n\t\t\tchunkId,\n\t\t\tsimilarity: cosineSimilarity(queryEmbedding, embedding),\n\t\t}));\n\n\t\t// Sort by similarity descending\n\t\tscored.sort((a, b) => b.similarity - a.similarity);\n\n\t\t// Get top results with chunk data\n\t\tconst topIds = scored.slice(0, limit);\n\t\tconst results: Array<{ chunk: Chunk; similarity: number }> = [];\n\n\t\tfor (const { chunkId, similarity } of topIds) {\n\t\t\tconst chunk = this.getChunk(chunkId);\n\t\t\tif (chunk) {\n\t\t\t\tresults.push({ chunk, similarity });\n\t\t\t}\n\t\t}\n\n\t\treturn results;\n\t}\n\n\t// Vector search (deprecated - use searchSemantic instead)\n\tsearchVector(_embedding: Float32Array, _limit = 10): Array<{ chunk: Chunk; distance: number }> {\n\t\t// TODO: Implement in Block 2 with sqlite-vec if needed\n\t\treturn [];\n\t}\n\n\t// Stats\n\tgetStats(): { totalChunks: number; byType: Record<string, number> } {\n\t\tconst total = this.db.prepare(\"SELECT COUNT(*) as count FROM chunks\").get() as { count: number };\n\t\tconst byType = this.db\n\t\t\t.prepare(`\n SELECT source_type, COUNT(*) as count FROM chunks GROUP BY source_type\n `)\n\t\t\t.all() as Array<{ source_type: string; count: number }>;\n\n\t\treturn {\n\t\t\ttotalChunks: total.count,\n\t\t\tbyType: Object.fromEntries(byType.map((r) => [r.source_type, r.count])),\n\t\t};\n\t}\n\n\t// ============================================================\n\t// OUTCOME TRACKING (Three-Layer Confidence Feedback Loop)\n\t// ============================================================\n\n\t/**\n\t * Record an outcome for a chunk (accepted, ignored, test_pass, etc.)\n\t * Per ADR: outcomes table feeds into confidence calculations\n\t */\n\trecordOutcome(chunkId: string, outcomeType: OutcomeType, context?: Record<string, unknown>): string {\n\t\tconst id = `outcome_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;\n\n\t\tconst stmt = this.db.prepare(`\n\t\t\tINSERT INTO outcomes (id, chunk_id, outcome_type, context)\n\t\t\tVALUES (?, ?, ?, ?)\n\t\t`);\n\n\t\tstmt.run(id, chunkId, outcomeType, context ? JSON.stringify(context) : null);\n\n\t\treturn id;\n\t}\n\n\t/**\n\t * Get all outcomes for a chunk\n\t */\n\tgetChunkOutcomes(chunkId: string, limit = 100): Outcome[] {\n\t\tconst stmt = this.db.prepare(`\n\t\t\tSELECT * FROM outcomes\n\t\t\tWHERE chunk_id = ?\n\t\t\tORDER BY created_at DESC\n\t\t\tLIMIT ?\n\t\t`);\n\n\t\tconst rows = stmt.all(chunkId, limit) as Array<Record<string, unknown>>;\n\n\t\treturn rows.map((row) => ({\n\t\t\tid: row.id as string,\n\t\t\tchunk_id: row.chunk_id as string,\n\t\t\toutcome_type: row.outcome_type as OutcomeType,\n\t\t\tcontext: row.context ? JSON.parse(row.context as string) : undefined,\n\t\t\tcreated_at: row.created_at as string,\n\t\t}));\n\t}\n\n\t/**\n\t * Get historical signals for a chunk (for three-layer confidence model)\n\t * Per ADR: HistoricalSignals includes success_rate, violation_count, access_count\n\t */\n\tgetHistoricalSignals(chunkId: string): HistoricalSignals {\n\t\t// Get outcome counts by type\n\t\tconst countStmt = this.db.prepare(`\n\t\t\tSELECT outcome_type, COUNT(*) as count\n\t\t\tFROM outcomes\n\t\t\tWHERE chunk_id = ?\n\t\t\tGROUP BY outcome_type\n\t\t`);\n\t\tconst counts = countStmt.all(chunkId) as Array<{ outcome_type: string; count: number }>;\n\n\t\t// Build counts map\n\t\tconst countMap: Record<string, number> = {};\n\t\tlet totalCount = 0;\n\t\tfor (const row of counts) {\n\t\t\tcountMap[row.outcome_type] = row.count;\n\t\t\ttotalCount += row.count;\n\t\t}\n\n\t\t// Calculate success rate: (accepted + test_pass + violation_prevented) / total\n\t\tconst successCount = (countMap.accepted ?? 0) + (countMap.test_pass ?? 0) + (countMap.violation_prevented ?? 0);\n\t\tconst successRate = totalCount > 0 ? successCount / totalCount : 0.5; // Default 0.5 for no data\n\n\t\t// Get recent outcomes (last 5)\n\t\tconst recentStmt = this.db.prepare(`\n\t\t\tSELECT outcome_type FROM outcomes\n\t\t\tWHERE chunk_id = ?\n\t\t\tORDER BY created_at DESC\n\t\t\tLIMIT 5\n\t\t`);\n\t\tconst recentRows = recentStmt.all(chunkId) as Array<{ outcome_type: string }>;\n\t\tconst recentOutcomes = recentRows.map((r) => r.outcome_type as OutcomeType);\n\n\t\treturn {\n\t\t\tsuccessRate,\n\t\t\tviolationCount: countMap.violation_prevented ?? 0,\n\t\t\taccessCount: totalCount,\n\t\t\trecentOutcomes,\n\t\t};\n\t}\n\n\t/**\n\t * Get chunks with their historical signals (batch operation for efficiency)\n\t */\n\tgetChunksWithSignals(chunkIds: string[]): Map<string, HistoricalSignals> {\n\t\tconst result = new Map<string, HistoricalSignals>();\n\n\t\t// For small batches, iterate; for large batches, use single query\n\t\tif (chunkIds.length <= 10) {\n\t\t\tfor (const id of chunkIds) {\n\t\t\t\tresult.set(id, this.getHistoricalSignals(id));\n\t\t\t}\n\t\t} else {\n\t\t\t// Batch query for counts\n\t\t\tconst placeholders = chunkIds.map(() => \"?\").join(\",\");\n\t\t\tconst countStmt = this.db.prepare(`\n\t\t\t\tSELECT chunk_id, outcome_type, COUNT(*) as count\n\t\t\t\tFROM outcomes\n\t\t\t\tWHERE chunk_id IN (${placeholders})\n\t\t\t\tGROUP BY chunk_id, outcome_type\n\t\t\t`);\n\t\t\tconst counts = countStmt.all(...chunkIds) as Array<{\n\t\t\t\tchunk_id: string;\n\t\t\t\toutcome_type: string;\n\t\t\t\tcount: number;\n\t\t\t}>;\n\n\t\t\t// Group by chunk_id\n\t\t\tconst chunkCounts = new Map<string, Map<string, number>>();\n\t\t\tfor (const row of counts) {\n\t\t\t\tlet chunkMap = chunkCounts.get(row.chunk_id);\n\t\t\t\tif (!chunkMap) {\n\t\t\t\t\tchunkMap = new Map();\n\t\t\t\t\tchunkCounts.set(row.chunk_id, chunkMap);\n\t\t\t\t}\n\t\t\t\tchunkMap.set(row.outcome_type, row.count);\n\t\t\t}\n\n\t\t\t// Calculate signals for each chunk\n\t\t\tfor (const id of chunkIds) {\n\t\t\t\tconst countMap = chunkCounts.get(id) ?? new Map();\n\t\t\t\tconst totalCount = Array.from(countMap.values()).reduce((a, b) => a + b, 0);\n\n\t\t\t\tconst successCount =\n\t\t\t\t\t(countMap.get(\"accepted\") ?? 0) +\n\t\t\t\t\t(countMap.get(\"test_pass\") ?? 0) +\n\t\t\t\t\t(countMap.get(\"violation_prevented\") ?? 0);\n\t\t\t\tconst successRate = totalCount > 0 ? successCount / totalCount : 0.5;\n\n\t\t\t\tresult.set(id, {\n\t\t\t\t\tsuccessRate,\n\t\t\t\t\tviolationCount: countMap.get(\"violation_prevented\") ?? 0,\n\t\t\t\t\taccessCount: totalCount,\n\t\t\t\t\trecentOutcomes: [], // Skip recent for batch (optimization)\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\treturn result;\n\t}\n\n\t/**\n\t * Update chunk authority based on outcome history\n\t * Per ADR: Confidence should evolve based on historical signals\n\t */\n\tupdateChunkAuthority(chunkId: string): void {\n\t\tconst signals = this.getHistoricalSignals(chunkId);\n\n\t\t// Authority formula: base * success_rate * recency_factor\n\t\t// - Start with current authority\n\t\t// - Adjust by success rate (higher success = higher authority)\n\t\t// - Apply recency weighting (recent failures weigh more)\n\t\tconst chunk = this.getChunk(chunkId);\n\t\tif (!chunk) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst baseAuthority = chunk.authority;\n\n\t\t// Calculate recency factor from recent outcomes\n\t\tlet recencyFactor = 1.0;\n\t\tconst weights = [0.3, 0.25, 0.2, 0.15, 0.1]; // Most recent weighted highest\n\t\tfor (let i = 0; i < signals.recentOutcomes.length; i++) {\n\t\t\tconst outcome = signals.recentOutcomes[i];\n\t\t\tconst isSuccess = outcome === \"accepted\" || outcome === \"test_pass\" || outcome === \"violation_prevented\";\n\t\t\trecencyFactor += weights[i] * (isSuccess ? 0.1 : -0.15);\n\t\t}\n\t\trecencyFactor = Math.max(0.5, Math.min(1.5, recencyFactor)); // Clamp to [0.5, 1.5]\n\n\t\t// Calculate new authority\n\t\t// Blend: 50% base authority, 30% success rate, 20% recency adjustment\n\t\tconst newAuthority = Math.max(\n\t\t\t0.1,\n\t\t\tMath.min(1.0, baseAuthority * 0.5 + signals.successRate * 0.3 + (recencyFactor - 1.0) * 0.2 + 0.5),\n\t\t);\n\n\t\t// Update in database\n\t\tconst stmt = this.db.prepare(`\n\t\t\tUPDATE chunks SET authority = ?, updated_at = datetime('now')\n\t\t\tWHERE id = ?\n\t\t`);\n\t\tstmt.run(newAuthority, chunkId);\n\t}\n\n\tclose(): void {\n\t\tthis.db.close();\n\t}\n}\n","/**\n * Learning Matcher\n *\n * Matches command context against stored learnings to find relevant candidates.\n * Part of Phase 1: Observe Mode implementation.\n *\n * Key responsibilities:\n * - Match learnings by command, intent, file patterns, and flags\n * - Score matches using confidence × recency formula\n * - Filter out archived and low-confidence learnings\n * - Return ranked candidates for evaluation\n */\n\nimport {\n\tcalculateLearningScore,\n\tHIGH_VALUE_COMMANDS,\n\ttype Learning,\n\ttype LearningEvaluationInput,\n\tLearningSchema,\n\tNEVER_EVALUATE_COMMANDS,\n\ttype SelectedLearning,\n} from \"@snapback/contracts\";\nimport Fuse from \"fuse.js\";\nimport type { StateStore, StoredLearning } from \"../storage/StateStore.js\";\n\n// =============================================================================\n// CONFIGURATION\n// =============================================================================\n\nexport interface LearningMatcherConfig {\n\t/** Minimum confidence score to include in results (default: 0.4) */\n\tminConfidence?: number;\n\t/** Minimum final score to include in results (default: 0.5) */\n\tminScore?: number;\n\t/** Maximum number of results to return (default: 3) */\n\tmaxResults?: number;\n\t/** Include archived learnings (default: false) */\n\tincludeArchived?: boolean;\n\t/** Fuzzy matching threshold for command extraction (default: 0.4, 0=exact, 1=match anything) */\n\tfuzzyThreshold?: number;\n}\n\nconst DEFAULT_CONFIG: Required<LearningMatcherConfig> = {\n\tminConfidence: 0.4,\n\tminScore: 0.5,\n\tmaxResults: 3,\n\tincludeArchived: false,\n\tfuzzyThreshold: 0.4,\n};\n\n// =============================================================================\n// LEARNING MATCHER\n// =============================================================================\n\nexport class LearningMatcher {\n\tprivate readonly config: Required<LearningMatcherConfig>;\n\tprivate readonly stateStore: StateStore;\n\n\tconstructor(stateStore: StateStore, config: LearningMatcherConfig = {}) {\n\t\tthis.stateStore = stateStore;\n\t\tthis.config = { ...DEFAULT_CONFIG, ...config };\n\t}\n\n\t/**\n\t * Check if a command should trigger learning evaluation\n\t */\n\tshouldEvaluate(commandName: string): boolean {\n\t\t// Never evaluate utility commands\n\t\tif (NEVER_EVALUATE_COMMANDS.includes(commandName as (typeof NEVER_EVALUATE_COMMANDS)[number])) {\n\t\t\treturn false;\n\t\t}\n\t\t// Always evaluate high-value commands\n\t\tif (HIGH_VALUE_COMMANDS.includes(commandName as (typeof HIGH_VALUE_COMMANDS)[number])) {\n\t\t\treturn true;\n\t\t}\n\t\t// Other commands: only with explicit opt-in (handled by caller)\n\t\treturn false;\n\t}\n\n\t/**\n\t * Find learnings that match the given input context\n\t */\n\tasync findMatches(input: LearningEvaluationInput): Promise<SelectedLearning[]> {\n\t\t// Get all learnings from StateStore\n\t\tconst storedLearnings = this.stateStore.getLearnings();\n\n\t\t// Convert and filter candidates\n\t\tconst candidates: Array<{ learning: Learning; score: number }> = [];\n\n\t\tfor (const stored of storedLearnings) {\n\t\t\t// Convert StoredLearning to Learning format\n\t\t\tconst learning = this.convertToLearning(stored);\n\t\t\tif (!learning) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Skip archived unless explicitly included\n\t\t\tif (learning.archived && !this.config.includeArchived) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Skip low-confidence learnings\n\t\t\tif (learning.confidence < this.config.minConfidence) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Calculate match score\n\t\t\tconst matchScore = this.calculateMatchScore(learning, input);\n\t\t\tif (matchScore === 0) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Calculate final score: confidence × recency × match\n\t\t\tconst baseScore = calculateLearningScore(learning);\n\t\t\tconst finalScore = baseScore * matchScore;\n\n\t\t\tif (finalScore >= this.config.minScore) {\n\t\t\t\tcandidates.push({ learning, score: finalScore });\n\t\t\t}\n\t\t}\n\n\t\t// Sort by score descending and take top N\n\t\tcandidates.sort((a, b) => b.score - a.score);\n\t\tconst topCandidates = candidates.slice(0, this.config.maxResults);\n\n\t\t// Convert to SelectedLearning format\n\t\treturn topCandidates.map(({ learning, score }) => ({\n\t\t\tid: learning.id,\n\t\t\ttitle: learning.trigger.description,\n\t\t\ttype: learning.type,\n\t\t\tscore,\n\t\t\taction: learning.action,\n\t\t\ttags: learning.tags,\n\t\t}));\n\t}\n\n\t/**\n\t * Convert StoredLearning to new Learning format\n\t * Returns null if conversion fails\n\t */\n\tprivate convertToLearning(stored: StoredLearning): Learning | null {\n\t\ttry {\n\t\t\t// Build trigger from stored format\n\t\t\tconst trigger = {\n\t\t\t\tdescription: stored.trigger,\n\t\t\t\t// Parse keywords as tags for matching\n\t\t\t\tcommands: this.extractCommands(stored.trigger, stored.keywords),\n\t\t\t};\n\n\t\t\t// Build action from stored format (default to warn type)\n\t\t\tconst action = this.parseAction(stored.action);\n\n\t\t\tconst learning: Learning = {\n\t\t\t\tid: stored.id,\n\t\t\t\ttype: stored.type,\n\t\t\t\ttrigger,\n\t\t\t\taction,\n\t\t\t\tconfidence: stored.relevanceScore,\n\t\t\t\tcreated: new Date(stored.createdAt).getTime(),\n\t\t\t\tlastUsed: stored.lastAccessed ? new Date(stored.lastAccessed).getTime() : undefined,\n\t\t\t\tusageCount: stored.appliedCount,\n\t\t\t\ttags: stored.keywords || [],\n\t\t\t\tarchived: false,\n\t\t\t};\n\n\t\t\t// Validate against schema\n\t\t\treturn LearningSchema.parse(learning);\n\t\t} catch {\n\t\t\t// Invalid learning format, skip\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t/**\n\t * Extract command names from trigger description and keywords using fuzzy matching\n\t */\n\tprivate extractCommands(trigger: string, keywords?: string[]): string[] {\n\t\tconst commands: string[] = [];\n\t\tconst allKeywords = [...(keywords || []), ...trigger.toLowerCase().split(/\\s+/)];\n\n\t\t// Use Fuse.js for fuzzy matching against HIGH_VALUE_COMMANDS\n\t\tconst fuse = new Fuse(allKeywords, {\n\t\t\tthreshold: this.config.fuzzyThreshold,\n\t\t});\n\n\t\t// Search for each HIGH_VALUE_COMMAND with fuzzy tolerance\n\t\tfor (const cmd of HIGH_VALUE_COMMANDS) {\n\t\t\tconst results = fuse.search(cmd);\n\t\t\t// Match if found with score below threshold\n\t\t\tif (results.length > 0) {\n\t\t\t\tcommands.push(cmd);\n\t\t\t}\n\t\t}\n\n\t\treturn commands;\n\t}\n\n\t/**\n\t * Parse action string into LearningAction format\n\t */\n\tprivate parseAction(actionStr: string): Learning[\"action\"] {\n\t\t// Default to warn action with the stored action as message\n\t\treturn {\n\t\t\ttype: \"warn\",\n\t\t\tpayload: {\n\t\t\t\tmessage: actionStr,\n\t\t\t\tseverity: \"info\",\n\t\t\t},\n\t\t};\n\t}\n\n\t/**\n\t * Calculate how well a learning matches the input context\n\t * Returns 0 if no match, 0.5-1.0 for partial/full match\n\t */\n\tprivate calculateMatchScore(learning: Learning, input: LearningEvaluationInput): number {\n\t\tlet score = 0;\n\t\tlet factors = 0;\n\n\t\tconst trigger = learning.trigger;\n\n\t\t// Command matching (weight: 0.4)\n\t\tif (trigger.commands && trigger.commands.length > 0) {\n\t\t\tfactors++;\n\t\t\tif (trigger.commands.includes(input.commandName)) {\n\t\t\t\tscore += 0.4;\n\t\t\t}\n\t\t}\n\n\t\t// Intent matching (weight: 0.2)\n\t\tif (trigger.intent && trigger.intent.length > 0 && input.intent) {\n\t\t\tfactors++;\n\t\t\tif (trigger.intent.includes(input.intent)) {\n\t\t\t\tscore += 0.2;\n\t\t\t}\n\t\t}\n\n\t\t// File pattern matching (weight: 0.2)\n\t\tif (trigger.filePatterns && trigger.filePatterns.length > 0 && input.filesOrPaths) {\n\t\t\tfactors++;\n\t\t\tconst matchesPattern = input.filesOrPaths.some((file: string) =>\n\t\t\t\ttrigger.filePatterns?.some((pattern) => this.matchGlobPattern(file, pattern)),\n\t\t\t);\n\t\t\tif (matchesPattern) {\n\t\t\t\tscore += 0.2;\n\t\t\t}\n\t\t}\n\n\t\t// Flag matching (weight: 0.2)\n\t\tif (trigger.flags && trigger.flags.length > 0 && input.args) {\n\t\t\tfactors++;\n\t\t\tconst argKeys = Object.keys(input.args);\n\t\t\tconst matchesFlag = trigger.flags.some((flag) => {\n\t\t\t\tconst flagName = flag.replace(/^--?/, \"\");\n\t\t\t\treturn argKeys.includes(flagName) || argKeys.includes(flag);\n\t\t\t});\n\t\t\tif (matchesFlag) {\n\t\t\t\tscore += 0.2;\n\t\t\t}\n\t\t}\n\n\t\t// Description fuzzy matching as fallback (weight: 0.3)\n\t\tif (factors === 0 || score === 0) {\n\t\t\tconst descriptionMatch = this.fuzzyMatchDescription(trigger.description, input);\n\t\t\tif (descriptionMatch > 0) {\n\t\t\t\tscore = Math.max(score, descriptionMatch * 0.3);\n\t\t\t}\n\t\t}\n\n\t\t// Normalize score if we had matching factors\n\t\tif (factors > 0 && score > 0) {\n\t\t\t// Boost score if multiple factors matched\n\t\t\tconst matchedFactors = Math.floor(score / 0.2);\n\t\t\tif (matchedFactors >= 2) {\n\t\t\t\tscore = Math.min(1.0, score * 1.2);\n\t\t\t}\n\t\t}\n\n\t\treturn score;\n\t}\n\n\t/**\n\t * Simple fuzzy matching against description\n\t */\n\tprivate fuzzyMatchDescription(description: string, input: LearningEvaluationInput): number {\n\t\tconst descLower = description.toLowerCase();\n\t\tlet matches = 0;\n\n\t\t// Check command name in description\n\t\tif (descLower.includes(input.commandName.toLowerCase())) {\n\t\t\tmatches++;\n\t\t}\n\n\t\t// Check intent in description\n\t\tif (input.intent && descLower.includes(input.intent.toLowerCase())) {\n\t\t\tmatches++;\n\t\t}\n\n\t\t// Check file paths\n\t\tif (input.filesOrPaths) {\n\t\t\tfor (const file of input.filesOrPaths) {\n\t\t\t\tconst fileName = file.split(\"/\").pop()?.toLowerCase() || \"\";\n\t\t\t\tif (descLower.includes(fileName)) {\n\t\t\t\t\tmatches++;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn matches > 0 ? Math.min(1.0, matches * 0.4) : 0;\n\t}\n\n\t/**\n\t * Simple glob pattern matching (supports * and **)\n\t */\n\tprivate matchGlobPattern(filePath: string, pattern: string): boolean {\n\t\t// Normalize paths\n\t\tconst normalizedFile = filePath.replace(/\\\\/g, \"/\");\n\t\tconst normalizedPattern = pattern.replace(/\\\\/g, \"/\");\n\n\t\t// Convert glob pattern to regex\n\t\tlet regexPattern = normalizedPattern\n\t\t\t.replace(/\\./g, \"\\\\.\") // Escape dots\n\t\t\t.replace(/\\*\\*/g, \"__DOUBLE_STAR__\") // Placeholder for **\n\t\t\t.replace(/\\*/g, \"[^/]*\") // * matches anything except /\n\t\t\t.replace(/__DOUBLE_STAR__/g, \".*\"); // ** matches anything including /\n\n\t\t// Add anchors if pattern doesn't start with **\n\t\tif (!normalizedPattern.startsWith(\"**\")) {\n\t\t\tregexPattern = `^${regexPattern}`;\n\t\t}\n\t\tif (!normalizedPattern.endsWith(\"**\")) {\n\t\t\tregexPattern = `${regexPattern}$`;\n\t\t}\n\n\t\ttry {\n\t\t\treturn new RegExp(regexPattern).test(normalizedFile);\n\t\t} catch {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t/**\n\t * Record that a learning was matched (for telemetry)\n\t */\n\trecordMatch(learningId: string): void {\n\t\t// Update access count in StateStore\n\t\tthis.stateStore.updateLearning(learningId, {\n\t\t\tlastAccessed: new Date().toISOString(),\n\t\t\taccessCount: (this.stateStore.getLearnings().find((l) => l.id === learningId)?.accessCount || 0) + 1,\n\t\t});\n\t}\n}\n\n// =============================================================================\n// EVALUATION SERVICE\n// =============================================================================\n\nexport interface EvaluationResult {\n\tselectedLearnings: SelectedLearning[];\n\tdebug?: {\n\t\tevaluatedCount: number;\n\t\tdurationMs: number;\n\t\tskippedReason?: string;\n\t};\n}\n\n/**\n * Learning Evaluation Service\n *\n * High-level service for evaluating learnings in observe mode.\n * Wraps LearningMatcher with timing and logging.\n * Phase 2.6a: Adds session-aware repetition avoidance.\n */\nexport class LearningEvaluationService {\n\tprivate readonly matcher: LearningMatcher;\n\tprivate readonly mode: \"observe\" | \"warn\" | \"apply-safe\" | \"apply-all\" | \"off\";\n\tprivate readonly stateStore: StateStore;\n\n\tconstructor(\n\t\tstateStore: StateStore,\n\t\tmode: \"observe\" | \"warn\" | \"apply-safe\" | \"apply-all\" | \"off\" = \"observe\",\n\t\tconfig?: LearningMatcherConfig,\n\t) {\n\t\tthis.stateStore = stateStore;\n\t\tthis.matcher = new LearningMatcher(stateStore, config);\n\t\tthis.mode = mode;\n\t}\n\n\t/**\n\t * Evaluate learnings for a command input (Phase 2.6a: session-aware)\n\t */\n\tasync evaluate(input: LearningEvaluationInput): Promise<EvaluationResult> {\n\t\tconst startTime = performance.now();\n\n\t\t// Check if evaluation is disabled\n\t\tif (this.mode === \"off\") {\n\t\t\treturn {\n\t\t\t\tselectedLearnings: [],\n\t\t\t\tdebug: {\n\t\t\t\t\tevaluatedCount: 0,\n\t\t\t\t\tdurationMs: 0,\n\t\t\t\t\tskippedReason: \"Learning evaluation disabled (mode=off)\",\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\n\t\t// Check if command should be evaluated\n\t\tif (!this.matcher.shouldEvaluate(input.commandName)) {\n\t\t\tconst durationMs = performance.now() - startTime;\n\t\t\treturn {\n\t\t\t\tselectedLearnings: [],\n\t\t\t\tdebug: {\n\t\t\t\t\tevaluatedCount: 0,\n\t\t\t\t\tdurationMs,\n\t\t\t\t\tskippedReason: `Command '${input.commandName}' not in evaluation scope`,\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\n\t\t// Find matching learnings\n\t\tconst allLearnings = await this.matcher.findMatches(input);\n\n\t\t// Phase 2.6a: Apply repetition penalty - filter out learnings already applied in current session\n\t\tconst activeSession = this.getActiveSession(input.workspaceId);\n\t\tconst appliedInSession = new Set(activeSession?.appliedLearnings || []);\n\t\tconst filteredLearnings = allLearnings.filter((learning) => !appliedInSession.has(learning.id));\n\n\t\t// Mode-specific filtering\n\t\tlet selectedLearnings = filteredLearnings;\n\t\tif (this.mode === \"warn\") {\n\t\t\tselectedLearnings = filteredLearnings.filter((learning) => learning.action.type === \"warn\");\n\t\t}\n\n\t\tconst durationMs = performance.now() - startTime;\n\n\t\t// In observe/warn modes, just log what would be applied\n\t\tif (this.mode === \"observe\" || this.mode === \"warn\") {\n\t\t\tfor (const learning of selectedLearnings) {\n\t\t\t\tthis.matcher.recordMatch(learning.id);\n\t\t\t}\n\t\t}\n\n\t\treturn {\n\t\t\tselectedLearnings,\n\t\t\tdebug: {\n\t\t\t\tevaluatedCount: selectedLearnings.length,\n\t\t\t\tdurationMs,\n\t\t\t},\n\t\t};\n\t}\n\n\t/**\n\t * Phase 2.6a: Get active session for workspace (with 15-minute timeout)\n\t * Session is considered active if last checkpoint was within 15 minutes\n\t */\n\tprivate getActiveSession(_workspaceId: string) {\n\t\tconst TIMEOUT_MS = 15 * 60 * 1000; // 15 minutes\n\t\tconst now = Date.now();\n\n\t\tconst sessions = this.stateStore.getSessions();\n\t\t// Find most recent session for this workspace\n\t\tconst recentSession = sessions\n\t\t\t.filter((s) => {\n\t\t\t\tconst lastCheckpoint = new Date(s.lastCheckpoint).getTime();\n\t\t\t\treturn now - lastCheckpoint < TIMEOUT_MS;\n\t\t\t})\n\t\t\t.sort((a, b) => new Date(b.lastCheckpoint).getTime() - new Date(a.lastCheckpoint).getTime())[0];\n\n\t\treturn recentSession || null;\n\t}\n}\n","/**\n * Mock Leakage Detector - Identifies test mocks and fixtures in production code\n */\n\nexport interface MockFinding {\n\ttype: string;\n\tline: number;\n\tsnippet: string;\n\tseverity: \"low\" | \"medium\" | \"high\" | \"critical\";\n\truleId: string;\n}\n\nexport interface MockDetectionResult {\n\tfindings: MockFinding[];\n\triskScore: number;\n}\n\n// Test library imports that shouldn't be in production code\nconst TEST_IMPORTS = [\n\t\"vitest\",\n\t\"jest\",\n\t\"@testing-library/react\",\n\t\"@testing-library/dom\",\n\t\"@testing-library/user-event\",\n\t\"@jest/globals\",\n\t\"mocha\",\n\t\"chai\",\n\t\"sinon\",\n\t\"@vitest/spy\",\n];\n\n// Mock data patterns - match variable/property names\nconst MOCK_PATTERNS = [\n\t/\\b(mock|mocked)\\w+/gi,\n\t/\\bfake\\w+/gi,\n\t/\\bdummy\\w+/gi,\n\t/\\b(stub|stubbed)\\w+/gi,\n\t/\\btest(?:Data|User|Response|Api)/gi,\n];\n\nexport class MockDetector {\n\t/**\n\t * Detect mock/test code leakage in production files\n\t */\n\tdetect(content: string, filePath: string): MockDetectionResult {\n\t\tconst findings: MockFinding[] = [];\n\n\t\t// Skip test files and config files\n\t\tif (this.isTestOrConfigFile(filePath)) {\n\t\t\treturn { findings: [], riskScore: 0 };\n\t\t}\n\n\t\tconst lines = content.split(\"\\n\");\n\n\t\t// Detect test library imports in production code\n\t\tthis.detectTestImports(lines, findings);\n\n\t\t// Detect mock data patterns\n\t\tthis.detectMockPatterns(lines, findings);\n\n\t\t// Calculate risk score\n\t\tconst riskScore = this.calculateRiskScore(findings);\n\n\t\treturn { findings, riskScore };\n\t}\n\n\t/**\n\t * Detect test library imports\n\t */\n\tprivate detectTestImports(lines: string[], findings: MockFinding[]): void {\n\t\tconst importPattern = /(?:import|require)\\s*.*?[\"']([^\"']+)[\"']/g;\n\n\t\tfor (let lineNum = 0; lineNum < lines.length; lineNum++) {\n\t\t\tconst line = lines[lineNum];\n\t\t\tconst matches = line.matchAll(importPattern);\n\n\t\t\tfor (const match of matches) {\n\t\t\t\tconst importPath = match[1];\n\n\t\t\t\t// Check if it's a test library\n\t\t\t\tfor (const testLib of TEST_IMPORTS) {\n\t\t\t\t\tif (importPath === testLib || importPath.startsWith(`${testLib}/`)) {\n\t\t\t\t\t\tfindings.push({\n\t\t\t\t\t\t\ttype: \"Test Library Import\",\n\t\t\t\t\t\t\tline: lineNum + 1,\n\t\t\t\t\t\t\tsnippet: line.trim().substring(0, 80),\n\t\t\t\t\t\t\tseverity: \"high\",\n\t\t\t\t\t\t\truleId: \"mock-detection/test-import\",\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Detect mock data patterns\n\t */\n\tprivate detectMockPatterns(lines: string[], findings: MockFinding[]): void {\n\t\tfor (let lineNum = 0; lineNum < lines.length; lineNum++) {\n\t\t\tconst line = lines[lineNum];\n\n\t\t\t// Skip comments\n\t\t\tif (line.trim().startsWith(\"//\") || line.trim().startsWith(\"*\")) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tfor (const pattern of MOCK_PATTERNS) {\n\t\t\t\t// Reset lastIndex to avoid stateful regex issues\n\t\t\t\tpattern.lastIndex = 0;\n\t\t\t\tif (pattern.test(line)) {\n\t\t\t\t\t// Check if it's a large data structure (potential fixture)\n\t\t\t\t\tconst isLargeStructure = line.includes(\"[\") || line.includes(\"{\");\n\n\t\t\t\t\tfindings.push({\n\t\t\t\t\t\ttype: \"Mock Data Pattern\",\n\t\t\t\t\t\tline: lineNum + 1,\n\t\t\t\t\t\tsnippet: line.trim().substring(0, 80),\n\t\t\t\t\t\tseverity: isLargeStructure ? \"medium\" : \"low\",\n\t\t\t\t\t\truleId: \"mock-detection/mock-pattern\",\n\t\t\t\t\t});\n\n\t\t\t\t\t// Only report once per line\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Check if file is a test or config file\n\t */\n\tprivate isTestOrConfigFile(filePath: string): boolean {\n\t\tconst allowedPatterns = [\n\t\t\t/\\.test\\.[jt]sx?$/,\n\t\t\t/\\.spec\\.[jt]sx?$/,\n\t\t\t/__tests__\\//,\n\t\t\t/\\/test\\//,\n\t\t\t/\\/tests\\//,\n\t\t\t/\\.fixture\\.[jt]sx?$/,\n\t\t\t/\\.seed\\.[jt]sx?$/,\n\t\t\t/vitest\\.config\\.[jt]s$/,\n\t\t\t/jest\\.config\\.[jt]s$/,\n\t\t\t/playwright\\.config\\.[jt]s$/,\n\t\t\t/setupTests\\.[jt]s$/,\n\t\t\t/test-utils\\.[jt]sx?$/,\n\t\t];\n\n\t\treturn allowedPatterns.some((pattern) => pattern.test(filePath));\n\t}\n\n\t/**\n\t * Calculate risk score (0-10)\n\t */\n\tprivate calculateRiskScore(findings: MockFinding[]): number {\n\t\tif (findings.length === 0) {\n\t\t\treturn 0;\n\t\t}\n\n\t\tconst severityWeights = {\n\t\t\tcritical: 10,\n\t\t\thigh: 7,\n\t\t\tmedium: 4,\n\t\t\tlow: 2,\n\t\t};\n\n\t\tlet totalScore = 0;\n\t\tfor (const finding of findings) {\n\t\t\ttotalScore += severityWeights[finding.severity];\n\t\t}\n\n\t\t// Cap at 10\n\t\treturn Math.min(10, totalScore / findings.length);\n\t}\n}\n","/**\n * Phantom Dependency Detector - Identifies unused dependencies in package.json\n */\n\nexport interface PhantomDependencyFinding {\n\tpackageName: string;\n\tdeclaredIn: \"dependencies\" | \"devDependencies\";\n\tseverity: \"low\" | \"medium\";\n\truleId: string;\n}\n\nexport interface PhantomDependencyResult {\n\tfindings: PhantomDependencyFinding[];\n\tphantomDeps: string[];\n\ttotalDeps: number;\n\tusageReport: Record<string, number>;\n\triskScore: number;\n}\n\n// Framework-specific exceptions (implicitly used)\nconst FRAMEWORK_EXCEPTIONS: Record<string, string[]> = {\n\tnext: [\"react\", \"react-dom\", \"next\"],\n\tvite: [\"vite\"],\n\t\"@vitejs/plugin-react\": [\"react\", \"react-dom\"],\n\tnuxt: [\"vue\", \"nuxt\"],\n\t\"@angular/core\": [\"@angular/common\", \"@angular/platform-browser\"],\n};\n\n// Build tool and CLI exceptions (not directly imported)\nconst BUILD_TOOL_EXCEPTIONS = [\n\t\"typescript\",\n\t\"tsup\",\n\t\"vite\",\n\t\"esbuild\",\n\t\"webpack\",\n\t\"rollup\",\n\t\"biome\",\n\t\"eslint\",\n\t\"prettier\",\n\t\"@biomejs/biome\",\n\t\"vitest\",\n\t\"jest\",\n\t\"playwright\",\n\t\"@playwright/test\",\n\t\"turbo\",\n\t\"tsx\",\n\t\"node-gyp\",\n\t\"@types/node\",\n\t\"@changesets/cli\",\n\t\"lefthook\",\n\t\"@evilmartians/lefthook\",\n\t\"commitlint\",\n\t\"lint-staged\",\n];\n\nexport class PhantomDependencyDetector {\n\t/**\n\t * Detect unused dependencies by analyzing imports\n\t */\n\tasync detect(\n\t\tpackageJsonContent: string,\n\t\tcodebaseFiles: Array<{ path: string; content: string }>,\n\t): Promise<PhantomDependencyResult> {\n\t\tconst findings: PhantomDependencyFinding[] = [];\n\t\tconst usageReport: Record<string, number> = {};\n\n\t\t// Parse package.json\n\t\tlet packageJson: any;\n\t\ttry {\n\t\t\tpackageJson = JSON.parse(packageJsonContent);\n\t\t} catch {\n\t\t\treturn {\n\t\t\t\tfindings: [],\n\t\t\t\tphantomDeps: [],\n\t\t\t\ttotalDeps: 0,\n\t\t\t\tusageReport: {},\n\t\t\t\triskScore: 0,\n\t\t\t};\n\t\t}\n\n\t\tconst dependencies = packageJson.dependencies || {};\n\t\tconst devDependencies = packageJson.devDependencies || {};\n\t\tconst allDeps = { ...dependencies, ...devDependencies };\n\t\tconst totalDeps = Object.keys(allDeps).length;\n\n\t\t// Initialize usage report\n\t\tfor (const dep of Object.keys(allDeps)) {\n\t\t\tusageReport[dep] = 0;\n\t\t}\n\n\t\t// Scan all files for imports\n\t\tfor (const file of codebaseFiles) {\n\t\t\t// Skip node_modules and build outputs\n\t\t\tif (file.path.includes(\"node_modules\") || file.path.includes(\"dist/\") || file.path.includes(\"build/\")) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tthis.scanFileForImports(file.content, usageReport);\n\t\t}\n\n\t\t// Determine framework exceptions based on dependencies\n\t\tconst frameworkExceptions = this.getFrameworkExceptions(allDeps);\n\n\t\t// Find phantom dependencies\n\t\tconst phantomDeps: string[] = [];\n\t\tfor (const [dep, usage] of Object.entries(usageReport)) {\n\t\t\t// Skip if used\n\t\t\tif (usage > 0) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Skip build tools\n\t\t\tif (BUILD_TOOL_EXCEPTIONS.includes(dep)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Skip framework exceptions\n\t\t\tif (frameworkExceptions.includes(dep)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Skip @types packages (TypeScript type definitions)\n\t\t\tif (dep.startsWith(\"@types/\")) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Skip transitive dependencies (packages starting with @)\n\t\t\t// This is a heuristic - in production you'd use dependency tree analysis\n\t\t\tif (dep.startsWith(\"@\") && !dep.includes(\"/\")) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// It's a phantom dependency\n\t\t\tphantomDeps.push(dep);\n\n\t\t\tconst declaredIn = dep in dependencies ? \"dependencies\" : \"devDependencies\";\n\t\t\tfindings.push({\n\t\t\t\tpackageName: dep,\n\t\t\t\tdeclaredIn,\n\t\t\t\tseverity: declaredIn === \"dependencies\" ? \"medium\" : \"low\",\n\t\t\t\truleId: \"phantom-deps/unused-dependency\",\n\t\t\t});\n\t\t}\n\n\t\t// Calculate risk score\n\t\tconst riskScore = this.calculateRiskScore(phantomDeps.length, totalDeps);\n\n\t\treturn {\n\t\t\tfindings,\n\t\t\tphantomDeps,\n\t\t\ttotalDeps,\n\t\t\tusageReport,\n\t\t\triskScore,\n\t\t};\n\t}\n\n\t/**\n\t * Scan file content for import/require statements\n\t */\n\tprivate scanFileForImports(content: string, usageReport: Record<string, number>): void {\n\t\t// Match various import patterns\n\t\tconst patterns = [\n\t\t\t/import\\s+.*?from\\s+[\"']([^\"']+)[\"']/g,\n\t\t\t/require\\s*\\(\\s*[\"']([^\"']+)[\"']\\s*\\)/g,\n\t\t\t/import\\s*\\(\\s*[\"']([^\"']+)[\"']\\s*\\)/g, // Dynamic imports\n\t\t];\n\n\t\tfor (const pattern of patterns) {\n\t\t\tconst matches = content.matchAll(pattern);\n\t\t\tfor (const match of matches) {\n\t\t\t\tconst importPath = match[1];\n\n\t\t\t\t// Extract package name from import path\n\t\t\t\t// e.g., \"react\" from \"react\"\n\t\t\t\t// e.g., \"@snapback/sdk\" from \"@snapback/sdk/storage\"\n\t\t\t\t// e.g., \"lodash\" from \"lodash/fp\"\n\t\t\t\tconst packageName = this.extractPackageName(importPath);\n\n\t\t\t\tif (packageName && packageName in usageReport) {\n\t\t\t\t\tusageReport[packageName]++;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Extract package name from import path\n\t */\n\tprivate extractPackageName(importPath: string): string {\n\t\t// Skip relative imports\n\t\tif (importPath.startsWith(\".\")) {\n\t\t\treturn \"\";\n\t\t}\n\n\t\t// Handle scoped packages (@org/package)\n\t\tif (importPath.startsWith(\"@\")) {\n\t\t\tconst parts = importPath.split(\"/\");\n\t\t\tif (parts.length >= 2) {\n\t\t\t\treturn `${parts[0]}/${parts[1]}`;\n\t\t\t}\n\t\t\treturn parts[0];\n\t\t}\n\n\t\t// Handle regular packages\n\t\tconst parts = importPath.split(\"/\");\n\t\treturn parts[0];\n\t}\n\n\t/**\n\t * Get framework-specific exceptions\n\t */\n\tprivate getFrameworkExceptions(allDeps: Record<string, string>): string[] {\n\t\tconst exceptions: string[] = [];\n\n\t\tfor (const [framework, deps] of Object.entries(FRAMEWORK_EXCEPTIONS)) {\n\t\t\tif (framework in allDeps) {\n\t\t\t\texceptions.push(...deps);\n\t\t\t}\n\t\t}\n\n\t\treturn exceptions;\n\t}\n\n\t/**\n\t * Calculate risk score (0-10)\n\t */\n\tprivate calculateRiskScore(phantomCount: number, totalCount: number): number {\n\t\tif (totalCount === 0) {\n\t\t\treturn 0;\n\t\t}\n\n\t\tconst ratio = phantomCount / totalCount;\n\n\t\t// Risk levels:\n\t\t// 0-10%: Low (score 0-3)\n\t\t// 10-25%: Medium (score 3-6)\n\t\t// 25%+: High (score 6-10)\n\n\t\tif (ratio <= 0.1) {\n\t\t\treturn ratio * 30; // 0-3\n\t\t}\n\t\tif (ratio <= 0.25) {\n\t\t\treturn 3 + (ratio - 0.1) * 20; // 3-6\n\t\t}\n\t\treturn Math.min(10, 6 + (ratio - 0.25) * 13.3); // 6-10\n\t}\n}\n","/**\n * Policy Engine - Orchestrates detectors and enforces policies\n * Provides watch/warn/block actions based on detection results\n */\n\nimport { type MockDetectionResult, MockDetector } from \"./detectors/MockDetector.js\";\nimport { PhantomDependencyDetector, type PhantomDependencyResult } from \"./detectors/PhantomDependencyDetector.js\";\nimport { type SecretDetectionResult, SecretDetector } from \"./detectors/SecretDetector.js\";\n\nexport type PolicyAction = \"watch\" | \"warn\" | \"block\";\n\nexport interface PolicyRule {\n\tid: string;\n\tname: string;\n\tdetector: \"secret\" | \"mock\" | \"phantom-dependency\";\n\taction: PolicyAction;\n\tseverity?: \"low\" | \"medium\" | \"high\" | \"critical\";\n\tenabled: boolean;\n}\n\nexport interface PolicyEngineConfig {\n\trules: PolicyRule[];\n\tdefaultAction?: PolicyAction;\n}\n\nexport interface DetectionEvent {\n\truleId: string;\n\tdetector: string;\n\taction: PolicyAction;\n\tfindings: any[];\n\triskScore: number;\n\ttimestamp: string;\n}\n\nexport interface PolicyEngineResult {\n\taction: PolicyAction;\n\tevents: DetectionEvent[];\n\tsummary: {\n\t\ttotalFindings: number;\n\t\tbyDetector: Record<string, number>;\n\t\thighestAction: PolicyAction;\n\t};\n}\n\n/**\n * Default policy rules configuration\n */\nconst DEFAULT_RULES: PolicyRule[] = [\n\t{\n\t\tid: \"secret-detection-critical\",\n\t\tname: \"Critical Secret Detection\",\n\t\tdetector: \"secret\",\n\t\taction: \"block\",\n\t\tseverity: \"critical\",\n\t\tenabled: true,\n\t},\n\t{\n\t\tid: \"secret-detection-high\",\n\t\tname: \"High Severity Secret Detection\",\n\t\tdetector: \"secret\",\n\t\taction: \"warn\",\n\t\tseverity: \"high\",\n\t\tenabled: true,\n\t},\n\t{\n\t\tid: \"mock-detection\",\n\t\tname: \"Mock/Test Leakage Detection\",\n\t\tdetector: \"mock\",\n\t\taction: \"warn\",\n\t\tenabled: true,\n\t},\n\t{\n\t\tid: \"phantom-dependency\",\n\t\tname: \"Phantom Dependency Detection\",\n\t\tdetector: \"phantom-dependency\",\n\t\taction: \"watch\",\n\t\tenabled: true,\n\t},\n];\n\nexport class PolicyEngine {\n\tprivate secretDetector: SecretDetector;\n\tprivate mockDetector: MockDetector;\n\tprivate phantomDependencyDetector: PhantomDependencyDetector;\n\tprivate config: PolicyEngineConfig;\n\n\tconstructor(config?: Partial<PolicyEngineConfig>) {\n\t\tthis.secretDetector = new SecretDetector();\n\t\tthis.mockDetector = new MockDetector();\n\t\tthis.phantomDependencyDetector = new PhantomDependencyDetector();\n\n\t\tthis.config = {\n\t\t\t// Deep copy DEFAULT_RULES to avoid mutation across instances\n\t\t\trules: config?.rules || DEFAULT_RULES.map((rule) => ({ ...rule })),\n\t\t\tdefaultAction: config?.defaultAction || \"watch\",\n\t\t};\n\t}\n\n\t/**\n\t * Run all enabled detectors on a file\n\t */\n\tasync analyzeFile(filePath: string, content: string): Promise<PolicyEngineResult> {\n\t\tconst events: DetectionEvent[] = [];\n\t\tlet totalFindings = 0;\n\t\tconst byDetector: Record<string, number> = {};\n\n\t\t// Run secret detection\n\t\tif (this.isDetectorEnabled(\"secret\")) {\n\t\t\tconst result = this.secretDetector.detect(content, filePath);\n\t\t\tconst action = this.determineAction(\"secret\", result);\n\n\t\t\tif (result.findings.length > 0) {\n\t\t\t\tevents.push({\n\t\t\t\t\truleId: \"secret-detection\",\n\t\t\t\t\tdetector: \"secret\",\n\t\t\t\t\taction,\n\t\t\t\t\tfindings: result.findings,\n\t\t\t\t\triskScore: result.riskScore,\n\t\t\t\t\ttimestamp: new Date().toISOString(),\n\t\t\t\t});\n\n\t\t\t\ttotalFindings += result.findings.length;\n\t\t\t\tbyDetector.secret = result.findings.length;\n\t\t\t}\n\t\t}\n\n\t\t// Run mock detection\n\t\tif (this.isDetectorEnabled(\"mock\")) {\n\t\t\tconst result = this.mockDetector.detect(content, filePath);\n\t\t\tconst action = this.determineAction(\"mock\", result);\n\n\t\t\tif (result.findings.length > 0) {\n\t\t\t\tevents.push({\n\t\t\t\t\truleId: \"mock-detection\",\n\t\t\t\t\tdetector: \"mock\",\n\t\t\t\t\taction,\n\t\t\t\t\tfindings: result.findings,\n\t\t\t\t\triskScore: result.riskScore,\n\t\t\t\t\ttimestamp: new Date().toISOString(),\n\t\t\t\t});\n\n\t\t\t\ttotalFindings += result.findings.length;\n\t\t\t\tbyDetector.mock = result.findings.length;\n\t\t\t}\n\t\t}\n\n\t\t// Determine highest action\n\t\tconst highestAction = this.getHighestAction(events.map((e) => e.action));\n\n\t\treturn {\n\t\t\taction: highestAction,\n\t\t\tevents,\n\t\t\tsummary: {\n\t\t\t\ttotalFindings,\n\t\t\t\tbyDetector,\n\t\t\t\thighestAction,\n\t\t\t},\n\t\t};\n\t}\n\n\t/**\n\t * Analyze package.json for phantom dependencies\n\t */\n\tasync analyzePackageJson(\n\t\tpackageJsonContent: string,\n\t\tcodebaseFiles: Array<{ path: string; content: string }>,\n\t): Promise<PolicyEngineResult> {\n\t\tconst events: DetectionEvent[] = [];\n\n\t\tif (this.isDetectorEnabled(\"phantom-dependency\")) {\n\t\t\tconst result = await this.phantomDependencyDetector.detect(packageJsonContent, codebaseFiles);\n\t\t\tconst action = this.determineAction(\"phantom-dependency\", result);\n\n\t\t\tif (result.findings.length > 0) {\n\t\t\t\tevents.push({\n\t\t\t\t\truleId: \"phantom-dependency\",\n\t\t\t\t\tdetector: \"phantom-dependency\",\n\t\t\t\t\taction,\n\t\t\t\t\tfindings: result.findings,\n\t\t\t\t\triskScore: result.riskScore,\n\t\t\t\t\ttimestamp: new Date().toISOString(),\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tconst highestAction = this.getHighestAction(events.map((e) => e.action));\n\n\t\tconst byDetector: Record<string, number> = {};\n\t\tfor (const e of events) {\n\t\t\tbyDetector[e.detector] = e.findings.length;\n\t\t}\n\n\t\treturn {\n\t\t\taction: highestAction,\n\t\t\tevents,\n\t\t\tsummary: {\n\t\t\t\ttotalFindings: events.reduce((sum, e) => sum + e.findings.length, 0),\n\t\t\t\tbyDetector,\n\t\t\t\thighestAction,\n\t\t\t},\n\t\t};\n\t}\n\n\t/**\n\t * Check if a detector is enabled in the policy\n\t */\n\tprivate isDetectorEnabled(detector: \"secret\" | \"mock\" | \"phantom-dependency\"): boolean {\n\t\treturn this.config.rules.some((rule) => rule.detector === detector && rule.enabled);\n\t}\n\n\t/**\n\t * Determine action based on detection results and configured rules\n\t */\n\tprivate determineAction(\n\t\tdetector: \"secret\" | \"mock\" | \"phantom-dependency\",\n\t\tresult: SecretDetectionResult | MockDetectionResult | PhantomDependencyResult,\n\t): PolicyAction {\n\t\t// Find the most severe matching rule\n\t\tlet highestAction: PolicyAction = this.config.defaultAction || \"watch\";\n\n\t\tfor (const rule of this.config.rules) {\n\t\t\tif (rule.detector !== detector || !rule.enabled) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// For secret detection, check severity\n\t\t\tif (detector === \"secret\" && rule.severity) {\n\t\t\t\tconst secretResult = result as SecretDetectionResult;\n\t\t\t\tconst hasSeverity = secretResult.findings.some((f) => f.severity === rule.severity);\n\t\t\t\tif (hasSeverity) {\n\t\t\t\t\thighestAction = this.getHigherAction(highestAction, rule.action);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// For other detectors, apply rule action if there are findings\n\t\t\t\tif (result.findings.length > 0) {\n\t\t\t\t\thighestAction = this.getHigherAction(highestAction, rule.action);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn highestAction;\n\t}\n\n\t/**\n\t * Get the higher priority action\n\t */\n\tprivate getHigherAction(current: PolicyAction, candidate: PolicyAction): PolicyAction {\n\t\tconst priority: Record<PolicyAction, number> = {\n\t\t\twatch: 1,\n\t\t\twarn: 2,\n\t\t\tblock: 3,\n\t\t};\n\n\t\treturn priority[candidate] > priority[current] ? candidate : current;\n\t}\n\n\t/**\n\t * Get the highest action from a list\n\t */\n\tprivate getHighestAction(actions: PolicyAction[]): PolicyAction {\n\t\tif (actions.length === 0) {\n\t\t\treturn this.config.defaultAction || \"watch\";\n\t\t}\n\n\t\treturn actions.reduce((highest, current) => this.getHigherAction(highest, current), \"watch\" as PolicyAction);\n\t}\n\n\t/**\n\t * Update policy configuration\n\t */\n\tupdateConfig(config: Partial<PolicyEngineConfig>): void {\n\t\tif (config.rules) {\n\t\t\tthis.config.rules = config.rules;\n\t\t}\n\t\tif (config.defaultAction) {\n\t\t\tthis.config.defaultAction = config.defaultAction;\n\t\t}\n\t}\n\n\t/**\n\t * Get current policy configuration\n\t */\n\tgetConfig(): PolicyEngineConfig {\n\t\treturn { ...this.config };\n\t}\n\n\t/**\n\t * Enable a specific rule\n\t */\n\tenableRule(ruleId: string): void {\n\t\tconst rule = this.config.rules.find((r) => r.id === ruleId);\n\t\tif (rule) {\n\t\t\trule.enabled = true;\n\t\t}\n\t}\n\n\t/**\n\t * Disable a specific rule\n\t */\n\tdisableRule(ruleId: string): void {\n\t\tconst rule = this.config.rules.find((r) => r.id === ruleId);\n\t\tif (rule) {\n\t\t\trule.enabled = false;\n\t\t}\n\t}\n}\n","/**\n * SARIF Formatter - Converts detection results to SARIF format\n * SARIF (Static Analysis Results Interchange Format) v2.1.0\n * https://docs.oasis-open.org/sarif/sarif/v2.1.0/sarif-v2.1.0.html\n */\n\nimport type { MockFinding } from \"./detectors/MockDetector.js\";\nimport type { PhantomDependencyFinding } from \"./detectors/PhantomDependencyDetector.js\";\nimport type { SecretFinding } from \"./detectors/SecretDetector.js\";\nimport type { PolicyEngineResult } from \"./PolicyEngine.js\";\n\nexport interface SarifLog {\n\tversion: \"2.1.0\";\n\t$schema: string;\n\truns: SarifRun[];\n}\n\nexport interface SarifRun {\n\ttool: {\n\t\tdriver: {\n\t\t\tname: string;\n\t\t\tversion: string;\n\t\t\tinformationUri?: string;\n\t\t\trules?: SarifRule[];\n\t\t};\n\t};\n\tresults: SarifResult[];\n}\n\nexport interface SarifRule {\n\tid: string;\n\tname: string;\n\tshortDescription: {\n\t\ttext: string;\n\t};\n\tfullDescription?: {\n\t\ttext: string;\n\t};\n\tdefaultConfiguration?: {\n\t\tlevel: \"error\" | \"warning\" | \"note\";\n\t};\n\thelpUri?: string;\n}\n\nexport interface SarifResult {\n\truleId: string;\n\tlevel: \"error\" | \"warning\" | \"note\";\n\tmessage: {\n\t\ttext: string;\n\t};\n\tlocations?: Array<{\n\t\tphysicalLocation: {\n\t\t\tartifactLocation: {\n\t\t\t\turi: string;\n\t\t\t};\n\t\t\tregion?: {\n\t\t\t\tstartLine: number;\n\t\t\t\tstartColumn?: number;\n\t\t\t};\n\t\t};\n\t}>;\n\tproperties?: {\n\t\tseverity?: string;\n\t\tconfidence?: number;\n\t\t[key: string]: any;\n\t};\n}\n\nexport class SarifFormatter {\n\tprivate toolName = \"SnapBack Guardian\";\n\tprivate toolVersion = \"1.0.0\";\n\tprivate toolUri = \"https://snapback.dev\";\n\n\t/**\n\t * Convert PolicyEngineResult to SARIF format\n\t */\n\ttoSarif(result: PolicyEngineResult, analysisSource?: string): SarifLog {\n\t\tconst rules: SarifRule[] = [];\n\t\tconst results: SarifResult[] = [];\n\n\t\t// Process each detection event\n\t\tfor (const event of result.events) {\n\t\t\t// Add rule definitions\n\t\t\tthis.addRulesForEvent(event.detector, rules);\n\n\t\t\t// Convert findings to SARIF results\n\t\t\tfor (const finding of event.findings) {\n\t\t\t\tconst sarifResult = this.convertFindingToResult(finding, event.detector, analysisSource);\n\t\t\t\tif (sarifResult) {\n\t\t\t\t\tresults.push(sarifResult);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn {\n\t\t\tversion: \"2.1.0\",\n\t\t\t$schema: \"https://raw.githubusercontent.com/oasis-tcs/sarif-spec/master/Schemata/sarif-schema-2.1.0.json\",\n\t\t\truns: [\n\t\t\t\t{\n\t\t\t\t\ttool: {\n\t\t\t\t\t\tdriver: {\n\t\t\t\t\t\t\tname: this.toolName,\n\t\t\t\t\t\t\tversion: this.toolVersion,\n\t\t\t\t\t\t\tinformationUri: this.toolUri,\n\t\t\t\t\t\t\trules: this.deduplicateRules(rules),\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tresults,\n\t\t\t\t},\n\t\t\t],\n\t\t};\n\t}\n\n\t/**\n\t * Add rule definitions based on detector type\n\t */\n\tprivate addRulesForEvent(detector: string, rules: SarifRule[]): void {\n\t\tswitch (detector) {\n\t\t\tcase \"secret\":\n\t\t\t\trules.push({\n\t\t\t\t\tid: \"secret-detection/aws-key\",\n\t\t\t\t\tname: \"AWS Access Key Detection\",\n\t\t\t\t\tshortDescription: {\n\t\t\t\t\t\ttext: \"Detects AWS access keys in code\",\n\t\t\t\t\t},\n\t\t\t\t\tdefaultConfiguration: {\n\t\t\t\t\t\tlevel: \"error\",\n\t\t\t\t\t},\n\t\t\t\t\thelpUri: \"https://snapback.dev/docs/detectors/secret-detection\",\n\t\t\t\t});\n\t\t\t\trules.push({\n\t\t\t\t\tid: \"secret-detection/github-token\",\n\t\t\t\t\tname: \"GitHub Token Detection\",\n\t\t\t\t\tshortDescription: {\n\t\t\t\t\t\ttext: \"Detects GitHub personal access tokens\",\n\t\t\t\t\t},\n\t\t\t\t\tdefaultConfiguration: {\n\t\t\t\t\t\tlevel: \"error\",\n\t\t\t\t\t},\n\t\t\t\t\thelpUri: \"https://snapback.dev/docs/detectors/secret-detection\",\n\t\t\t\t});\n\t\t\t\trules.push({\n\t\t\t\t\tid: \"secret-detection/high-entropy-string\",\n\t\t\t\t\tname: \"High Entropy String Detection\",\n\t\t\t\t\tshortDescription: {\n\t\t\t\t\t\ttext: \"Detects high-entropy strings that may be secrets\",\n\t\t\t\t\t},\n\t\t\t\t\tdefaultConfiguration: {\n\t\t\t\t\t\tlevel: \"warning\",\n\t\t\t\t\t},\n\t\t\t\t\thelpUri: \"https://snapback.dev/docs/detectors/secret-detection\",\n\t\t\t\t});\n\t\t\t\tbreak;\n\n\t\t\tcase \"mock\":\n\t\t\t\trules.push({\n\t\t\t\t\tid: \"mock-detection/test-import\",\n\t\t\t\t\tname: \"Test Library Import Detection\",\n\t\t\t\t\tshortDescription: {\n\t\t\t\t\t\ttext: \"Detects test library imports in production code\",\n\t\t\t\t\t},\n\t\t\t\t\tdefaultConfiguration: {\n\t\t\t\t\t\tlevel: \"warning\",\n\t\t\t\t\t},\n\t\t\t\t\thelpUri: \"https://snapback.dev/docs/detectors/mock-detection\",\n\t\t\t\t});\n\t\t\t\trules.push({\n\t\t\t\t\tid: \"mock-detection/mock-pattern\",\n\t\t\t\t\tname: \"Mock Pattern Detection\",\n\t\t\t\t\tshortDescription: {\n\t\t\t\t\t\ttext: \"Detects mock/test patterns in production code\",\n\t\t\t\t\t},\n\t\t\t\t\tdefaultConfiguration: {\n\t\t\t\t\t\tlevel: \"warning\",\n\t\t\t\t\t},\n\t\t\t\t\thelpUri: \"https://snapback.dev/docs/detectors/mock-detection\",\n\t\t\t\t});\n\t\t\t\tbreak;\n\n\t\t\tcase \"phantom-dependency\":\n\t\t\t\trules.push({\n\t\t\t\t\tid: \"phantom-deps/unused-dependency\",\n\t\t\t\t\tname: \"Unused Dependency Detection\",\n\t\t\t\t\tshortDescription: {\n\t\t\t\t\t\ttext: \"Detects declared dependencies that are not imported\",\n\t\t\t\t\t},\n\t\t\t\t\tdefaultConfiguration: {\n\t\t\t\t\t\tlevel: \"note\",\n\t\t\t\t\t},\n\t\t\t\t\thelpUri: \"https://snapback.dev/docs/detectors/phantom-dependency\",\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\t/**\n\t * Convert a finding to SARIF result format\n\t */\n\tprivate convertFindingToResult(finding: any, detector: string, source?: string): SarifResult | null {\n\t\tif (detector === \"secret\") {\n\t\t\treturn this.convertSecretFinding(finding as SecretFinding, source);\n\t\t}\n\t\tif (detector === \"mock\") {\n\t\t\treturn this.convertMockFinding(finding as MockFinding, source);\n\t\t}\n\t\tif (detector === \"phantom-dependency\") {\n\t\t\treturn this.convertPhantomDependencyFinding(finding as PhantomDependencyFinding);\n\t\t}\n\t\treturn null;\n\t}\n\n\t/**\n\t * Convert secret finding to SARIF result\n\t */\n\tprivate convertSecretFinding(finding: SecretFinding, source?: string): SarifResult {\n\t\treturn {\n\t\t\truleId: finding.ruleId,\n\t\t\tlevel: this.mapSeverityToLevel(finding.severity),\n\t\t\tmessage: {\n\t\t\t\ttext: `${finding.type} detected: ${finding.snippet.substring(0, 50)}...`,\n\t\t\t},\n\t\t\tlocations: source\n\t\t\t\t? [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tphysicalLocation: {\n\t\t\t\t\t\t\t\tartifactLocation: {\n\t\t\t\t\t\t\t\t\turi: source,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tregion: {\n\t\t\t\t\t\t\t\t\tstartLine: finding.line,\n\t\t\t\t\t\t\t\t\tstartColumn: finding.column,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t]\n\t\t\t\t: undefined,\n\t\t\tproperties: {\n\t\t\t\tseverity: finding.severity,\n\t\t\t\tentropy: finding.entropy,\n\t\t\t},\n\t\t};\n\t}\n\n\t/**\n\t * Convert mock finding to SARIF result\n\t */\n\tprivate convertMockFinding(finding: MockFinding, source?: string): SarifResult {\n\t\treturn {\n\t\t\truleId: finding.ruleId,\n\t\t\tlevel: this.mapSeverityToLevel(finding.severity),\n\t\t\tmessage: {\n\t\t\t\ttext: `${finding.type} detected: ${finding.snippet}`,\n\t\t\t},\n\t\t\tlocations: source\n\t\t\t\t? [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tphysicalLocation: {\n\t\t\t\t\t\t\t\tartifactLocation: {\n\t\t\t\t\t\t\t\t\turi: source,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tregion: {\n\t\t\t\t\t\t\t\t\tstartLine: finding.line,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t]\n\t\t\t\t: undefined,\n\t\t\tproperties: {\n\t\t\t\tseverity: finding.severity,\n\t\t\t},\n\t\t};\n\t}\n\n\t/**\n\t * Convert phantom dependency finding to SARIF result\n\t */\n\tprivate convertPhantomDependencyFinding(finding: PhantomDependencyFinding): SarifResult {\n\t\treturn {\n\t\t\truleId: finding.ruleId,\n\t\t\tlevel: this.mapSeverityToLevel(finding.severity),\n\t\t\tmessage: {\n\t\t\t\ttext: `Unused dependency '${finding.packageName}' in ${finding.declaredIn}`,\n\t\t\t},\n\t\t\tlocations: [\n\t\t\t\t{\n\t\t\t\t\tphysicalLocation: {\n\t\t\t\t\t\tartifactLocation: {\n\t\t\t\t\t\t\turi: \"package.json\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t],\n\t\t\tproperties: {\n\t\t\t\tseverity: finding.severity,\n\t\t\t\tpackageName: finding.packageName,\n\t\t\t\tdeclaredIn: finding.declaredIn,\n\t\t\t},\n\t\t};\n\t}\n\n\t/**\n\t * Map internal severity to SARIF level\n\t */\n\tprivate mapSeverityToLevel(severity: \"low\" | \"medium\" | \"high\" | \"critical\"): \"error\" | \"warning\" | \"note\" {\n\t\tswitch (severity) {\n\t\t\tcase \"critical\":\n\t\t\tcase \"high\":\n\t\t\t\treturn \"error\";\n\t\t\tcase \"medium\":\n\t\t\t\treturn \"warning\";\n\t\t\tdefault:\n\t\t\t\treturn \"note\";\n\t\t}\n\t}\n\n\t/**\n\t * Deduplicate rules by ID\n\t */\n\tprivate deduplicateRules(rules: SarifRule[]): SarifRule[] {\n\t\tconst seen = new Set<string>();\n\t\tconst deduplicated: SarifRule[] = [];\n\n\t\tfor (const rule of rules) {\n\t\t\tif (!seen.has(rule.id)) {\n\t\t\t\tseen.add(rule.id);\n\t\t\t\tdeduplicated.push(rule);\n\t\t\t}\n\t\t}\n\n\t\treturn deduplicated;\n\t}\n\n\t/**\n\t * Export to SARIF JSON string\n\t */\n\ttoJson(result: PolicyEngineResult, analysisSource?: string): string {\n\t\tconst sarif = this.toSarif(result, analysisSource);\n\t\treturn JSON.stringify(sarif, null, 2);\n\t}\n\n\t/**\n\t * Static method to format PolicyEngineResult to SARIF (matches export API)\n\t */\n\tstatic format(result: PolicyEngineResult, options: { toolVersion: string; baseUri?: string }): SarifLog {\n\t\tconst formatter = new SarifFormatter();\n\t\tformatter.toolVersion = options.toolVersion;\n\t\treturn formatter.toSarif(result);\n\t}\n\n\t/**\n\t * Static method to convert SARIF log to JSON string (matches export API)\n\t */\n\tstatic toJSON(log: SarifLog): string {\n\t\treturn JSON.stringify(log, null, 2);\n\t}\n\n\t/**\n\t * Static method to write SARIF log to file (matches export API)\n\t */\n\tstatic toFile(log: SarifLog, filePath: string): void {\n\t\tconst fs = require(\"node:fs\");\n\t\tfs.writeFileSync(filePath, SarifFormatter.toJSON(log), \"utf-8\");\n\t}\n}\n","/**\n * Policy Engine - Migrated from @snapback/policy-engine\n *\n * Provides policy evaluation, SARIF formatting, and detection capabilities.\n *\n * @example\n * ```typescript\n * import { evaluate, PolicyEngine, SecretDetector } from \"@snapback/intelligence/policy\";\n *\n * // Evaluate SARIF against policy\n * const decision = evaluate(sarifLog);\n *\n * // Use PolicyEngine for comprehensive analysis\n * const engine = new PolicyEngine();\n * const result = await engine.analyzeFile(filePath, content);\n *\n * // Use individual detectors\n * const detector = new SecretDetector();\n * const findings = detector.detect(content, filePath);\n * ```\n */\n\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\n\n/**\n * Policy engine for SnapBack\n * Evaluates SARIF results against policy rules defined in .snapbackrc\n */\n\n// Default policy configuration\nconst DEFAULT_POLICY = {\n\tthresholds: {\n\t\tcritical: 0, // Block on any critical issues\n\t\thigh: 0, // Block on any high issues\n\t\tmedium: 100, // Allow medium issues\n\t\tlow: 100, // Allow low issues\n\t},\n\tblockOn: {\n\t\tcritical: true,\n\t\thigh: true,\n\t\tmedium: false,\n\t\tlow: false,\n\t},\n\tpathRules: [] as {\n\t\tglob: string;\n\t\tthresholds: any;\n\t\tblockOn?: { critical: boolean; high: boolean; medium: boolean; low: boolean };\n\t}[],\n};\n\n// Policy version information\nconst POLICY_VERSION = \"1.0.0\";\nconst POLICY_ETAG = \"abc123def456\";\n\nexport interface PolicyConfig {\n\tthresholds: {\n\t\tcritical: number;\n\t\thigh: number;\n\t\tmedium: number;\n\t\tlow: number;\n\t};\n\tblockOn: {\n\t\tcritical: boolean;\n\t\thigh: boolean;\n\t\tmedium: boolean;\n\t\tlow: boolean;\n\t};\n\tpathRules: {\n\t\tglob: string;\n\t\tthresholds: any;\n\t\tblockOn?: {\n\t\t\tcritical: boolean;\n\t\t\thigh: boolean;\n\t\t\tmedium: boolean;\n\t\t\tlow: boolean;\n\t\t};\n\t}[];\n}\n\nexport interface PolicyDecision {\n\taction: \"apply\" | \"review\" | \"block\";\n\treason: string;\n\trules_hit: string[];\n\tconfidence: number;\n\tpolicyVersion: string;\n\tetag: string;\n\tdetails: {\n\t\tissueCounts: {\n\t\t\tcritical: number;\n\t\t\thigh: number;\n\t\t\tmedium: number;\n\t\t\tlow: number;\n\t\t};\n\t\t[path: string]: unknown;\n\t};\n}\n\n/**\n * Evaluate SARIF results against policy rules\n * @param sarif SARIF data to evaluate\n * @param config Policy configuration\n * @param filePath Optional file path for path-based rules\n * @returns Policy decision\n */\nexport function evaluate(sarif: any, config: PolicyConfig = DEFAULT_POLICY, filePath?: string): PolicyDecision {\n\t// Merge with default policy to ensure all fields are present\n\tconst effectiveConfig = {\n\t\tthresholds: { ...DEFAULT_POLICY.thresholds, ...config.thresholds },\n\t\tblockOn: { ...DEFAULT_POLICY.blockOn, ...config.blockOn },\n\t\tpathRules: config.pathRules || DEFAULT_POLICY.pathRules,\n\t};\n\n\t// Apply path-specific rules if filePath is provided\n\tlet effectiveThresholds = effectiveConfig.thresholds;\n\tlet effectiveBlockOn = effectiveConfig.blockOn;\n\tif (filePath) {\n\t\tfor (const rule of effectiveConfig.pathRules) {\n\t\t\tif (matchesGlob(filePath, rule.glob)) {\n\t\t\t\teffectiveThresholds = { ...effectiveThresholds, ...rule.thresholds };\n\t\t\t\t// Apply path-specific blockOn settings if provided\n\t\t\t\tif (rule.blockOn) {\n\t\t\t\t\teffectiveBlockOn = { ...effectiveBlockOn, ...rule.blockOn };\n\t\t\t\t} else {\n\t\t\t\t\t// If thresholds are overridden without explicit blockOn, enable blocking for those severities\n\t\t\t\t\tconst implicitBlockOn: Partial<typeof effectiveBlockOn> = {};\n\t\t\t\t\tif (rule.thresholds.critical !== undefined) {\n\t\t\t\t\t\timplicitBlockOn.critical = true;\n\t\t\t\t\t}\n\t\t\t\t\tif (rule.thresholds.high !== undefined) {\n\t\t\t\t\t\timplicitBlockOn.high = true;\n\t\t\t\t\t}\n\t\t\t\t\tif (rule.thresholds.medium !== undefined) {\n\t\t\t\t\t\timplicitBlockOn.medium = true;\n\t\t\t\t\t}\n\t\t\t\t\tif (rule.thresholds.low !== undefined) {\n\t\t\t\t\t\timplicitBlockOn.low = true;\n\t\t\t\t\t}\n\t\t\t\t\teffectiveBlockOn = { ...effectiveBlockOn, ...implicitBlockOn };\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Track rules that are hit and count issues by severity\n\tconst rulesHit: string[] = [];\n\tconst issueCounts = {\n\t\tcritical: 0,\n\t\thigh: 0,\n\t\tmedium: 0,\n\t\tlow: 0,\n\t};\n\n\t// Extract results from SARIF\n\tif (sarif.runs && sarif.runs.length > 0) {\n\t\tconst results = sarif.runs[0].results || [];\n\t\tfor (const result of results) {\n\t\t\tconst severity = getSeverity(result);\n\t\t\tif (severity in issueCounts) {\n\t\t\t\tissueCounts[severity as keyof typeof issueCounts]++;\n\n\t\t\t\t// Track which rules are hit\n\t\t\t\tif (result.ruleId) {\n\t\t\t\t\tif (!rulesHit.includes(result.ruleId)) {\n\t\t\t\t\t\trulesHit.push(result.ruleId);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Calculate confidence based on issue counts and thresholds\n\tconst confidence = calculateConfidence(issueCounts, effectiveThresholds);\n\n\t// Check if any blocking conditions are met\n\tif (effectiveBlockOn.critical && issueCounts.critical > effectiveThresholds.critical) {\n\t\treturn {\n\t\t\taction: \"block\",\n\t\t\treason: `Critical issues (${issueCounts.critical}) exceed threshold (${effectiveThresholds.critical})`,\n\t\t\trules_hit: rulesHit,\n\t\t\tconfidence: confidence,\n\t\t\tpolicyVersion: POLICY_VERSION,\n\t\t\tetag: POLICY_ETAG,\n\t\t\tdetails: {\n\t\t\t\tissueCounts,\n\t\t\t},\n\t\t};\n\t}\n\n\tif (effectiveBlockOn.high && issueCounts.high > effectiveThresholds.high) {\n\t\treturn {\n\t\t\taction: \"block\",\n\t\t\treason: `High issues (${issueCounts.high}) exceed threshold (${effectiveThresholds.high})`,\n\t\t\trules_hit: rulesHit,\n\t\t\tconfidence: confidence,\n\t\t\tpolicyVersion: POLICY_VERSION,\n\t\t\tetag: POLICY_ETAG,\n\t\t\tdetails: {\n\t\t\t\tissueCounts,\n\t\t\t},\n\t\t};\n\t}\n\n\tif (effectiveBlockOn.medium && issueCounts.medium > effectiveThresholds.medium) {\n\t\treturn {\n\t\t\taction: \"block\",\n\t\t\treason: `Medium issues (${issueCounts.medium}) exceed threshold (${effectiveThresholds.medium})`,\n\t\t\trules_hit: rulesHit,\n\t\t\tconfidence: confidence,\n\t\t\tpolicyVersion: POLICY_VERSION,\n\t\t\tetag: POLICY_ETAG,\n\t\t\tdetails: {\n\t\t\t\tissueCounts,\n\t\t\t},\n\t\t};\n\t}\n\n\tif (effectiveBlockOn.low && issueCounts.low > effectiveThresholds.low) {\n\t\treturn {\n\t\t\taction: \"block\",\n\t\t\treason: `Low issues (${issueCounts.low}) exceed threshold (${effectiveThresholds.low})`,\n\t\t\trules_hit: rulesHit,\n\t\t\tconfidence: confidence,\n\t\t\tpolicyVersion: POLICY_VERSION,\n\t\t\tetag: POLICY_ETAG,\n\t\t\tdetails: {\n\t\t\t\tissueCounts,\n\t\t\t},\n\t\t};\n\t}\n\n\t// If we have any critical or high issues that don't exceed thresholds, require review\n\t// But only if blockOn is false for those severity levels\n\tif ((issueCounts.critical > 0 && !effectiveBlockOn.critical) || (issueCounts.high > 0 && !effectiveBlockOn.high)) {\n\t\treturn {\n\t\t\taction: \"review\",\n\t\t\treason: \"Critical or high severity issues found\",\n\t\t\trules_hit: rulesHit,\n\t\t\tconfidence: confidence,\n\t\t\tpolicyVersion: POLICY_VERSION,\n\t\t\tetag: POLICY_ETAG,\n\t\t\tdetails: {\n\t\t\t\tissueCounts,\n\t\t\t},\n\t\t};\n\t}\n\n\t// Otherwise, apply automatically\n\treturn {\n\t\taction: \"apply\",\n\t\treason: \"No blocking issues found\",\n\t\trules_hit: rulesHit,\n\t\tconfidence: confidence,\n\t\tpolicyVersion: POLICY_VERSION,\n\t\tetag: POLICY_ETAG,\n\t\tdetails: {\n\t\t\tissueCounts,\n\t\t},\n\t};\n}\n\n/**\n * Calculate confidence score based on issue counts and thresholds\n */\nfunction calculateConfidence(\n\tissueCounts: { critical: number; high: number; medium: number; low: number },\n\tthresholds: { critical: number; high: number; medium: number; low: number },\n): number {\n\tlet confidence = 0.9;\n\tconst criticalRatio = thresholds.critical > 0 ? issueCounts.critical / thresholds.critical : 0;\n\tconst highRatio = thresholds.high > 0 ? issueCounts.high / thresholds.high : 0;\n\tconst mediumRatio = thresholds.medium > 0 ? issueCounts.medium / thresholds.medium : 0;\n\tconst lowRatio = thresholds.low > 0 ? issueCounts.low / thresholds.low : 0;\n\tconst thresholdProximity = Math.max(criticalRatio, highRatio, mediumRatio, lowRatio);\n\tconfidence = Math.max(0.1, confidence - thresholdProximity * 0.5);\n\treturn confidence;\n}\n\n/**\n * Get severity level from SARIF result\n */\nfunction getSeverity(result: any): string {\n\tif (result.level) {\n\t\tconst level = result.level.toLowerCase();\n\t\tswitch (level) {\n\t\t\tcase \"error\":\n\t\t\t\treturn \"critical\";\n\t\t\tcase \"warning\":\n\t\t\t\treturn \"high\";\n\t\t\tcase \"note\":\n\t\t\t\treturn \"medium\";\n\t\t\tcase \"critical\":\n\t\t\t\treturn \"critical\";\n\t\t\tcase \"high\":\n\t\t\t\treturn \"high\";\n\t\t\tcase \"medium\":\n\t\t\t\treturn \"medium\";\n\t\t\tcase \"low\":\n\t\t\t\treturn \"low\";\n\t\t\tdefault:\n\t\t\t\treturn \"medium\";\n\t\t}\n\t}\n\treturn \"medium\";\n}\n\n/**\n * Check if a file path matches a glob pattern\n */\nfunction matchesGlob(filePath: string, glob: string): boolean {\n\tif (glob === \"src/**\") {\n\t\treturn filePath.startsWith(\"src/\");\n\t}\n\tconst regexPattern = glob.replace(/\\./g, \"\\\\.\").replace(/\\*/g, \".*\").replace(/\\?/g, \".\").replace(/\\//g, \"[/\\\\\\\\]\");\n\tconst regex = new RegExp(`^${regexPattern}$`);\n\treturn regex.test(filePath);\n}\n\n/**\n * Load policy configuration from .snapbackrc file\n */\nexport function loadPolicyConfig(cwd: string = process.cwd()): PolicyConfig {\n\tconst configPath = path.join(cwd, \".snapbackrc\");\n\tif (!fs.existsSync(configPath)) {\n\t\treturn DEFAULT_POLICY;\n\t}\n\ttry {\n\t\tconst configContent = fs.readFileSync(configPath, \"utf8\");\n\t\tconst config = JSON.parse(configContent);\n\t\treturn {\n\t\t\tthresholds: { ...DEFAULT_POLICY.thresholds, ...config.thresholds },\n\t\t\tblockOn: { ...DEFAULT_POLICY.blockOn, ...config.blockOn },\n\t\t\tpathRules: config.pathRules || DEFAULT_POLICY.pathRules,\n\t\t};\n\t} catch (error) {\n\t\tconsole.warn(\"Failed to load .snapbackrc, using default policy\", error);\n\t\treturn DEFAULT_POLICY;\n\t}\n}\n\n// Re-export detectors\nexport { type MockDetectionResult, MockDetector, type MockFinding } from \"./detectors/MockDetector.js\";\nexport {\n\tPhantomDependencyDetector,\n\ttype PhantomDependencyFinding,\n\ttype PhantomDependencyResult,\n} from \"./detectors/PhantomDependencyDetector.js\";\nexport { type SecretDetectionResult, SecretDetector, type SecretFinding } from \"./detectors/SecretDetector.js\";\n\n// Re-export PolicyEngine\nexport {\n\ttype DetectionEvent,\n\ttype PolicyAction,\n\tPolicyEngine,\n\ttype PolicyEngineConfig,\n\ttype PolicyEngineResult,\n\ttype PolicyRule,\n} from \"./PolicyEngine.js\";\n\n// Re-export SarifFormatter\nexport { SarifFormatter, type SarifLog, type SarifResult, type SarifRule, type SarifRun } from \"./SarifFormatter.js\";\n","/**\n * Pattern Query Engine\n *\n * Search and query patterns, violations, and learnings from the Intelligence Layer.\n * Provides semantic search, filtering, and ranking for pattern discovery.\n *\n * Features:\n * - Full-text search across patterns and violations\n * - Filtering by type, source, date range\n * - Ranking by relevance and usage count\n * - Pattern recommendations based on context\n *\n * @module query/pattern-engine\n */\n\nimport type { RiskFactor, RiskFactorSource } from \"../types/integrations.js\";\n\n/**\n * Pattern query filters\n */\nexport interface PatternQuery {\n\t/** Search text (matches against name, description, suggestion) */\n\tsearch?: string;\n\t/** Filter by risk factor source */\n\tsource?: RiskFactorSource | RiskFactorSource[];\n\t/** Filter by score range */\n\tscoreMin?: number;\n\tscoreMax?: number;\n\t/** Filter by date range (timestamp) */\n\tdateFrom?: number;\n\tdateTo?: number;\n\t/** Limit results */\n\tlimit?: number;\n\t/** Offset for pagination */\n\toffset?: number;\n\t/** Sort by */\n\tsortBy?: \"relevance\" | \"score\" | \"date\" | \"usage\";\n\t/** Sort order */\n\tsortOrder?: \"asc\" | \"desc\";\n}\n\n/**\n * Pattern search result with metadata\n */\nexport interface PatternSearchResult {\n\tpattern: RiskFactor;\n\t/** Relevance score (0-1) for search ranking */\n\trelevance: number;\n\t/** Usage count (how many times this pattern appeared) */\n\tusageCount: number;\n\t/** First seen timestamp */\n\tfirstSeen: number;\n\t/** Last seen timestamp */\n\tlastSeen: number;\n}\n\n/**\n * Violation record for tracking\n */\nexport interface ViolationRecord {\n\ttype: string;\n\tfile: string;\n\tdescription: string;\n\treason?: string;\n\tprevention: string;\n\ttimestamp: number;\n\tcount: number;\n}\n\n/**\n * Pattern recommendation based on context\n */\nexport interface PatternRecommendation {\n\tpattern: RiskFactor;\n\t/** Why this pattern is recommended */\n\treason: string;\n\t/** Confidence score (0-1) */\n\tconfidence: number;\n\t/** Related patterns */\n\trelated: RiskFactor[];\n}\n\n/**\n * Pattern Query Engine\n *\n * In-memory pattern database with search and query capabilities.\n * Can be extended to use persistent storage (e.g., SQLite) for large datasets.\n */\nexport class PatternQueryEngine {\n\tprivate patterns: Map<string, PatternSearchResult> = new Map();\n\tprivate violations: Map<string, ViolationRecord> = new Map();\n\n\t/**\n\t * Index a risk factor for searching\n\t */\n\tindexPattern(factor: RiskFactor, timestamp = Date.now()): void {\n\t\tconst key = this.makePatternKey(factor);\n\t\tconst existing = this.patterns.get(key);\n\n\t\tif (existing) {\n\t\t\t// Update existing pattern\n\t\t\texisting.usageCount++;\n\t\t\texisting.lastSeen = timestamp;\n\t\t\texisting.relevance = this.calculateRelevance(existing);\n\t\t} else {\n\t\t\t// Add new pattern\n\t\t\tthis.patterns.set(key, {\n\t\t\t\tpattern: factor,\n\t\t\t\trelevance: 1.0,\n\t\t\t\tusageCount: 1,\n\t\t\t\tfirstSeen: timestamp,\n\t\t\t\tlastSeen: timestamp,\n\t\t\t});\n\t\t}\n\t}\n\n\t/**\n\t * Index multiple risk factors\n\t */\n\tindexPatterns(factors: RiskFactor[], timestamp = Date.now()): void {\n\t\tfor (const factor of factors) {\n\t\t\tthis.indexPattern(factor, timestamp);\n\t\t}\n\t}\n\n\t/**\n\t * Record a violation\n\t */\n\trecordViolation(violation: Omit<ViolationRecord, \"count\" | \"timestamp\">): void {\n\t\tconst key = `${violation.type}:${violation.file}`;\n\t\tconst existing = this.violations.get(key);\n\n\t\tif (existing) {\n\t\t\t// Increment count\n\t\t\texisting.count++;\n\t\t\texisting.timestamp = Date.now();\n\t\t} else {\n\t\t\t// New violation\n\t\t\tthis.violations.set(key, {\n\t\t\t\t...violation,\n\t\t\t\tcount: 1,\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t});\n\t\t}\n\t}\n\n\t/**\n\t * Search patterns with query\n\t */\n\tsearch(query: PatternQuery): PatternSearchResult[] {\n\t\tlet results = Array.from(this.patterns.values());\n\n\t\t// Filter by source\n\t\tif (query.source) {\n\t\t\tconst sources = Array.isArray(query.source) ? query.source : [query.source];\n\t\t\tresults = results.filter((r) => sources.includes(r.pattern.source));\n\t\t}\n\n\t\t// Filter by score range\n\t\tif (query.scoreMin !== undefined) {\n\t\t\tconst scoreMin = query.scoreMin;\n\t\t\tresults = results.filter((r) => r.pattern.score >= scoreMin);\n\t\t}\n\t\tif (query.scoreMax !== undefined) {\n\t\t\tconst scoreMax = query.scoreMax;\n\t\t\tresults = results.filter((r) => r.pattern.score <= scoreMax);\n\t\t}\n\n\t\t// Filter by date range\n\t\tif (query.dateFrom !== undefined) {\n\t\t\tconst dateFrom = query.dateFrom;\n\t\t\tresults = results.filter((r) => r.lastSeen >= dateFrom);\n\t\t}\n\t\tif (query.dateTo !== undefined) {\n\t\t\tconst dateTo = query.dateTo;\n\t\t\tresults = results.filter((r) => r.lastSeen <= dateTo);\n\t\t}\n\n\t\t// Search text\n\t\tif (query.search) {\n\t\t\tconst searchLower = query.search.toLowerCase();\n\t\t\tresults = results\n\t\t\t\t.map((r) => ({\n\t\t\t\t\t...r,\n\t\t\t\t\tsearchScore: this.calculateSearchScore(r.pattern, searchLower),\n\t\t\t\t}))\n\t\t\t\t.filter((r) => r.searchScore > 0)\n\t\t\t\t.sort((a, b) => b.searchScore - a.searchScore);\n\t\t}\n\n\t\t// Sort\n\t\tconst sortBy = query.sortBy || \"relevance\";\n\t\tconst sortOrder = query.sortOrder || \"desc\";\n\t\tresults.sort((a, b) => {\n\t\t\tlet comparison = 0;\n\t\t\tswitch (sortBy) {\n\t\t\t\tcase \"relevance\":\n\t\t\t\t\tcomparison = a.relevance - b.relevance;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"score\":\n\t\t\t\t\tcomparison = a.pattern.score - b.pattern.score;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"date\":\n\t\t\t\t\tcomparison = a.lastSeen - b.lastSeen;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"usage\":\n\t\t\t\t\tcomparison = a.usageCount - b.usageCount;\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\treturn sortOrder === \"asc\" ? comparison : -comparison;\n\t\t});\n\n\t\t// Pagination\n\t\tconst offset = query.offset || 0;\n\t\tconst limit = query.limit || 50;\n\t\treturn results.slice(offset, offset + limit);\n\t}\n\n\t/**\n\t * Get pattern recommendations based on context\n\t */\n\trecommend(context: {\n\t\tfilePath?: string;\n\t\trecentPatterns?: RiskFactor[];\n\t\tkeywords?: string[];\n\t}): PatternRecommendation[] {\n\t\tconst recommendations: PatternRecommendation[] = [];\n\t\tconst allPatterns = Array.from(this.patterns.values());\n\n\t\t// Extract file extension for file-type patterns\n\t\tconst fileExt = context.filePath?.split(\".\").pop()?.toLowerCase();\n\n\t\tfor (const result of allPatterns) {\n\t\t\tconst pattern = result.pattern;\n\t\t\tlet confidence = 0;\n\t\t\tconst reasons: string[] = [];\n\n\t\t\t// High usage patterns are more relevant\n\t\t\tif (result.usageCount > 5) {\n\t\t\t\tconfidence += 0.3;\n\t\t\t\treasons.push(`Seen ${result.usageCount} times`);\n\t\t\t}\n\n\t\t\t// Recent patterns are more relevant\n\t\t\tconst daysSinceLastSeen = (Date.now() - result.lastSeen) / (1000 * 60 * 60 * 24);\n\t\t\tif (daysSinceLastSeen < 7) {\n\t\t\t\tconfidence += 0.2;\n\t\t\t\treasons.push(\"Recently active\");\n\t\t\t}\n\n\t\t\t// Keyword matching\n\t\t\tif (context.keywords) {\n\t\t\t\tconst matchingKeywords = context.keywords.filter((kw) => this.patternMatchesKeyword(pattern, kw));\n\t\t\t\tif (matchingKeywords.length > 0) {\n\t\t\t\t\tconfidence += 0.3 * (matchingKeywords.length / context.keywords.length);\n\t\t\t\t\treasons.push(`Matches keywords: ${matchingKeywords.join(\", \")}`);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// File type relevance\n\t\t\tif (fileExt && pattern.description.toLowerCase().includes(fileExt)) {\n\t\t\t\tconfidence += 0.2;\n\t\t\t\treasons.push(`Relevant to .${fileExt} files`);\n\t\t\t}\n\n\t\t\t// Similar to recent patterns\n\t\t\tif (context.recentPatterns) {\n\t\t\t\tconst similarity = this.calculateSimilarity(pattern, context.recentPatterns);\n\t\t\t\tif (similarity > 0.5) {\n\t\t\t\t\tconfidence += 0.3 * similarity;\n\t\t\t\t\treasons.push(\"Similar to recent patterns\");\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Only recommend if confidence threshold met\n\t\t\tif (confidence > 0.3) {\n\t\t\t\trecommendations.push({\n\t\t\t\t\tpattern,\n\t\t\t\t\treason: reasons.join(\"; \"),\n\t\t\t\t\tconfidence: Math.min(confidence, 1.0),\n\t\t\t\t\trelated: this.findRelatedPatterns(pattern, 3),\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\t// Sort by confidence and return top recommendations\n\t\treturn recommendations.sort((a, b) => b.confidence - a.confidence).slice(0, 10);\n\t}\n\n\t/**\n\t * Get violation statistics\n\t */\n\tgetViolationStats(): {\n\t\ttotal: number;\n\t\tbyType: Map<string, number>;\n\t\tbyFile: Map<string, number>;\n\t\ttopViolations: ViolationRecord[];\n\t} {\n\t\tconst byType = new Map<string, number>();\n\t\tconst byFile = new Map<string, number>();\n\t\tlet total = 0;\n\n\t\tfor (const violation of this.violations.values()) {\n\t\t\ttotal += violation.count;\n\t\t\tbyType.set(violation.type, (byType.get(violation.type) || 0) + violation.count);\n\t\t\tbyFile.set(violation.file, (byFile.get(violation.file) || 0) + violation.count);\n\t\t}\n\n\t\tconst topViolations = Array.from(this.violations.values())\n\t\t\t.sort((a, b) => b.count - a.count)\n\t\t\t.slice(0, 10);\n\n\t\treturn { total, byType, byFile, topViolations };\n\t}\n\n\t/**\n\t * Clear all patterns and violations\n\t */\n\tclear(): void {\n\t\tthis.patterns.clear();\n\t\tthis.violations.clear();\n\t}\n\n\t/**\n\t * Get all patterns\n\t */\n\tgetAllPatterns(): PatternSearchResult[] {\n\t\treturn Array.from(this.patterns.values());\n\t}\n\n\t/**\n\t * Get all violations\n\t */\n\tgetAllViolations(): ViolationRecord[] {\n\t\treturn Array.from(this.violations.values());\n\t}\n\n\t// =========================================================================\n\t// Private helpers\n\t// =========================================================================\n\n\t/**\n\t * Make unique key for pattern\n\t */\n\tprivate makePatternKey(factor: RiskFactor): string {\n\t\treturn `${factor.source}:${factor.name}:${factor.description.slice(0, 50)}`;\n\t}\n\n\t/**\n\t * Calculate relevance score based on usage and recency\n\t */\n\tprivate calculateRelevance(result: PatternSearchResult): number {\n\t\t// Usage component (0-0.5)\n\t\tconst usageScore = Math.min(result.usageCount / 20, 0.5);\n\n\t\t// Recency component (0-0.5)\n\t\tconst daysSinceLastSeen = (Date.now() - result.lastSeen) / (1000 * 60 * 60 * 24);\n\t\tconst recencyScore = Math.max(0, 0.5 - daysSinceLastSeen / 60);\n\n\t\treturn usageScore + recencyScore;\n\t}\n\n\t/**\n\t * Calculate search score for text matching\n\t */\n\tprivate calculateSearchScore(pattern: RiskFactor, searchLower: string): number {\n\t\tconst name = pattern.name.toLowerCase();\n\t\tconst description = pattern.description.toLowerCase();\n\t\tconst suggestion = pattern.suggestion?.toLowerCase() || \"\";\n\n\t\tlet score = 0;\n\n\t\t// Exact name match = highest score\n\t\tif (name === searchLower) {\n\t\t\tscore += 1.0;\n\t\t}\n\t\t// Name contains search\n\t\telse if (name.includes(searchLower)) {\n\t\t\tscore += 0.8;\n\t\t}\n\n\t\t// Description contains search\n\t\tif (description.includes(searchLower)) {\n\t\t\tscore += 0.5;\n\t\t}\n\n\t\t// Suggestion contains search\n\t\tif (suggestion.includes(searchLower)) {\n\t\t\tscore += 0.3;\n\t\t}\n\n\t\treturn score;\n\t}\n\n\t/**\n\t * Check if pattern matches keyword\n\t */\n\tprivate patternMatchesKeyword(pattern: RiskFactor, keyword: string): boolean {\n\t\tconst keywordLower = keyword.toLowerCase();\n\t\treturn (\n\t\t\tpattern.name.toLowerCase().includes(keywordLower) ||\n\t\t\tpattern.description.toLowerCase().includes(keywordLower) ||\n\t\t\tpattern.suggestion?.toLowerCase().includes(keywordLower) ||\n\t\t\tfalse\n\t\t);\n\t}\n\n\t/**\n\t * Calculate similarity between pattern and recent patterns\n\t */\n\tprivate calculateSimilarity(pattern: RiskFactor, recentPatterns: RiskFactor[]): number {\n\t\tlet maxSimilarity = 0;\n\n\t\tfor (const recent of recentPatterns) {\n\t\t\t// Same source = more similar\n\t\t\tconst sourceSimilarity = pattern.source === recent.source ? 0.5 : 0;\n\n\t\t\t// Similar score = more similar\n\t\t\tconst scoreDiff = Math.abs(pattern.score - recent.score);\n\t\t\tconst scoreSimilarity = Math.max(0, 1 - scoreDiff / 100) * 0.3;\n\n\t\t\t// Name/description overlap\n\t\t\tconst textSimilarity = this.calculateTextSimilarity(\n\t\t\t\t`${pattern.name} ${pattern.description}`,\n\t\t\t\t`${recent.name} ${recent.description}`,\n\t\t\t);\n\n\t\t\tconst totalSimilarity = sourceSimilarity + scoreSimilarity + textSimilarity;\n\t\t\tmaxSimilarity = Math.max(maxSimilarity, totalSimilarity);\n\t\t}\n\n\t\treturn maxSimilarity;\n\t}\n\n\t/**\n\t * Calculate text similarity (simple word overlap)\n\t */\n\tprivate calculateTextSimilarity(text1: string, text2: string): number {\n\t\tconst words1 = new Set(text1.toLowerCase().split(/\\s+/));\n\t\tconst words2 = new Set(text2.toLowerCase().split(/\\s+/));\n\n\t\tlet overlap = 0;\n\t\tfor (const word of words1) {\n\t\t\tif (words2.has(word) && word.length > 3) {\n\t\t\t\t// Only count meaningful words\n\t\t\t\toverlap++;\n\t\t\t}\n\t\t}\n\n\t\tconst total = Math.max(words1.size, words2.size);\n\t\treturn total > 0 ? (overlap / total) * 0.2 : 0;\n\t}\n\n\t/**\n\t * Find related patterns based on source and similarity\n\t */\n\tprivate findRelatedPatterns(pattern: RiskFactor, limit: number): RiskFactor[] {\n\t\tconst allPatterns = Array.from(this.patterns.values());\n\t\tconst related: Array<{ pattern: RiskFactor; similarity: number }> = [];\n\n\t\tfor (const result of allPatterns) {\n\t\t\t// Skip self\n\t\t\tif (this.makePatternKey(result.pattern) === this.makePatternKey(pattern)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst similarity = this.calculateSimilarity(result.pattern, [pattern]);\n\t\t\tif (similarity > 0.3) {\n\t\t\t\trelated.push({ pattern: result.pattern, similarity });\n\t\t\t}\n\t\t}\n\n\t\treturn related\n\t\t\t.sort((a, b) => b.similarity - a.similarity)\n\t\t\t.slice(0, limit)\n\t\t\t.map((r) => r.pattern);\n\t}\n}\n\n/**\n * Create pattern query engine\n */\nexport function createPatternQueryEngine(): PatternQueryEngine {\n\treturn new PatternQueryEngine();\n}\n","/**\n * File Fragility Tracking Types\n *\n * Tracks which files are \"fragile\" based on rollback history and co-change patterns.\n *\n * Based on research:\n * - arXiv:2501.09225 - Provenance Guided Rollback Suggestions\n * - Hybrid Change Impact Analysis - co-change pattern mining\n * - CI/CD Rollback Best Practices\n */\n\n/**\n * Fragility level classification\n */\nexport type FragilityLevel = \"stable\" | \"moderate\" | \"fragile\" | \"critical\";\n\n/**\n * Rollback event\n */\nexport interface RollbackEvent {\n\t/** File path */\n\tfile: string;\n\t/** Rollback timestamp */\n\ttimestamp: number;\n\t/** Time since last modification (ms) */\n\ttimeSinceModification: number;\n\t/** Reason (if available) */\n\treason?: string;\n\t/** Related files rolled back together */\n\trelatedFiles?: string[];\n}\n\n/**\n * Co-change pattern\n * Files that are frequently modified together\n */\nexport interface CoChangePattern {\n\t/** Primary file */\n\tfile: string;\n\t/** Co-changed file */\n\tcoChangedWith: string;\n\t/** Number of times changed together */\n\tcoChangeCount: number;\n\t/** Total changes to primary file */\n\ttotalChanges: number;\n\t/** Co-change frequency (0-1) */\n\tfrequency: number;\n\t/** Last co-change timestamp */\n\tlastCoChange: number;\n}\n\n/**\n * File fragility profile\n */\nexport interface FileFragilityProfile {\n\t/** File path */\n\tpath: string;\n\n\t/** Fragility level */\n\tlevel: FragilityLevel;\n\n\t/** Fragility score (0-1, higher = more fragile) */\n\tscore: number;\n\n\t/** Total rollback count */\n\trollbackCount: number;\n\n\t/** Average time to rollback (ms) */\n\taverageTimeToRollback: number;\n\n\t/** Last rollback timestamp */\n\tlastRollback?: number;\n\n\t/** Files frequently modified together */\n\tfrequentlyModifiedWith: string[];\n\n\t/** Co-change patterns */\n\tcoChangePatterns: CoChangePattern[];\n\n\t/** Modification velocity (changes per day) */\n\tmodificationVelocity: number;\n\n\t/** Last modified timestamp */\n\tlastModified: number;\n\n\t/** Confidence in fragility assessment (0-1) */\n\tconfidence: number;\n}\n\n/**\n * Fragility tracker configuration\n */\nexport interface FragilityConfig {\n\t/** Enable fragility tracking */\n\tenabled: boolean;\n\n\t/** Rolling window for rollback tracking (days) */\n\trollbackWindowDays: number;\n\n\t/** Minimum rollbacks to classify as fragile */\n\tminRollbacksForFragile: number;\n\n\t/** Co-change frequency threshold (0-1) */\n\tcoChangeThreshold: number;\n\n\t/** Max time for \"quick rollback\" (ms) */\n\tquickRollbackThresholdMs: number;\n\n\t/** Fragility score decay rate (daily) */\n\tscoreDecayRate: number;\n}\n\n/**\n * Default fragility configuration\n */\nexport const DEFAULT_FRAGILITY_CONFIG: FragilityConfig = {\n\tenabled: true,\n\trollbackWindowDays: 7,\n\tminRollbacksForFragile: 2,\n\tcoChangeThreshold: 0.3, // 30% co-change frequency\n\tquickRollbackThresholdMs: 3600000, // 1 hour\n\tscoreDecayRate: 0.05, // 5% daily decay\n};\n\n/**\n * Fragility analysis result\n */\nexport interface FragilityAnalysis {\n\t/** File path */\n\tfile: string;\n\n\t/** Current fragility profile */\n\tprofile: FileFragilityProfile;\n\n\t/** Warnings */\n\twarnings: Array<{\n\t\tlevel: \"error\" | \"warning\" | \"info\";\n\t\tmessage: string;\n\t}>;\n\n\t/** Recommendations */\n\trecommendations: string[];\n\n\t/** Related files to review */\n\trelatedFiles: Array<{\n\t\tpath: string;\n\t\treason: string;\n\t\tcoChangeFrequency: number;\n\t}>;\n}\n\n/**\n * Fragility store schema (JSONL)\n */\nexport interface FragilityRecord {\n\t/** File path */\n\tfile: string;\n\t/** Event type */\n\teventType: \"rollback\" | \"modification\" | \"co-change\";\n\t/** Timestamp */\n\ttimestamp: number;\n\t/** Event data */\n\tdata: {\n\t\trollback?: RollbackEvent;\n\t\tmodification?: {\n\t\t\tlinesChanged: number;\n\t\t\tauthor: string;\n\t\t};\n\t\tcoChange?: {\n\t\t\tfiles: string[];\n\t\t};\n\t};\n}\n"]}