@snapback/cli 1.0.2 → 1.0.4

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 (42) hide show
  1. package/dist/SkippedTestDetector-B3JZUE5G.js +5 -0
  2. package/dist/{SkippedTestDetector-JY4EF5BN.js.map → SkippedTestDetector-B3JZUE5G.js.map} +1 -1
  3. package/dist/{analysis-B4NVULM4.js → analysis-Z53F5FT2.js} +6 -5
  4. package/dist/{analysis-B4NVULM4.js.map → analysis-Z53F5FT2.js.map} +1 -1
  5. package/dist/{chunk-BCIXMIPW.js → chunk-6MR2TINI.js} +4 -3
  6. package/dist/chunk-6MR2TINI.js.map +1 -0
  7. package/dist/{chunk-WCQVDF3K.js → chunk-BW7RALUZ.js} +3 -2
  8. package/dist/{chunk-WCQVDF3K.js.map → chunk-BW7RALUZ.js.map} +1 -1
  9. package/dist/{chunk-VSJ33PLA.js → chunk-G7QXHNGB.js} +5 -4
  10. package/dist/chunk-G7QXHNGB.js.map +1 -0
  11. package/dist/{chunk-MTQ6ESQR.js → chunk-ISVRGBWT.js} +6 -5
  12. package/dist/chunk-ISVRGBWT.js.map +1 -0
  13. package/dist/{chunk-KSPLKCVF.js → chunk-NKBZIXCN.js} +7 -6
  14. package/dist/chunk-NKBZIXCN.js.map +1 -0
  15. package/dist/{chunk-RU7BOXR3.js → chunk-P2F6HU3P.js} +4 -3
  16. package/dist/chunk-P2F6HU3P.js.map +1 -0
  17. package/dist/{chunk-BJS6XH2V.js → chunk-QAKFE3NE.js} +4 -3
  18. package/dist/chunk-QAKFE3NE.js.map +1 -0
  19. package/dist/{chunk-WALLF2AH.js → chunk-YOVA65PS.js} +4 -3
  20. package/dist/chunk-YOVA65PS.js.map +1 -0
  21. package/dist/{dist-FBRR6YHP.js → dist-7UKXVKH3.js} +5 -4
  22. package/dist/{dist-7GPVXUEA.js.map → dist-7UKXVKH3.js.map} +1 -1
  23. package/dist/{dist-7GPVXUEA.js → dist-JX77JABV.js} +5 -4
  24. package/dist/{dist-DVM64QIS.js.map → dist-JX77JABV.js.map} +1 -1
  25. package/dist/{dist-DVM64QIS.js → dist-WKLJSPJT.js} +8 -7
  26. package/dist/{dist-FBRR6YHP.js.map → dist-WKLJSPJT.js.map} +1 -1
  27. package/dist/index.js +19 -18
  28. package/dist/index.js.map +1 -1
  29. package/dist/{secure-credentials-YKZHAZNB.js → secure-credentials-6UMEU22H.js} +4 -3
  30. package/dist/secure-credentials-6UMEU22H.js.map +1 -0
  31. package/dist/{snapback-dir-4QRR2IPV.js → snapback-dir-T3CRQRY6.js} +6 -5
  32. package/dist/{snapback-dir-4QRR2IPV.js.map → snapback-dir-T3CRQRY6.js.map} +1 -1
  33. package/package.json +5 -4
  34. package/dist/SkippedTestDetector-JY4EF5BN.js +0 -4
  35. package/dist/chunk-BCIXMIPW.js.map +0 -1
  36. package/dist/chunk-BJS6XH2V.js.map +0 -1
  37. package/dist/chunk-KSPLKCVF.js.map +0 -1
  38. package/dist/chunk-MTQ6ESQR.js.map +0 -1
  39. package/dist/chunk-RU7BOXR3.js.map +0 -1
  40. package/dist/chunk-VSJ33PLA.js.map +0 -1
  41. package/dist/chunk-WALLF2AH.js.map +0 -1
  42. package/dist/secure-credentials-YKZHAZNB.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../packages-oss/contracts/src/auth/errors.ts","../../../packages-oss/contracts/src/auth/session.ts","../../../packages-oss/contracts/src/auth/api.ts","../../../packages-oss/contracts/src/eventBus.ts","../../../packages-oss/contracts/src/id-generator.ts","../../../packages-oss/contracts/src/logger.ts","../../../packages-oss/contracts/src/observability/InstrumentationProvider.ts","../../../packages-oss/contracts/src/observability/SemanticConventions.ts","../../../packages-oss/contracts/src/observability/types.ts","../../../packages-oss/contracts/src/observability/utils.ts","../../../packages-oss/contracts/src/session.ts","../../../packages-oss/contracts/src/session/file-modification.ts","../../../packages-oss/contracts/src/signals/index.ts","../../../packages-oss/contracts/src/types/analysis.ts","../../../packages-oss/contracts/src/types/config.ts","../../../packages-oss/contracts/src/types/protection.ts","../../../packages-oss/contracts/src/types/protection-utils.ts","../../../packages-oss/contracts/src/schemas.ts","../../../packages-oss/contracts/src/types/snapshot.ts","../../../packages-oss/infrastructure/src/logging/logger.ts","../../../packages-oss/infrastructure/src/tracing/error-budget.ts","../../../packages-oss/sdk/src/session/SessionRecovery.ts","../../../packages-oss/sdk/src/session/SessionRollback.ts","../../../packages-oss/sdk/src/analysis/FileChangeAnalyzer.ts","../../../packages-oss/sdk/src/config/Thresholds.ts","../../../packages-oss/sdk/src/analysis/RiskAnalyzer.ts","../../../packages-oss/sdk/src/arch/invariant.ts","../../../packages-oss/sdk/src/arch/rules.ts","../../../packages-oss/sdk/src/auth/DeviceAuthClient.ts","../../../packages-oss/sdk/src/cache/lru-cache.ts","../../../packages-oss/sdk/src/privacy/sanitizer.ts","../../../packages-oss/sdk/src/client.ts","../../../packages-oss/sdk/src/client/ProtectionClient.ts","../../../packages-oss/sdk/src/client/SnapshotClient.ts","../../../packages-oss/sdk/src/config.ts","../../../packages-oss/sdk/src/config/ConfigDetector.ts","../../../packages-oss/sdk/src/config/SnapBackRCParser.ts","../../../packages-oss/sdk/src/core/detection/AIPresenceDetector.ts","../../../packages-oss/sdk/src/core/detection/BurstHeuristicsDetector.ts","../../../packages-oss/sdk/src/core/detection/CursorDetector.ts","../../../packages-oss/sdk/src/core/session/interfaces.ts","../../../packages-oss/sdk/src/core/session/ExperienceClassifier.ts","../../../packages-oss/sdk/src/core/session/SessionCoordinator.ts","../../../packages-oss/sdk/src/core/session/SessionSummaryGenerator.ts","../../../packages-oss/sdk/src/core/session/SessionTagger.ts","../../../packages-oss/sdk/src/encryption/EncryptionService.ts","../../../packages-oss/sdk/src/errors/index.ts","../../../packages-oss/sdk/src/utils/errorHelpers.ts","../../../packages-oss/sdk/src/utils/result.ts","../../../packages-oss/sdk/src/fs/atomic.ts","../../../packages-oss/sdk/src/helpers.ts","../../../packages-oss/sdk/src/utils/hash.ts","../../../packages-oss/sdk/src/privacy/validator.ts","../../../packages-oss/sdk/src/protection/ProtectionManager.ts","../../../packages-oss/sdk/src/utils/security.ts","../../../packages-oss/sdk/src/snapshot/SnapshotDeduplication.ts","../../../packages-oss/sdk/src/snapshot/SnapshotNaming.ts","../../../packages-oss/sdk/src/snapshot/SnapshotManager.ts","../../../packages-oss/sdk/src/storage/StorageErrors.ts","../../../packages-oss/sdk/src/storage/LocalStorage.ts","../../../packages-oss/sdk/src/storage/MemoryStorage.ts","../../../packages-oss/sdk/src/Snapback.ts","../../../packages-oss/sdk/src/session/SessionDeduplication.ts","../../../packages-oss/sdk/src/ai/SimpleChangeTracker.ts","../../../packages-oss/sdk/src/ai/AiSessionTracker.ts","../../../packages-oss/sdk/src/session/sessionAnalytics.ts","../../../packages-oss/sdk/src/session/SessionManager.ts","../../../packages-oss/sdk/src/session/index.ts","../../../packages-oss/sdk/src/snapshot/FileConflictResolver.ts","../../../packages-oss/sdk/src/utils/retry.ts","../../../packages-oss/sdk/src/snapshot/retry-hook.ts","../../../packages-oss/sdk/src/snapshot/SnapshotDeletionService.ts","../../../packages-oss/sdk/src/snapshot/SnapshotIconStrategy.ts","../../../packages-oss/sdk/src/snapshot/SnapshotNamingStrategy.ts","../../../packages-oss/sdk/src/storage/StorageBroker.ts","../../../packages-oss/sdk/src/storage/StorageBrokerAdapter.ts","../../../packages-oss/sdk/src/utils/id-generation.ts","../../../packages-oss/sdk/src/utils/PathNormalizer.ts","../../../packages/sdk/src/analysis/riskFactorDescriptions.ts","../../../packages/sdk/src/dashboard/metrics-client.ts","../../../packages/sdk/src/protection/ProtectionDecisionEngine.ts","../../../packages/sdk/src/snapshot/DiffCalculator.ts","../../../packages/sdk/src/token/TokenBucket.ts","../../../packages/sdk/src/token/RateLimiter.ts","../../../packages/sdk/src/token/DistributedTokenManager.ts"],"names":["AuthErrorCodeSchema","z","enum","AuthErrorSchema","object","code","message","string","details","record","unknown","optional","BETTER_AUTH_ERROR_MAP","INVALID_PASSWORD","USER_NOT_FOUND","INVALID_EMAIL","USER_ALREADY_EXISTS","EMAIL_ALREADY_IN_USE","WEAK_PASSWORD","SESSION_EXPIRED","SESSION_NOT_FOUND","INVALID_SESSION","EMAIL_NOT_VERIFIED","INVALID_TOKEN","TOKEN_EXPIRED","RATE_LIMIT_EXCEEDED","TOO_MANY_REQUESTS","OAUTH_ERROR","OAUTH_CALLBACK_ERROR","PROVIDER_ERROR","mapBetterAuthError","betterAuthError","createAuthError","AUTH_ERROR_MESSAGES","INVALID_CREDENTIALS","UNAUTHORIZED","RATE_LIMITED","NETWORK_ERROR","UNKNOWN_ERROR","getErrorMessage","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","isAuthenticated","state","isUnauthenticated","isLoading","PasswordSchema","min","regex","EmailSchema","toLowerCase","trim","password","max","success","error","rememberMe","default","union","null","currentPassword","newPassword","provider","callbackURL","EventBus","m","Map","on","k","h","set","get","Set","add","delete","emit","p","handlers","handlersArray","Array","from","generateId","prefix","nanoid","slugify","description","maxLength","replace","slice","generateSnapshotId","length","slug","Date","now","createLogger","options","level","timestamps","formatMessage","__name","levelStr","toISOString","formatMeta","meta","Error","stack","JSON","stringify","debug","console","info","warn","createSilentLogger","NoOpInstrumentationProvider","noopSpan","setAttribute","setAttributes","addEvent","setStatus","recordException","end","isRecording","startSpan","_name","_options","withSpan","fn","injectContext","_carrier","extractContext","recordMetric","_value","_attributes","recordEvent","shutdown","HttpAttributes","METHOD","STATUS_CODE","ROUTE","TARGET","SCHEME","HOST","USER_AGENT","NetworkAttributes","PEER_IP","SemanticConventions","Http","Network","SpanStatusCode","TRACE_PARENT_HEADER","TRACE_STATE_HEADER","extractTraceHeaders","headers","traceHeaders","Headers","forEach","value","key","lowerKey","Object","entries","setHttpRequestAttributes","span","request","method","target","route","host","clientIp","scheme","forwardedProto","detectedScheme","startsWith","setSpanStatusFromHttp","statusCode","ERROR","errorMessage","addErrorEvent","OK","SessionSchemaVersion","ChangeOpSchema","EOLTypeSchema","SessionTriggerSchema","SessionChangeSchema","op","hOld","hNew","sizeBefore","number","int","nonnegative","sizeAfter","mtimeBefore","mtimeAfter","modeBefore","modeAfter","eolBefore","eolAfter","schema","sessionId","startedAt","datetime","endedAt","workspaceUri","triggers","array","changeCount","filesChanged","snapshots","activeOnly","finalizedOnly","after","before","limit","positive","offset","idleMs","flushBatchSize","flushIntervalMs","useVSCodeWatcher","ignorePatterns","encodeTriggerBitmask","mask","trigger","decodeTriggerBitmask","push","ModificationSourceSchema","ModificationTypeSchema","FileModificationSchema","path","timestamp","type","linesChanged","aiAttributed","aiTool","source","parseFileModification","input","parse","fromMCPFileChange","change","file","toMCPFileChange","mod","fromIntelligenceFileModification","toIntelligenceFileModification","filterModificationsSince","mods","since","filter","getUniqueModifiedPaths","map","countAIAttributedModifications","getTotalLinesChanged","reduce","sum","groupByAITool","groups","tool","has","extensionIds","content","velocity","charCount","AiDetectionOutputSchema","confidence","indicators","ThreatPatternSchema","severity","ThreatDetectionOutputSchema","threatCount","patterns","score","filePath","BurstDetectionOutputSchema","isBurst","ComplexityFileInputSchema","lineCount","files","ComplexityAnalysisOutputSchema","avgComplexity","maxComplexity","highComplexityFiles","fileCount","signal","triggered","signals","ai","threats","burst","complexity","overallRisk","riskLevel","triggeredSignals","processingTimeMs","SignalTypeSchema","SeveritySchema","RiskSeveritySchema","ValidationSeveritySchema","toSeverity","validationSeverity","toValidationSeverity","BaseIssueSchema","line","fix","extend","column","snippet","rule","passed","issues","duration","CircuitBreakerStateEnumSchema","failures","threshold","lastFailure","cooldownMs","ConfigFileTypeSchema","SupportedLanguageSchema","FileBaselineSchema","hash","size","language","critical","baseline","any","valid","metadata","errors","warnings","autoDetect","watchChanges","autoProtect","customPatterns","enabled","includePatterns","excludePatterns","ProtectionLevelSchema","icon","label","color","themeColor","ProtectedFileSchema","reason","addedAt","pattern","PatternRuleSchema","ProtectionConfigSchema","defaultLevel","autoProtectConfigs","config","persistRegistry","registryPath","isProtected","LEGACY_TO_CANONICAL","Watched","Warning","Protected","CANONICAL_TO_LEGACY","watch","block","VALID_LEVELS","legacyToCanonical","legacy","canonicalToLegacy","canonical","isProtectionLevel","includes","DiffChangeSchema","added","removed","count","RiskScoreSchema","factors","version","fileContents","permissions","createdBy","tags","metrics","trends","insights","snapshotRecommendations","shouldCreateSnapshot","urgency","suggestedTiming","risk","changes","RetrySchema","retries","factor","jitter","CircuitSchema","errorThresholdPercentage","volumeThreshold","timeoutMs","resetMs","rollingCountMs","rollingCountBuckets","maxConcurrent","retry","circuit","batch","maxWaitMs","debounceMs","awaitWriteFinish","stabilityThreshold","pollInterval","ignored","SnapshotTriggerSchema","SnapshotOriginSchema","SnapshotReasonCodeSchema","CheckpointTypeSchema","SnapshotSchema","FileStateSchema","encrypted","iv","tag","algorithm","SnapshotFileRefV2Schema","blobHash","fileStates","iconColor","action","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","isSnapshotManifestV2","manifest","isPostCheckpoint","isPointerCheckpoint","workspaceId","period","start","fileStats","total","byLanguage","byRisk","snapshotStats","frequency","averageSize","activity","redactPaths","pinoLogger","pino","process","env","LOG_LEVEL","redact","paths","censor","logger","child","bindings","childLogger","nestedBindings","ERROR_BUDGET","ALERT_THRESHOLD","errorMetrics","totalRequests","errorCount","lastAlertTime","recordSuccess","recordError","getErrorRate","checkErrorBudget","errorRate","toFixed","budget","recommendation","sendAlert","channel","alert","resetMetrics","getMetrics","SessionRecovery","workspaceRoot","journalDir","join","recoverAll","pendingDir","existsSync","readdir","endsWith","readFile","journal","result","recoverJournal","basename","filesRestored","String","cleanupOldJournals","journalPath","backupExists","checkBackupsExist","backups","unlink","restoredCount","rollbackFromBackups","emitRecoveryTelemetry","backup","original","safeRename","src","dst","rename","copyFile","committedDir","sevenDaysMs","_sessionId","_filesRestored","listPendingJournals","journals","recoverJournalById","deleteJournal","pendingPath","committedPath","cleanupOrphanedBackups","cleanedCount","orphanedBackups","findOrphanedBackups","backupPath","dir","withFileTypes","entry","fullPath","isDirectory","subBackups","SessionRollback","blobStore","rollback","startTime","performance","filesReverted","filesSkipped","mkdir","recursive","writeFile","onProgress","reversedChanges","reverseChanges","stagingDir","deletedDir","stagedFiles","filesToDelete","i","stageChange","skipVerification","validationErrors","validateStaging","cleanupStaging","dryRun","keys","swapResult","atomicSwap","reverted","skipped","log","reversed","reverse","inversed","undefined","temp","_result","stagingPath","blobResult","ok","dirname","mtimeDate","utimes","platform","chmod","computedHash","createHash","update","digest","processed","relPath","absPath","rm","force","getPendingJournals","FileChangeAnalyzer","fileSystem","analyzeSnapshot","snapshotFiles","relativePath","snapshotContent","absolutePath","analyzeFile","_error","fileName","getFileName","changeType","linesDeleted","changeSummary","typePriority","modified","deleted","unchanged","sort","a","b","priorityDiff","localeCompare","absoluteFilePath","getRelativePath","fileExists","currentContent","split","stats","calculateDiffStats","oldContent","newContent","oldLines","newLines","oldSet","newSet","parts","createChangeSummary","modifiedCount","c","addedCount","deletedCount","unchangedCount","DEFAULT_THRESHOLDS_FROZEN","freeze","idleTimeout","minSessionDuration","maxSessionDuration","timeWindow","minCharsInserted","maxKeystrokeInterval","minLinesAffected","minInsertDeleteRatio","experience","explorer","snapshotsCreated","sessionsRecorded","protectedFiles","manualRestores","aiAssistedSessions","daysSinceFirstUse","commandDiversity","intermediate","power","tagging","minBurstConfidence","minLongSessionDuration","maxShortSessionDuration","minLargeEditLines","normalization","multiFileThreshold","multiFileNormalization","longSessionNormalization","largeEditsNormalization","blockingThreshold","criticalThreshold","highThreshold","mediumThreshold","securityScores","evalUsage","functionConstructor","dangerousHtml","execCommand","sqlConcat","hardcodedSecrets","weakCrypto","detection","entropyThreshold","typosquattingDistance","protection","protectedCooldown","otherCooldown","debounceWindow","resources","dedupCacheSize","snapshotMaxFiles","snapshotMaxFileSize","snapshotMaxTotalSize","diffHaloSize","trialSnapshotLimit","freeMonthlyLimit","qos","rateLimitCapacity","rateLimitRefill","eventBusTimeout","eventBusMaxRetries","errorBudgetHard","errorBudgetWarn","batchMax","batchIntervalMs","retryBaseMs","retryMaxMs","maxQueueSize","httpTimeout","docs","DEFAULT_THRESHOLDS","THRESHOLDS","structuredClone","createThresholds","overrides","updateThresholds","updated","assign","resetThresholds","DEFAULT_RISK_THRESHOLDS","SECURITY_PATTERNS","RiskAnalyzer","thresholds","addPattern","analyze","_filePath","recommendations","totalScore","allPatterns","matches","matchAll","match","getLineNumber","index","cappedScore","Math","calculateSeverity","shouldBlock","lines","substring","getThresholds","setThresholds","globalConfig","NODE_ENV","includeStack","violationCounts","consoleReporter","report","violation","invariantId","context","configureInvariant","getInvariantConfig","resetViolationCounts","clear","getViolationCounts","invariant","condition","err","stackLines","callerLine","Number","parseInt","reporter","softInvariant","typeInvariant","guard","actualType","actualValue","createScopedInvariant","scope","scopedInvariant","assertDefined","assertNonEmptyString","assertPositiveNumber","isNaN","assertNonEmptyArray","isArray","assertPathWithinRoot","root","normalizedPath","normalizedRoot","SNAPBACK_LAYER_RULES","runArchCheck","rules","overrideDefaultRules","customRules","violations","ruleResults","ruleViolations","checkRule","ruleId","v","rulesChecked","rulesPassed","r","durationMs","checkNoDependency","checkCycleFree","relative","sources","targets","sourceDir","escapeRegex","runGrep","globalExclude","exclude","some","ex","ruleDescription","sourceFile","targetFile","importPath","madgeModule","madge","fileExtensions","excludeRegExp","RegExp","detectiveOptions","ts","skipTypeImports","cycles","circular","cycle","spawn","Promise","resolve","args","proc","cwd","stdio","stdout","data","toString","Boolean","colonIdx","indexOf","rest","lineNumIdx","lineNum","str","createRule","filesIn","shouldNotDependOn","shouldBeCycleFree","withSeverity","excluding","build","DeviceAuthClient","http","abortController","currentInterval","httpClient","ky","create","prefixUrl","baseUrl","timeout","getState","cancel","abort","authenticate","callbacks","AbortController","deviceCodeResponse","requestDeviceCode","onDeviceCode","interval","pollForToken","onApproved","currentState","onCancelled","onError","mergeSignals","response","post","json","client_id","clientId","device_code","handleAbortError","expires_in","attempt","aborted","delay","onPoll","grant_type","mapTokenToAuthResult","onSlowDown","token","api_key","access_token","user_id","tier","refresh_token","ms","setTimeout","addEventListener","clearTimeout","once","combined","createDeviceAuthClient","LRUCache","cache","maxSize","QuickLRU","item","expiry","ttlSeconds","CODE_EXTENSIONS","CONFIG_EXTENSIONS","DOCUMENT_EXTENSIONS","IMAGE_EXTENSIONS","MEDIA_EXTENSIONS","ARCHIVE_EXTENSIONS","DATABASE_EXTENSIONS","BINARY_EXTENSIONS","ALL_EXTENSIONS","FILE_EXTENSION_REGEX","PrivacySanitizer","sanitize","copy","hashFilePaths","hashedPath","hashFilePath","pathHash","sanitizeString","isPrivacySafe","forbiddenProps","prop","_key","crypto","sanitizeFactor","SDKConfigSchema","endpoint","apiKey","privacy","anonymizeWorkspace","ttl","maxRetries","backoffMs","WorkspaceIdSchema","FilesArraySchema","LocalFallback","generateRecommendations","SnapbackClient","sanitizer","localFallback","methods","statusCodes","backoffLimit","getHttpClient","parseRetryAfter","retryAfter","test","getTime","httpRequest","requestFn","retryLimit","pRetry","AbortError","minTimeout","maxTimeout","randomize","onFailedAttempt","onRetry","attemptNumber","sendMetadata","sanitized","f","accepted","rejected","getAnalytics","cacheKey","forceRefresh","analytics","getRecommendations","searchParams","healthCheck","ProtectionClient","protect","invalidateListCache","unprotect","cached","list","filters","put","SnapshotClient","restore","defaultConfig","createConfig","ConfigDetector","configFiles","changeHandlers","detectConfigFiles","globPatterns","glob","ignore","determineConfigType","pop","parseConfigFile","parsed","extractMetadata","jsonError","pkg","dependencies","devDependencies","scripts","validateConfig","parseResult","validatePackageJson","validateTsConfig","tsconfig","compilerOptions","module","onConfigChange","handler","VALID_PROTECTION_LEVELS","SnapBackRCParser","isValid","validate","ruleErrors","validateProtectionRule","settings","settingsErrors","validateSettings","policies","policyErrors","validatePolicies","debounce","excludeFrom","autoSnapshot","defaultProtectionLevel","protectionDebounce","maxStorageSize","parallelOperations","minimumProtectionLevel","merge","base","override","_provenance","baseProvenance","overrideProvenance","ignoreSet","hooks","templates","filterByPattern","AI_EXTENSION_IDS","GITHUB_COPILOT","GITHUB_COPILOT_CHAT","CLAUDE","TABNINE","CODEIUM","AMAZON_Q","CONTINUE","BLACKBOX","WINDSURF","ASSISTANT_DISPLAY_NAMES","AIPresenceDetector","extensionProvider","detectAIPresence","installedExtensionIds","getAllExtensionIds","detectedAssistants","hasAI","assistantDetails","isAIAssistantInstalled","assistantName","extensionId","getInstalledAIAssistants","installed","DEFAULT_BURST_CONFIG","BurstHeuristicsDetector","recentChanges","lastChangeTime","recordChange","charsInserted","charsDeleted","linesAffected","changeInfo","trimOldChanges","analyzeBurst","windowChanges","totalInserted","totalDeleted","totalLines","meetsCharThreshold","meetsLineThreshold","ratio","meetsRatioThreshold","intervals","avgInterval","meetsTimingThreshold","charConfidence","lineConfidence","ratioConfidence","timingConfidence","cutoffTime","CursorDetector","detect","appName","getAppName","hasCursor","NoOpLogger","NodeTimerService","timeouts","nextId","callback","globalThis","setInterval","clearInterval","dispose","values","DEFAULT_EXPERIENCE_THRESHOLDS","ExperienceClassifier","storage","getExperienceTier","manualTier","getExperienceMetrics","meetsThreshold","firstUseTimestamp","commandsUsed","floor","commandsUsedRecord","totalCommands","uniqueCommands","updateExperienceMetrics","current","newValue","recordCommandUsage","command","setExperienceTier","resetExperienceTier","getExperienceTierDescription","DEFAULT_CONFIG","longSessionCheckInterval","SessionCoordinator","candidates","idleTimeoutId","longSessionIntervalId","sessionStart","timers","eventEmitter","resetIdleTimer","startLongSessionMonitoring","addCandidate","uri","snapshotId","candidate","finalizeSession","sessionDuration","candidateCount","resetSession","randomUUID","changeStats","storeSessionManifest","fire","handleWindowBlur","handleGitCommit","handleTaskCompletion","handleManualFinalization","handleIdleTimeout","checkLongSession","maxDuration","getCandidateCount","getSessionStart","SessionSummaryGenerator","snapshotProvider","generateSummary","generateDetailedSummary","generateMetadataSummary","allIdentifiers","fileEntry","snapshot","identifiers","extractTopIdentifiers","identifier","round","summary","aiTags","topIdentifiers","aiPrefix","extension","extname","extractIdentifiersWithRegex","exec","isCommonKeyword","commonKeywords","SessionTagger","aiPresenceDetector","tagSession","burstResult","addReasonTags","totalAdded","aiPresence","assistant","uniqueTags","updateSessionWithTags","taggingResult","manual","EncryptionService","PBKDF2_ITERATIONS","KEY_LENGTH","ALGORITHM","IV_LENGTH","deriveKey","userSecret","salt","keyMaterial","subtle","importKey","TextEncoder","encode","iterations","generateChecksum","buffer","hashBuffer","hashArray","Uint8Array","padStart","encryptSnapshot","getRandomValues","plaintext","plaintextBuffer","ciphertextBuffer","encrypt","ciphertext","decryptSnapshot","decrypt","TextDecoder","decode","verifySecret","Buffer","randomBytes","cipher","createCipheriv","concat","final","authTag","getAuthTag","decipher","createDecipheriv","setAuthTag","decrypted","computeContentHash","SnapBackError","cause","captureStackTrace","toJSON","SnapshotError","SnapshotNotFoundError","SnapshotCreationError","SnapshotDuplicateError","existingId","SnapshotProtectedError","SnapshotRestoreError","SnapshotVersionError","supportedVersions","SnapshotVerificationError","actual","StorageError","StorageFullError","required","available","retryable","StorageLockError","resource","StorageIOError","ValidationError","InputValidationError","field","PathValidationError","MissingContentError","ApiError","RateLimitError","AuthenticationError","AuthorizationError","isSnapBackError","isSnapshotError","isStorageError","isValidationError","isApiError","isRetryableError","toError","ensureSnapBackError","baseError","_stringifyError","isOk","isErr","mapErr","andThen","unwrap","unwrapOr","defaultValue","unwrapOrElse","fromPromise","promise","fromPromiseWith","errorMapper","sequence","tryAll","operations","tap","tapErr","toPromise","reject","all","allOrErrors","tryCatch","tryCatchAsync","DEFAULT_MAX_SIZE","atomicWriteFile","encoding","mode","tempSuffix","tempPath","atomicWriteFileSync","contentSize","byteLength","writeFileSync","renameSync","unlinkSync","client","envelope","idempotentEnvelope","ensureIdempotentRequestId","evaluatePolicy","ingestTelemetry","request_id","generateRequestId","sha256","hashContent","hashWorkspaceId","getBlobPath","levels","segments","PrivacyValidator","isMetadataOnly","forbidden","props","getAllProps","strings","getAllStrings","looksLikeCode","obj","fullKey","codePatterns","ProtectionManager","registry","protectedFile","getProtection","directProtection","minimatch","getLevel","listProtected","updateLevel","existing","getConfig","updateConfig","SecurityError","validatePath","normalized","normalize","isAbsolute","sep","seg","sanitizeForJSON","SnapshotDeduplication","hashCache","cacheSize","hashFiles","sorted","isDuplicate","cachedId","supportsHashLookup","getByContentHash","allSnapshots","isMatch","every","recordHash","clearHash","SnapshotNaming","generateName","strategy","gitStrategy","semanticStrategy","timestampStrategy","capitalize","actionCounts","acc","primaryAction","charAt","toUpperCase","SnapshotManager","deduplication","naming","createSnapshot","createTest","params","fileInput","contentHash","save","targetPath","restoreAtomic","backupDir","targetBackedUp","targetFilePath","progress","rollbackError","getStoredContentHash","search","criteria","supportsOptimizedSearch","optimizedSearch","hasContent","StorageConnectionError","StorageTransactionError","CorruptedDataError","DatabaseConstructor","loadError","loadBetterSqlite3","LocalStorage","db","dbPath","ensureInitialized","DB","initSchema","sanitizedFiles","sanitizedFileContents","sanitizedMeta","stmt","prepare","run","row","deserializeSnapshot","content_hash","query","rows","close","file_contents","MemoryStorage","_contentHash","cloneSnapshot","s","beforeMs","afterMs","Snapback","snapshotManager","protectionManager","cloudClient","analyticsClient","protectionConfig","cloud","sdkConfig","SnapbackAnalyticsClient","fileInputs","listSnapshots","getSnapshot","deleteSnapshot","restoreSnapshot","protectSnapshot","unprotectSnapshot","protectFile","getProtectionLevel","SessionDeduplication","timeDeltaMs","minFilesForDedup","fingerprintCache","computeFingerprint","items","checkDuplicate","fingerprint","timeDelta","existingSessionId","register","unregister","getStats","LARGE_INSERT_THRESHOLD","minChars","minLines","SimpleChangeTracker","totalChars","largeInsertCount","multiLineInsertCount","event","chars","isInsert","isMultiLine","isLargeInsert","reset","light","maxTotalChars","medium","minLargeInserts","minTotalChars","heavy","maxLargeInsertsForSinglePaste","CONFIDENCE","noneWithNoProvider","noneWithProvider","inferenceOnlyCap","AiSessionTracker","detectEnv","changeTracker","isEnabled","startSession","reasoning","classifyLevel","calculateConfidence","generateReasoning","_provider","_metrics","providerName","makeSafeSessionStartedEvent","makeSafeSessionFinalizedEvent","consent","extCounts","computeExtensionHistogram","ext_counts","counts","ext","getFileExtension","lastDot","lastIndexOf","lastSlash","createAiTracker","cursorDetector","VSCODE_APP_NAME","APP_NAME","getEnvVar","cursorResult","tracker","aiDetectionEnabled","SessionManager","activeSession","idleTimer","flushTimer","aiTracker","runCrashRecovery","catch","recovery","recovered","failed","totalFilesRestored","finalize","changeBuffer","triggerBitmask","encodeTriggers","startIdleTimer","startFlushTimer","emitSessionStarted","track","normalizePath","shouldIgnore","fromPath","oldUri","oldAbsPath","mtime","scheduleFlush","cancelTimers","computeDeferredHashes","aiResult","generateOfflineName","emitSessionFinalized","totalDuration","session_id","started_at","ended_at","change_count","decodeTriggers","getManifest","workspace_uri","dbRowToSessionChange","snapshot_id","dot","stems","stemList","rel_path","from_path","h_old","h_new","size_before","size_after","mtime_before","mtime_after","mode_before","mode_after","eol_before","eol_after","autoFinalize","FileConflictResolver","fileSearchProvider","resolveAndWrite","_originalMetadata","hasPermission","checkPermissions","resolved","parentDir","writeError","findRenamedFile","originalPath","originalFileName","originalExt","findFiles","newPath","isSimilarFileName","similarity","calculateSimilarity","access","constants","W_OK","rootDir","findExistingAncestor","dirPath","accessSync","name1","name2","base1","base2","distance","levenshteinDistance","maxLen","str1","str2","n","dp","fill","j","hash1","hash2","withRetry","maxAttempts","baseDelayMs","maxDelayMs","calculateBackoff","baseMs","maxMs","exponential","capped","jitterAmount","random","RetryPresets","network","api","fast","diagnoseSnapshotFailure","missingFiles","suggestedFix","userAction","canAutoFix","affectedFiles","absolutePaths","applyAutomaticFix","diagnosis","fromCwd","DEFAULT_RETRY_CONFIG","delayMs","exponentialBackoff","autoFix","verbose","createSnapshotWithRetry","snapshotFn","cfg","lastError","lastDiagnosis","totalAttempts","fixApplied","suggestion","diagnostics","createSnapshotWithRetrySafe","formatDiagnosis","confidencePercent","autoFixBadge","SnapshotDeletionService","confirmationService","unprotectFirst","skipConfirmation","confirmed","confirm","deleteOlderThan","keepProtected","getAll","toDelete","autoCleanup","minimumSnapshots","olderThanDays","eligibleForDeletion","maxToDelete","canDelete","SnapshotIconStrategy","ICON_MAP","refactor","database","TEST_FILE_REGEX","CONFIG_FILE_REGEX","STYLE_FILE_REGEX","DOC_FILE_REGEX","SQL_FILE_REGEX","SCHEMA_FILE_REGEX","API_FILE_REGEX","PACKAGE_FILES","CONFIG_FILES","BUG_FIX_KEYWORDS","REFACTOR_KEYWORDS","ADDITION_KEYWORDS","DELETION_KEYWORDS","DOC_KEYWORDS","STYLE_KEYWORDS","API_KEYWORDS","DATABASE_KEYWORDS","PACKAGE_KEYWORDS","CONFIG_KEYWORDS","classifyIcon","nameResult","classifyByName","fileResult","classifyByFiles","getIconMapping","category","getAllIconMappings","lowerName","matchesPrefixKeyword","matchesKeyword","containsTestFiles","containsPackageFiles","containsConfigFiles","containsDocFiles","containsStyleFiles","containsDatabaseFiles","containsApiFiles","keywords","lowerFile","execAsync","promisify","SnapshotNamingStrategy","gitTimeoutMs","maxNameLength","baseName","gitName","tryGitNaming","fileOpName","tryFileOperationNaming","contentName","tryContentAnalysisNaming","fallbackNaming","userContext","formatUserContext","isGitRepo","execGit","gitStatus","generateSingleFileGitName","generateMultiFileGitName","testFiles","isTestFile","dependencyFiles","isDependencyFile","isConfigFile","importCount","countImportChanges","structureCount","countStructureChanges","commonDir","findCommonDirectory","moduleName","extractModuleName","allCodeFiles","isCodeFile","hasAdditions","hasModifications","hasDeletions","sanitizedName","sanitizeFilename","truncatedName","truncatePath","statusSummary","dirName","getRelativeDirectory","dirPaths","segmentArrays","firstSegments","commonSegments","segment","allMatch","firstFile","part","knownCodeFiles","known","isKnownCodeExtension","codeExtensions","importRegex","fs","structureRegex","ellipsis","filename","presetMap","credentials","testing","cleaned","compress","gzipSync","timestampPart","randomPart","ConnectionPool","connections","availableConnections","maxConnections","dbOptions","getConnection","connection","createDatabaseInstance","pragma","shift","releaseConnection","_db","cachedDatabaseConstructor","cachedDatabaseError","tryLoadBetterSqlite3","requiredModule","ctor","probe","instantiationError","isBetterSqlite3Available","getBetterSqlite3LoadError","requireDatabaseConstructor","betterSqlite3","detailedMessage","betterSqlite3Error","pathToDatabase","DatabaseCtor","StorageBroker","readConnectionPool","initialized","operationQueue","isProcessingQueue","writerId","substr","initialize","runMigrations","specificError","getDatabase","processQueue","getReadConnection","isAvailable","getLoadError","acquireLock","maxWaitTime","waitTime","releaseLock","queueOperation","preCompressedFiles","compressed","storageType","insert","transaction","preCompressed","queryError","operationName","priority","queuedOp","lockAcquired","fileRows","fileRow","typedFileRow","decompressed","gunzipSync","diff","file_path","sortBy","sortOrder","validatedSortBy","validatedSortOrder","validSortColumns","StorageBrokerAdapter","broker","filesMap","ID_PREFIX","SESSION","SNAPSHOT","AUDIT","CHECKPOINT","randomSuffix","bytes","generateSessionId","contractsGenerateSnapshotId","contractsGenerateId","generateAuditId","generateCheckpointId","randomId","parseIdTimestamp","parseIdPrefix","isValidId","expectedPrefix","isSnapshotId","isWithin","childPath","parentPath","normalizedChild","normalizedParent","getDepth","isUnixPath","areEqual","path1","path2","norm1","norm2","isWindows","RISK_FACTOR_DESCRIPTIONS","deserialization","cryptography","describeRiskFactors","describeRiskFactor","isKnownRiskFactor","getStandardRiskFactors","createDashboardMetricsClient","orpcClient","getDashboardMetrics","dashboard","DefaultRiskAnalyzer","aiContext","burstPattern","changeMetrics","affectedFunctions","ProtectionDecisionEngine","riskAnalyzer","evaluate","protectionLevel","inCooldown","shouldSnapshot","shouldProceed","hasTemporaryAllowance","determineShouldSnapshot","determineShouldProceed","buildReason","buildRecommendations","DiffCalculator","calculateFileDiff","currentLines","snapshotLines","computeLineDiff","calculateChecksum","lcs","longestCommonSubsequence","previewLines","previewLineCount","maxPreviewLines","arr1","arr2","unshift","require","generateDiffPreview","isConsumptionAllowed","allowed","isConsumptionDenied","TokenBucket","capacity","refillRate","tokens","lastRefill","tryConsume","amount","refill","tokensRemaining","resetAt","calculateResetTime","timePassed","tokensToAdd","getConsumptionInfo","consumed","percentageUsed","remaining","tokensNeeded","secondsToReset","createTokenBucket","isRateLimitAllowed","isRateLimitDenied","RateLimiter","plans","buckets","planName","checkLimit","plan","bucketKey","bucket","consumeResult","resetTime","ceil","getBucketState","resetBucket","clearAll","getActiveBucketCount","DistributedTokenManager","redis","keyPrefix","fallbackToInMemory","fallbackLimiter","redisClient","checkLimitViaRedis","checkLimitViaFallback","getRedisKey","getOrCreateBucket","expire","bucketData","cleanup"],"mappings":"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","file":"chunk-WALLF2AH.js","sourcesContent":["/**\n * @license Apache-2.0\n * @copyright SnapBack Contributors\n *\n * This file is part of SnapBack OSS.\n * Auto-generated from packages/contracts - DO NOT EDIT DIRECTLY.\n *\n * Source: packages/contracts/src/auth/errors.ts\n * Generated: 2026-01-11T17:16:21.775Z\n */\n\n/**\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 */\n\nimport { z } from \"zod\";\n\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\t\"INVALID_CREDENTIALS\",\n\t\"USER_NOT_FOUND\",\n\t\"EMAIL_NOT_VERIFIED\",\n\t\"SESSION_EXPIRED\",\n\t\"UNAUTHORIZED\",\n\t\"RATE_LIMITED\",\n\t\"INVALID_TOKEN\",\n\t\"USER_ALREADY_EXISTS\",\n\t\"WEAK_PASSWORD\",\n\t\"INVALID_EMAIL\",\n\t\"OAUTH_ERROR\",\n\t\"NETWORK_ERROR\",\n\t\"UNKNOWN_ERROR\",\n]);\n\nexport type AuthErrorCode = z.infer<typeof AuthErrorCodeSchema>;\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\tcode: AuthErrorCodeSchema,\n\tmessage: z.string(),\n\tdetails: z.record(z.string(), z.unknown()).optional(),\n});\n\nexport type AuthError = z.infer<typeof AuthErrorSchema>;\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: Record<string, AuthErrorCode> = {\n\t// Sign in errors\n\tINVALID_PASSWORD: \"INVALID_CREDENTIALS\",\n\tUSER_NOT_FOUND: \"USER_NOT_FOUND\",\n\tINVALID_EMAIL: \"INVALID_EMAIL\",\n\n\t// Sign up errors\n\tUSER_ALREADY_EXISTS: \"USER_ALREADY_EXISTS\",\n\tEMAIL_ALREADY_IN_USE: \"USER_ALREADY_EXISTS\",\n\tWEAK_PASSWORD: \"WEAK_PASSWORD\",\n\n\t// Session errors\n\tSESSION_EXPIRED: \"SESSION_EXPIRED\",\n\tSESSION_NOT_FOUND: \"SESSION_EXPIRED\",\n\tINVALID_SESSION: \"SESSION_EXPIRED\",\n\n\t// Verification errors\n\tEMAIL_NOT_VERIFIED: \"EMAIL_NOT_VERIFIED\",\n\n\t// Token errors\n\tINVALID_TOKEN: \"INVALID_TOKEN\",\n\tTOKEN_EXPIRED: \"INVALID_TOKEN\",\n\n\t// Rate limiting\n\tRATE_LIMIT_EXCEEDED: \"RATE_LIMITED\",\n\tTOO_MANY_REQUESTS: \"RATE_LIMITED\",\n\n\t// OAuth errors\n\tOAUTH_ERROR: \"OAUTH_ERROR\",\n\tOAUTH_CALLBACK_ERROR: \"OAUTH_ERROR\",\n\tPROVIDER_ERROR: \"OAUTH_ERROR\",\n};\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: string): AuthErrorCode {\n\treturn BETTER_AUTH_ERROR_MAP[betterAuthError] || \"UNKNOWN_ERROR\";\n}\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: AuthErrorCode, message: string, details?: Record<string, unknown>): AuthError {\n\treturn {\n\t\tcode,\n\t\tmessage,\n\t\t...(details && { details }),\n\t};\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: Record<AuthErrorCode, string> = {\n\tINVALID_CREDENTIALS: \"The email or password you entered is incorrect\",\n\tUSER_NOT_FOUND: \"No account found with this email address\",\n\tEMAIL_NOT_VERIFIED: \"Please verify your email address before signing in\",\n\tSESSION_EXPIRED: \"Your session has expired. Please sign in again\",\n\tUNAUTHORIZED: \"You do not have permission to perform this action\",\n\tRATE_LIMITED: \"Too many attempts. Please try again later\",\n\tINVALID_TOKEN: \"Invalid or expired verification token\",\n\tUSER_ALREADY_EXISTS: \"An account with this email already exists\",\n\tWEAK_PASSWORD: \"Password does not meet security requirements\",\n\tINVALID_EMAIL: \"Please enter a valid email address\",\n\tOAUTH_ERROR: \"Authentication with this provider failed. Please try again\",\n\tNETWORK_ERROR: \"Network error. Please check your connection and try again\",\n\tUNKNOWN_ERROR: \"An unexpected error occurred. Please try again\",\n};\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: AuthErrorCode): string {\n\treturn AUTH_ERROR_MESSAGES[code];\n}\n","/**\n * @license Apache-2.0\n * @copyright SnapBack Contributors\n *\n * This file is part of SnapBack OSS.\n * Auto-generated from packages/contracts - DO NOT EDIT DIRECTLY.\n *\n * Source: packages/contracts/src/auth/session.ts\n * Generated: 2026-01-11T17:16:21.776Z\n */\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 */\n\nimport { z } from \"zod\";\n\n/**\n * User role type - matches database schema and Better Auth admin plugin\n */\nexport const UserRoleSchema = z.enum([\"admin\", \"user\", \"viewer\"]).nullable();\nexport type UserRole = z.infer<typeof UserRoleSchema>;\n\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\tid: z.string(),\n\temail: z.string().email(),\n\tname: z.string().nullable(),\n\timage: z.string().url().nullable().optional(),\n\temailVerified: z.boolean(),\n\tcreatedAt: z.coerce.date(),\n\tupdatedAt: z.coerce.date(),\n\t// Role field from database - nullable as not all users have a role assigned\n\trole: UserRoleSchema.optional(),\n});\n\nexport type AuthUser = z.infer<typeof AuthUserSchema>;\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\tid: z.string(),\n\tuserId: z.string(),\n\texpiresAt: z.coerce.date(),\n\tcreatedAt: z.coerce.date(),\n\tupdatedAt: z.coerce.date(),\n\t// Better Auth session metadata\n\tuserAgent: z.string().nullable().optional(),\n\tipAddress: z.string().nullable().optional(),\n});\n\nexport type Session = z.infer<typeof SessionSchema>;\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\tsession: SessionSchema,\n\tuser: AuthUserSchema,\n});\n\nexport type SessionWithUser = z.infer<typeof SessionWithUserSchema>;\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\tz.object({\n\t\tstatus: z.literal(\"authenticated\"),\n\t\tuser: AuthUserSchema,\n\t\tsession: SessionSchema,\n\t}),\n\tz.object({\n\t\tstatus: z.literal(\"unauthenticated\"),\n\t}),\n\tz.object({\n\t\tstatus: z.literal(\"loading\"),\n\t}),\n]);\n\nexport type AuthState = z.infer<typeof AuthStateSchema>;\n\n/**\n * Type guards for auth state\n */\nexport function isAuthenticated(state: AuthState): state is Extract<AuthState, { status: \"authenticated\" }> {\n\treturn state.status === \"authenticated\";\n}\n\nexport function isUnauthenticated(state: AuthState): state is Extract<AuthState, { status: \"unauthenticated\" }> {\n\treturn state.status === \"unauthenticated\";\n}\n\nexport function isLoading(state: AuthState): state is Extract<AuthState, { status: \"loading\" }> {\n\treturn state.status === \"loading\";\n}\n","/**\n * @license Apache-2.0\n * @copyright SnapBack Contributors\n *\n * This file is part of SnapBack OSS.\n * Auto-generated from packages/contracts - DO NOT EDIT DIRECTLY.\n *\n * Source: packages/contracts/src/auth/api.ts\n * Generated: 2026-01-11T17:16:21.775Z\n */\n\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 */\n\nimport { z } from \"zod\";\nimport { AuthErrorSchema } from \"./errors\";\nimport { AuthUserSchema, SessionWithUserSchema } from \"./session\";\n\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\t.string()\n\t.min(8, \"Password must be at least 8 characters\")\n\t.regex(/[A-Z]/, \"Password must contain at least one uppercase letter\")\n\t.regex(/[a-z]/, \"Password must contain at least one lowercase letter\")\n\t.regex(/[0-9]/, \"Password must contain at least one number\");\n\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/**\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\temail: EmailSchema,\n\tpassword: PasswordSchema,\n\tname: z.string().min(1, \"Name is required\").max(100, \"Name is too long\").trim(),\n});\n\nexport type SignUpRequest = z.infer<typeof SignUpRequestSchema>;\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\tz.object({\n\t\tsuccess: z.literal(true),\n\t\tuser: AuthUserSchema,\n\t}),\n\tz.object({\n\t\tsuccess: z.literal(false),\n\t\terror: AuthErrorSchema,\n\t}),\n]);\n\nexport type SignUpResponse = z.infer<typeof SignUpResponseSchema>;\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\temail: EmailSchema,\n\tpassword: z.string().min(1, \"Password is required\"),\n\trememberMe: z.boolean().optional().default(false),\n});\n\nexport type SignInRequest = z.infer<typeof SignInRequestSchema>;\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\tz.object({\n\t\tsuccess: z.literal(true),\n\t\tuser: AuthUserSchema,\n\t\tsession: z.object({\n\t\t\tid: z.string(),\n\t\t\texpiresAt: z.coerce.date(),\n\t\t}),\n\t}),\n\tz.object({\n\t\tsuccess: z.literal(false),\n\t\terror: AuthErrorSchema,\n\t}),\n]);\n\nexport type SignInResponse = z.infer<typeof SignInResponseSchema>;\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\nexport type GetSessionResponse = z.infer<typeof GetSessionResponseSchema>;\n\n/**\n * Sign out response schema\n *\n * Simple success/error response for logout operations\n */\nexport const SignOutResponseSchema = z.discriminatedUnion(\"success\", [\n\tz.object({\n\t\tsuccess: z.literal(true),\n\t}),\n\tz.object({\n\t\tsuccess: z.literal(false),\n\t\terror: AuthErrorSchema,\n\t}),\n]);\n\nexport type SignOutResponse = z.infer<typeof SignOutResponseSchema>;\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\tname: z.string().min(1).max(100).trim().optional(),\n\timage: z.string().url().optional(),\n});\n\nexport type UpdateProfileRequest = z.infer<typeof UpdateProfileRequestSchema>;\n\n/**\n * Update user profile response schema\n */\nexport const UpdateProfileResponseSchema = z.discriminatedUnion(\"success\", [\n\tz.object({\n\t\tsuccess: z.literal(true),\n\t\tuser: AuthUserSchema,\n\t}),\n\tz.object({\n\t\tsuccess: z.literal(false),\n\t\terror: AuthErrorSchema,\n\t}),\n]);\n\nexport type UpdateProfileResponse = z.infer<typeof UpdateProfileResponseSchema>;\n\n/**\n * Change password request schema\n *\n * Requires current password for security\n */\nexport const ChangePasswordRequestSchema = z.object({\n\tcurrentPassword: z.string().min(1, \"Current password is required\"),\n\tnewPassword: PasswordSchema,\n});\n\nexport type ChangePasswordRequest = z.infer<typeof ChangePasswordRequestSchema>;\n\n/**\n * Change password response schema\n */\nexport const ChangePasswordResponseSchema = z.discriminatedUnion(\"success\", [\n\tz.object({\n\t\tsuccess: z.literal(true),\n\t}),\n\tz.object({\n\t\tsuccess: z.literal(false),\n\t\terror: AuthErrorSchema,\n\t}),\n]);\n\nexport type ChangePasswordResponse = z.infer<typeof ChangePasswordResponseSchema>;\n\n/**\n * OAuth sign-in request schema\n *\n * Supports GitHub, Google, and other OAuth providers\n */\nexport const OAuthSignInRequestSchema = z.object({\n\tprovider: z.enum([\"github\", \"google\"]),\n\tcallbackURL: z.string().url().optional(),\n});\n\nexport type OAuthSignInRequest = z.infer<typeof OAuthSignInRequestSchema>;\n","/**\n * @license Apache-2.0\n * @copyright SnapBack Contributors\n *\n * This file is part of SnapBack OSS.\n * Auto-generated from packages/contracts - DO NOT EDIT DIRECTLY.\n *\n * Source: packages/contracts/src/eventBus.ts\n * Generated: 2026-01-11T17:16:21.776Z\n */\n\nexport type Handler<T> = (payload: T) => void;\n\nexport class EventBus<M extends Record<string, unknown>> {\n\tprivate m = new Map<keyof M, Set<Handler<M[keyof M]>>>();\n\n\ton<K extends keyof M>(k: K, h: Handler<M[K]>) {\n\t\tconst set = this.m.get(k) ?? new Set<Handler<M[keyof M]>>();\n\t\tset.add(h as Handler<M[keyof M]>);\n\t\tthis.m.set(k, set);\n\t\treturn () => set.delete(h as Handler<M[keyof M]>);\n\t}\n\n\temit<K extends keyof M>(k: K, p: M[K]) {\n\t\tconst handlers = this.m.get(k);\n\t\tif (handlers) {\n\t\t\t// Use Array.from to convert Set to Array for iteration\n\t\t\tconst handlersArray = Array.from(handlers);\n\t\t\tfor (const h of handlersArray) {\n\t\t\t\th(p as M[keyof M]);\n\t\t\t}\n\t\t}\n\t}\n}\n\nexport type SnapbackEvents = {\n\t\"checkpoint:created\": { id: string; risk?: number; trigger: string };\n\t\"checkpoint:restored\": { id: string; success: boolean };\n\t\"risk:detected\": { score: number; factors: string[]; file?: string };\n\t\"failover:triggered\": { from: \"enhanced\"; to: \"legacy\"; error: string };\n};\n","/**\n * @license Apache-2.0\n * @copyright SnapBack Contributors\n *\n * This file is part of SnapBack OSS.\n * Auto-generated from packages/contracts - DO NOT EDIT DIRECTLY.\n *\n * Source: packages/contracts/src/id-generator.ts\n * Generated: 2026-01-11T17:16:21.779Z\n */\n\nimport { nanoid } from \"nanoid\";\n\n/**\n * Generate a unique ID with optional prefix\n * @param prefix Optional prefix for the ID (e.g., 'user', 'session')\n * @returns Unique ID string\n */\nexport function generateId(prefix?: string): string {\n\tconst id = nanoid();\n\treturn prefix ? `${prefix}-${id}` : id;\n}\n\n/**\n * Slugify a description for use in snapshot IDs\n * Converts \"Before fixing auth flow\" to \"before-fixing-auth-flow\"\n */\nfunction slugify(description: string, maxLength = 30): string {\n\treturn description\n\t\t.toLowerCase()\n\t\t.trim()\n\t\t.replace(/[^a-z0-9\\s-]/g, \"\") // Remove non-alphanumeric\n\t\t.replace(/\\s+/g, \"-\") // Spaces to hyphens\n\t\t.replace(/-+/g, \"-\") // Collapse hyphens\n\t\t.replace(/^-|-$/g, \"\") // Trim hyphens\n\t\t.slice(0, maxLength);\n}\n\n/**\n * Generate a snapshot ID in the standard format\n * Format with description: snapshot-<slug>-<timestamp>-<random>\n * Format without: snapshot-<timestamp>-<random>\n * @param description Optional human-readable description\n * @returns Snapshot ID string\n */\nexport function generateSnapshotId(description?: string): string {\n\tif (description && description.length > 0) {\n\t\tconst slug = slugify(description);\n\t\tif (slug.length > 0) {\n\t\t\treturn `snapshot-${slug}-${Date.now()}-${nanoid(9)}`;\n\t\t}\n\t}\n\treturn `snapshot-${Date.now()}-${nanoid(9)}`;\n}\n","/**\n * @license Apache-2.0\n * @copyright SnapBack Contributors\n *\n * This file is part of SnapBack OSS.\n * Auto-generated from packages/contracts - DO NOT EDIT DIRECTLY.\n *\n * Source: packages/contracts/src/logger.ts\n * Generated: 2026-01-11T17:16:21.779Z\n */\n\n// [INTERNAL: 39 lines removed]\n\nexport interface Logger {\n\t/**\n\t * Log a debug message (verbose, for development)\n\t */\n\tdebug(message: string, meta?: Record<string, unknown>): void;\n\n\t/**\n\t * Log an info message (general informational messages)\n\t */\n\tinfo(message: string, meta?: Record<string, unknown>): void;\n\n\t/**\n\t * Log a warning message (non-critical issues)\n\t */\n\twarn(message: string, meta?: Record<string, unknown>): void;\n\n\t/**\n\t * Log an error message (errors and exceptions)\n\t */\n\terror(message: string, meta?: Record<string, unknown> | Error): void;\n}\n\n/**\n * Log levels\n */\nexport enum LogLevel {\n\tDEBUG = 0,\n\tINFO = 1,\n\tWARN = 2,\n\tERROR = 3,\n\tSILENT = 4,\n}\n\n/**\n * Logger options\n */\nexport interface LoggerOptions {\n\t/**\n\t * Name/context for the logger (e.g., 'sdk', 'mcp-server')\n\t */\n\tname: string;\n\n\t/**\n\t * Minimum log level to output\n\t * @default LogLevel.INFO\n\t */\n\tlevel?: LogLevel;\n\n\t/**\n\t * Whether to include timestamps\n\t * @default false\n\t */\n\ttimestamps?: boolean;\n}\n\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-oss/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: LoggerOptions): Logger {\n\t// Fallback to minimal console implementation\n\tconst { name, level = LogLevel.INFO, timestamps = false } = options;\n\n\tconst formatMessage = (levelStr: string, message: string): string => {\n\t\tconst prefix = timestamps ? `[${new Date().toISOString()}] ` : \"\";\n\t\treturn `${prefix}[${name}] ${levelStr}: ${message}`;\n\t};\n\n\tconst formatMeta = (meta?: Record<string, unknown> | Error): string => {\n\t\tif (!meta) {\n\t\t\treturn \"\";\n\t\t}\n\n\t\tif (meta instanceof Error) {\n\t\t\treturn `\\n Error: ${meta.message}\\n Stack: ${meta.stack}`;\n\t\t}\n\n\t\ttry {\n\t\t\treturn `\n ${JSON.stringify(meta, null, 2)}`;\n\t\t} catch {\n\t\t\treturn \"\\n [Circular or non-serializable metadata]\";\n\t\t}\n\t};\n\n\treturn {\n\t\tdebug(message: string, meta?: Record<string, unknown>): void {\n\t\t\tif (level <= LogLevel.DEBUG) {\n\t\t\t\tconsole.debug(formatMessage(\"DEBUG\", message) + formatMeta(meta));\n\t\t\t}\n\t\t},\n\n\t\tinfo(message: string, meta?: Record<string, unknown>): void {\n\t\t\tif (level <= LogLevel.INFO) {\n\t\t\t\tconsole.info(formatMessage(\"INFO\", message) + formatMeta(meta));\n\t\t\t}\n\t\t},\n\n\t\twarn(message: string, meta?: Record<string, unknown>): void {\n\t\t\tif (level <= LogLevel.WARN) {\n\t\t\t\tconsole.warn(formatMessage(\"WARN\", message) + formatMeta(meta));\n\t\t\t}\n\t\t},\n\n\t\terror(message: string, meta?: Record<string, unknown> | Error): void {\n\t\t\tif (level <= LogLevel.ERROR) {\n\t\t\t\tconsole.error(formatMessage(\"ERROR\", message) + formatMeta(meta));\n\t\t\t}\n\t\t},\n\t};\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(): Logger {\n\treturn {\n\t\tdebug: () => {},\n\t\tinfo: () => {},\n\t\twarn: () => {},\n\t\terror: () => {},\n\t};\n}\n","/**\n * @license Apache-2.0\n * @copyright SnapBack Contributors\n *\n * This file is part of SnapBack OSS.\n * Auto-generated from packages/contracts - DO NOT EDIT DIRECTLY.\n *\n * Source: packages/contracts/src/observability/InstrumentationProvider.ts\n * Generated: 2026-01-11T17:16:21.780Z\n */\n\n/**\n * InstrumentationProvider Interface\n *\n * Core abstraction for distributed tracing and observability.\n * Enables vendor-neutral instrumentation across SnapBack services.\n *\n * @example\n * ```typescript\n * const provider = new OTelInstrumentationProvider({\n * serviceName: 'snapback-api',\n * collectorUrl: 'http://localhost:4318',\n * });\n *\n * await provider.withSpan('create_snapshot', async (span) => {\n * span.setAttribute('snapshot.id', id);\n * const result = await createSnapshot(files);\n * return result;\n * });\n * ```\n */\n\nimport type { Attributes, Context, ContextCarrier, SpanOptions, SpanStatus } from \"./types\";\n\n/**\n * Span interface for recording operation telemetry\n */\nexport interface Span {\n\t/**\n\t * Set a single attribute on the span\n\t * @param key - Attribute name (use SemanticConventions for standard attributes)\n\t * @param value - Attribute value\n\t */\n\tsetAttribute(key: string, value: string | number | boolean): void;\n\n\t/**\n\t * Set multiple attributes at once\n\t * @param attributes - Key-value pairs to set\n\t */\n\tsetAttributes(attributes: Attributes): void;\n\n\t/**\n\t * Add an event to the span timeline\n\t * @param name - Event name (e.g., 'validation.start', 'cache.hit')\n\t * @param attributes - Optional event attributes\n\t */\n\taddEvent(name: string, attributes?: Attributes): void;\n\n\t/**\n\t * Set the span status\n\t * @param status - Status object with code and optional message\n\t */\n\tsetStatus(status: SpanStatus): void;\n\n\t/**\n\t * Record an exception on the span\n\t * @param error - Error object to record\n\t */\n\trecordException(error: Error): void;\n\n\t/**\n\t * End the span (MUST be called to export telemetry)\n\t */\n\tend(): void;\n\n\t/**\n\t * Check if span is recording (for performance optimization)\n\t */\n\tisRecording(): boolean;\n}\n\n/**\n * Instrumentation provider interface\n *\n * Implementations: OTelInstrumentationProvider, DatadogProvider, MockProvider\n */\nexport interface InstrumentationProvider {\n\t/**\n\t * Start a new span\n\t * @param name - Span name (e.g., 'HTTP POST /snapshots', 'db.query')\n\t * @param options - Span configuration\n\t * @returns Span instance (caller MUST call span.end())\n\t */\n\tstartSpan(name: string, options?: SpanOptions): Span;\n\n\t/**\n\t * Execute a function within a span (auto-manages span lifecycle)\n\t * @param name - Span name\n\t * @param fn - Function to execute\n\t * @returns Function result\n\t *\n\t * @example\n\t * ```typescript\n\t * const result = await provider.withSpan('calculate_checksum', async (span) => {\n\t * span.setAttribute('file.size', fileSize);\n\t * const checksum = await computeChecksum(file);\n\t * span.addEvent('checksum.complete');\n\t * return checksum;\n\t * });\n\t * ```\n\t */\n\twithSpan<T>(name: string, fn: (span: Span) => Promise<T>, options?: SpanOptions): Promise<T>;\n\n\t/**\n\t * Inject context into carrier (for HTTP headers, message metadata)\n\t * @param carrier - Target carrier (e.g., HTTP headers object)\n\t *\n\t * @example\n\t * ```typescript\n\t * const headers: Record<string, string> = {};\n\t * provider.injectContext(headers);\n\t * // headers now contains: { traceparent: '00-...', tracestate: '...' }\n\t * fetch(url, { headers });\n\t * ```\n\t */\n\tinjectContext(carrier: ContextCarrier): void;\n\n\t/**\n\t * Extract context from carrier (from HTTP headers, message metadata)\n\t * @param carrier - Source carrier\n\t * @returns Extracted context or null if not found\n\t *\n\t * @example\n\t * ```typescript\n\t * // Hono middleware\n\t * const context = provider.extractContext(c.req.raw.headers);\n\t * if (context) {\n\t * // Continue trace from upstream\n\t * }\n\t * ```\n\t */\n\textractContext(carrier: ContextCarrier): Context | null;\n\n\t/**\n\t * Record a metric value\n\t * @param name - Metric name (e.g., 'snapshots.created', 'api.latency')\n\t * @param value - Numeric value\n\t * @param attributes - Optional attributes for metric dimensions\n\t */\n\trecordMetric(name: string, value: number, attributes?: Attributes): void;\n\n\t/**\n\t * Record an event without creating a span\n\t * @param name - Event name\n\t * @param attributes - Event attributes\n\t */\n\trecordEvent(name: string, attributes?: Attributes): void;\n\n\t/**\n\t * Flush pending telemetry and shutdown provider\n\t * Call before process exit to ensure data export\n\t */\n\tshutdown(): Promise<void>;\n}\n\n/**\n * No-op implementation for testing or disabled instrumentation\n */\nexport class NoOpInstrumentationProvider implements InstrumentationProvider {\n\tprivate static noopSpan: Span = {\n\t\tsetAttribute: () => {},\n\t\tsetAttributes: () => {},\n\t\taddEvent: () => {},\n\t\tsetStatus: () => {},\n\t\trecordException: () => {},\n\t\tend: () => {},\n\t\tisRecording: () => false,\n\t};\n\n\tstartSpan(_name: string, _options?: SpanOptions): Span {\n\t\treturn NoOpInstrumentationProvider.noopSpan;\n\t}\n\n\tasync withSpan<T>(_name: string, fn: (span: Span) => Promise<T>, _options?: SpanOptions): Promise<T> {\n\t\treturn await fn(NoOpInstrumentationProvider.noopSpan);\n\t}\n\n\tinjectContext(_carrier: ContextCarrier): void {\n\t\t// No-op\n\t}\n\n\textractContext(_carrier: ContextCarrier): Context | null {\n\t\treturn null;\n\t}\n\n\trecordMetric(_name: string, _value: number, _attributes?: Attributes): void {\n\t\t// No-op\n\t}\n\n\trecordEvent(_name: string, _attributes?: Attributes): void {\n\t\t// No-op\n\t}\n\n\tasync shutdown(): Promise<void> {\n\t\t// No-op\n\t}\n}\n","/**\n * @license Apache-2.0\n * @copyright SnapBack Contributors\n *\n * This file is part of SnapBack OSS.\n * Auto-generated from packages/contracts - DO NOT EDIT DIRECTLY.\n *\n * Source: packages/contracts/src/observability/SemanticConventions.ts\n * Generated: 2026-01-11T17:16:21.780Z\n */\n\n/**\n * Semantic Conventions for SnapBack Instrumentation\n *\n * Standard attribute names for spans, metrics, and events.\n * Aligned with OpenTelemetry semantic conventions where applicable.\n *\n * @see https://opentelemetry.io/docs/specs/semconv/\n */\n\n/**\n * HTTP attributes (aligned with OTel)\n */\nexport const HttpAttributes = {\n\t/** HTTP request method (GET, POST, etc.) */\n\tMETHOD: \"http.method\",\n\t/** HTTP response status code */\n\tSTATUS_CODE: \"http.status_code\",\n\t/** HTTP route pattern */\n\tROUTE: \"http.route\",\n\t/** HTTP target URL path */\n\tTARGET: \"http.target\",\n\t/** HTTP scheme (http, https) */\n\tSCHEME: \"http.scheme\",\n\t/** HTTP host header */\n\tHOST: \"http.host\",\n\t/** User agent string */\n\tUSER_AGENT: \"http.user_agent\",\n\t/** Request content length */\n\tREQUEST_CONTENT_LENGTH: \"http.request_content_length\",\n\t/** Response content length */\n\tRESPONSE_CONTENT_LENGTH: \"http.response_content_length\",\n} as const;\n\n/**\n * Database attributes (aligned with OTel)\n */\nexport const DbAttributes = {\n\t/** Database system (sqlite, postgresql, etc.) */\n\tSYSTEM: \"db.system\",\n\t/** Database operation name (SELECT, INSERT, etc.) */\n\tOPERATION: \"db.operation\",\n\t/** Database statement/query */\n\tSTATEMENT: \"db.statement\",\n\t/** Database name */\n\tNAME: \"db.name\",\n\t/** Table name */\n\tTABLE: \"db.sql.table\",\n} as const;\n\n/**\n * SnapBack-specific snapshot attributes\n */\nexport const SnapshotAttributes = {\n\t/** Snapshot unique identifier */\n\tID: \"snapback.snapshot.id\",\n\t/** Number of files in snapshot */\n\tFILE_COUNT: \"snapback.snapshot.file_count\",\n\t/** Total size in bytes */\n\tSIZE_BYTES: \"snapback.snapshot.size_bytes\",\n\t/** Snapshot creation method (manual, auto, api) */\n\tMETHOD: \"snapback.snapshot.method\",\n\t/** Snapshot trigger (command, watch, schedule) */\n\tTRIGGER: \"snapback.snapshot.trigger\",\n\t/** Snapshot protected status */\n\tPROTECTED: \"snapback.snapshot.protected\",\n\t/** Snapshot encryption enabled */\n\tENCRYPTED: \"snapback.snapshot.encrypted\",\n} as const;\n\n/**\n * SnapBack-specific file protection attributes\n */\nexport const ProtectionAttributes = {\n\t/** Protection level (watch, warn, block) */\n\tLEVEL: \"snapback.protection.level\",\n\t/** File path (sanitized) */\n\tFILE_PATH: \"snapback.file.path\",\n\t/** File extension */\n\tFILE_EXTENSION: \"snapback.file.extension\",\n\t/** File size in bytes */\n\tFILE_SIZE: \"snapback.file.size\",\n\t/** Protection rule applied */\n\tRULE_ID: \"snapback.protection.rule_id\",\n\t/** Policy evaluation result */\n\tPOLICY_RESULT: \"snapback.protection.policy_result\",\n} as const;\n\n/**\n * SnapBack-specific risk detection attributes\n */\nexport const RiskAttributes = {\n\t/** Risk level (low, medium, high, critical) */\n\tLEVEL: \"snapback.risk.level\",\n\t/** Risk factors detected */\n\tFACTORS: \"snapback.risk.factors\",\n\t/** Confidence score (0.0 - 1.0) */\n\tCONFIDENCE: \"snapback.risk.confidence\",\n\t/** Risk patterns matched */\n\tPATTERNS: \"snapback.risk.patterns\",\n\t/** AI-assisted change detected */\n\tAI_ASSISTED: \"snapback.risk.ai_assisted\",\n} as const;\n\n/**\n * User and authentication attributes\n */\nexport const UserAttributes = {\n\t/** User ID (sanitized) */\n\tID: \"snapback.user.id\",\n\t/** Session ID */\n\tSESSION_ID: \"snapback.session.id\",\n\t/** API key ID (not the key itself) */\n\tAPI_KEY_ID: \"snapback.api_key.id\",\n\t/** Organization ID */\n\tORGANIZATION_ID: \"snapback.organization.id\",\n} as const;\n\n/**\n * Network attributes\n */\nexport const NetworkAttributes = {\n\t/** Client IP address */\n\tPEER_IP: \"net.peer.ip\",\n\t/** Client port */\n\tPEER_PORT: \"net.peer.port\",\n\t/** Host IP address */\n\tHOST_IP: \"net.host.ip\",\n\t/** Host port */\n\tHOST_PORT: \"net.host.port\",\n} as const;\n\n/**\n * Service and infrastructure attributes\n */\nexport const ServiceAttributes = {\n\t/** Service name (api, vscode, mcp, cli) */\n\tNAME: \"service.name\",\n\t/** Service version */\n\tVERSION: \"service.version\",\n\t/** Service environment (dev, staging, production) */\n\tENVIRONMENT: \"service.environment\",\n\t/** Service instance ID */\n\tINSTANCE_ID: \"service.instance.id\",\n} as const;\n\n/**\n * Error attributes\n */\nexport const ErrorAttributes = {\n\t/** Error type/name */\n\tTYPE: \"error.type\",\n\t/** Error message */\n\tMESSAGE: \"error.message\",\n\t/** Error stack trace (truncated) */\n\tSTACK: \"error.stack\",\n\t/** Error code */\n\tCODE: \"error.code\",\n} as const;\n\n/**\n * Performance attributes\n */\nexport const PerformanceAttributes = {\n\t/** Operation duration in milliseconds */\n\tDURATION_MS: \"snapback.performance.duration_ms\",\n\t/** Cache hit/miss */\n\tCACHE_HIT: \"snapback.performance.cache_hit\",\n\t/** Retry count */\n\tRETRY_COUNT: \"snapback.performance.retry_count\",\n\t/** Queue depth */\n\tQUEUE_DEPTH: \"snapback.performance.queue_depth\",\n} as const;\n\n/**\n * All semantic conventions combined\n */\nexport const SemanticConventions = {\n\tHttp: HttpAttributes,\n\tNetwork: NetworkAttributes,\n\tDb: DbAttributes,\n\tSnapshot: SnapshotAttributes,\n\tProtection: ProtectionAttributes,\n\tRisk: RiskAttributes,\n\tUser: UserAttributes,\n\tService: ServiceAttributes,\n\tError: ErrorAttributes,\n\tPerformance: PerformanceAttributes,\n} as const;\n","/**\n * @license Apache-2.0\n * @copyright SnapBack Contributors\n *\n * This file is part of SnapBack OSS.\n * Auto-generated from packages/contracts - DO NOT EDIT DIRECTLY.\n *\n * Source: packages/contracts/src/observability/types.ts\n * Generated: 2026-01-11T17:16:21.781Z\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/**\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 enum SpanStatusCode {\n\t/** The default status */\n\tUNSET = 0,\n\t/** The operation completed successfully */\n\tOK = 1,\n\t/** The operation contains an error */\n\tERROR = 2,\n}\n\n/**\n * Span status with optional message\n */\nexport interface SpanStatus {\n\tcode: SpanStatusCode;\n\tmessage?: string;\n}\n\n/**\n * Attribute value types supported by instrumentation\n */\nexport type AttributeValue = string | number | boolean | string[] | number[] | boolean[];\n\n/**\n * Key-value attributes for spans and events\n */\nexport type Attributes = Record<string, AttributeValue>;\n\n/**\n * Span options for customizing span behavior\n */\nexport interface SpanOptions {\n\t/** Span kind (internal, server, client, producer, consumer) */\n\tkind?: SpanKind;\n\t/** Parent span or context */\n\tparent?: unknown;\n\t/** Initial attributes */\n\tattributes?: Attributes;\n\t/** Start time in milliseconds */\n\tstartTime?: number;\n}\n\n/**\n * Span kinds aligned with OpenTelemetry\n */\nexport enum SpanKind {\n\tINTERNAL = 0,\n\tSERVER = 1,\n\tCLIENT = 2,\n\tPRODUCER = 3,\n\tCONSUMER = 4,\n}\n\n/**\n * Context carrier for propagation (HTTP headers, metadata, etc.)\n */\nexport type ContextCarrier = Record<string, string>;\n\n/**\n * Opaque context object for propagation\n */\nexport interface Context {\n\t[key: string]: unknown;\n}\n","/**\n * @license Apache-2.0\n * @copyright SnapBack Contributors\n *\n * This file is part of SnapBack OSS.\n * Auto-generated from packages/contracts - DO NOT EDIT DIRECTLY.\n *\n * Source: packages/contracts/src/observability/utils.ts\n * Generated: 2026-01-11T17:16:21.781Z\n */\n\nimport type { Span } from \"./InstrumentationProvider\";\nimport { SemanticConventions } from \"./SemanticConventions\";\nimport { SpanStatusCode } from \"./types\";\n\nconst TRACE_PARENT_HEADER = \"traceparent\";\nconst TRACE_STATE_HEADER = \"tracestate\";\n\n/**\n * Extract only W3C Trace Context headers from incoming request headers.\n * Filters out all sensitive headers (Authorization, Cookie, etc.).\n *\n * @param headers - Request headers object\n * @returns Filtered headers containing only traceparent and tracestate\n */\nexport function extractTraceHeaders(headers: Headers | Record<string, string>): Record<string, string> {\n\tconst traceHeaders: Record<string, string> = {};\n\n\tif (headers instanceof Headers) {\n\t\theaders.forEach((value, key) => {\n\t\t\tconst lowerKey = key.toLowerCase();\n\t\t\tif (lowerKey === TRACE_PARENT_HEADER || lowerKey === TRACE_STATE_HEADER) {\n\t\t\t\ttraceHeaders[key] = value;\n\t\t\t}\n\t\t});\n\t} else {\n\t\tfor (const [key, value] of Object.entries(headers)) {\n\t\t\tconst lowerKey = key.toLowerCase();\n\t\t\tif (lowerKey === TRACE_PARENT_HEADER || lowerKey === TRACE_STATE_HEADER) {\n\t\t\t\ttraceHeaders[key] = value;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn traceHeaders;\n}\n\n/**\n * Set HTTP request attributes on a span using OTel semantic conventions.\n *\n * @param span - Span to set attributes on\n * @param request - HTTP request metadata\n */\nexport function setHttpRequestAttributes(\n\tspan: Span,\n\trequest: {\n\t\tmethod: string;\n\t\turl: string;\n\t\ttarget?: string;\n\t\troute?: string;\n\t\thost?: string;\n\t\tuserAgent?: string;\n\t\tclientIp?: string;\n\t\tscheme?: string;\n\t\tforwardedProto?: string;\n\t},\n): void {\n\tconst { method, url, target, route, host, userAgent, clientIp, scheme, forwardedProto } = request;\n\n\t// Core HTTP attributes\n\tspan.setAttribute(SemanticConventions.Http.METHOD, method);\n\n\tif (target) {\n\t\tspan.setAttribute(SemanticConventions.Http.TARGET, target);\n\t}\n\n\tif (route) {\n\t\tspan.setAttribute(SemanticConventions.Http.ROUTE, route);\n\t}\n\n\tif (host) {\n\t\tspan.setAttribute(SemanticConventions.Http.HOST, host);\n\t}\n\n\tif (userAgent) {\n\t\tspan.setAttribute(SemanticConventions.Http.USER_AGENT, userAgent);\n\t}\n\n\t// Network attributes\n\tif (clientIp) {\n\t\tspan.setAttribute(SemanticConventions.Network.PEER_IP, clientIp);\n\t}\n\n\t// Detect scheme from X-Forwarded-Proto or URL\n\tconst detectedScheme = forwardedProto || scheme || (url.startsWith(\"https\") ? \"https\" : \"http\");\n\tspan.setAttribute(SemanticConventions.Http.SCHEME, detectedScheme);\n}\n\n/**\n * Set HTTP response attributes on a span and update span status based on status code.\n *\n * @param span - Span to set attributes on\n * @param statusCode - HTTP response status code\n * @param options - Optional configuration for error handling\n */\nexport function setSpanStatusFromHttp(\n\tspan: Span,\n\tstatusCode: number,\n\toptions?: {\n\t\t/** Whether to add error event for 4xx/5xx responses */\n\t\taddErrorEvent?: boolean;\n\t\t/** Custom error message */\n\t\terrorMessage?: string;\n\t},\n): void {\n\tspan.setAttribute(SemanticConventions.Http.STATUS_CODE, statusCode);\n\n\t// Set span status based on HTTP status code\n\tif (statusCode >= 500) {\n\t\t// 5xx = server error\n\t\tspan.setStatus({\n\t\t\tcode: SpanStatusCode.ERROR,\n\t\t\tmessage: options?.errorMessage || `HTTP ${statusCode}`,\n\t\t});\n\n\t\tif (options?.addErrorEvent) {\n\t\t\tspan.addEvent(\"server_error\", {\n\t\t\t\tstatus: statusCode,\n\t\t\t\t...(options.errorMessage && { message: options.errorMessage }),\n\t\t\t});\n\t\t}\n\t} else if (statusCode >= 400) {\n\t\t// 4xx = client error (not a span error)\n\t\tspan.setStatus({ code: SpanStatusCode.OK });\n\n\t\tif (options?.addErrorEvent) {\n\t\t\tspan.addEvent(\"client_error\", {\n\t\t\t\tstatus: statusCode,\n\t\t\t\t...(options.errorMessage && { message: options.errorMessage }),\n\t\t\t});\n\t\t}\n\t} else {\n\t\t// 2xx/3xx = success\n\t\tspan.setStatus({ code: SpanStatusCode.OK });\n\t}\n}\n","/**\n * @license Apache-2.0\n * @copyright SnapBack Contributors\n *\n * This file is part of SnapBack OSS.\n * Auto-generated from packages/contracts - DO NOT EDIT DIRECTLY.\n *\n * Source: packages/contracts/src/session.ts\n * Generated: 2026-01-11T17:16:21.783Z\n */\n\nimport { z } from \"zod\";\n\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/**\n * Session schema version for backward compatibility\n */\nexport const SessionSchemaVersion = \"sb.session.v1\" as const;\nexport type SessionSchema = typeof SessionSchemaVersion;\n\n/**\n * File change operation types\n */\nexport const ChangeOpSchema = z.enum([\"created\", \"modified\", \"deleted\", \"renamed\"]);\nexport type ChangeOp = z.infer<typeof ChangeOpSchema>;\n\n/**\n * Line ending types for cross-platform consistency\n */\nexport const EOLTypeSchema = z.enum([\"lf\", \"crlf\"]);\nexport type EOLType = z.infer<typeof EOLTypeSchema>;\n\n/**\n * Session trigger sources for analytics\n */\nexport const SessionTriggerSchema = z.enum([\"filewatch\", \"pre-commit\", \"manual\", \"idle-finalize\"]);\nexport type SessionTrigger = z.infer<typeof SessionTriggerSchema>;\n\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\t/** Relative POSIX path from workspace root */\n\tp: z.string(),\n\n\t/** Operation type */\n\top: ChangeOpSchema,\n\n\t/** Prior relative path (for rename operations only) */\n\tfrom: z.string().optional(),\n\n\t/** SHA-256 hash before change (CAS reference) - computed on finalize */\n\thOld: z.string().optional(),\n\n\t/** SHA-256 hash after change (CAS reference) - computed on finalize */\n\thNew: z.string().optional(),\n\n\t/** File size before change (bytes) */\n\tsizeBefore: z.number().int().nonnegative().optional(),\n\n\t/** File size after change (bytes) */\n\tsizeAfter: z.number().int().nonnegative().optional(),\n\n\t/** Modification time before change (Unix epoch ms) */\n\tmtimeBefore: z.number().int().nonnegative().optional(),\n\n\t/** Modification time after change (Unix epoch ms) */\n\tmtimeAfter: z.number().int().nonnegative().optional(),\n\n\t/** File permissions before change (Unix mode) */\n\tmodeBefore: z.number().int().nonnegative().optional(),\n\n\t/** File permissions after change (Unix mode) */\n\tmodeAfter: z.number().int().nonnegative().optional(),\n\n\t/** Line ending style before change */\n\teolBefore: EOLTypeSchema.optional(),\n\n\t/** Line ending style after change */\n\teolAfter: EOLTypeSchema.optional(),\n});\nexport type SessionChange = z.infer<typeof SessionChangeSchema>;\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\t/** Schema version for backward compatibility */\n\tschema: z.literal(SessionSchemaVersion),\n\n\t/** Unique session identifier (CUID) */\n\tsessionId: z.string(),\n\n\t/** Session start timestamp (ISO 8601) */\n\tstartedAt: z.string().datetime(),\n\n\t/** Session end timestamp (ISO 8601) - undefined if active */\n\tendedAt: z.string().datetime().optional(),\n\n\t/** VS Code workspace folder URI (multi-root workspace safe) */\n\tworkspaceUri: z.string(),\n\n\t/** Offline-generated semantic label (never transmitted) */\n\tname: z.string().optional(),\n\n\t/** Trigger sources for this session */\n\ttriggers: z.array(SessionTriggerSchema),\n\n\t/** Total number of file changes in this session */\n\tchangeCount: z.number().int().nonnegative(),\n\n\t/** Chronological list of file changes */\n\tfilesChanged: z.array(SessionChangeSchema),\n\n\t/** Array of snapshot IDs created during this session */\n\tsnapshots: z.array(z.string()).optional(),\n});\nexport type SessionManifestV1 = z.infer<typeof SessionManifestV1Schema>;\n\n/**\n * Minimal session data for list views\n */\nexport const SessionSummarySchema = z.object({\n\tsessionId: z.string(),\n\tstartedAt: z.string().datetime(),\n\tendedAt: z.string().datetime().optional(),\n\tname: z.string().optional(),\n\tchangeCount: z.number().int().nonnegative(),\n\ttriggers: z.array(SessionTriggerSchema),\n});\nexport type SessionSummary = z.infer<typeof SessionSummarySchema>;\n\n/**\n * Session filters for querying\n */\nexport const SessionFiltersSchema = z.object({\n\t/** Only return sessions for this workspace URI */\n\tworkspaceUri: z.string().optional(),\n\n\t/** Only return active sessions (endedAt is null) */\n\tactiveOnly: z.boolean().optional(),\n\n\t/** Only return finalized sessions (endedAt is not null) */\n\tfinalizedOnly: z.boolean().optional(),\n\n\t/** Return sessions that started after this timestamp */\n\tafter: z.date().optional(),\n\n\t/** Return sessions that started before this timestamp */\n\tbefore: z.date().optional(),\n\n\t/** Maximum number of results */\n\tlimit: z.number().int().positive().optional(),\n\n\t/** Offset for pagination */\n\toffset: z.number().int().nonnegative().optional(),\n});\nexport type SessionFilters = z.infer<typeof SessionFiltersSchema>;\n\n/**\n * Session creation options\n */\nexport const CreateSessionOptionsSchema = z.object({\n\t/** VS Code workspace folder URI */\n\tworkspaceUri: z.string(),\n\n\t/** Initial trigger sources */\n\ttriggers: z.array(SessionTriggerSchema).default([\"filewatch\"]),\n\n\t/** Optional semantic name (generated offline) */\n\tname: z.string().optional(),\n});\nexport type CreateSessionOptions = z.infer<typeof CreateSessionOptionsSchema>;\n\n/**\n * Session manager configuration\n */\nexport const SessionManagerConfigSchema = z.object({\n\t/** VS Code workspace folder URI (multi-root safe) */\n\tworkspaceUri: z.string(),\n\n\t/** Idle timeout in milliseconds (default: 15 minutes) */\n\tidleMs: z\n\t\t.number()\n\t\t.int()\n\t\t.positive()\n\t\t.default(15 * 60_000),\n\n\t/** Batch size for flushing changes to database (default: 50) */\n\tflushBatchSize: z.number().int().positive().default(50),\n\n\t/** Flush interval in milliseconds (default: 5 seconds) */\n\tflushIntervalMs: z.number().int().positive().default(5000),\n\n\t/** Use VS Code file system watcher (default: true) */\n\tuseVSCodeWatcher: z.boolean().default(true),\n\n\t/** Patterns to ignore (.snapbackignore) */\n\tignorePatterns: z\n\t\t.array(z.string())\n\t\t.default([\n\t\t\t\"node_modules/**\",\n\t\t\t\".next/**\",\n\t\t\t\"dist/**\",\n\t\t\t\"build/**\",\n\t\t\t\"coverage/**\",\n\t\t\t\".git/**\",\n\t\t\t\"*.log\",\n\t\t\t\"*.tmp\",\n\t\t\t\"*.swp\",\n\t\t\t\".DS_Store\",\n\t\t]),\n});\nexport type SessionManagerConfig = z.infer<typeof SessionManagerConfigSchema>;\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: SessionTrigger[]): number {\n\tlet mask = 0;\n\tfor (const trigger of triggers) {\n\t\tswitch (trigger) {\n\t\t\tcase \"filewatch\":\n\t\t\t\tmask |= 1;\n\t\t\t\tbreak;\n\t\t\tcase \"pre-commit\":\n\t\t\t\tmask |= 2;\n\t\t\t\tbreak;\n\t\t\tcase \"manual\":\n\t\t\t\tmask |= 4;\n\t\t\t\tbreak;\n\t\t\tcase \"idle-finalize\":\n\t\t\t\tmask |= 8;\n\t\t\t\tbreak;\n\t\t}\n\t}\n\treturn mask;\n}\n\n/**\n * Decode trigger bitmask to array of trigger types\n */\nexport function decodeTriggerBitmask(mask: number): SessionTrigger[] {\n\tconst triggers: SessionTrigger[] = [];\n\tif (mask & 1) {\n\t\ttriggers.push(\"filewatch\");\n\t}\n\tif (mask & 2) {\n\t\ttriggers.push(\"pre-commit\");\n\t}\n\tif (mask & 4) {\n\t\ttriggers.push(\"manual\");\n\t}\n\tif (mask & 8) {\n\t\ttriggers.push(\"idle-finalize\");\n\t}\n\treturn triggers;\n}\n","/**\n * @license Apache-2.0\n * @copyright SnapBack Contributors\n *\n * This file is part of SnapBack OSS.\n * Auto-generated from packages/contracts - DO NOT EDIT DIRECTLY.\n *\n * Source: packages/contracts/src/session/file-modification.ts\n * Generated: 2026-01-11T17:16:21.782Z\n */\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 */\n\nimport { z } from \"zod\";\n\n/**\n * Source surfaces that can record file modifications\n */\nexport const ModificationSourceSchema = z.enum([\"extension\", \"mcp\", \"daemon\", \"cli\"]);\nexport type ModificationSource = z.infer<typeof ModificationSourceSchema>;\n\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\"]);\nexport type ModificationType = z.infer<typeof ModificationTypeSchema>;\n\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\t/** Absolute path to the modified file */\n\tpath: z.string().min(1, \"Path cannot be empty\"),\n\n\t/** Modification timestamp (ms since epoch) */\n\ttimestamp: z.number().positive(\"Timestamp must be positive\"),\n\n\t/** Type of modification */\n\ttype: ModificationTypeSchema,\n\n\t/** Lines changed (0 if unknown or delete) */\n\tlinesChanged: z.number().int().nonnegative().default(0),\n\n\t/** Whether this change was AI-attributed (detected by AIPresenceDetector) */\n\taiAttributed: z.boolean().default(false),\n\n\t/** Which AI tool made the change, if detected (e.g., 'copilot', 'cursor', 'claude') */\n\taiTool: z.string().nullable().default(null),\n\n\t/** Source surface that recorded this modification */\n\tsource: ModificationSourceSchema,\n});\n\nexport type FileModification = z.infer<typeof FileModificationSchema>;\n\n/**\n * Input type for recording modifications (source required, others have defaults)\n */\nexport type FileModificationInput = {\n\tpath: string;\n\ttimestamp: number;\n\ttype: ModificationType;\n\tsource: ModificationSource;\n\tlinesChanged?: number;\n\taiAttributed?: boolean;\n\taiTool?: string | null;\n};\n\n/**\n * Parse and validate a FileModification input\n */\nexport function parseFileModification(input: FileModificationInput): FileModification {\n\treturn FileModificationSchema.parse(input);\n}\n\n// =============================================================================\n// ADAPTERS: Convert between surface-specific types and canonical type\n// =============================================================================\n\n/**\n * MCP's FileChange type (from packages/mcp/src/session/state.ts)\n */\nexport interface MCPFileChange {\n\tfile: string;\n\ttype: \"created\" | \"modified\" | \"deleted\";\n\ttimestamp: number;\n\taiAttributed: boolean;\n\tlinesChanged: number;\n}\n\n/**\n * Convert MCP's FileChange to canonical FileModification\n */\nexport function fromMCPFileChange(change: MCPFileChange): FileModification {\n\treturn {\n\t\tpath: change.file,\n\t\ttimestamp: change.timestamp,\n\t\ttype: change.type === \"created\" ? \"create\" : change.type === \"deleted\" ? \"delete\" : \"update\",\n\t\tlinesChanged: change.linesChanged,\n\t\taiAttributed: change.aiAttributed,\n\t\taiTool: null, // MCP doesn't track specific AI tool\n\t\tsource: \"mcp\",\n\t};\n}\n\n/**\n * Convert canonical FileModification to MCP's FileChange\n */\nexport function toMCPFileChange(mod: FileModification): MCPFileChange {\n\treturn {\n\t\tfile: mod.path,\n\t\ttype: mod.type === \"create\" ? \"created\" : mod.type === \"delete\" ? \"deleted\" : \"modified\",\n\t\ttimestamp: mod.timestamp,\n\t\taiAttributed: mod.aiAttributed,\n\t\tlinesChanged: mod.linesChanged,\n\t};\n}\n\n/**\n * Intelligence's internal FileModification type (from packages/intelligence/src/types/session.ts)\n * Note: Intelligence will be updated to use the canonical type directly\n */\nexport interface IntelligenceFileModification {\n\tpath: string;\n\ttimestamp: number;\n\ttype: \"create\" | \"update\" | \"delete\";\n\tlinesChanged?: number;\n}\n\n/**\n * Convert Intelligence's FileModification to canonical FileModification\n */\nexport function fromIntelligenceFileModification(\n\tmod: IntelligenceFileModification,\n\tsource: ModificationSource = \"extension\",\n): FileModification {\n\treturn {\n\t\tpath: mod.path,\n\t\ttimestamp: mod.timestamp,\n\t\ttype: mod.type,\n\t\tlinesChanged: mod.linesChanged ?? 0,\n\t\taiAttributed: false, // Intelligence doesn't track this currently\n\t\taiTool: null,\n\t\tsource,\n\t};\n}\n\n/**\n * Convert canonical FileModification to Intelligence's format\n * (for backwards compatibility during migration)\n */\nexport function toIntelligenceFileModification(mod: FileModification): IntelligenceFileModification {\n\treturn {\n\t\tpath: mod.path,\n\t\ttimestamp: mod.timestamp,\n\t\ttype: mod.type,\n\t\tlinesChanged: mod.linesChanged,\n\t};\n}\n\n// =============================================================================\n// UTILITY FUNCTIONS\n// =============================================================================\n\n/**\n * Filter modifications to only those after a given timestamp\n */\nexport function filterModificationsSince(mods: FileModification[], since: number): FileModification[] {\n\treturn mods.filter((m) => m.timestamp >= since);\n}\n\n/**\n * Get unique file paths from modifications\n */\nexport function getUniqueModifiedPaths(mods: FileModification[]): string[] {\n\treturn [...new Set(mods.map((m) => m.path))];\n}\n\n/**\n * Count AI-attributed modifications\n */\nexport function countAIAttributedModifications(mods: FileModification[]): number {\n\treturn mods.filter((m) => m.aiAttributed).length;\n}\n\n/**\n * Get total lines changed across all modifications\n */\nexport function getTotalLinesChanged(mods: FileModification[]): number {\n\treturn mods.reduce((sum, m) => sum + m.linesChanged, 0);\n}\n\n/**\n * Group modifications by AI tool\n */\nexport function groupByAITool(mods: FileModification[]): Map<string | null, FileModification[]> {\n\tconst groups = new Map<string | null, FileModification[]>();\n\tfor (const mod of mods) {\n\t\tconst tool = mod.aiTool;\n\t\tif (!groups.has(tool)) {\n\t\t\tgroups.set(tool, []);\n\t\t}\n\t\tgroups.get(tool)?.push(mod);\n\t}\n\treturn groups;\n}\n","/**\n * @license Apache-2.0\n * @copyright SnapBack Contributors\n *\n * This file is part of SnapBack OSS.\n * Auto-generated from packages/contracts - DO NOT EDIT DIRECTLY.\n *\n * Source: packages/contracts/src/signals/index.ts\n * Generated: 2026-01-11T17:16:21.783Z\n */\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 */\n\nimport { z } from \"zod\";\n\n// =============================================================================\n// AI Detection Schemas\n// =============================================================================\n\n/**\n * AI Detection Input\n *\n * Detects AI tool presence and code generation patterns.\n */\nexport const AiDetectionInputSchema = z.object({\n\t/** Active extension IDs in the IDE environment */\n\textensionIds: z.array(z.string()).default([]),\n\n\t/** Optional file content to analyze for AI signatures */\n\tcontent: z.string().optional(),\n\n\t/** Character velocity (chars/ms) from burst detection */\n\tvelocity: z.number().nonnegative().optional(),\n\n\t/** Total characters changed in the operation */\n\tcharCount: z.number().int().nonnegative().optional(),\n});\n\nexport type AiDetectionInput = z.infer<typeof AiDetectionInputSchema>;\n\n/**\n * AI Detection Output\n */\nexport const AiDetectionOutputSchema = z.object({\n\t/** Detected AI tool name, or null if none detected */\n\ttool: z.string().nullable(),\n\n\t/** Confidence score (0-1) */\n\tconfidence: z.number().min(0).max(1),\n\n\t/** Detection method that triggered */\n\tmethod: z.enum([\"extension\", \"velocity\", \"pattern\", \"combined\"]).nullable(),\n\n\t/** Indicators that contributed to detection */\n\tindicators: z.array(z.string()).optional(),\n});\n\nexport type AiDetectionOutput = z.infer<typeof AiDetectionOutputSchema>;\n\n// =============================================================================\n// Threat Detection Schemas\n// =============================================================================\n\n/**\n * Threat Detection Input\n *\n * Scans code content for security threat patterns.\n */\nexport const ThreatDetectionInputSchema = z.object({\n\t/** Code content to scan for threats */\n\tcontent: z.string(),\n});\n\nexport type ThreatDetectionInput = z.infer<typeof ThreatDetectionInputSchema>;\n\n/**\n * Individual threat pattern match\n */\nexport const ThreatPatternSchema = z.object({\n\t/** Description of the threat pattern */\n\tdescription: z.string(),\n\n\t/** Severity score (0-1), where 1 is most critical */\n\tseverity: z.number().min(0).max(1),\n});\n\nexport type ThreatPattern = z.infer<typeof ThreatPatternSchema>;\n\n/**\n * Threat Detection Output\n */\nexport const ThreatDetectionOutputSchema = z.object({\n\t/** Total number of threats detected */\n\tthreatCount: z.number().int().nonnegative(),\n\n\t/** List of detected threat patterns */\n\tpatterns: z.array(ThreatPatternSchema),\n\n\t/** Overall severity level */\n\tseverity: z.enum([\"none\", \"low\", \"medium\", \"high\", \"critical\"]),\n\n\t/** Aggregated threat score (0-10) */\n\tscore: z.number().min(0).max(10),\n});\n\nexport type ThreatDetectionOutput = z.infer<typeof ThreatDetectionOutputSchema>;\n\n// =============================================================================\n// Burst Detection Schemas\n// =============================================================================\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\t/** File path being analyzed */\n\tfilePath: z.string(),\n\n\t/** Number of characters changed */\n\tcharCount: z.number().int().nonnegative(),\n\n\t/** Timestamp of the change (ms since epoch) */\n\ttimestamp: z.number().int().positive().optional(),\n});\n\nexport type BurstDetectionInput = z.infer<typeof BurstDetectionInputSchema>;\n\n/**\n * Burst Detection Output\n */\nexport const BurstDetectionOutputSchema = z.object({\n\t/** Whether a burst was detected */\n\tisBurst: z.boolean(),\n\n\t/** Character velocity (chars/ms) */\n\tvelocity: z.number().nonnegative(),\n\n\t/** File path analyzed */\n\tfilePath: z.string(),\n\n\t/** Total characters in the change */\n\tcharCount: z.number().int().nonnegative(),\n\n\t/** Timestamp of detection */\n\ttimestamp: z.number().int().positive(),\n});\n\nexport type BurstDetectionOutput = z.infer<typeof BurstDetectionOutputSchema>;\n\n// =============================================================================\n// Complexity Analysis Schemas\n// =============================================================================\n\n/**\n * File input for complexity analysis\n */\nexport const ComplexityFileInputSchema = z.object({\n\t/** File path */\n\tpath: z.string(),\n\n\t/** File content */\n\tcontent: z.string(),\n\n\t/** Line count of the file */\n\tlineCount: z.number().int().nonnegative(),\n});\n\nexport type ComplexityFileInput = z.infer<typeof ComplexityFileInputSchema>;\n\n/**\n * Complexity Analysis Input\n */\nexport const ComplexityAnalysisInputSchema = z.object({\n\t/** Files to analyze */\n\tfiles: z.array(ComplexityFileInputSchema),\n});\n\nexport type ComplexityAnalysisInput = z.infer<typeof ComplexityAnalysisInputSchema>;\n\n/**\n * Complexity Analysis Output\n */\nexport const ComplexityAnalysisOutputSchema = z.object({\n\t/** Average complexity score across all files (0-1) */\n\tavgComplexity: z.number().min(0).max(1),\n\n\t/** Maximum complexity score of any single file (0-1) */\n\tmaxComplexity: z.number().min(0).max(1),\n\n\t/** List of files with complexity > 0.7 */\n\thighComplexityFiles: z.array(z.string()),\n\n\t/** Number of files analyzed */\n\tfileCount: z.number().int().nonnegative(),\n\n\t/** Overall complexity value (same as avgComplexity) */\n\tvalue: z.number().min(0).max(1),\n});\n\nexport type ComplexityAnalysisOutput = z.infer<typeof ComplexityAnalysisOutputSchema>;\n\n// =============================================================================\n// Comprehensive Signal Analysis Schemas\n// =============================================================================\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\t/** Extension IDs for AI detection */\n\textensionIds: z.array(z.string()).default([]),\n\n\t/** Content to analyze (for threats, AI patterns, complexity) */\n\tcontent: z.string(),\n\n\t/** File path being analyzed */\n\tfilePath: z.string(),\n\n\t/** Line count (for complexity calculation) */\n\tlineCount: z.number().int().nonnegative().optional(),\n\n\t/** Character count (for burst detection) */\n\tcharCount: z.number().int().nonnegative().optional(),\n\n\t/** Velocity (for AI detection) */\n\tvelocity: z.number().nonnegative().optional(),\n\n\t/** Timestamp (for burst detection) */\n\ttimestamp: z.number().int().positive().optional(),\n});\n\nexport type ComprehensiveSignalInput = z.infer<typeof ComprehensiveSignalInputSchema>;\n\n/**\n * Individual signal result in comprehensive output\n */\nexport const SignalResultSchema = z.object({\n\t/** Signal name */\n\tsignal: z.enum([\"ai\", \"threats\", \"burst\", \"complexity\"]),\n\n\t/** Signal-specific score/value */\n\tvalue: z.number(),\n\n\t/** Whether this signal is considered \"triggered\" */\n\ttriggered: z.boolean(),\n});\n\nexport type SignalResult = z.infer<typeof SignalResultSchema>;\n\n/**\n * Comprehensive Signal Analysis Output\n */\nexport const ComprehensiveSignalOutputSchema = z.object({\n\t/** Individual signal results */\n\tsignals: z.object({\n\t\tai: AiDetectionOutputSchema,\n\t\tthreats: ThreatDetectionOutputSchema,\n\t\tburst: BurstDetectionOutputSchema.optional(),\n\t\tcomplexity: ComplexityAnalysisOutputSchema,\n\t}),\n\n\t/** Overall risk score (0-1), weighted combination of all signals */\n\toverallRisk: z.number().min(0).max(1),\n\n\t/** Risk level classification */\n\triskLevel: z.enum([\"low\", \"medium\", \"high\", \"critical\"]),\n\n\t/** Summary of triggered signals */\n\ttriggeredSignals: z.array(z.enum([\"ai\", \"threats\", \"burst\", \"complexity\"])),\n\n\t/** Processing time in milliseconds */\n\tprocessingTimeMs: z.number().nonnegative(),\n});\n\nexport type ComprehensiveSignalOutput = z.infer<typeof ComprehensiveSignalOutputSchema>;\n\n// =============================================================================\n// Shared Types\n// =============================================================================\n\n/**\n * Signal type enumeration\n */\nexport const SignalTypeSchema = z.enum([\"ai\", \"threats\", \"burst\", \"complexity\", \"comprehensive\"]);\n\nexport type SignalType = z.infer<typeof SignalTypeSchema>;\n\n/**\n * Common error response for signal endpoints\n */\nexport const SignalErrorSchema = z.object({\n\t/** Error code */\n\tcode: z.string(),\n\n\t/** Human-readable error message */\n\tmessage: z.string(),\n\n\t/** Signal type that failed */\n\tsignal: SignalTypeSchema.optional(),\n});\n\nexport type SignalError = z.infer<typeof SignalErrorSchema>;\n","/**\n * @license Apache-2.0\n * @copyright SnapBack Contributors\n *\n * This file is part of SnapBack OSS.\n * Auto-generated from packages/contracts - DO NOT EDIT DIRECTLY.\n *\n * Source: packages/contracts/src/types/analysis.ts\n * Generated: 2026-01-11T17:16:21.783Z\n */\n\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 */\n\nimport { z } from \"zod\";\n\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/**\n * Issue severity levels (comprehensive) - TypeScript type\n */\nexport type Severity = z.infer<typeof SeveritySchema>;\n\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/**\n * Risk/Urgency severity - TypeScript type\n */\nexport type RiskSeverity = z.infer<typeof RiskSeveritySchema>;\n\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/**\n * Simplified severity for validation contexts - TypeScript type\n */\nexport type ValidationSeverity = z.infer<typeof ValidationSeveritySchema>;\n\n/**\n * Convert ValidationSeverity to Severity\n */\nexport function toSeverity(validationSeverity: ValidationSeverity): Severity {\n\tswitch (validationSeverity) {\n\t\tcase \"critical\":\n\t\t\treturn \"critical\";\n\t\tcase \"warning\":\n\t\t\treturn \"medium\";\n\t\tcase \"info\":\n\t\t\treturn \"info\";\n\t}\n}\n\n/**\n * Convert Severity to ValidationSeverity\n */\nexport function toValidationSeverity(severity: Severity): ValidationSeverity {\n\tswitch (severity) {\n\t\tcase \"critical\":\n\t\tcase \"high\":\n\t\t\treturn \"critical\";\n\t\tcase \"medium\":\n\t\tcase \"low\":\n\t\t\treturn \"warning\";\n\t\tcase \"info\":\n\t\t\treturn \"info\";\n\t}\n}\n\n/**\n * Base issue schema for all analysis/validation contexts\n */\nexport const BaseIssueSchema = z.object({\n\t/** Severity level */\n\tseverity: z.union([SeveritySchema, ValidationSeveritySchema]),\n\t/** Issue type code (e.g., UNSAFE_EVAL, PATH_TRAVERSAL) */\n\ttype: z.string(),\n\t/** Human-readable message */\n\tmessage: z.string(),\n\t/** Line number (1-indexed) */\n\tline: z.number().optional(),\n\t/** Suggested fix */\n\tfix: z.string().optional(),\n});\n\n/**\n * Base issue type for all analysis/validation contexts\n */\nexport type BaseIssue = z.infer<typeof BaseIssueSchema>;\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\tseverity: ValidationSeveritySchema,\n});\n\n/**\n * Issue detected during validation (simple form) - TypeScript type\n */\nexport type ValidationIssue = z.infer<typeof ValidationIssueSchema>;\n\n/**\n * Issue detected during analysis (detailed form) - Zod schema\n * Used by core package analyzers\n */\nexport const AnalysisIssueSchema = BaseIssueSchema.extend({\n\t/** Unique identifier for deduplication: analyzer/type/file/line */\n\tid: z.string(),\n\t/** Severity level */\n\tseverity: SeveritySchema,\n\t/** File path where issue was found */\n\tfile: z.string().optional(),\n\t/** Column number (1-indexed) */\n\tcolumn: z.number().optional(),\n\t/** Code snippet showing the issue */\n\tsnippet: z.string().optional(),\n\t/** Rule ID if from a lint tool */\n\trule: z.string().optional(),\n});\n\n/**\n * Issue detected during analysis (detailed form) - TypeScript type\n */\nexport type AnalysisIssue = z.infer<typeof AnalysisIssueSchema>;\n\n/**\n * Basic validation result - Zod schema\n */\nexport const ValidationResultSchema = z.object({\n\t/** Whether validation passed */\n\tpassed: z.boolean(),\n\t/** Issues found */\n\tissues: z.array(BaseIssueSchema),\n\t/** Duration in milliseconds */\n\tduration: z.number().optional(),\n});\n\n/**\n * Basic validation result - TypeScript type\n */\nexport type ValidationResult = z.infer<typeof ValidationResultSchema>;\n\n/**\n * Circuit breaker state enum - Zod schema\n */\nexport const CircuitBreakerStateEnumSchema = z.enum([\"closed\", \"open\", \"half-open\"]);\n\n/**\n * Circuit breaker state - Zod schema\n * Used for resilience patterns across packages\n */\nexport const CircuitBreakerStateSchema = z.object({\n\t/** Current state */\n\tstate: CircuitBreakerStateEnumSchema,\n\t/** Failure count */\n\tfailures: z.number(),\n\t/** Failure threshold */\n\tthreshold: z.number(),\n\t/** Last failure timestamp */\n\tlastFailure: z.number().optional(),\n\t/** Cooldown period in ms */\n\tcooldownMs: z.number(),\n});\n\n/**\n * Circuit breaker state - TypeScript type\n */\nexport type CircuitBreakerState = z.infer<typeof CircuitBreakerStateSchema>;\n","/**\n * @license Apache-2.0\n * @copyright SnapBack Contributors\n *\n * This file is part of SnapBack OSS.\n * Auto-generated from packages/contracts - DO NOT EDIT DIRECTLY.\n *\n * Source: packages/contracts/src/types/config.ts\n * Generated: 2026-01-11T17:16:21.784Z\n */\n\nimport { z } from \"zod\";\n\n/**\n * Configuration file types\n */\nexport const ConfigFileTypeSchema = z.enum([\n\t\"package\",\n\t\"typescript\",\n\t\"linting\",\n\t\"build\",\n\t\"environment\",\n\t\"testing\",\n\t\"framework\",\n\t\"database\",\n\t\"ci\",\n]);\nexport type ConfigFileType = z.infer<typeof ConfigFileTypeSchema>;\n\n/**\n * Supported programming languages\n */\nexport const SupportedLanguageSchema = z.enum([\"javascript\", \"typescript\", \"python\", \"universal\"]);\nexport type SupportedLanguage = z.infer<typeof SupportedLanguageSchema>;\n\n/**\n * File baseline information for config files\n */\nexport const FileBaselineSchema = z.object({\n\tpath: z.string(),\n\thash: z.string(),\n\ttimestamp: z.number(),\n\tsize: z.number(),\n});\nexport type FileBaseline = z.infer<typeof FileBaselineSchema>;\n\n/**\n * Base configuration file interface\n */\nexport const ConfigFileSchema = z.object({\n\tpath: z.string(),\n\ttype: ConfigFileTypeSchema,\n\tlanguage: SupportedLanguageSchema,\n\tcritical: z.boolean().default(false),\n\tbaseline: FileBaselineSchema.optional(),\n});\nexport type ConfigFile = z.infer<typeof ConfigFileSchema>;\n\n/**\n * Detected configuration file\n */\nexport const DetectedConfigFileSchema = z.object({\n\ttype: z.string(),\n\tpath: z.string(),\n\tname: z.string(),\n\tcritical: z.boolean().default(false),\n});\nexport type DetectedConfigFile = z.infer<typeof DetectedConfigFileSchema>;\n\n/**\n * Config parse result\n */\nexport const ConfigParseResultSchema = z.object({\n\tcontent: z.any(),\n\tvalid: z.boolean(),\n\terror: z.string().optional(),\n\tmetadata: z.record(z.string(), z.any()).optional(),\n});\nexport type ConfigParseResult = z.infer<typeof ConfigParseResultSchema>;\n\n/**\n * Config validation result\n */\nexport const ConfigValidationResultSchema = z.object({\n\tvalid: z.boolean(),\n\terrors: z.array(z.string()).default([]),\n\twarnings: z.array(z.string()).default([]),\n});\nexport type ConfigValidationResult = z.infer<typeof ConfigValidationResultSchema>;\n\n/**\n * Config file change\n */\nexport const ConfigChangeSchema = z.object({\n\ttype: z.enum([\"added\", \"modified\", \"deleted\"]),\n\tfile: z.string(),\n\ttimestamp: z.number(),\n\tbaseline: FileBaselineSchema.optional(),\n});\nexport type ConfigChange = z.infer<typeof ConfigChangeSchema>;\n\n/**\n * Config detection patterns\n */\nexport interface ConfigDetectionPattern {\n\tpattern: string | RegExp;\n\ttype: ConfigFileType;\n\tlanguage: SupportedLanguage;\n\tcritical: boolean;\n}\n\n/**\n * Config manager options\n */\nexport const ConfigManagerOptionsSchema = z.object({\n\tautoDetect: z.boolean().default(true),\n\twatchChanges: z.boolean().default(true),\n\tautoProtect: z.boolean().default(true),\n\tcustomPatterns: z.array(z.any()).optional(),\n});\nexport type ConfigManagerOptions = z.infer<typeof ConfigManagerOptionsSchema>;\n\n/**\n * Selective snapshot configuration\n */\nexport const SelectiveSnapshotConfigSchema = z.object({\n\tenabled: z.boolean(),\n\tpatterns: z.array(z.string()).optional(),\n\tthreshold: z.number().optional(),\n\tincludePatterns: z.array(z.string()).optional(),\n\texcludePatterns: z.array(z.string()).optional(),\n});\nexport type SelectiveSnapshotConfig = z.infer<typeof SelectiveSnapshotConfigSchema>;\n","/**\n * @license Apache-2.0\n * @copyright SnapBack Contributors\n *\n * This file is part of SnapBack OSS.\n * Auto-generated from packages/contracts - DO NOT EDIT DIRECTLY.\n *\n * Source: packages/contracts/src/types/protection.ts\n * Generated: 2026-01-11T17:16:21.784Z\n */\n\nimport { z } from \"zod\";\n\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\"]);\nexport type ProtectionLevel = z.infer<typeof ProtectionLevelSchema>;\n\n// Legacy VS Code names for backward compatibility\nexport type LegacyProtectionLevel = \"Watched\" | \"Warning\" | \"Protected\";\n\n/**\n * UI metadata for protection levels\n */\nexport const ProtectionLevelMetadataSchema = z.object({\n\tlevel: ProtectionLevelSchema,\n\ticon: z.string(),\n\tlabel: z.string(),\n\tdescription: z.string(),\n\tcolor: z.string(),\n\tthemeColor: z.string().optional(),\n});\nexport type ProtectionLevelMetadata = z.infer<typeof ProtectionLevelMetadataSchema>;\n\n/**\n * Protection level configurations with UI metadata\n */\nexport const PROTECTION_LEVELS: Record<ProtectionLevel, ProtectionLevelMetadata> = {\n\twatch: {\n\t\tlevel: \"watch\",\n\t\ticon: \"🟢\",\n\t\tlabel: \"Watch\",\n\t\tdescription: \"Silent auto-snapshot on save\",\n\t\tcolor: \"#10B981\",\n\t\tthemeColor: \"charts.green\",\n\t},\n\twarn: {\n\t\tlevel: \"warn\",\n\t\ticon: \"🟡\",\n\t\tlabel: \"Warn\",\n\t\tdescription: \"Notify before save with options\",\n\t\tcolor: \"#FF6B35\",\n\t\tthemeColor: \"charts.orange\",\n\t},\n\tblock: {\n\t\tlevel: \"block\",\n\t\ticon: \"🔴\",\n\t\tlabel: \"Block\",\n\t\tdescription: \"Require snapshot or explicit override\",\n\t\tcolor: \"#EF4444\",\n\t\tthemeColor: \"charts.red\",\n\t},\n};\n\n/**\n * Protected file entry\n */\nexport const ProtectedFileSchema = z.object({\n\tpath: z.string(),\n\tlevel: ProtectionLevelSchema,\n\treason: z.string().optional(),\n\taddedAt: z.date(),\n\tpattern: z.string().optional(), // If added via pattern match\n});\nexport type ProtectedFile = z.infer<typeof ProtectedFileSchema>;\n\n/**\n * Pattern rule for automatic protection\n */\nexport const PatternRuleSchema = z.object({\n\tpattern: z.string(),\n\tlevel: ProtectionLevelSchema,\n\treason: z.string().optional(),\n\tenabled: z.boolean().default(true),\n});\nexport type PatternRule = z.infer<typeof PatternRuleSchema>;\n\n/**\n * Protection configuration\n */\nexport const ProtectionConfigSchema = z.object({\n\tpatterns: z.array(PatternRuleSchema).default([]),\n\tdefaultLevel: ProtectionLevelSchema.default(\"watch\"),\n\tenabled: z.boolean().default(true),\n\tautoProtectConfigs: z.boolean().default(true),\n});\nexport type ProtectionConfig = z.infer<typeof ProtectionConfigSchema>;\n\n/**\n * Protection manager options\n */\nexport const ProtectionManagerOptionsSchema = z.object({\n\tconfig: ProtectionConfigSchema.optional(),\n\tpersistRegistry: z.boolean().default(true),\n\tregistryPath: z.string().optional(),\n});\nexport type ProtectionManagerOptions = z.infer<typeof ProtectionManagerOptionsSchema>;\n\n/**\n * Protection check result\n */\nexport const ProtectionCheckResultSchema = z.object({\n\tisProtected: z.boolean(),\n\tlevel: ProtectionLevelSchema.optional(),\n\treason: z.string().optional(),\n\tfile: ProtectedFileSchema.optional(),\n});\nexport type ProtectionCheckResult = z.infer<typeof ProtectionCheckResultSchema>;\n","/**\n * @license Apache-2.0\n * @copyright SnapBack Contributors\n *\n * This file is part of SnapBack OSS.\n * Auto-generated from packages/contracts - DO NOT EDIT DIRECTLY.\n *\n * Source: packages/contracts/src/types/protection-utils.ts\n * Generated: 2026-01-11T17:16:21.784Z\n */\n\n/**\n * Protection Level Conversion Utilities\n *\n * Provides type-safe conversion between canonical protection levels\n * and legacy VSCode string formats for backward compatibility.\n *\n * Canonical format: \"watch\" | \"warn\" | \"block\"\n * Legacy format: \"Watched\" | \"Warning\" | \"Protected\"\n */\n\nimport type { LegacyProtectionLevel, ProtectionLevel } from \"./protection\";\n\n/**\n * Mapping table for legacy to canonical conversion\n */\nconst LEGACY_TO_CANONICAL: Record<LegacyProtectionLevel, ProtectionLevel> = {\n\tWatched: \"watch\",\n\tWarning: \"warn\",\n\tProtected: \"block\",\n} as const;\n\n/**\n * Mapping table for canonical to legacy conversion\n */\nconst CANONICAL_TO_LEGACY: Record<ProtectionLevel, LegacyProtectionLevel> = {\n\twatch: \"Watched\",\n\twarn: \"Warning\",\n\tblock: \"Protected\",\n} as const;\n\n/**\n * Valid canonical protection level values\n */\nconst VALID_LEVELS = [\"watch\", \"warn\", \"block\"] as const;\n\n/**\n * Convert legacy protection level to canonical format\n *\n * @param legacy - Legacy protection level (\"Watched\" | \"Warning\" | \"Protected\")\n * @returns Canonical protection level (\"watch\" | \"warn\" | \"block\")\n *\n * @example\n * ```typescript\n * legacyToCanonical(\"Watched\") // \"watch\"\n * legacyToCanonical(\"Warning\") // \"warn\"\n * legacyToCanonical(\"Protected\") // \"block\"\n * ```\n */\nexport function legacyToCanonical(legacy: LegacyProtectionLevel): ProtectionLevel {\n\treturn LEGACY_TO_CANONICAL[legacy];\n}\n\n/**\n * Convert canonical protection level to legacy format\n *\n * @param canonical - Canonical protection level (\"watch\" | \"warn\" | \"block\")\n * @returns Legacy protection level (\"Watched\" | \"Warning\" | \"Protected\")\n *\n * @example\n * ```typescript\n * canonicalToLegacy(\"watch\") // \"Watched\"\n * canonicalToLegacy(\"warn\") // \"Warning\"\n * canonicalToLegacy(\"block\") // \"Protected\"\n * ```\n */\nexport function canonicalToLegacy(canonical: ProtectionLevel): LegacyProtectionLevel {\n\treturn CANONICAL_TO_LEGACY[canonical];\n}\n\n/**\n * Type guard to check if a value is a valid canonical protection level\n *\n * @param value - Value to check\n * @returns True if value is a canonical protection level\n *\n * @example\n * ```typescript\n * isProtectionLevel(\"watch\") // true\n * isProtectionLevel(\"Watched\") // false (legacy format)\n * isProtectionLevel(\"invalid\") // false\n *\n * // Type narrowing\n * const value: string | undefined = getUserInput();\n * if (isProtectionLevel(value)) {\n * // value is now typed as ProtectionLevel\n * setLevel(value);\n * }\n * ```\n */\nexport function isProtectionLevel(value: unknown): value is ProtectionLevel {\n\treturn typeof value === \"string\" && (VALID_LEVELS as readonly string[]).includes(value);\n}\n\n/**\n * Re-export types for convenience\n */\nexport type { LegacyProtectionLevel, ProtectionLevel };\n","/**\n * @license Apache-2.0\n * @copyright SnapBack Contributors\n *\n * This file is part of SnapBack OSS.\n * Auto-generated from packages/contracts - DO NOT EDIT DIRECTLY.\n *\n * Source: packages/contracts/src/schemas.ts\n * Generated: 2026-01-11T17:16:21.782Z\n */\n\nimport { z } from \"zod\";\nimport { RiskSeveritySchema } from \"./types/analysis.js\";\n\nexport const DiffChangeSchema = z.object({\n\tadded: z.boolean().optional().default(false),\n\tremoved: z.boolean().optional().default(false),\n\tvalue: z.string(),\n\tcount: z.number().optional(),\n});\nexport type DiffChange = z.infer<typeof DiffChangeSchema>;\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\tscore: z.number().min(0).max(10),\n\tfactors: z.array(z.string()),\n\tseverity: RiskSeveritySchema,\n});\nexport type RiskScore = z.infer<typeof RiskScoreSchema>;\n\nexport const SnapshotSchema = z.object({\n\tid: z.string(),\n\ttimestamp: z.number(),\n\tversion: z.string().default(\"1.0\"),\n\tmeta: z.record(z.string(), z.any()).optional(),\n\tfiles: z.array(z.string()).optional(),\n\tfileContents: z.record(z.string(), z.string()).optional(),\n});\nexport type Snapshot = z.infer<typeof SnapshotSchema>;\n\n// Adding missing types for SDK functionality\nexport const FileMetadataSchema = z.object({\n\tpath: z.string(),\n\tsize: z.number(),\n\tcreatedAt: z.number(),\n\tupdatedAt: z.number(),\n\thash: z.string().optional(),\n\tpermissions: z.string().optional(),\n});\nexport type FileMetadata = z.infer<typeof FileMetadataSchema>;\n\nexport const SnapshotMetadataSchema = z.object({\n\tid: z.string(),\n\tname: z.string(),\n\tdescription: z.string().optional(),\n\tcreatedAt: z.number(),\n\tcreatedBy: z.string().optional(),\n\ttags: z.array(z.string()).optional(),\n});\nexport type SnapshotMetadata = z.infer<typeof SnapshotMetadataSchema>;\n\nexport const AnalyticsResponseSchema = z.object({\n\tmetrics: z.record(z.string(), z.number()),\n\ttrends: z.record(z.string(), z.array(z.number())),\n\tinsights: z.array(z.string()),\n\ttimestamp: z.number(),\n\tsnapshotRecommendations: z\n\t\t.object({\n\t\t\tshouldCreateSnapshot: z.boolean(),\n\t\t\treason: z.string(),\n\t\t\turgency: RiskSeveritySchema,\n\t\t\tsuggestedTiming: z.string(),\n\t\t})\n\t\t.optional(),\n});\nexport type AnalyticsResponse = z.infer<typeof AnalyticsResponseSchema>;\n\nexport const CreateSnapshotArgsSchema = z.object({\n\ttrigger: z.string().default(\"manual\"),\n\trisk: z.number().min(0).max(10).optional(),\n\tcontent: z.string().optional(),\n\tfiles: z.array(z.string()).optional(),\n});\nexport type CreateSnapshotArgs = z.infer<typeof CreateSnapshotArgsSchema>;\n\nexport const CreateCheckpointArgsSchema = z.object({\n\ttrigger: z.string().default(\"manual\"),\n\trisk: z.number().min(0).max(10).optional(),\n\tcontent: z.string().optional(),\n});\nexport type CreateCheckpointArgs = z.infer<typeof CreateCheckpointArgsSchema>;\n\nexport const CheckpointSchema = z.object({\n\tid: z.string(),\n\ttimestamp: z.number(),\n\tmeta: z\n\t\t.object({\n\t\t\ttrigger: z.string().optional(),\n\t\t\trisk: z.number().optional(),\n\t\t})\n\t\t.optional(),\n});\nexport type Checkpoint = z.infer<typeof CheckpointSchema>;\n\nexport const AnalyzeRiskArgsSchema = z.object({\n\tchanges: z.array(DiffChangeSchema),\n});\n\nexport const DepQuickArgsSchema = z.object({\n\tbefore: z.record(z.string(), z.any()),\n\tafter: z.record(z.string(), z.any()),\n});\n\nexport const CommonErrorSchema = z.object({\n\tmessage: z.string(),\n\tcode: z.string().optional(),\n\tdetails: z.any().optional(),\n});\n\n// MCP Configuration Schemas\nexport const RetrySchema = z.object({\n\tretries: z.number().int().min(0).default(2),\n\tfactor: z.number().min(1).default(2),\n\tmin: z.number().int().default(250),\n\tmax: z.number().int().default(1500),\n\tjitter: z.boolean().default(true),\n});\n\nexport const CircuitSchema = z.object({\n\tenabled: z.boolean().default(true),\n\terrorThresholdPercentage: z.number().int().min(1).max(100).default(50),\n\tvolumeThreshold: z.number().int().min(1).default(10),\n\ttimeoutMs: z.number().int().default(5000),\n\tresetMs: z.number().int().default(30000),\n\trollingCountMs: z.number().int().default(60000),\n\trollingCountBuckets: z.number().int().default(6),\n});\n\nexport const McpSchema = z.object({\n\ttimeoutMs: z.number().int().default(5000),\n\tmaxConcurrent: z.number().int().min(1).default(4),\n\tretry: RetrySchema,\n\tcircuit: CircuitSchema,\n\tbatch: z.object({\n\t\tsize: z.number().int().min(1).default(5),\n\t\tmaxWaitMs: z.number().int().default(150),\n\t}),\n});\n\nexport const WatcherSchema = z.object({\n\tdebounceMs: z.number().int().default(120),\n\tawaitWriteFinish: z.object({\n\t\tstabilityThreshold: z.number().int().default(200),\n\t\tpollInterval: z.number().int().default(50),\n\t}),\n\tignored: z.array(z.string()).default([\"**/{node_modules,.git,.vscode,dist,.next,.nuxt,coverage}/**\"]),\n});\n","/**\n * @license Apache-2.0\n * @copyright SnapBack Contributors\n *\n * This file is part of SnapBack OSS.\n * Auto-generated from packages/contracts - DO NOT EDIT DIRECTLY.\n *\n * Source: packages/contracts/src/types/snapshot.ts\n * Generated: 2026-01-11T17:16:21.785Z\n */\n\nimport { z } from \"zod\";\nimport { RiskScoreSchema } from \"../schemas.js\";\nimport { RiskSeveritySchema } from \"./analysis.js\";\n\n// =============================================================================\n// SNAPSHOT TRIGGER & ORIGIN TYPES (ADR-004 Consolidated)\n// =============================================================================\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\t\"manual\",\n\t\"auto\",\n\t\"auto_save\",\n\t\"ai_detected\",\n\t\"ai-detected\", // Legacy alias\n\t\"pre_save\",\n\t\"pre-save\", // Legacy alias\n\t\"session_start\",\n\t\"session_end\",\n\t\"mcp_snap_start\",\n\t\"cli_protect\",\n\t\"api_request\",\n\t\"engine_internal\",\n\t\"recovery\",\n]);\nexport type SnapshotTrigger = z.infer<typeof SnapshotTriggerSchema>;\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\"]);\nexport type SnapshotOrigin = z.infer<typeof SnapshotOriginSchema>;\n\n/**\n * Reason codes for snapshot creation (from VSCode ManifestV2)\n * Used for explainability and debugging\n */\nexport const SnapshotReasonCodeSchema = z.enum([\n\t\"AI_DETECTED\",\n\t\"MANUAL_CHECKPOINT\",\n\t\"CRITICAL_FILE\",\n\t\"HIGH_RISK\",\n\t\"SESSION_START\",\n\t\"SESSION_END\",\n\t\"PRE_ROLLBACK\",\n\t\"BURST_MODE\",\n\t\"IDLE_FINALIZE\",\n]);\nexport type SnapshotReasonCode = z.infer<typeof SnapshotReasonCodeSchema>;\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\"]);\nexport type CheckpointType = z.infer<typeof CheckpointTypeSchema>;\n\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\tid: z.string(),\n\ttimestamp: z.number(),\n\tversion: z.string().optional().default(\"1.0\"),\n\tmeta: z.record(z.string(), z.any()).optional(),\n\tfiles: z.array(z.string()).optional(),\n\tfileContents: z.record(z.string(), z.string()).optional(),\n});\n/** Output type after Zod parsing - version is guaranteed to exist */\nexport type Snapshot = z.infer<typeof SnapshotSchema>;\n/** Input type for creating snapshots - version can be omitted (default applied on parse) */\nexport type SnapshotInput = z.input<typeof SnapshotSchema>;\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\tpath: z.string(),\n\tcontent: z.string(),\n\t/** SHA-256 hash of content (optional, computed for dedup) */\n\thash: z.string().optional(),\n\t/** File size in bytes */\n\tsize: z.number().optional(),\n\t/** Encrypted data (for sensitive files - VSCode format) */\n\tencrypted: z\n\t\t.object({\n\t\t\t/** Initialization vector */\n\t\t\tiv: z.string(),\n\t\t\t/** Authentication tag */\n\t\t\ttag: z.string(),\n\t\t\t/** Optional: algorithm used (default: aes-256-gcm) */\n\t\t\talgorithm: z.string().optional(),\n\t\t})\n\t\t.optional(),\n});\nexport type FileState = z.infer<typeof FileStateSchema>;\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\t/** SHA-256 hash of file content (CAS reference) */\n\tblobHash: z.string(),\n\t/** File size in bytes */\n\tsize: z.number(),\n});\nexport type SnapshotFileRefV2 = z.infer<typeof SnapshotFileRefV2Schema>;\n\n/**\n * Complete snapshot state for deduplication\n */\nexport const SnapshotStateSchema = z.object({\n\tid: z.string(),\n\ttimestamp: z.number(),\n\tfiles: z.array(FileStateSchema),\n});\nexport type SnapshotState = z.infer<typeof SnapshotStateSchema>;\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\tname: z.string(),\n\tfileStates: z.array(FileStateSchema).optional(),\n\tisProtected: z.boolean(),\n\ticon: z.string().optional(),\n\ticonColor: z.string().optional(),\n});\nexport type RichSnapshot = z.infer<typeof RichSnapshotSchema>;\n\n/**\n * Minimal snapshot for deletion operations\n */\nexport const MinimalSnapshotSchema = z.object({\n\tid: z.string(),\n\tname: z.string(),\n\ttimestamp: z.number(),\n\tisProtected: z.boolean(),\n});\nexport type MinimalSnapshot = z.infer<typeof MinimalSnapshotSchema>;\n\n/**\n * File input for snapshot creation\n */\nexport const FileInputSchema = z.object({\n\tpath: z.string(),\n\tcontent: z.string(),\n\taction: z.enum([\"add\", \"modify\", \"delete\"]),\n});\nexport type FileInput = z.infer<typeof FileInputSchema>;\n\n/**\n * Snapshot creation options\n * Enhanced per ADR-004 with DORA metric extensions from VSCode\n */\nexport const CreateSnapshotOptionsSchema = z.object({\n\t/** Description/reason for the snapshot */\n\tdescription: z.string().optional(),\n\t/** Whether to protect from auto-deletion */\n\tprotected: z.boolean().optional(),\n\t/** What triggered the snapshot */\n\ttrigger: SnapshotTriggerSchema.optional(),\n\t/** Origin classification for DORA metrics */\n\torigin: SnapshotOriginSchema.optional(),\n\t/** Time since last file change in ms (DORA lead time metric) */\n\ttimeSinceLastChangeMs: z.number().optional(),\n});\nexport type CreateSnapshotOptions = z.infer<typeof CreateSnapshotOptionsSchema>;\n\n/**\n * Snapshot filters for querying\n */\nexport const SnapshotFiltersSchema = z.object({\n\tfilePath: z.string().optional(),\n\tbefore: z.date().optional(),\n\tafter: z.date().optional(),\n\tprotected: z.boolean().optional(),\n\tlimit: z.number().int().positive().optional(),\n\toffset: z.number().int().nonnegative().optional(),\n});\nexport type SnapshotFilters = z.infer<typeof SnapshotFiltersSchema>;\n\n/**\n * File diff for restore preview\n */\nexport const FileDiffSchema = z.object({\n\tpath: z.string(),\n\toperation: z.enum([\"create\", \"modify\", \"delete\"]),\n\tlinesAdded: z.number(),\n\tlinesRemoved: z.number(),\n\tpreview: z.string(),\n\tcurrentChecksum: z.string().optional(),\n\tsnapshotChecksum: z.string().optional(),\n});\nexport type FileDiff = z.infer<typeof FileDiffSchema>;\n\n/**\n * Diff preview for restore operations\n */\nexport const DiffPreviewSchema = z.object({\n\ttotalFiles: z.number(),\n\tfilesCreated: z.number(),\n\tfilesModified: z.number(),\n\tfilesDeleted: z.number(),\n\ttotalLinesAdded: z.number(),\n\ttotalLinesRemoved: z.number(),\n\tdiffs: z.array(FileDiffSchema),\n});\nexport type DiffPreview = z.infer<typeof DiffPreviewSchema>;\n\n/**\n * Conflict report for restore operations\n */\nexport const ConflictReportSchema = z.object({\n\tpath: z.string(),\n\treason: z.string(),\n\tcurrentChecksum: z.string(),\n\tsnapshotChecksum: z.string(),\n});\nexport type ConflictReport = z.infer<typeof ConflictReportSchema>;\n\n/**\n * Snapshot restore result (enhanced with diff previews and conflicts)\n */\nexport const SnapshotRestoreResultSchema = z.object({\n\tsuccess: z.boolean(),\n\trestoredFiles: z.array(z.string()),\n\terrors: z.array(z.string()).optional(),\n\tdiffPreview: DiffPreviewSchema.optional(),\n\tconflicts: z.array(ConflictReportSchema).optional(),\n\tverification: z\n\t\t.object({\n\t\t\tallVerified: z.boolean(),\n\t\t\tresults: z.array(\n\t\t\t\tz.object({\n\t\t\t\t\tpath: z.string(),\n\t\t\t\t\tverified: z.boolean(),\n\t\t\t\t\tchecksum: z.string(),\n\t\t\t\t\texpected: z.string(),\n\t\t\t\t}),\n\t\t\t),\n\t\t})\n\t\t.optional(),\n});\nexport type SnapshotRestoreResult = z.infer<typeof SnapshotRestoreResultSchema>;\n\n/**\n * Snapshot naming strategy types\n */\nexport type SnapshotNamingStrategy = \"git\" | \"semantic\" | \"timestamp\" | \"custom\";\n\n/**\n * Snapshot manager configuration\n */\nexport const SnapshotManagerConfigSchema = z.object({\n\tenableDeduplication: z.boolean().default(true),\n\tnamingStrategy: z.enum([\"git\", \"semantic\", \"timestamp\", \"custom\"]).default(\"semantic\"),\n\tautoProtect: z.boolean().default(false),\n\tmaxSnapshots: z.number().int().positive().optional(),\n});\nexport type SnapshotManagerConfig = z.infer<typeof SnapshotManagerConfigSchema>;\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\tid: z.string(),\n\tpath: z.string(),\n\thash: z.string().optional(),\n\tsize: z.number().optional(),\n\tlanguage: z.string().optional(),\n\trisk: RiskScoreSchema.optional(),\n\tlastModified: z.number().optional(),\n\tcreatedAt: z.number().optional(),\n});\nexport type FileMetadata = z.infer<typeof FileMetadataSchema>;\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\t// Core fields (required)\n\tid: z.string(),\n\ttimestamp: z.number(),\n\tfileCount: z.number(),\n\n\t// Analytics fields (optional)\n\ttotalSize: z.number().optional(),\n\triskScore: RiskScoreSchema.optional(),\n\ttags: z.array(z.string()).optional(),\n\n\t// V2 Hierarchy fields (from VSCode ManifestV2)\n\t/** Sequential snapshot number (1-based, monotonic) */\n\tseq: z.number().int().positive().optional(),\n\t/** Parent snapshot seq (null for root) */\n\tparentSeq: z.number().int().positive().nullable().optional(),\n\t/** Parent snapshot ID */\n\tparentId: z.string().nullable().optional(),\n\t/** Checkpoint type */\n\ttype: CheckpointTypeSchema.optional(),\n\t/** Main file that triggered this snapshot */\n\tanchorFile: z.string().optional(),\n\n\t// DORA Metrics fields\n\t/** Time since last file change in ms (for lead time metric) */\n\ttimeSinceLastChangeMs: z.number().optional(),\n\t/** Compression ratio achieved (for storage efficiency) */\n\tcompressionRatio: z.number().optional(),\n\t/** Storage size in bytes (after compression) */\n\tstorageSizeBytes: z.number().optional(),\n\n\t// Origin & Classification\n\t/** Origin classification for analytics */\n\torigin: SnapshotOriginSchema.optional(),\n\t/** Reason codes for explainability */\n\treasons: z.array(SnapshotReasonCodeSchema).optional(),\n\n\t// AI Detection\n\taiDetection: z\n\t\t.object({\n\t\t\tdetected: z.boolean(),\n\t\t\ttool: z.string().optional(),\n\t\t\tconfidence: z.number().min(0).max(1).optional(),\n\t\t})\n\t\t.optional(),\n\n\t// Session linkage\n\t/** SnapBack session ID */\n\tsessionId: z.string().optional(),\n\t/** External task ID (from LLM agent) */\n\ttaskId: z.string().optional(),\n\n\t// UI fields\n\tname: z.string().optional(),\n\ticon: z.string().optional(),\n});\nexport type SnapshotMetadata = z.infer<typeof SnapshotMetadataSchema>;\n\n// =============================================================================\n// SNAPSHOT MANIFEST V2 (ADR-004 - Canonical Definition)\n// =============================================================================\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\t/** Schema version - always 2 for V2 */\n\tschemaVersion: z.literal(2),\n\n\t/** Unique ID: snap-{timestamp}-{random} */\n\tid: z.string(),\n\n\t/** Sequential snapshot number (1-based, monotonic) */\n\tseq: z.number().int().positive(),\n\n\t/** Parent snapshot seq (null for root) */\n\tparentSeq: z.number().int().positive().nullable(),\n\n\t/** Parent snapshot ID (null for root) */\n\tparentId: z.string().nullable(),\n\n\t/** Unix timestamp (ms) */\n\ttimestamp: z.number(),\n\n\t/** Human-readable name */\n\tname: z.string(),\n\n\t/** Checkpoint type */\n\ttype: CheckpointTypeSchema,\n\n\t/** The main file that triggered this snapshot */\n\tanchorFile: z.string(),\n\n\t/** Files in snapshot (path → ref). Empty for PRE checkpoints. */\n\tfiles: z.record(z.string(), SnapshotFileRefV2Schema),\n\n\t/** Optional metadata */\n\tmetadata: z\n\t\t.object({\n\t\t\t/** Risk score 0-1 */\n\t\t\triskScore: z.number().min(0).max(1).optional(),\n\t\t\t/** Origin classification */\n\t\t\torigin: SnapshotOriginSchema.optional(),\n\t\t\t/** Stable reason codes */\n\t\t\treasons: z.array(SnapshotReasonCodeSchema).optional(),\n\t\t\t/** AI detection info */\n\t\t\taiDetection: z\n\t\t\t\t.object({\n\t\t\t\t\tdetected: z.boolean(),\n\t\t\t\t\ttool: z.string().optional(),\n\t\t\t\t\tconfidence: z.number().optional(),\n\t\t\t\t})\n\t\t\t\t.optional(),\n\t\t\t/** SnapBack session ID */\n\t\t\tsessionId: z.string().optional(),\n\t\t\t/** External task ID */\n\t\t\ttaskId: z.string().optional(),\n\t\t\t/** DORA: Time since last change */\n\t\t\ttimeSinceLastChangeMs: z.number().optional(),\n\t\t})\n\t\t.optional(),\n});\nexport type SnapshotManifestV2 = z.infer<typeof SnapshotManifestV2Schema>;\n\n/**\n * V1 Snapshot Manifest - Legacy format for backward compatibility\n */\nexport const SnapshotManifestV1Schema = z.object({\n\t/** Unique ID */\n\tid: z.string(),\n\t/** Unix timestamp (ms) */\n\ttimestamp: z.number(),\n\t/** Human-readable name */\n\tname: z.string(),\n\t/** Trigger reason */\n\ttrigger: z.enum([\"auto\", \"manual\", \"ai-detected\", \"pre-save\"]),\n\t/** Main file that triggered snapshot */\n\tanchorFile: z.string(),\n\t/** Files in snapshot (path → ref) */\n\tfiles: z.record(\n\t\tz.string(),\n\t\tz.object({\n\t\t\tblob: z.string(),\n\t\t\tsize: z.number(),\n\t\t}),\n\t),\n\t/** Optional metadata */\n\tmetadata: z\n\t\t.object({\n\t\t\triskScore: z.number().optional(),\n\t\t\taiDetection: z\n\t\t\t\t.object({\n\t\t\t\t\tdetected: z.boolean(),\n\t\t\t\t\ttool: z.string().optional(),\n\t\t\t\t\tconfidence: z.number().optional(),\n\t\t\t\t})\n\t\t\t\t.optional(),\n\t\t\tsessionId: z.string().optional(),\n\t\t\ttaskId: z.string().optional(),\n\t\t})\n\t\t.optional(),\n});\nexport type SnapshotManifestV1 = z.infer<typeof SnapshotManifestV1Schema>;\n\n/**\n * Union type for any snapshot manifest version\n */\nexport type AnySnapshotManifest = SnapshotManifestV1 | SnapshotManifestV2;\n\n/**\n * Type guard for V2 manifests\n */\nexport function isSnapshotManifestV2(manifest: unknown): manifest is SnapshotManifestV2 {\n\treturn (\n\t\ttypeof manifest === \"object\" &&\n\t\tmanifest !== null &&\n\t\t\"schemaVersion\" in manifest &&\n\t\t(manifest as Record<string, unknown>).schemaVersion === 2\n\t);\n}\n\n/**\n * Type guard for POST checkpoints (have content)\n */\nexport function isPostCheckpoint(manifest: AnySnapshotManifest): boolean {\n\tif (!isSnapshotManifestV2(manifest)) {\n\t\treturn true; // V1 manifests always have content\n\t}\n\treturn manifest.type === \"POST\";\n}\n\n/**\n * Type guard for pointer checkpoints (PRE, PRE_ROLLBACK)\n */\nexport function isPointerCheckpoint(manifest: AnySnapshotManifest): boolean {\n\tif (!isSnapshotManifestV2(manifest)) {\n\t\treturn false;\n\t}\n\treturn manifest.type === \"PRE\" || manifest.type === \"PRE_ROLLBACK\";\n}\n\n/**\n * Analytics response structure\n */\nexport const AnalyticsResponseSchema = z.object({\n\tworkspaceId: z.string(),\n\tperiod: z.object({\n\t\tstart: z.number(),\n\t\tend: z.number(),\n\t}),\n\trisk: RiskScoreSchema,\n\tfileStats: z.object({\n\t\ttotal: z.number(),\n\t\tbyLanguage: z.record(z.string(), z.number()),\n\t\tbyRisk: z.record(z.string(), z.number()),\n\t}),\n\tsnapshotStats: z.object({\n\t\ttotal: z.number(),\n\t\tfrequency: z.number(),\n\t\taverageSize: z.number().optional(),\n\t}),\n\tsnapshotRecommendations: z.object({\n\t\tshouldCreateSnapshot: z.boolean(),\n\t\treason: z.string(),\n\t\turgency: RiskSeveritySchema,\n\t\tsuggestedTiming: z.string(),\n\t}),\n\ttrends: z.object({\n\t\trisk: z.array(\n\t\t\tz.object({\n\t\t\t\ttimestamp: z.number(),\n\t\t\t\tscore: z.number(),\n\t\t\t}),\n\t\t),\n\t\tactivity: z.array(\n\t\t\tz.object({\n\t\t\t\ttimestamp: z.number(),\n\t\t\t\tcount: z.number(),\n\t\t\t}),\n\t\t),\n\t}),\n});\nexport type AnalyticsResponse = z.infer<typeof AnalyticsResponseSchema>;\n\n/**\n * Storage interface for snapshots\n * This interface allows public packages to interact with snapshot storage\n * without depending on the private @snapback/storage implementation.\n */\nexport interface SnapshotStorage {\n\tcreate(data: CreateSnapshotOptions): Promise<Snapshot>;\n\tretrieve(id: string): Promise<Snapshot | null>;\n\tlist(): Promise<Snapshot[]>;\n\trestore(\n\t\tid: string,\n\t\ttargetPath: string,\n\t\toptions?: {\n\t\t\tfiles?: string[];\n\t\t\tdryRun?: boolean;\n\t\t\tbackupCurrent?: boolean;\n\t\t},\n\t): Promise<SnapshotRestoreResult>;\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: string): Promise<SnapshotStorage> {\n\t// Dynamically import the storage package to avoid circular dependencies\n\t// The import path is resolved at runtime after both packages are built\n\ttry {\n\t\tconst { StorageBrokerAdapter } = await import(\"@snapback/sdk/storage\" as any);\n\t\t// Use the standard workspace database path\n\t\tconst storage = new StorageBrokerAdapter(`${basePath}/.snapback/snapback.db`);\n\t\tawait storage.initialize();\n\n\t\treturn {\n\t\t\tcreate: async (data) => {\n\t\t\t\tconst snapshot: Snapshot = {\n\t\t\t\t\tid: `snap-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`,\n\t\t\t\t\ttimestamp: Date.now(),\n\t\t\t\t\tversion: \"1.0\",\n\t\t\t\t\tmeta: {\n\t\t\t\t\t\t...data,\n\t\t\t\t\t\tprotected: data.protected || false,\n\t\t\t\t\t\tdescription: data.description || \"\",\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t\tawait storage.save(snapshot);\n\t\t\t\treturn snapshot;\n\t\t\t},\n\t\t\tretrieve: async (id) => {\n\t\t\t\treturn await storage.get(id);\n\t\t\t},\n\t\t\tlist: async () => {\n\t\t\t\treturn await storage.list();\n\t\t\t},\n\t\t\trestore: async (id, _targetPath, options) => {\n\t\t\t\t// Note: Full restore implementation requires file system operations\n\t\t\t\t// This is a simplified version - real implementation in storage package\n\t\t\t\tconst snapshot = await storage.get(id);\n\t\t\t\tif (!snapshot) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tsuccess: false,\n\t\t\t\t\t\trestoredFiles: [],\n\t\t\t\t\t\terrors: [`Snapshot ${id} not found`],\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tif (options?.dryRun) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tsuccess: true,\n\t\t\t\t\t\trestoredFiles: snapshot.files || [],\n\t\t\t\t\t\terrors: [],\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\tsuccess: true,\n\t\t\t\t\trestoredFiles: snapshot.files || [],\n\t\t\t\t\terrors: [],\n\t\t\t\t};\n\t\t\t},\n\t\t};\n\t} catch (error) {\n\t\tthrow new Error(\n\t\t\t`Failed to initialize snapshot storage: ${error instanceof Error ? error.message : String(error)}. ` +\n\t\t\t\t\"Ensure @snapback/sdk is installed and storage path is writable.\",\n\t\t);\n\t}\n}\n","import pino from \"pino\";\n\n// Define redaction paths for sensitive data\nconst redactPaths = [\n\t\"user.email\",\n\t\"user.password\",\n\t\"apiKey\",\n\t\"session.token\",\n\t\"req.headers.authorization\",\n\t\"auth.*.password\",\n\t\"config.*.secret\",\n\t\"env.*\",\n];\n\nconst pinoLogger = pino({\n\tlevel: process.env.LOG_LEVEL || \"info\",\n\tredact: {\n\t\tpaths: redactPaths,\n\t\tcensor: \"[REDACTED]\",\n\t},\n\t// Only use pino-pretty in development AND when not in browser/webpack context\n\t// ...(process.env.NODE_ENV === \"development\" && typeof window === \"undefined\"\n\t// \t? {\n\t// \t\t\ttransport: {\n\t// \t\t\t\ttarget: \"pino-pretty\",\n\t// \t\t\t\toptions: {\n\t// \t\t\t\t\tcolorize: true,\n\t// \t\t\t\t\ttranslateTime: \"SYS:standard\",\n\t// \t\t\t\t\tignore: \"pid,hostname\",\n\t// \t\t\t\t},\n\t// \t\t\t},\n\t// \t\t}\n\t// \t: {}),\n});\n\n// Create a wrapper that matches the contracts Logger interface\n// Pino signature: logger.info(meta, message)\n// Contracts signature: logger.info(message, meta)\nexport const logger = {\n\tdebug: (message: string, meta?: Record<string, unknown>): void => {\n\t\tif (meta) {\n\t\t\tpinoLogger.debug(meta, message);\n\t\t} else {\n\t\t\tpinoLogger.debug(message);\n\t\t}\n\t},\n\tinfo: (message: string, meta?: Record<string, unknown>): void => {\n\t\tif (meta) {\n\t\t\tpinoLogger.info(meta, message);\n\t\t} else {\n\t\t\tpinoLogger.info(message);\n\t\t}\n\t},\n\twarn: (message: string, meta?: Record<string, unknown>): void => {\n\t\tif (meta) {\n\t\t\tpinoLogger.warn(meta, message);\n\t\t} else {\n\t\t\tpinoLogger.warn(message);\n\t\t}\n\t},\n\terror: (message: string, meta?: Record<string, unknown> | Error): void => {\n\t\tif (meta instanceof Error) {\n\t\t\tpinoLogger.error(meta, message);\n\t\t} else if (meta) {\n\t\t\tpinoLogger.error(meta, message);\n\t\t} else {\n\t\t\tpinoLogger.error(message);\n\t\t}\n\t},\n\t// Add child method for creating scoped loggers\n\tchild: (bindings: Record<string, unknown>) => {\n\t\tconst childLogger = pinoLogger.child(bindings);\n\t\treturn {\n\t\t\tdebug: (message: string, meta?: Record<string, unknown>): void => {\n\t\t\t\tif (meta) {\n\t\t\t\t\tchildLogger.debug(meta, message);\n\t\t\t\t} else {\n\t\t\t\t\tchildLogger.debug(message);\n\t\t\t\t}\n\t\t\t},\n\t\t\tinfo: (message: string, meta?: Record<string, unknown>): void => {\n\t\t\t\tif (meta) {\n\t\t\t\t\tchildLogger.info(meta, message);\n\t\t\t\t} else {\n\t\t\t\t\tchildLogger.info(message);\n\t\t\t\t}\n\t\t\t},\n\t\t\twarn: (message: string, meta?: Record<string, unknown>): void => {\n\t\t\t\tif (meta) {\n\t\t\t\t\tchildLogger.warn(meta, message);\n\t\t\t\t} else {\n\t\t\t\t\tchildLogger.warn(message);\n\t\t\t\t}\n\t\t\t},\n\t\t\terror: (message: string, meta?: Record<string, unknown> | Error): void => {\n\t\t\t\tif (meta instanceof Error) {\n\t\t\t\t\tchildLogger.error(meta, message);\n\t\t\t\t} else if (meta) {\n\t\t\t\t\tchildLogger.error(meta, message);\n\t\t\t\t} else {\n\t\t\t\t\tchildLogger.error(message);\n\t\t\t\t}\n\t\t\t},\n\t\t\tlevel: childLogger.level,\n\t\t\tchild: (nestedBindings: Record<string, unknown>) => logger.child({ ...bindings, ...nestedBindings }),\n\t\t};\n\t},\n};\n\n// Re-export the logger interface and createLogger function from contracts\n// This allows packages to use the full infrastructure logger while maintaining compatibility\nexport type { Logger } from \"@snapback-oss/contracts\";\nexport { LogLevel } from \"@snapback-oss/contracts\";\n","import { logger } from \"../logging/logger\";\n\n// Error budget configuration\nconst ERROR_BUDGET = 0.01; // 1% error rate\nconst ALERT_THRESHOLD = 0.005; // 0.5% error rate (early warning)\n\n// Error metrics tracking\nconst errorMetrics = {\n\ttotalRequests: 0,\n\terrorCount: 0,\n\tlastAlertTime: 0,\n};\n\n// Record a successful request\nexport function recordSuccess() {\n\terrorMetrics.totalRequests++;\n}\n\n// Record an error\nexport function recordError() {\n\terrorMetrics.totalRequests++;\n\terrorMetrics.errorCount++;\n}\n\n// Calculate current error rate\nexport function getErrorRate() {\n\tif (errorMetrics.totalRequests === 0) {\n\t\treturn 0;\n\t}\n\treturn errorMetrics.errorCount / errorMetrics.totalRequests;\n}\n\nexport async function checkErrorBudget() {\n\tconst errorRate = getErrorRate();\n\n\t// Early warning alert\n\tif (errorRate > ALERT_THRESHOLD && Date.now() - errorMetrics.lastAlertTime > 60000) {\n\t\tlogger.warn(\"Error rate approaching budget threshold\", {\n\t\t\terrorRate: `${(errorRate * 100).toFixed(2)}%`,\n\t\t\tthreshold: `${(ALERT_THRESHOLD * 100).toFixed(2)}%`,\n\t\t\terrorCount: errorMetrics.errorCount,\n\t\t\ttotalRequests: errorMetrics.totalRequests,\n\t\t});\n\n\t\terrorMetrics.lastAlertTime = Date.now();\n\t}\n\n\t// Budget exceeded alert\n\tif (errorRate > ERROR_BUDGET) {\n\t\tlogger.error(\"🚨 Error budget exceeded!\", {\n\t\t\terrorRate: `${(errorRate * 100).toFixed(2)}%`,\n\t\t\tbudget: `${(ERROR_BUDGET * 100).toFixed(2)}%`,\n\t\t\terrorCount: errorMetrics.errorCount,\n\t\t\ttotalRequests: errorMetrics.totalRequests,\n\t\t\trecommendation: \"Investigate root cause immediately and consider rolling back\",\n\t\t});\n\n\t\t// In a real implementation, you would send alerts to Slack, email, etc.\n\t\tawait sendAlert({\n\t\t\tchannel: \"#alerts\",\n\t\t\tmessage: `🚨 Error budget exceeded! Current error rate: ${(errorRate * 100).toFixed(\n\t\t\t\t2,\n\t\t\t)}% (Budget: ${(ERROR_BUDGET * 100).toFixed(2)}%)`,\n\t\t});\n\t}\n}\n\n// Send alert to monitoring system\nasync function sendAlert(alert: { channel: string; message: string }) {\n\t// This would integrate with your alerting system (Slack, PagerDuty, etc.)\n\tlogger.info(\"Alert sent\", alert);\n\n\t// Example integration with a webhook\n\t/*\n try {\n await fetch(process.env.ALERT_WEBHOOK_URL!, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n channel: alert.channel,\n text: alert.message,\n }),\n });\n } catch (error) {\n logger.error(\"Failed to send alert\", { error });\n }\n */\n}\n\n// Reset metrics (useful for testing)\nexport function resetMetrics() {\n\terrorMetrics.totalRequests = 0;\n\terrorMetrics.errorCount = 0;\n\terrorMetrics.lastAlertTime = 0;\n}\n\n// Get current metrics\nexport function getMetrics() {\n\treturn {\n\t\t...errorMetrics,\n\t\terrorRate: getErrorRate(),\n\t};\n}\n","/**\n * SessionRecovery - Journal-based crash recovery for session rollbacks\n *\n * Design Principles:\n * - Automatic recovery on startup: Check for pending journals and recover\n * - Per-file backup tracking: Restore from individual .bak-{sessionId} files\n * - Safe cleanup: Only delete backups after successful recovery\n * - Privacy-safe logging: No file paths or content in telemetry\n *\n * Recovery Scenarios:\n * 1. Pending journal with backups → Rollback incomplete transaction\n * 2. Pending journal without backups → Transaction never started, safe to delete\n * 3. Committed journal → Cleanup only (already successful)\n */\n\nimport { existsSync } from \"node:fs\";\nimport * as fs from \"node:fs/promises\";\nimport * as path from \"node:path\";\n\n/**\n * Journal entry structure (matches SessionRollback)\n */\ninterface JournalEntry {\n\tsessionId: string;\n\ttimestamp: number;\n\tworkspaceRoot: string;\n\tchanges: any[];\n\tbackups: Array<{ original: string; backup: string }>;\n\tstatus: \"pending\" | \"committed\" | \"rolled-back\";\n}\n\n/**\n * Recovery result for a single journal\n */\nexport interface RecoveryResult {\n\tsessionId: string;\n\tstatus: \"recovered\" | \"cleaned\" | \"failed\";\n\tfilesRestored: number;\n\terror?: string;\n}\n\n/**\n * SessionRecovery - Handles crash recovery for session rollbacks\n */\nexport class SessionRecovery {\n\tconstructor(\n\t\tprivate readonly workspaceRoot: string,\n\t\tprivate readonly journalDir: string = path.join(workspaceRoot, \".sb_journal\"),\n\t) {}\n\n\t/**\n\t * Recover all pending transactions\n\t *\n\t * Call this on startup to ensure workspace consistency after crashes\n\t */\n\tasync recoverAll(): Promise<RecoveryResult[]> {\n\t\tconst results: RecoveryResult[] = [];\n\n\t\ttry {\n\t\t\tconst pendingDir = path.join(this.journalDir, \"pending\");\n\n\t\t\t// Check if journal directory exists\n\t\t\tif (!existsSync(pendingDir)) {\n\t\t\t\treturn results;\n\t\t\t}\n\n\t\t\t// Read all pending journal files\n\t\t\tconst files = await fs.readdir(pendingDir);\n\n\t\t\tfor (const file of files) {\n\t\t\t\tif (!file.endsWith(\".json\")) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tconst filePath = path.join(pendingDir, file);\n\n\t\t\t\ttry {\n\t\t\t\t\tconst content = await fs.readFile(filePath, \"utf-8\");\n\t\t\t\t\tconst journal = JSON.parse(content) as JournalEntry;\n\n\t\t\t\t\tconst result = await this.recoverJournal(journal, filePath);\n\t\t\t\t\tresults.push(result);\n\t\t\t\t} catch (error) {\n\t\t\t\t\tresults.push({\n\t\t\t\t\t\tsessionId: path.basename(file, \".json\"),\n\t\t\t\t\t\tstatus: \"failed\",\n\t\t\t\t\t\tfilesRestored: 0,\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\t// Cleanup old committed journals (older than 7 days)\n\t\t\tawait this.cleanupOldJournals();\n\n\t\t\treturn results;\n\t\t} catch (error) {\n\t\t\tconsole.error(\"[SessionRecovery] Failed to recover transactions:\", error);\n\t\t\treturn results;\n\t\t}\n\t}\n\n\t/**\n\t * Recover a single journal entry\n\t */\n\tprivate async recoverJournal(journal: JournalEntry, journalPath: string): Promise<RecoveryResult> {\n\t\tconst result: RecoveryResult = {\n\t\t\tsessionId: journal.sessionId,\n\t\t\tstatus: \"cleaned\",\n\t\t\tfilesRestored: 0,\n\t\t};\n\n\t\ttry {\n\t\t\t// Check if any backups exist\n\t\t\tconst backupExists = await this.checkBackupsExist(journal.backups);\n\n\t\t\tif (!backupExists) {\n\t\t\t\t// No backups = transaction never started or already completed\n\t\t\t\t// Safe to delete journal\n\t\t\t\tawait fs.unlink(journalPath);\n\t\t\t\tresult.status = \"cleaned\";\n\t\t\t\treturn result;\n\t\t\t}\n\n\t\t\t// Rollback incomplete transaction by restoring from backups\n\t\t\tconst restoredCount = await this.rollbackFromBackups(journal.backups);\n\n\t\t\tresult.filesRestored = restoredCount;\n\t\t\tresult.status = \"recovered\";\n\n\t\t\t// Delete journal after successful recovery\n\t\t\tawait fs.unlink(journalPath);\n\n\t\t\t// Emit telemetry (privacy-safe: no file paths)\n\t\t\tthis.emitRecoveryTelemetry(journal.sessionId, restoredCount);\n\n\t\t\treturn result;\n\t\t} catch (error) {\n\t\t\tresult.status = \"failed\";\n\t\t\tresult.error = error instanceof Error ? error.message : String(error);\n\n\t\t\t// Keep journal for manual recovery\n\t\t\tconsole.error(`[SessionRecovery] Failed to recover ${journal.sessionId}:`, error);\n\n\t\t\treturn result;\n\t\t}\n\t}\n\n\t/**\n\t * Check if any backup files exist\n\t */\n\tprivate async checkBackupsExist(backups: Array<{ original: string; backup: string }>): Promise<boolean> {\n\t\tfor (const backup of backups) {\n\t\t\tif (existsSync(backup.backup)) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\n\t/**\n\t * Rollback from per-file backups\n\t */\n\tprivate async rollbackFromBackups(backups: Array<{ original: string; backup: string }>): Promise<number> {\n\t\tlet restoredCount = 0;\n\n\t\tfor (const { original, backup } of backups) {\n\t\t\ttry {\n\t\t\t\t// Only restore if backup exists\n\t\t\t\tif (!existsSync(backup)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Restore from backup\n\t\t\t\tawait this.safeRename(backup, original);\n\t\t\t\trestoredCount++;\n\n\t\t\t\t// Delete backup file\n\t\t\t\tif (existsSync(backup)) {\n\t\t\t\t\tawait fs.unlink(backup);\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error(`[SessionRecovery] Failed to restore ${original}:`, error);\n\t\t\t\t// Continue with other files\n\t\t\t}\n\t\t}\n\n\t\treturn restoredCount;\n\t}\n\n\t/**\n\t * Safe file rename with EXDEV fallback (cross-device support for Windows)\n\t */\n\tprivate async safeRename(src: string, dst: string): Promise<void> {\n\t\ttry {\n\t\t\tawait fs.rename(src, dst);\n\t\t} catch (error: any) {\n\t\t\t// EXDEV: Cross-device link error (Windows different drives)\n\t\t\tif (error.code === \"EXDEV\") {\n\t\t\t\tawait fs.copyFile(src, dst);\n\t\t\t\tawait fs.unlink(src);\n\t\t\t} else {\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Cleanup old committed journals (older than 7 days)\n\t */\n\tprivate async cleanupOldJournals(): Promise<void> {\n\t\ttry {\n\t\t\tconst committedDir = path.join(this.journalDir, \"committed\");\n\n\t\t\tif (!existsSync(committedDir)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst files = await fs.readdir(committedDir);\n\t\t\tconst now = Date.now();\n\t\t\tconst sevenDaysMs = 7 * 24 * 60 * 60 * 1000;\n\n\t\t\tfor (const file of files) {\n\t\t\t\tif (!file.endsWith(\".json\")) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tconst filePath = path.join(committedDir, file);\n\n\t\t\t\ttry {\n\t\t\t\t\tconst content = await fs.readFile(filePath, \"utf-8\");\n\t\t\t\t\tconst journal = JSON.parse(content) as JournalEntry;\n\n\t\t\t\t\t// Delete if older than 7 days\n\t\t\t\t\tif (now - journal.timestamp > sevenDaysMs) {\n\t\t\t\t\t\tawait fs.unlink(filePath);\n\t\t\t\t\t}\n\t\t\t\t} catch {\n\t\t\t\t\t// Ignore errors for individual files\n\t\t\t\t}\n\t\t\t}\n\t\t} catch {\n\t\t\t// Ignore cleanup errors\n\t\t}\n\t}\n\n\t/**\n\t * Emit recovery telemetry (privacy-safe: no file paths)\n\t */\n\tprivate emitRecoveryTelemetry(_sessionId: string, _filesRestored: number): void {\n\t\t// TODO: Emit to analytics client\n\t\t// {\n\t\t// event: 'SESSION_RECOVERY',\n\t\t// sessionId: '[redacted]',\n\t\t// filesRestored,\n\t\t// timestamp: Date.now(),\n\t\t// }\n\t}\n\n\t/**\n\t * Manual recovery: Get list of pending journals\n\t */\n\tasync listPendingJournals(): Promise<JournalEntry[]> {\n\t\tconst pendingDir = path.join(this.journalDir, \"pending\");\n\n\t\ttry {\n\t\t\tif (!existsSync(pendingDir)) {\n\t\t\t\treturn [];\n\t\t\t}\n\n\t\t\tconst files = await fs.readdir(pendingDir);\n\t\t\tconst journals: JournalEntry[] = [];\n\n\t\t\tfor (const file of files) {\n\t\t\t\tif (!file.endsWith(\".json\")) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tconst filePath = path.join(pendingDir, file);\n\t\t\t\tconst content = await fs.readFile(filePath, \"utf-8\");\n\t\t\t\tconst journal = JSON.parse(content) as JournalEntry;\n\t\t\t\tjournals.push(journal);\n\t\t\t}\n\n\t\t\treturn journals;\n\t\t} catch {\n\t\t\treturn [];\n\t\t}\n\t}\n\n\t/**\n\t * Manual recovery: Force recover a specific journal\n\t */\n\tasync recoverJournalById(sessionId: string): Promise<RecoveryResult> {\n\t\tconst journalPath = path.join(this.journalDir, \"pending\", `${sessionId}.json`);\n\n\t\tif (!existsSync(journalPath)) {\n\t\t\treturn {\n\t\t\t\tsessionId,\n\t\t\t\tstatus: \"failed\",\n\t\t\t\tfilesRestored: 0,\n\t\t\t\terror: \"Journal not found\",\n\t\t\t};\n\t\t}\n\n\t\tconst content = await fs.readFile(journalPath, \"utf-8\");\n\t\tconst journal = JSON.parse(content) as JournalEntry;\n\n\t\treturn this.recoverJournal(journal, journalPath);\n\t}\n\n\t/**\n\t * Manual recovery: Delete a specific journal without recovery\n\t */\n\tasync deleteJournal(sessionId: string): Promise<void> {\n\t\tconst pendingPath = path.join(this.journalDir, \"pending\", `${sessionId}.json`);\n\t\tconst committedPath = path.join(this.journalDir, \"committed\", `${sessionId}.json`);\n\n\t\tif (existsSync(pendingPath)) {\n\t\t\tawait fs.unlink(pendingPath);\n\t\t}\n\n\t\tif (existsSync(committedPath)) {\n\t\t\tawait fs.unlink(committedPath);\n\t\t}\n\t}\n\n\t/**\n\t * Cleanup all orphaned backup files (.bak-* files)\n\t */\n\tasync cleanupOrphanedBackups(): Promise<number> {\n\t\tlet cleanedCount = 0;\n\n\t\ttry {\n\t\t\t// Walk workspace directory tree\n\t\t\tconst orphanedBackups = await this.findOrphanedBackups(this.workspaceRoot);\n\n\t\t\tfor (const backupPath of orphanedBackups) {\n\t\t\t\ttry {\n\t\t\t\t\tawait fs.unlink(backupPath);\n\t\t\t\t\tcleanedCount++;\n\t\t\t\t} catch {\n\t\t\t\t\t// Ignore errors for individual files\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn cleanedCount;\n\t\t} catch {\n\t\t\treturn cleanedCount;\n\t\t}\n\t}\n\n\t/**\n\t * Find orphaned backup files (*.bak-* pattern)\n\t */\n\tprivate async findOrphanedBackups(dir: string): Promise<string[]> {\n\t\tconst backups: string[] = [];\n\n\t\ttry {\n\t\t\tconst entries = await fs.readdir(dir, { withFileTypes: true });\n\n\t\t\tfor (const entry of entries) {\n\t\t\t\tconst fullPath = path.join(dir, entry.name);\n\n\t\t\t\t// Skip .git, node_modules, etc.\n\t\t\t\tif (entry.isDirectory()) {\n\t\t\t\t\tif (\n\t\t\t\t\t\tentry.name === \".git\" ||\n\t\t\t\t\t\tentry.name === \"node_modules\" ||\n\t\t\t\t\t\tentry.name === \".next\" ||\n\t\t\t\t\t\tentry.name === \"dist\" ||\n\t\t\t\t\t\tentry.name === \"build\"\n\t\t\t\t\t) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Recurse into subdirectories\n\t\t\t\t\tconst subBackups = await this.findOrphanedBackups(fullPath);\n\t\t\t\t\tbackups.push(...subBackups);\n\t\t\t\t} else if (entry.name.includes(\".bak-\")) {\n\t\t\t\t\t// Found a backup file\n\t\t\t\t\tbackups.push(fullPath);\n\t\t\t\t}\n\t\t\t}\n\t\t} catch {\n\t\t\t// Ignore errors for individual directories\n\t\t}\n\n\t\treturn backups;\n\t}\n}\n","/**\n * SessionRollback - Per-file atomic session rollback with journal-based crash safety\n *\n * Design Principles:\n * - Per-file atomic swap: Individual .bak-{sessionId} files instead of full workspace backup\n * - Journal-based recovery: .sb_journal tracks all file operations for crash safety\n * - Cross-platform: EXDEV fallback for Windows cross-device moves\n * - Privacy-safe: No file paths or content transmitted in analytics\n *\n * Performance:\n * - Staging validation: <500ms for typical sessions (<100 files)\n * - Per-file swap: Atomic rename operations (milliseconds per file)\n * - Rollback recovery: Journal replay on crash (automatic on next startup)\n */\n\nimport { createHash } from \"node:crypto\";\nimport { existsSync } from \"node:fs\";\nimport * as fs from \"node:fs/promises\";\nimport * as path from \"node:path\";\nimport type { SessionChange, SessionManifestV1 } from \"@snapback-oss/contracts/session\";\nimport type { BlobStore } from \"../storage/BlobStore\";\n\n/**\n * Rollback options\n */\nexport interface RollbackOptions {\n\t/** Progress callback (0-100) */\n\tonProgress?: (percent: number) => void;\n\n\t/** Dry run mode: validate without applying changes */\n\tdryRun?: boolean;\n\n\t/** Skip hash verification (faster but less safe) */\n\tskipVerification?: boolean;\n}\n\n/**\n * Rollback result\n */\nexport interface RollbackResult {\n\t/** Whether the rollback succeeded */\n\tsuccess: boolean;\n\n\t/** Files successfully reverted */\n\tfilesReverted: string[];\n\n\t/** Files skipped due to conflicts or missing blobs */\n\tfilesSkipped: string[];\n\n\t/** Errors encountered during rollback */\n\terrors: Array<{ path: string; error: string }>;\n\n\t/** Path to journal file (for manual recovery if needed) */\n\tjournalPath?: string;\n}\n\n/**\n * Journal entry for crash recovery\n */\ninterface JournalEntry {\n\tsessionId: string;\n\ttimestamp: number;\n\tworkspaceRoot: string;\n\tchanges: SessionChange[];\n\tbackups: Array<{ original: string; backup: string }>;\n\tstatus: \"pending\" | \"committed\" | \"rolled-back\";\n}\n\n/**\n * SessionRollback - Implements selective session-scoped file restoration\n */\nexport class SessionRollback {\n\tprivate readonly journalDir: string;\n\n\tconstructor(\n\t\tprivate readonly workspaceRoot: string,\n\t\tprivate readonly blobStore: BlobStore,\n\t\tjournalDir?: string,\n\t) {\n\t\tthis.journalDir = journalDir ?? path.join(workspaceRoot, \".sb_journal\");\n\t}\n\n\t/**\n\t * Rollback a session to its starting state\n\t */\n\tasync rollback(manifest: SessionManifestV1, options?: RollbackOptions): Promise<RollbackResult> {\n\t\tconst startTime = performance.now();\n\n\t\tconst result: RollbackResult = {\n\t\t\tsuccess: false,\n\t\t\tfilesReverted: [],\n\t\t\tfilesSkipped: [],\n\t\t\terrors: [],\n\t\t};\n\n\t\ttry {\n\t\t\t// Create journal directory\n\t\t\tawait fs.mkdir(path.join(this.journalDir, \"pending\"), { recursive: true });\n\t\t\tawait fs.mkdir(path.join(this.journalDir, \"committed\"), { recursive: true });\n\n\t\t\t// Create journal entry\n\t\t\tconst journalPath = path.join(this.journalDir, \"pending\", `${manifest.sessionId}.json`);\n\t\t\tconst journal: JournalEntry = {\n\t\t\t\tsessionId: manifest.sessionId,\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t\tworkspaceRoot: this.workspaceRoot,\n\t\t\t\tchanges: manifest.filesChanged,\n\t\t\t\tbackups: [],\n\t\t\t\tstatus: \"pending\",\n\t\t\t};\n\n\t\t\t// Write initial journal\n\t\t\tawait fs.writeFile(journalPath, JSON.stringify(journal, null, 2));\n\t\t\tresult.journalPath = journalPath;\n\n\t\t\t// Report progress\n\t\t\toptions?.onProgress?.(10);\n\n\t\t\t// Reverse changes (apply inverse operations in reverse chronological order)\n\t\t\tconst reversedChanges = this.reverseChanges(manifest.filesChanged);\n\n\t\t\t// Create staging directory\n\t\t\tconst stagingDir = path.join(this.workspaceRoot, `.snapback-rollback-${manifest.sessionId}`);\n\t\t\tawait fs.mkdir(stagingDir, { recursive: true });\n\t\t\tconst deletedDir = path.join(stagingDir, \".deleted\");\n\t\t\tawait fs.mkdir(deletedDir, { recursive: true });\n\n\t\t\t// Prepare staged files\n\t\t\tconst stagedFiles: Map<string, { hash: string; content: Uint8Array }> = new Map();\n\t\t\tconst filesToDelete: Set<string> = new Set();\n\n\t\t\tfor (let i = 0; i < reversedChanges.length; i++) {\n\t\t\t\tconst change = reversedChanges[i];\n\t\t\t\toptions?.onProgress?.(10 + (i / reversedChanges.length) * 40);\n\n\t\t\t\ttry {\n\t\t\t\t\tawait this.stageChange(change, stagingDir, stagedFiles, filesToDelete, result);\n\t\t\t\t} catch (error) {\n\t\t\t\t\tresult.filesSkipped.push(change.p);\n\t\t\t\t\tresult.errors.push({\n\t\t\t\t\t\tpath: change.p,\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\t// Report progress\n\t\t\toptions?.onProgress?.(50);\n\n\t\t\t// Validate staging directory (verify hashes)\n\t\t\tif (!options?.skipVerification) {\n\t\t\t\tconst validationErrors = await this.validateStaging(stagedFiles);\n\t\t\t\tif (validationErrors.length > 0) {\n\t\t\t\t\t// Validation failed - abort rollback\n\t\t\t\t\tfor (const error of validationErrors) {\n\t\t\t\t\t\tresult.errors.push(error);\n\t\t\t\t\t\tresult.filesSkipped.push(error.path);\n\t\t\t\t\t}\n\n\t\t\t\t\t// Clean up staging directory\n\t\t\t\t\tawait this.cleanupStaging(stagingDir);\n\n\t\t\t\t\t// Update journal status\n\t\t\t\t\tjournal.status = \"rolled-back\";\n\t\t\t\t\tawait fs.writeFile(journalPath, JSON.stringify(journal, null, 2));\n\n\t\t\t\t\treturn result;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Report progress\n\t\t\toptions?.onProgress?.(60);\n\n\t\t\t// If dry run, stop here\n\t\t\tif (options?.dryRun) {\n\t\t\t\tresult.success = true;\n\t\t\t\tresult.filesReverted = Array.from(stagedFiles.keys());\n\t\t\t\tawait this.cleanupStaging(stagingDir);\n\t\t\t\tawait fs.unlink(journalPath);\n\t\t\t\treturn result;\n\t\t\t}\n\n\t\t\t// Per-file atomic swap\n\t\t\tconst swapResult = await this.atomicSwap(stagedFiles, filesToDelete, journal, manifest.sessionId, options);\n\n\t\t\tresult.filesReverted = swapResult.reverted;\n\t\t\tresult.filesSkipped.push(...swapResult.skipped);\n\t\t\tresult.errors.push(...swapResult.errors);\n\t\t\tresult.success = swapResult.success;\n\n\t\t\t// Report progress\n\t\t\toptions?.onProgress?.(90);\n\n\t\t\t// Update journal status\n\t\t\tif (swapResult.success) {\n\t\t\t\tjournal.status = \"committed\";\n\t\t\t\tawait fs.writeFile(\n\t\t\t\t\tpath.join(this.journalDir, \"committed\", `${manifest.sessionId}.json`),\n\t\t\t\t\tJSON.stringify(journal, null, 2),\n\t\t\t\t);\n\t\t\t\tawait fs.unlink(journalPath);\n\n\t\t\t\t// Clean up backup files\n\t\t\t\tfor (const backup of journal.backups) {\n\t\t\t\t\tif (existsSync(backup.backup)) {\n\t\t\t\t\t\tawait fs.unlink(backup.backup);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Rollback failed - keep journal for recovery\n\t\t\t\tjournal.status = \"pending\";\n\t\t\t\tawait fs.writeFile(journalPath, JSON.stringify(journal, null, 2));\n\t\t\t}\n\n\t\t\t// Clean up staging directory\n\t\t\tawait this.cleanupStaging(stagingDir);\n\n\t\t\t// Report progress\n\t\t\toptions?.onProgress?.(100);\n\n\t\t\tconst duration = performance.now() - startTime;\n\t\t\tconsole.log(\n\t\t\t\t`[SessionRollback] rollback() took ${duration.toFixed(0)}ms (sessionId=${manifest.sessionId}, reverted=${result.filesReverted.length}, skipped=${result.filesSkipped.length})`,\n\t\t\t);\n\n\t\t\treturn result;\n\t\t} catch (error) {\n\t\t\tresult.errors.push({\n\t\t\t\tpath: \"<session>\",\n\t\t\t\terror: `Rollback failed: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t});\n\t\t\treturn result;\n\t\t}\n\t}\n\n\t/**\n\t * Reverse changes to get inverse operations\n\t */\n\tprivate reverseChanges(changes: SessionChange[]): SessionChange[] {\n\t\tconst reversed = [...changes].reverse();\n\t\treturn reversed.map((change) => {\n\t\t\t// Inverse operations:\n\t\t\t// - created → deleted\n\t\t\t// - modified → modified (with hOld/hNew swapped)\n\t\t\t// - deleted → created\n\t\t\t// - renamed → renamed (with p/from swapped)\n\n\t\t\tconst inversed: SessionChange = { ...change };\n\n\t\t\tswitch (change.op) {\n\t\t\t\tcase \"created\":\n\t\t\t\t\tinversed.op = \"deleted\";\n\t\t\t\t\tinversed.hOld = change.hNew;\n\t\t\t\t\tinversed.hNew = undefined;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"modified\":\n\t\t\t\t\t// Swap hashes and sizes\n\t\t\t\t\tinversed.hOld = change.hNew;\n\t\t\t\t\tinversed.hNew = change.hOld;\n\t\t\t\t\tinversed.sizeBefore = change.sizeAfter;\n\t\t\t\t\tinversed.sizeAfter = change.sizeBefore;\n\t\t\t\t\tinversed.mtimeBefore = change.mtimeAfter;\n\t\t\t\t\tinversed.mtimeAfter = change.mtimeBefore;\n\t\t\t\t\tinversed.modeBefore = change.modeAfter;\n\t\t\t\t\tinversed.modeAfter = change.modeBefore;\n\t\t\t\t\tinversed.eolBefore = change.eolAfter;\n\t\t\t\t\tinversed.eolAfter = change.eolBefore;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"deleted\":\n\t\t\t\t\tinversed.op = \"created\";\n\t\t\t\t\tinversed.hNew = change.hOld;\n\t\t\t\t\tinversed.hOld = undefined;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"renamed\": {\n\t\t\t\t\t// Swap path and fromPath\n\t\t\t\t\tconst temp = inversed.p;\n\t\t\t\t\tinversed.p = change.from || change.p;\n\t\t\t\t\tinversed.from = temp;\n\t\t\t\t\t// Also swap hashes\n\t\t\t\t\tinversed.hOld = change.hNew;\n\t\t\t\t\tinversed.hNew = change.hOld;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn inversed;\n\t\t});\n\t}\n\n\t/**\n\t * Stage a change for rollback\n\t */\n\tprivate async stageChange(\n\t\tchange: SessionChange,\n\t\tstagingDir: string,\n\t\tstagedFiles: Map<string, { hash: string; content: Uint8Array }>,\n\t\tfilesToDelete: Set<string>,\n\t\t_result: RollbackResult,\n\t): Promise<void> {\n\t\tconst _absPath = path.join(this.workspaceRoot, change.p);\n\t\tconst stagingPath = path.join(stagingDir, change.p);\n\n\t\tif (change.op === \"deleted\") {\n\t\t\t// Mark file for deletion\n\t\t\tfilesToDelete.add(change.p);\n\t\t\treturn;\n\t\t}\n\n\t\t// For created/modified/renamed: retrieve blob from BlobStore\n\t\tconst hash = change.hNew;\n\t\tif (!hash) {\n\t\t\tthrow new Error(`Missing hash for ${change.op} operation on ${change.p}`);\n\t\t}\n\n\t\t// Retrieve blob\n\t\tconst blobResult = await this.blobStore.get(hash);\n\t\tif (!blobResult.ok) {\n\t\t\tthrow new Error(`Failed to retrieve blob ${hash}: ${blobResult.error.message}`);\n\t\t}\n\n\t\tconst content = blobResult.value;\n\t\tif (!content) {\n\t\t\tthrow new Error(`Blob not found: ${hash}`);\n\t\t}\n\n\t\t// Create staging directory for file\n\t\tawait fs.mkdir(path.dirname(stagingPath), { recursive: true });\n\n\t\t// Write to staging\n\t\tawait fs.writeFile(stagingPath, content);\n\n\t\t// Restore metadata\n\t\tif (change.mtimeAfter) {\n\t\t\tconst mtimeDate = new Date(change.mtimeAfter);\n\t\t\tawait fs.utimes(stagingPath, mtimeDate, mtimeDate);\n\t\t}\n\n\t\tif (change.modeAfter && process.platform !== \"win32\") {\n\t\t\tawait fs.chmod(stagingPath, change.modeAfter);\n\t\t}\n\n\t\t// Add to staged files map\n\t\tstagedFiles.set(change.p, { hash, content });\n\t}\n\n\t/**\n\t * Validate staging directory (verify hashes)\n\t */\n\tprivate async validateStaging(\n\t\tstagedFiles: Map<string, { hash: string; content: Uint8Array }>,\n\t): Promise<Array<{ path: string; error: string }>> {\n\t\tconst errors: Array<{ path: string; error: string }> = [];\n\n\t\tfor (const [filePath, { hash, content }] of stagedFiles.entries()) {\n\t\t\tconst computedHash = createHash(\"sha256\").update(content).digest(\"hex\");\n\t\t\tif (computedHash !== hash) {\n\t\t\t\terrors.push({\n\t\t\t\t\tpath: filePath,\n\t\t\t\t\terror: `Hash mismatch: expected ${hash}, got ${computedHash}`,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\treturn errors;\n\t}\n\n\t/**\n\t * Perform per-file atomic swap\n\t */\n\tprivate async atomicSwap(\n\t\tstagedFiles: Map<string, { hash: string; content: Uint8Array }>,\n\t\tfilesToDelete: Set<string>,\n\t\tjournal: JournalEntry,\n\t\tsessionId: string,\n\t\toptions?: RollbackOptions,\n\t): Promise<{\n\t\tsuccess: boolean;\n\t\treverted: string[];\n\t\tskipped: string[];\n\t\terrors: Array<{ path: string; error: string }>;\n\t}> {\n\t\tconst reverted: string[] = [];\n\t\tconst skipped: string[] = [];\n\t\tconst errors: Array<{ path: string; error: string }> = [];\n\n\t\ttry {\n\t\t\t// Swap staged files\n\t\t\tlet processed = 0;\n\t\t\tconst total = stagedFiles.size + filesToDelete.size;\n\n\t\t\tfor (const [relPath] of stagedFiles.entries()) {\n\t\t\t\tprocessed++;\n\t\t\t\toptions?.onProgress?.(60 + (processed / total) * 30);\n\n\t\t\t\tconst absPath = path.join(this.workspaceRoot, relPath);\n\t\t\t\tconst stagingPath = path.join(this.workspaceRoot, `.snapback-rollback-${sessionId}`, relPath);\n\t\t\t\tconst backupPath = `${absPath}.bak-${sessionId}`;\n\n\t\t\t\ttry {\n\t\t\t\t\t// Backup current file (if exists)\n\t\t\t\t\tif (existsSync(absPath)) {\n\t\t\t\t\t\tawait this.safeRename(absPath, backupPath);\n\t\t\t\t\t\tjournal.backups.push({ original: absPath, backup: backupPath });\n\t\t\t\t\t}\n\n\t\t\t\t\t// Move staged file into place\n\t\t\t\t\tawait this.safeRename(stagingPath, absPath);\n\n\t\t\t\t\treverted.push(relPath);\n\t\t\t\t} catch (error) {\n\t\t\t\t\tskipped.push(relPath);\n\t\t\t\t\terrors.push({\n\t\t\t\t\t\tpath: relPath,\n\t\t\t\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\t\t\t});\n\n\t\t\t\t\t// Restore from backup if swap failed\n\t\t\t\t\tif (existsSync(backupPath)) {\n\t\t\t\t\t\tawait this.safeRename(backupPath, absPath);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Delete marked files\n\t\t\tfor (const relPath of filesToDelete) {\n\t\t\t\tprocessed++;\n\t\t\t\toptions?.onProgress?.(60 + (processed / total) * 30);\n\n\t\t\t\tconst absPath = path.join(this.workspaceRoot, relPath);\n\t\t\t\tconst backupPath = `${absPath}.bak-${sessionId}`;\n\n\t\t\t\ttry {\n\t\t\t\t\t// Backup current file (rename to backup is the deletion)\n\t\t\t\t\tif (existsSync(absPath)) {\n\t\t\t\t\t\tawait this.safeRename(absPath, backupPath);\n\t\t\t\t\t\tjournal.backups.push({ original: absPath, backup: backupPath });\n\t\t\t\t\t\t// Note: File is now deleted (moved to backup), no unlink needed\n\t\t\t\t\t\treverted.push(relPath);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tskipped.push(relPath);\n\t\t\t\t\t}\n\t\t\t\t} catch (error) {\n\t\t\t\t\tskipped.push(relPath);\n\t\t\t\t\terrors.push({\n\t\t\t\t\t\tpath: relPath,\n\t\t\t\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\t\t\t});\n\n\t\t\t\t\t// Restore from backup if deletion failed\n\t\t\t\t\tif (existsSync(backupPath)) {\n\t\t\t\t\t\tawait this.safeRename(backupPath, absPath);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tsuccess: errors.length === 0,\n\t\t\t\treverted,\n\t\t\t\tskipped,\n\t\t\t\terrors,\n\t\t\t};\n\t\t} catch (error) {\n\t\t\t// Fatal error - rollback all changes from backups\n\t\t\tfor (const backup of journal.backups) {\n\t\t\t\tif (existsSync(backup.backup)) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait this.safeRename(backup.backup, backup.original);\n\t\t\t\t\t} catch {\n\t\t\t\t\t\t// Ignore errors during recovery\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\treverted,\n\t\t\t\tskipped,\n\t\t\t\terrors: [\n\t\t\t\t\t{\n\t\t\t\t\t\tpath: \"<session>\",\n\t\t\t\t\t\terror: `Fatal error during swap: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t\t\t},\n\t\t\t\t\t...errors,\n\t\t\t\t],\n\t\t\t};\n\t\t}\n\t}\n\n\t/**\n\t * Safe file rename with EXDEV fallback (cross-device support for Windows)\n\t */\n\tprivate async safeRename(src: string, dst: string): Promise<void> {\n\t\ttry {\n\t\t\tawait fs.rename(src, dst);\n\t\t} catch (error: any) {\n\t\t\t// EXDEV: Cross-device link error (Windows different drives)\n\t\t\tif (error.code === \"EXDEV\") {\n\t\t\t\tawait fs.copyFile(src, dst);\n\t\t\t\tawait fs.unlink(src);\n\t\t\t} else {\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Clean up staging directory\n\t */\n\tprivate async cleanupStaging(stagingDir: string): Promise<void> {\n\t\ttry {\n\t\t\tif (existsSync(stagingDir)) {\n\t\t\t\tawait fs.rm(stagingDir, { recursive: true, force: true });\n\t\t\t}\n\t\t} catch {\n\t\t\t// Ignore cleanup errors\n\t\t}\n\t}\n\n\t/**\n\t * Get pending journal entries (for recovery)\n\t */\n\tasync getPendingJournals(): Promise<JournalEntry[]> {\n\t\tconst pendingDir = path.join(this.journalDir, \"pending\");\n\n\t\ttry {\n\t\t\tif (!existsSync(pendingDir)) {\n\t\t\t\treturn [];\n\t\t\t}\n\n\t\t\tconst files = await fs.readdir(pendingDir);\n\t\t\tconst journals: JournalEntry[] = [];\n\n\t\t\tfor (const file of files) {\n\t\t\t\tif (!file.endsWith(\".json\")) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tconst filePath = path.join(pendingDir, file);\n\t\t\t\tconst content = await fs.readFile(filePath, \"utf-8\");\n\t\t\t\tconst journal = JSON.parse(content) as JournalEntry;\n\t\t\t\tjournals.push(journal);\n\t\t\t}\n\n\t\t\treturn journals;\n\t\t} catch {\n\t\t\treturn [];\n\t\t}\n\t}\n}\n","/**\n * FileChangeAnalyzer - Platform-agnostic file change analysis\n *\n * This module provides utilities for analyzing differences between snapshot\n * and current workspace state, enabling rich diff previews and change summaries.\n *\n * @module FileChangeAnalyzer\n */\n\n/**\n * Interface for file system providers\n *\n * Different platforms implement this interface to provide their\n * specific method of file system operations.\n */\nexport interface IFileSystemProvider {\n\t/**\n\t * Read a file's contents\n\t *\n\t * @param filePath - Absolute path to the file\n\t * @returns Promise that resolves to file contents as string\n\t */\n\treadFile(filePath: string): Promise<string>;\n\n\t/**\n\t * Check if a file exists\n\t *\n\t * @param filePath - Absolute path to the file\n\t * @returns Promise that resolves to true if file exists\n\t */\n\tfileExists(filePath: string): Promise<boolean>;\n\n\t/**\n\t * Get relative path from workspace root\n\t *\n\t * @param workspaceRoot - Workspace root directory\n\t * @param absolutePath - Absolute file path\n\t * @returns Relative path from workspace root\n\t */\n\tgetRelativePath(workspaceRoot: string, absolutePath: string): string;\n}\n\n/**\n * Type of change detected for a file\n */\nexport type FileChangeType = \"modified\" | \"added\" | \"deleted\" | \"unchanged\";\n\n/**\n * Represents a file change between snapshot and current state\n */\nexport interface FileChange {\n\t/** Absolute file path */\n\tfilePath: string;\n\n\t/** Relative file path for display */\n\trelativePath: string;\n\n\t/** File name only */\n\tfileName: string;\n\n\t/** Type of change */\n\tchangeType: FileChangeType;\n\n\t/** Number of lines added (for modified files) */\n\tlinesAdded: number;\n\n\t/** Number of lines deleted (for modified files) */\n\tlinesDeleted: number;\n\n\t/** Content from snapshot */\n\tsnapshotContent: string;\n\n\t/** Current content (if file exists) */\n\tcurrentContent?: string;\n\n\t/** Icon identifier for VS Code */\n\ticon: string;\n\n\t/** Human-readable change summary */\n\tchangeSummary: string;\n}\n\n/**\n * FileChangeAnalyzer - Analyzes file changes between snapshots and current state\n *\n * Provides platform-agnostic file change analysis using dependency injection\n * for file system operations.\n *\n * @example\n * ```typescript\n * // Node.js example\n * import { readFile } from 'fs/promises';\n * import { existsSync } from 'fs';\n * import { relative, basename } from 'path';\n *\n * const fsProvider = {\n * readFile: (path) => readFile(path, 'utf-8'),\n * fileExists: (path) => Promise.resolve(existsSync(path)),\n * getRelativePath: (root, path) => relative(root, path)\n * };\n *\n * const analyzer = new FileChangeAnalyzer('/workspace', fsProvider);\n * const changes = await analyzer.analyzeSnapshot(snapshotFiles);\n * ```\n */\nexport class FileChangeAnalyzer {\n\tprivate workspaceRoot: string;\n\tprivate fileSystem: IFileSystemProvider;\n\n\t/**\n\t * Creates a new FileChangeAnalyzer\n\t *\n\t * @param workspaceRoot - Root directory of the workspace\n\t * @param fileSystem - File system provider for platform-specific operations\n\t */\n\tconstructor(workspaceRoot: string, fileSystem: IFileSystemProvider) {\n\t\tthis.workspaceRoot = workspaceRoot;\n\t\tthis.fileSystem = fileSystem;\n\t}\n\n\t/**\n\t * Analyzes all files in a snapshot and compares with current state\n\t *\n\t * @param snapshotFiles - Map of relative file paths to snapshot content\n\t * @returns Promise that resolves to array of file changes with detailed analysis\n\t */\n\tasync analyzeSnapshot(snapshotFiles: Record<string, string>): Promise<FileChange[]> {\n\t\tconst changes: FileChange[] = [];\n\n\t\tfor (const [relativePath, snapshotContent] of Object.entries(snapshotFiles)) {\n\t\t\ttry {\n\t\t\t\t// Convert relative path to absolute path for file system operations\n\t\t\t\tconst absolutePath = `${this.workspaceRoot}/${relativePath}`;\n\t\t\t\tconst change = await this.analyzeFile(absolutePath, snapshotContent);\n\t\t\t\tchanges.push(change);\n\t\t\t} catch (_error) {\n\t\t\t\t// Add entry with error indicator\n\t\t\t\tchanges.push({\n\t\t\t\t\tfilePath: `${this.workspaceRoot}/${relativePath}`,\n\t\t\t\t\trelativePath,\n\t\t\t\t\tfileName: this.getFileName(relativePath),\n\t\t\t\t\tchangeType: \"unchanged\",\n\t\t\t\t\tlinesAdded: 0,\n\t\t\t\t\tlinesDeleted: 0,\n\t\t\t\t\tsnapshotContent,\n\t\t\t\t\ticon: \"error\",\n\t\t\t\t\tchangeSummary: \"Error analyzing changes\",\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\t// Sort by change type priority: modified > deleted > added > unchanged\n\t\tconst typePriority: Record<FileChangeType, number> = {\n\t\t\tmodified: 0,\n\t\t\tdeleted: 1,\n\t\t\tadded: 2,\n\t\t\tunchanged: 3,\n\t\t};\n\n\t\treturn changes.sort((a, b) => {\n\t\t\tconst priorityDiff = typePriority[a.changeType] - typePriority[b.changeType];\n\t\t\tif (priorityDiff !== 0) {\n\t\t\t\treturn priorityDiff;\n\t\t\t}\n\n\t\t\t// Within same type, sort by file name\n\t\t\treturn a.fileName.localeCompare(b.fileName);\n\t\t});\n\t}\n\n\t/**\n\t * Analyzes a single file's changes\n\t *\n\t * @param absoluteFilePath - Absolute file path\n\t * @param snapshotContent - Content from snapshot\n\t * @returns Promise that resolves to detailed file change information\n\t */\n\tasync analyzeFile(absoluteFilePath: string, snapshotContent: string): Promise<FileChange> {\n\t\tconst relativePath = this.fileSystem.getRelativePath(this.workspaceRoot, absoluteFilePath);\n\t\tconst fileName = this.getFileName(relativePath);\n\n\t\t// Check if file exists in current workspace\n\t\t// Let errors propagate to caller for proper error handling\n\t\tconst fileExists = await this.fileSystem.fileExists(absoluteFilePath);\n\t\tlet currentContent: string | undefined;\n\n\t\tif (fileExists) {\n\t\t\tcurrentContent = await this.fileSystem.readFile(absoluteFilePath);\n\t\t}\n\n\t\t// Determine change type\n\t\tlet changeType: FileChangeType;\n\t\tlet icon: string;\n\t\tlet changeSummary: string;\n\t\tlet linesAdded = 0;\n\t\tlet linesDeleted = 0;\n\n\t\tif (!fileExists) {\n\t\t\t// File was deleted since snapshot\n\t\t\tchangeType = \"deleted\";\n\t\t\ticon = \"diff-removed\";\n\t\t\tconst lineCount = snapshotContent.split(\"\\n\").length;\n\t\t\tlinesDeleted = lineCount;\n\t\t\tchangeSummary = `Deleted (${lineCount} lines)`;\n\t\t} else if (currentContent === snapshotContent) {\n\t\t\t// File unchanged\n\t\t\tchangeType = \"unchanged\";\n\t\t\ticon = \"circle-outline\";\n\t\t\tchangeSummary = \"No changes\";\n\t\t} else {\n\t\t\t// File modified - calculate diff stats (currentContent is guaranteed to exist here)\n\t\t\tif (!currentContent) {\n\t\t\t\tthrow new Error(\"Unexpected: currentContent is undefined for existing file\");\n\t\t\t}\n\t\t\tchangeType = \"modified\";\n\t\t\ticon = \"diff-modified\";\n\n\t\t\tconst stats = this.calculateDiffStats(snapshotContent, currentContent);\n\t\t\tlinesAdded = stats.added;\n\t\t\tlinesDeleted = stats.deleted;\n\n\t\t\tif (linesAdded === 0 && linesDeleted === 0) {\n\t\t\t\tchangeSummary = \"Modified (whitespace only)\";\n\t\t\t} else if (linesAdded > 0 && linesDeleted > 0) {\n\t\t\t\tchangeSummary = `+${linesAdded} -${linesDeleted}`;\n\t\t\t} else if (linesAdded > 0) {\n\t\t\t\tchangeSummary = `+${linesAdded}`;\n\t\t\t} else {\n\t\t\t\tchangeSummary = `-${linesDeleted}`;\n\t\t\t}\n\t\t}\n\n\t\treturn {\n\t\t\tfilePath: absoluteFilePath,\n\t\t\trelativePath,\n\t\t\tfileName,\n\t\t\tchangeType,\n\t\t\tlinesAdded,\n\t\t\tlinesDeleted,\n\t\t\tsnapshotContent,\n\t\t\tcurrentContent,\n\t\t\ticon,\n\t\t\tchangeSummary,\n\t\t};\n\t}\n\n\t/**\n\t * Calculates simple diff statistics between two file contents\n\t *\n\t * Uses line-based comparison to estimate additions and deletions.\n\t * This is a simplified diff algorithm suitable for UI display.\n\t *\n\t * @param oldContent - Original content (snapshot)\n\t * @param newContent - Current content\n\t * @returns Object with added and deleted line counts\n\t */\n\tprivate calculateDiffStats(oldContent: string, newContent: string): { added: number; deleted: number } {\n\t\tconst oldLines = oldContent.split(\"\\n\");\n\t\tconst newLines = newContent.split(\"\\n\");\n\n\t\t// Simple line-based diff using Set for quick lookups\n\t\tconst oldSet = new Set(oldLines);\n\t\tconst newSet = new Set(newLines);\n\n\t\tlet added = 0;\n\t\tlet deleted = 0;\n\n\t\t// Count lines only in new (added)\n\t\tfor (const line of newLines) {\n\t\t\tif (!oldSet.has(line)) {\n\t\t\t\tadded++;\n\t\t\t}\n\t\t}\n\n\t\t// Count lines only in old (deleted)\n\t\tfor (const line of oldLines) {\n\t\t\tif (!newSet.has(line)) {\n\t\t\t\tdeleted++;\n\t\t\t}\n\t\t}\n\n\t\treturn { added, deleted };\n\t}\n\n\t/**\n\t * Extract file name from path\n\t *\n\t * @param filePath - File path\n\t * @returns File name only\n\t */\n\tprivate getFileName(filePath: string): string {\n\t\tconst parts = filePath.split(\"/\");\n\t\treturn parts[parts.length - 1] || filePath;\n\t}\n}\n\n/**\n * Creates a summary of changes for display\n *\n * @param changes - Array of file changes\n * @returns Human-readable change summary\n */\nexport function createChangeSummary(changes: FileChange[]): string {\n\tconst modifiedCount = changes.filter((c) => c.changeType === \"modified\").length;\n\tconst addedCount = changes.filter((c) => c.changeType === \"added\").length;\n\tconst deletedCount = changes.filter((c) => c.changeType === \"deleted\").length;\n\tconst unchangedCount = changes.filter((c) => c.changeType === \"unchanged\").length;\n\n\tconst parts: string[] = [];\n\n\tif (modifiedCount > 0) {\n\t\tparts.push(`${modifiedCount} modified`);\n\t}\n\tif (deletedCount > 0) {\n\t\tparts.push(`${deletedCount} deleted`);\n\t}\n\tif (addedCount > 0) {\n\t\tparts.push(`${addedCount} added`);\n\t}\n\tif (unchangedCount > 0 && parts.length === 0) {\n\t\tparts.push(`${unchangedCount} unchanged`);\n\t}\n\n\treturn parts.join(\", \");\n}\n","/**\n * Centralized Threshold Configuration\n *\n * This module serves as the single source of truth for all timing,\n * detection, classification, and risk thresholds across the SDK.\n *\n * These thresholds represent empirically tuned values from production usage\n * and constitute critical intellectual property. Centralizing thresholds enables:\n * - Single source of truth for all threshold values\n * - A/B testing and empirical tuning\n * - Runtime configuration via feature flags\n * - Consistent behavior across all platforms (VSCode, CLI, MCP, Web)\n *\n * All threshold values are frozen to prevent accidental modification.\n * Components can override these defaults via their configuration options.\n *\n * @module config/Thresholds\n */\n\nimport type { ExperienceMetrics } from \"../types/experience\";\n\n/**\n * Session coordinator thresholds for session lifecycle management\n */\nexport interface SessionThresholds {\n\t/** Time of inactivity before finalizing session (ms) */\n\tidleTimeout: number;\n\n\t/** Minimum duration for a valid session (ms) */\n\tminSessionDuration: number;\n\n\t/** Maximum duration before auto-finalizing session (ms) */\n\tmaxSessionDuration: number;\n}\n\n/**\n * Burst detection thresholds for identifying AI-like editing patterns\n */\nexport interface BurstThresholds {\n\t/** Time window for burst detection (ms) */\n\ttimeWindow: number;\n\n\t/** Minimum characters inserted to qualify as burst */\n\tminCharsInserted: number;\n\n\t/** Maximum time between keystrokes for burst (ms) */\n\tmaxKeystrokeInterval: number;\n\n\t/** Minimum lines affected to qualify as burst */\n\tminLinesAffected: number;\n\n\t/** Minimum insert/delete ratio for burst (e.g., 3:1) */\n\tminInsertDeleteRatio: number;\n}\n\n/**\n * Experience classification thresholds for user tiers\n */\nexport interface ExperienceThresholds {\n\t/** Thresholds for explorer tier (new users) */\n\texplorer: ExperienceMetrics;\n\n\t/** Thresholds for intermediate tier (regular users) */\n\tintermediate: ExperienceMetrics;\n\n\t/** Thresholds for power tier (advanced users) */\n\tpower: ExperienceMetrics;\n}\n\n/**\n * Session tagging thresholds for automatic tag generation\n */\nexport interface TaggingThresholds {\n\t/** Minimum burst confidence to tag as AI-assisted */\n\tminBurstConfidence: number;\n\n\t/** Minimum duration to tag as long-session (ms) */\n\tminLongSessionDuration: number;\n\n\t/** Maximum duration to tag as short-session (ms) */\n\tmaxShortSessionDuration: number;\n\n\t/** Minimum lines added to tag as large-edits */\n\tminLargeEditLines: number;\n\n\t/** Normalization constants for confidence calculations */\n\tnormalization: {\n\t\t/** File count threshold for multi-file tag */\n\t\tmultiFileThreshold: number;\n\n\t\t/** File count for normalizing multi-file confidence */\n\t\tmultiFileNormalization: number;\n\n\t\t/** Duration for normalizing long-session confidence (ms) */\n\t\tlongSessionNormalization: number;\n\n\t\t/** Line count for normalizing large-edits confidence */\n\t\tlargeEditsNormalization: number;\n\t};\n}\n\n/**\n * Risk analysis and scoring thresholds\n */\nexport interface RiskThresholds {\n\t/** Score above which operations are blocked (default: 8.0 on 0-10 scale) */\n\tblockingThreshold: number;\n\n\t/** Score threshold for critical severity (default: 7.0) */\n\tcriticalThreshold: number;\n\n\t/** Score threshold for high severity (default: 5.0) */\n\thighThreshold: number;\n\n\t/** Score threshold for medium severity (default: 3.0) */\n\tmediumThreshold: number;\n}\n\n/**\n * Security pattern risk scores (0-10 scale)\n */\nexport interface SecurityPatternScores {\n\t/** eval() usage score (default: 4.0) */\n\tevalUsage: number;\n\n\t/** Function constructor score (default: 4.0) */\n\tfunctionConstructor: number;\n\n\t/** innerHTML usage score (default: 3.0) */\n\tdangerousHtml: number;\n\n\t/** exec() command score (default: 5.0) */\n\texecCommand: number;\n\n\t/** SQL concatenation score (default: 6.0) */\n\tsqlConcat: number;\n\n\t/** Hardcoded secrets score (default: 4.0) */\n\thardcodedSecrets: number;\n\n\t/** Weak crypto score (default: 3.0) */\n\tweakCrypto: number;\n}\n\n/**\n * Detection thresholds for security analysis\n */\nexport interface DetectionThresholds {\n\t/** Shannon entropy threshold for secret detection (default: 2.5 bits per symbol) */\n\tentropyThreshold: number;\n\n\t/** Levenshtein distance threshold for typosquatting (default: 3) */\n\ttyposquattingDistance: number;\n}\n\n/**\n * Protection level and cooldown thresholds\n */\nexport interface ProtectionThresholds {\n\t/** Cooldown duration for protected files (default: 10min = 600s) */\n\tprotectedCooldown: number;\n\n\t/** Cooldown duration for other protection levels (default: 5min = 300s) */\n\totherCooldown: number;\n\n\t/** Debounce window for protection checks (default: 5s) */\n\tdebounceWindow: number;\n}\n\n/**\n * Resource limits and capacity thresholds\n */\nexport interface ResourceThresholds {\n\t/** Maximum deduplication cache size (default: 500 entries) */\n\tdedupCacheSize: number;\n\n\t/** Maximum files in snapshot (default: 10,000) */\n\tsnapshotMaxFiles: number;\n\n\t/** Maximum file size in snapshot (default: 10MB) */\n\tsnapshotMaxFileSize: number;\n\n\t/** Maximum total snapshot size (default: 500MB) */\n\tsnapshotMaxTotalSize: number;\n\n\t/** Halo size for diff context (default: 3 lines) */\n\tdiffHaloSize: number;\n\n\t/** Trial snapshot limit (default: 50) */\n\ttrialSnapshotLimit: number;\n\n\t/** Free tier monthly snapshot limit (default: 100) */\n\tfreeMonthlyLimit: number;\n}\n\n/**\n * Quality of Service (QoS) thresholds\n */\nexport interface QoSThresholds {\n\t/** Rate limiter token bucket capacity (default: 100) */\n\trateLimitCapacity: number;\n\n\t/** Rate limiter refill period (default: 60s) */\n\trateLimitRefill: number;\n\n\t/** Event bus timeout (default: 5s) */\n\teventBusTimeout: number;\n\n\t/** Event bus max retries (default: 3) */\n\teventBusMaxRetries: number;\n\n\t/** Error budget hard threshold (default: 1% = 0.01) */\n\terrorBudgetHard: number;\n\n\t/** Error budget warning threshold (default: 0.5% = 0.005) */\n\terrorBudgetWarn: number;\n\n\t/** Maximum items in batch (default: 10) */\n\tbatchMax: number;\n\n\t/** Time interval for batch flush in milliseconds (default: 1s) */\n\tbatchIntervalMs: number;\n\n\t/** Base retry delay in milliseconds (default: 100ms) */\n\tretryBaseMs: number;\n\n\t/** Maximum retry delay in milliseconds (default: 5s) */\n\tretryMaxMs: number;\n\n\t/** Maximum queue size before dropping items (default: 1000) */\n\tmaxQueueSize: number;\n\n\t/** HTTP request timeout in milliseconds (default: 30s) */\n\thttpTimeout: number;\n}\n\n/**\n * Documentation for threshold values\n */\nexport interface ThresholdDocumentation {\n\tsession: {\n\t\tidleTimeout: string;\n\t\tminSessionDuration: string;\n\t\tmaxSessionDuration: string;\n\t};\n\tburst: {\n\t\ttimeWindow: string;\n\t\tminCharsInserted: string;\n\t\tmaxKeystrokeInterval: string;\n\t\tminLinesAffected: string;\n\t\tminInsertDeleteRatio: string;\n\t};\n\texperience: {\n\t\tdescription: string;\n\t\texplorer: string;\n\t\tintermediate: string;\n\t\tpower: string;\n\t};\n\ttagging: {\n\t\tdescription: string;\n\t\tminBurstConfidence: string;\n\t\tminLongSessionDuration: string;\n\t\tmaxShortSessionDuration: string;\n\t\tminLargeEditLines: string;\n\t};\n\trisk: {\n\t\tdescription: string;\n\t\tblockingThreshold: string;\n\t\tcriticalThreshold: string;\n\t\thighThreshold: string;\n\t\tmediumThreshold: string;\n\t};\n\tdetection: {\n\t\tentropyThreshold: string;\n\t\ttyposquattingDistance: string;\n\t};\n\tprotection: {\n\t\tprotectedCooldown: string;\n\t\totherCooldown: string;\n\t\tdebounceWindow: string;\n\t};\n\tresources: {\n\t\tdedupCacheSize: string;\n\t\tsnapshotMaxFiles: string;\n\t\tdiffHaloSize: string;\n\t};\n\tqos: {\n\t\trateLimitCapacity: string;\n\t\terrorBudgetHard: string;\n\t\tbatchMax: string;\n\t\tbatchIntervalMs: string;\n\t\tretryBaseMs: string;\n\t\tretryMaxMs: string;\n\t\tmaxQueueSize: string;\n\t\thttpTimeout: string;\n\t};\n}\n\n/**\n * Complete threshold configuration\n */\nexport interface ThresholdsConfig {\n\tsession: SessionThresholds;\n\tburst: BurstThresholds;\n\texperience: ExperienceThresholds;\n\ttagging: TaggingThresholds;\n\trisk: RiskThresholds;\n\tsecurityScores: SecurityPatternScores;\n\tdetection: DetectionThresholds;\n\tprotection: ProtectionThresholds;\n\tresources: ResourceThresholds;\n\tqos: QoSThresholds;\n\tdocs: ThresholdDocumentation;\n}\n\n/**\n * Default threshold configuration (frozen and immutable)\n *\n * This constant contains the default values and is frozen to prevent modification.\n * Use THRESHOLDS for the current (potentially modified) values.\n */\nconst DEFAULT_THRESHOLDS_FROZEN: Readonly<ThresholdsConfig> = Object.freeze({\n\t/**\n\t * Session lifecycle thresholds\n\t */\n\tsession: Object.freeze({\n\t\tidleTimeout: 105000, // 105 seconds (1.75 minutes)\n\t\tminSessionDuration: 5000, // 5 seconds\n\t\tmaxSessionDuration: 3600000, // 1 hour\n\t}),\n\n\t/**\n\t * Burst detection thresholds\n\t */\n\tburst: Object.freeze({\n\t\ttimeWindow: 5000, // 5 seconds\n\t\tminCharsInserted: 100, // 100 characters\n\t\tmaxKeystrokeInterval: 200, // 200 milliseconds\n\t\tminLinesAffected: 3, // 3 lines\n\t\tminInsertDeleteRatio: 3, // 3:1 ratio (favoring insertions)\n\t}),\n\n\t/**\n\t * Experience tier thresholds\n\t */\n\texperience: Object.freeze({\n\t\texplorer: Object.freeze({\n\t\t\tsnapshotsCreated: 5,\n\t\t\tsessionsRecorded: 3,\n\t\t\tprotectedFiles: 2,\n\t\t\tmanualRestores: 1,\n\t\t\taiAssistedSessions: 0,\n\t\t\tdaysSinceFirstUse: 7,\n\t\t\tcommandDiversity: 0.3,\n\t\t}),\n\t\tintermediate: Object.freeze({\n\t\t\tsnapshotsCreated: 20,\n\t\t\tsessionsRecorded: 10,\n\t\t\tprotectedFiles: 5,\n\t\t\tmanualRestores: 5,\n\t\t\taiAssistedSessions: 2,\n\t\t\tdaysSinceFirstUse: 30,\n\t\t\tcommandDiversity: 0.6,\n\t\t}),\n\t\tpower: Object.freeze({\n\t\t\tsnapshotsCreated: 100,\n\t\t\tsessionsRecorded: 50,\n\t\t\tprotectedFiles: 20,\n\t\t\tmanualRestores: 20,\n\t\t\taiAssistedSessions: 10,\n\t\t\tdaysSinceFirstUse: 90,\n\t\t\tcommandDiversity: 0.9,\n\t\t}),\n\t}),\n\n\t/**\n\t * Session tagging thresholds\n\t */\n\ttagging: Object.freeze({\n\t\tminBurstConfidence: 0.7,\n\t\tminLongSessionDuration: 1800000, // 30 minutes\n\t\tmaxShortSessionDuration: 30000, // 30 seconds\n\t\tminLargeEditLines: 1000,\n\t\tnormalization: Object.freeze({\n\t\t\tmultiFileThreshold: 5, // Tag as multi-file if > 5 files\n\t\t\tmultiFileNormalization: 10, // Normalize confidence to 10 files\n\t\t\tlongSessionNormalization: 7200000, // Normalize to 2 hours\n\t\t\tlargeEditsNormalization: 5000, // Normalize to 5000 lines\n\t\t}),\n\t}),\n\n\t/**\n\t * Risk analysis thresholds\n\t */\n\trisk: Object.freeze({\n\t\tblockingThreshold: 8.0, // Block operations above this score (0-10 scale)\n\t\tcriticalThreshold: 7.0, // Critical severity\n\t\thighThreshold: 5.0, // High severity\n\t\tmediumThreshold: 3.0, // Medium severity\n\t}),\n\n\t/**\n\t * Security pattern scores (0-10 scale)\n\t */\n\tsecurityScores: Object.freeze({\n\t\tevalUsage: 4.0,\n\t\tfunctionConstructor: 4.0,\n\t\tdangerousHtml: 3.0,\n\t\texecCommand: 5.0,\n\t\tsqlConcat: 6.0,\n\t\thardcodedSecrets: 4.0,\n\t\tweakCrypto: 3.0,\n\t}),\n\n\t/**\n\t * Detection thresholds\n\t */\n\tdetection: Object.freeze({\n\t\tentropyThreshold: 2.5, // Shannon entropy (bits per symbol) for secret detection\n\t\ttyposquattingDistance: 3, // Levenshtein distance for dependency typosquatting\n\t}),\n\n\t/**\n\t * Protection level thresholds\n\t */\n\tprotection: Object.freeze({\n\t\tprotectedCooldown: 600000, // 10 minutes in ms\n\t\totherCooldown: 300000, // 5 minutes in ms\n\t\tdebounceWindow: 5000, // 5 seconds in ms\n\t}),\n\n\t/**\n\t * Resource limits\n\t */\n\tresources: Object.freeze({\n\t\tdedupCacheSize: 500, // Maximum cache entries\n\t\tsnapshotMaxFiles: 10000, // Maximum files in snapshot\n\t\tsnapshotMaxFileSize: 10 * 1024 * 1024, // 10MB in bytes\n\t\tsnapshotMaxTotalSize: 500 * 1024 * 1024, // 500MB in bytes\n\t\tdiffHaloSize: 3, // Context lines for diffs\n\t\ttrialSnapshotLimit: 50, // Snapshots for trial users\n\t\tfreeMonthlyLimit: 100, // Free tier monthly limit\n\t}),\n\n\t/**\n\t * Quality of Service thresholds\n\t */\n\tqos: Object.freeze({\n\t\trateLimitCapacity: 100, // Token bucket capacity\n\t\trateLimitRefill: 60000, // 60 seconds in ms\n\t\teventBusTimeout: 5000, // 5 seconds in ms\n\t\teventBusMaxRetries: 3, // Maximum retry attempts\n\t\terrorBudgetHard: 0.01, // 1% error rate threshold\n\t\terrorBudgetWarn: 0.005, // 0.5% warning threshold\n\t\tbatchMax: 10, // Maximum items in batch\n\t\tbatchIntervalMs: 1000, // 1 second batch interval\n\t\tretryBaseMs: 100, // 100ms base retry delay\n\t\tretryMaxMs: 5000, // 5 seconds max retry delay\n\t\tmaxQueueSize: 1000, // Maximum queue size\n\t\thttpTimeout: 30000, // 30 seconds HTTP timeout\n\t}),\n\n\t/**\n\t * Documentation for threshold values\n\t */\n\tdocs: Object.freeze({\n\t\tsession: Object.freeze({\n\t\t\tidleTimeout: \"Duration of inactivity before automatically finalizing a session\",\n\t\t\tminSessionDuration: \"Minimum duration required for a session to be considered valid\",\n\t\t\tmaxSessionDuration: \"Maximum duration before automatically finalizing a long-running session\",\n\t\t}),\n\t\tburst: Object.freeze({\n\t\t\ttimeWindow: \"Time window to analyze for burst patterns (rapid insertions)\",\n\t\t\tminCharsInserted: \"Minimum characters inserted within time window to qualify as burst\",\n\t\t\tmaxKeystrokeInterval: \"Maximum time between consecutive keystrokes to qualify as burst\",\n\t\t\tminLinesAffected: \"Minimum number of lines changed to qualify as burst\",\n\t\t\tminInsertDeleteRatio:\n\t\t\t\t\"Minimum ratio of inserted to deleted characters (e.g., 3:1 means 3x more insertions)\",\n\t\t}),\n\t\texperience: Object.freeze({\n\t\t\tdescription:\n\t\t\t\t\"Thresholds for classifying users into experience tiers based on usage patterns. Users must meet ALL thresholds within a tier to qualify.\",\n\t\t\texplorer: \"New users getting started with SnapBack (low activity)\",\n\t\t\tintermediate: \"Regular users with moderate experience (consistent usage)\",\n\t\t\tpower: \"Advanced users who leverage many features (high engagement)\",\n\t\t}),\n\t\ttagging: Object.freeze({\n\t\t\tdescription: \"Thresholds for automatically tagging sessions based on detected patterns and characteristics\",\n\t\t\tminBurstConfidence: \"Minimum confidence level (0-1) required to tag session as having burst patterns\",\n\t\t\tminLongSessionDuration: \"Minimum duration to classify and tag a session as 'long-session'\",\n\t\t\tmaxShortSessionDuration: \"Maximum duration to classify and tag a session as 'short-session'\",\n\t\t\tminLargeEditLines: \"Minimum lines added to classify and tag a session as having 'large-edits'\",\n\t\t}),\n\t\trisk: Object.freeze({\n\t\t\tdescription: \"Risk thresholds for security analysis and blocking operations\",\n\t\t\tblockingThreshold: \"Score above which operations are blocked (0-10 scale)\",\n\t\t\tcriticalThreshold: \"Threshold for critical severity classification\",\n\t\t\thighThreshold: \"Threshold for high severity classification\",\n\t\t\tmediumThreshold: \"Threshold for medium severity classification\",\n\t\t}),\n\t\tdetection: Object.freeze({\n\t\t\tentropyThreshold:\n\t\t\t\t\"Shannon entropy threshold (bits per symbol) for detecting potential secrets and high-entropy strings\",\n\t\t\ttyposquattingDistance:\n\t\t\t\t\"Maximum Levenshtein distance for detecting potential typosquatting in dependency names\",\n\t\t}),\n\t\tprotection: Object.freeze({\n\t\t\tprotectedCooldown: \"Cooldown period after saving protected files before next protection check\",\n\t\t\totherCooldown: \"Cooldown period for warn and watch protection levels\",\n\t\t\tdebounceWindow: \"Debounce window to prevent rapid-fire protection checks\",\n\t\t}),\n\t\tresources: Object.freeze({\n\t\t\tdedupCacheSize: \"Maximum number of entries in the deduplication cache (FIFO eviction)\",\n\t\t\tsnapshotMaxFiles: \"Maximum number of files allowed in a single snapshot operation\",\n\t\t\tdiffHaloSize: \"Number of context lines to include around changed regions in diffs\",\n\t\t}),\n\t\tqos: Object.freeze({\n\t\t\trateLimitCapacity: \"Token bucket capacity for rate limiting API requests\",\n\t\t\terrorBudgetHard: \"Hard error rate threshold triggering alerts and degradation (1% = 0.01)\",\n\t\t\tbatchMax: \"Maximum number of items to batch together before flushing\",\n\t\t\tbatchIntervalMs: \"Time interval to wait before auto-flushing a batch (milliseconds)\",\n\t\t\tretryBaseMs: \"Base delay for exponential backoff retry logic (milliseconds)\",\n\t\t\tretryMaxMs: \"Maximum delay cap for exponential backoff retries (milliseconds)\",\n\t\t\tmaxQueueSize: \"Maximum queue size before dropping new items to prevent memory overflow\",\n\t\t\thttpTimeout: \"HTTP request timeout for QoS API calls (milliseconds)\",\n\t\t}),\n\t}),\n});\n\n/**\n * Exported default thresholds (frozen for immutability)\n *\n * This is a reference to the frozen defaults, exported for inspection and testing.\n * Use THRESHOLDS for the current (potentially modified) values.\n */\nexport const DEFAULT_THRESHOLDS: Readonly<ThresholdsConfig> = DEFAULT_THRESHOLDS_FROZEN;\n\n/**\n * Current threshold configuration (mutable)\n *\n * This object holds the currently active thresholds and can be modified at runtime\n * using updateThresholds() or reset using resetThresholds().\n *\n * @example\n * ```typescript\n * import { THRESHOLDS } from '@snapback/sdk';\n *\n * const coordinator = new SessionCoordinator({\n * config: {\n * idleTimeout: THRESHOLDS.session.idleTimeout,\n * minSessionDuration: THRESHOLDS.session.minSessionDuration,\n * }\n * });\n * ```\n */\nexport const THRESHOLDS: ThresholdsConfig = structuredClone(DEFAULT_THRESHOLDS_FROZEN);\n\n/**\n * Re-export for convenience\n */\nexport default THRESHOLDS;\n\n/**\n * Create a new thresholds instance with optional overrides\n *\n * @param overrides - Partial threshold overrides\n * @returns New thresholds configuration with overrides applied\n *\n * @example\n * ```typescript\n * const testThresholds = createThresholds({\n * risk: {\n * blockingThreshold: 6.0, // More permissive for testing\n * criticalThreshold: 5.0,\n * highThreshold: 4.0,\n * mediumThreshold: 2.0,\n * },\n * });\n * ```\n */\nexport function createThresholds(overrides?: Partial<ThresholdsConfig>): ThresholdsConfig {\n\treturn {\n\t\tsession: { ...THRESHOLDS.session, ...overrides?.session },\n\t\tburst: { ...THRESHOLDS.burst, ...overrides?.burst },\n\t\texperience: {\n\t\t\texplorer: { ...THRESHOLDS.experience.explorer, ...overrides?.experience?.explorer },\n\t\t\tintermediate: { ...THRESHOLDS.experience.intermediate, ...overrides?.experience?.intermediate },\n\t\t\tpower: { ...THRESHOLDS.experience.power, ...overrides?.experience?.power },\n\t\t},\n\t\ttagging: {\n\t\t\t...THRESHOLDS.tagging,\n\t\t\t...overrides?.tagging,\n\t\t\tnormalization: { ...THRESHOLDS.tagging.normalization, ...overrides?.tagging?.normalization },\n\t\t},\n\t\trisk: { ...THRESHOLDS.risk, ...overrides?.risk },\n\t\tsecurityScores: { ...THRESHOLDS.securityScores, ...overrides?.securityScores },\n\t\tdetection: { ...THRESHOLDS.detection, ...overrides?.detection },\n\t\tprotection: { ...THRESHOLDS.protection, ...overrides?.protection },\n\t\tresources: { ...THRESHOLDS.resources, ...overrides?.resources },\n\t\tqos: { ...THRESHOLDS.qos, ...overrides?.qos },\n\t\tdocs: THRESHOLDS.docs, // Documentation is immutable\n\t};\n}\n\n/**\n * Update global thresholds at runtime\n *\n * Useful for feature flags, A/B testing, or environment-specific tuning.\n * Note: This mutates the global THRESHOLDS object.\n *\n * @param overrides - Partial threshold overrides to apply globally\n *\n * @example\n * ```typescript\n * // More aggressive burst detection for beta users\n * updateThresholds({\n * burst: {\n * timeWindow: 3000, // 3s instead of 5s\n * minCharsInserted: 50,\n * maxKeystrokeInterval: 150,\n * minLinesAffected: 2,\n * minInsertDeleteRatio: 2,\n * },\n * });\n * ```\n */\nexport function updateThresholds(overrides: Partial<ThresholdsConfig>): void {\n\tconst updated = createThresholds(overrides);\n\t// Note: THRESHOLDS is exported as a mutable let binding\n\tObject.assign(THRESHOLDS, updated);\n}\n\n/**\n * Reset global thresholds to defaults\n *\n * Useful for testing or restoring default configuration.\n */\nexport function resetThresholds(): void {\n\tObject.assign(THRESHOLDS, DEFAULT_THRESHOLDS);\n}\n","/**\n * RiskAnalyzer - Platform-agnostic risk analysis for code security\n *\n * This module provides platform-agnostic risk analysis functionality,\n * detecting security issues in code through pattern matching and scoring.\n *\n * Key Features:\n * - Pattern-based security detection\n * - Risk scoring (0-10 scale)\n * - Severity classification (low/medium/high/critical)\n * - Configurable thresholds\n *\n * Thresholds are centralized in config/Thresholds.ts for consistency across\n * all platforms (VSCode, CLI, MCP, Web).\n *\n * @module RiskAnalyzer\n */\n\nimport { THRESHOLDS } from \"../config/Thresholds\";\n\n/**\n * Severity levels for risk analysis\n */\nexport type RiskSeverity = \"low\" | \"medium\" | \"high\" | \"critical\";\n\n/**\n * Risk factor detected in analysis\n */\nexport interface RiskFactor {\n\t/** Type of risk detected */\n\ttype: string;\n\t/** Human-readable message */\n\tmessage: string;\n\t/** Line number where issue was found (optional) */\n\tline?: number;\n\t/** Column number where issue was found (optional) */\n\tcolumn?: number;\n}\n\n/**\n * Result of risk analysis\n */\nexport interface AnalysisResult {\n\t/** Risk score (0-10 scale, where 10 is most risky) */\n\tscore: number;\n\t/** Severity classification */\n\tseverity: RiskSeverity;\n\t/** Risk factors detected */\n\tfactors: RiskFactor[];\n\t/** Recommendations for remediation */\n\trecommendations: string[];\n}\n\n/**\n * Configuration for risk analysis thresholds\n */\nexport interface RiskThresholds {\n\t/** Score threshold for blocking (default: 8.0) */\n\tblockingThreshold: number;\n\t/** Score threshold for critical severity (default: 7.0) */\n\tcriticalThreshold: number;\n\t/** Score threshold for high severity (default: 5.0) */\n\thighThreshold: number;\n\t/** Score threshold for medium severity (default: 3.0) */\n\tmediumThreshold: number;\n}\n\n/**\n * Default risk thresholds based on SnapBack's security model\n *\n * These values are sourced from the centralized THRESHOLDS configuration\n * to ensure consistency across all platforms.\n */\nexport const DEFAULT_RISK_THRESHOLDS: RiskThresholds = {\n\tblockingThreshold: THRESHOLDS.risk.blockingThreshold,\n\tcriticalThreshold: THRESHOLDS.risk.criticalThreshold,\n\thighThreshold: THRESHOLDS.risk.highThreshold,\n\tmediumThreshold: THRESHOLDS.risk.mediumThreshold,\n};\n\n/**\n * Security pattern definition\n */\ninterface SecurityPattern {\n\t/** Pattern name */\n\tname: string;\n\t/** Regular expression to match */\n\tpattern: RegExp;\n\t/** Risk score contribution (0-10) */\n\tscore: number;\n\t/** Human-readable message */\n\tmessage: string;\n\t/** Recommendation for remediation */\n\trecommendation: string;\n}\n\n/**\n * Built-in security patterns for detection\n *\n * These patterns detect common security anti-patterns. Scores are sourced from\n * centralized THRESHOLDS.securityScores for consistency.\n */\nconst SECURITY_PATTERNS: SecurityPattern[] = [\n\t{\n\t\tname: \"eval_usage\",\n\t\tpattern: /\\beval\\s*\\(/g,\n\t\tscore: THRESHOLDS.securityScores.evalUsage,\n\t\tmessage: \"eval() usage detected - high security risk\",\n\t\trecommendation:\n\t\t\t\"Avoid using eval() as it can execute arbitrary code. Use safer alternatives like JSON.parse() for data or explicit function calls.\",\n\t},\n\t{\n\t\tname: \"function_constructor\",\n\t\tpattern: /\\bnew\\s+Function\\s*\\(/g,\n\t\tscore: THRESHOLDS.securityScores.functionConstructor,\n\t\tmessage: \"Function constructor usage detected - high security risk\",\n\t\trecommendation:\n\t\t\t\"Avoid using Function constructor as it can execute arbitrary code. Use regular function declarations instead.\",\n\t},\n\t{\n\t\tname: \"dangerous_html\",\n\t\tpattern: /\\binnerHTML\\s*=/g,\n\t\tscore: THRESHOLDS.securityScores.dangerousHtml,\n\t\tmessage: \"innerHTML usage detected - XSS risk\",\n\t\trecommendation:\n\t\t\t\"Use textContent or safer DOM manipulation methods to prevent XSS attacks. If HTML is necessary, sanitize it first.\",\n\t},\n\t{\n\t\tname: \"exec_command\",\n\t\tpattern: /\\bexec\\s*\\(/g,\n\t\tscore: THRESHOLDS.securityScores.execCommand,\n\t\tmessage: \"exec() usage detected - command injection risk\",\n\t\trecommendation:\n\t\t\t\"Avoid using exec(). If shell commands are necessary, use execFile() with hardcoded command paths and validate all inputs.\",\n\t},\n\t{\n\t\tname: \"sql_concat\",\n\t\tpattern: /SELECT\\s+.+\\+\\s*['\"]/gi,\n\t\tscore: THRESHOLDS.securityScores.sqlConcat,\n\t\tmessage: \"Potential SQL injection through string concatenation\",\n\t\trecommendation: \"Use parameterized queries or prepared statements to prevent SQL injection attacks.\",\n\t},\n\t{\n\t\tname: \"hardcoded_secrets\",\n\t\tpattern: /(password|secret|api[_-]?key|token)\\s*=\\s*['\"][^'\"]+['\"]/gi,\n\t\tscore: THRESHOLDS.securityScores.hardcodedSecrets,\n\t\tmessage: \"Potential hardcoded secret detected\",\n\t\trecommendation:\n\t\t\t\"Store secrets in environment variables or secure secret management systems, never in source code.\",\n\t},\n\t{\n\t\tname: \"weak_crypto\",\n\t\tpattern: /\\b(MD5|SHA1)\\b/gi,\n\t\tscore: THRESHOLDS.securityScores.weakCrypto,\n\t\tmessage: \"Weak cryptographic algorithm detected\",\n\t\trecommendation: \"Use modern algorithms like SHA-256 or bcrypt for hashing, and AES-256 for encryption.\",\n\t},\n];\n\n/**\n * RiskAnalyzer - Analyzes code for security risks\n *\n * This class provides platform-agnostic risk analysis through pattern\n * matching and configurable thresholds. It's designed to work across\n * VSCode, CLI, MCP, and web environments.\n */\nexport class RiskAnalyzer {\n\tprivate thresholds: RiskThresholds;\n\tprivate customPatterns: SecurityPattern[] = [];\n\n\t/**\n\t * Creates a new RiskAnalyzer\n\t *\n\t * @param thresholds - Custom threshold configuration (optional)\n\t */\n\tconstructor(thresholds?: Partial<RiskThresholds>) {\n\t\tthis.thresholds = {\n\t\t\t...DEFAULT_RISK_THRESHOLDS,\n\t\t\t...thresholds,\n\t\t};\n\t}\n\n\t/**\n\t * Add a custom security pattern for detection\n\t *\n\t * @param pattern - Security pattern to add\n\t */\n\taddPattern(pattern: SecurityPattern): void {\n\t\tthis.customPatterns.push(pattern);\n\t}\n\n\t/**\n\t * Analyze content for security risks\n\t *\n\t * @param content - Code content to analyze\n\t * @param filePath - Path to the file (for context, optional)\n\t * @returns Analysis result with risk score and factors\n\t */\n\tanalyze(content: string, _filePath?: string): AnalysisResult {\n\t\tconst factors: RiskFactor[] = [];\n\t\tconst recommendations: string[] = [];\n\t\tlet totalScore = 0;\n\n\t\t// Combine built-in and custom patterns\n\t\tconst allPatterns = [...SECURITY_PATTERNS, ...this.customPatterns];\n\n\t\t// Check each pattern against content\n\t\tfor (const pattern of allPatterns) {\n\t\t\tconst matches = content.matchAll(pattern.pattern);\n\t\t\tfor (const match of matches) {\n\t\t\t\t// Add risk factor\n\t\t\t\tfactors.push({\n\t\t\t\t\ttype: pattern.name,\n\t\t\t\t\tmessage: pattern.message,\n\t\t\t\t\tline: this.getLineNumber(content, match.index || 0),\n\t\t\t\t});\n\n\t\t\t\t// Add recommendation (deduplicated)\n\t\t\t\tif (!recommendations.includes(pattern.recommendation)) {\n\t\t\t\t\trecommendations.push(pattern.recommendation);\n\t\t\t\t}\n\n\t\t\t\t// Accumulate score\n\t\t\t\ttotalScore += pattern.score;\n\t\t\t}\n\t\t}\n\n\t\t// Cap score at 10\n\t\tconst cappedScore = Math.min(totalScore, 10);\n\n\t\t// Determine severity based on thresholds\n\t\tconst severity = this.calculateSeverity(cappedScore);\n\n\t\treturn {\n\t\t\tscore: cappedScore,\n\t\t\tseverity,\n\t\t\tfactors,\n\t\t\trecommendations,\n\t\t};\n\t}\n\n\t/**\n\t * Check if a risk score should block a save operation\n\t *\n\t * @param score - Risk score to check\n\t * @returns True if score exceeds blocking threshold\n\t */\n\tshouldBlock(score: number): boolean {\n\t\treturn score > this.thresholds.blockingThreshold;\n\t}\n\n\t/**\n\t * Calculate severity based on risk score\n\t *\n\t * @param score - Risk score (0-10)\n\t * @returns Severity classification\n\t */\n\tprivate calculateSeverity(score: number): RiskSeverity {\n\t\tif (score >= this.thresholds.criticalThreshold) {\n\t\t\treturn \"critical\";\n\t\t}\n\t\tif (score >= this.thresholds.highThreshold) {\n\t\t\treturn \"high\";\n\t\t}\n\t\tif (score >= this.thresholds.mediumThreshold) {\n\t\t\treturn \"medium\";\n\t\t}\n\t\treturn \"low\";\n\t}\n\n\t/**\n\t * Get line number from character index\n\t *\n\t * @param content - Full content string\n\t * @param index - Character index\n\t * @returns Line number (1-indexed)\n\t */\n\tprivate getLineNumber(content: string, index: number): number {\n\t\tconst lines = content.substring(0, index).split(\"\\n\");\n\t\treturn lines.length;\n\t}\n\n\t/**\n\t * Get current thresholds\n\t *\n\t * @returns Current threshold configuration\n\t */\n\tgetThresholds(): RiskThresholds {\n\t\treturn { ...this.thresholds };\n\t}\n\n\t/**\n\t * Update thresholds\n\t *\n\t * @param thresholds - New threshold values\n\t */\n\tsetThresholds(thresholds: Partial<RiskThresholds>): void {\n\t\tthis.thresholds = {\n\t\t\t...this.thresholds,\n\t\t\t...thresholds,\n\t\t};\n\t}\n}\n","/**\n * Runtime Invariant System\n *\n * Provides reporting-enabled assertions that:\n * 1. Throw in development (fail fast)\n * 2. Report to telemetry in production (graceful degradation)\n * 3. Track violation patterns for automated learning\n *\n * @packageDocumentation\n */\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/**\n * Invariant violation details for reporting\n */\nexport interface InvariantViolation {\n\t/** Unique identifier for this invariant */\n\tinvariantId: string;\n\t/** Human-readable message */\n\tmessage: string;\n\t/** File where violation occurred */\n\tfile?: string;\n\t/** Line number */\n\tline?: number;\n\t/** Additional context */\n\tcontext?: Record<string, unknown>;\n\t/** Timestamp */\n\ttimestamp: number;\n\t/** Stack trace (development only) */\n\tstack?: string;\n}\n\n/**\n * Invariant reporter interface\n */\nexport interface InvariantReporter {\n\t/** Report a violation */\n\treport(violation: InvariantViolation): void;\n\t/** Flush pending reports */\n\tflush?(): Promise<void>;\n}\n\n/**\n * Invariant configuration\n */\nexport interface InvariantConfig {\n\t/** Environment: development throws, production reports */\n\tenv: \"development\" | \"production\" | \"test\";\n\t/** Custom reporter (default: console) */\n\treporter?: InvariantReporter;\n\t/** Enable stack traces */\n\tincludeStack?: boolean;\n}\n\n// =============================================================================\n// Default Configuration\n// =============================================================================\n\nlet globalConfig: InvariantConfig = {\n\tenv: (process.env.NODE_ENV as InvariantConfig[\"env\"]) || \"development\",\n\tincludeStack: true,\n};\n\nconst violationCounts = new Map<string, number>();\n\n/**\n * Console reporter for development\n */\nconst consoleReporter: InvariantReporter = {\n\treport(violation) {\n\t\tconsole.error(`[INVARIANT VIOLATION] ${violation.invariantId}: ${violation.message}`);\n\t\tif (violation.file) {\n\t\t\tconsole.error(` at ${violation.file}${violation.line ? `:${violation.line}` : \"\"}`);\n\t\t}\n\t\tif (violation.context) {\n\t\t\tconsole.error(\" context:\", violation.context);\n\t\t}\n\t},\n};\n\n// =============================================================================\n// Core Functions\n// =============================================================================\n\n/**\n * Configure the invariant system\n */\nexport function configureInvariant(config: Partial<InvariantConfig>): void {\n\tglobalConfig = { ...globalConfig, ...config };\n}\n\n/**\n * Get current invariant configuration\n */\nexport function getInvariantConfig(): InvariantConfig {\n\treturn { ...globalConfig };\n}\n\n/**\n * Reset violation counts (for testing)\n */\nexport function resetViolationCounts(): void {\n\tviolationCounts.clear();\n}\n\n/**\n * Get violation counts by invariant ID\n */\nexport function getViolationCounts(): Map<string, number> {\n\treturn new Map(violationCounts);\n}\n\n/**\n * Core invariant function with reporting\n *\n * @param condition - Condition that must be true\n * @param invariantId - Unique identifier for this invariant\n * @param message - Human-readable message if condition fails\n * @param context - Optional additional context\n *\n * @example\n * ```typescript\n * // Basic usage\n * invariant(user != null, \"user-exists\", \"User must exist\");\n *\n * // With context\n * invariant(\n * storage.path.startsWith(workspaceRoot),\n * \"storage-path-valid\",\n * \"Storage path must be within workspace\",\n * { path: storage.path, workspaceRoot }\n * );\n * ```\n */\nexport function invariant(\n\tcondition: unknown,\n\tinvariantId: string,\n\tmessage: string,\n\tcontext?: Record<string, unknown>,\n): asserts condition {\n\tif (condition) {\n\t\treturn;\n\t}\n\n\t// Track violation count\n\tconst count = (violationCounts.get(invariantId) || 0) + 1;\n\tviolationCounts.set(invariantId, count);\n\n\t// Build violation details\n\tconst violation: InvariantViolation = {\n\t\tinvariantId,\n\t\tmessage,\n\t\tcontext,\n\t\ttimestamp: Date.now(),\n\t};\n\n\t// Add stack trace if configured\n\tif (globalConfig.includeStack) {\n\t\tconst err = new Error();\n\t\tviolation.stack = err.stack;\n\n\t\t// Extract file/line from stack\n\t\tconst stackLines = err.stack?.split(\"\\n\") || [];\n\t\tconst callerLine = stackLines[2]; // Skip Error and invariant lines\n\t\tconst match = callerLine?.match(/at\\s+(?:.+?\\s+)?\\(?(.+?):(\\d+):\\d+\\)?/);\n\t\tif (match) {\n\t\t\tviolation.file = match[1];\n\t\t\tviolation.line = Number.parseInt(match[2], 10);\n\t\t}\n\t}\n\n\t// Report violation\n\tconst reporter = globalConfig.reporter || consoleReporter;\n\treporter.report(violation);\n\n\t// Behavior based on environment\n\tif (globalConfig.env === \"development\" || globalConfig.env === \"test\") {\n\t\t// Development: throw immediately\n\t\tconst err = new Error(`Invariant violation [${invariantId}]: ${message}`);\n\t\terr.name = \"InvariantError\";\n\t\tthrow err;\n\t}\n\n\t// Production: log but don't throw (graceful degradation)\n\t// The reporter should send to telemetry\n}\n\n/**\n * Soft invariant - warns instead of throwing in development\n *\n * Use for conditions that indicate a problem but shouldn't crash the app.\n */\nexport function softInvariant(\n\tcondition: unknown,\n\tinvariantId: string,\n\tmessage: string,\n\tcontext?: Record<string, unknown>,\n): boolean {\n\tif (condition) {\n\t\treturn true;\n\t}\n\n\t// Track violation count\n\tconst count = (violationCounts.get(invariantId) || 0) + 1;\n\tviolationCounts.set(invariantId, count);\n\n\t// Build violation details\n\tconst violation: InvariantViolation = {\n\t\tinvariantId,\n\t\tmessage: `[SOFT] ${message}`,\n\t\tcontext,\n\t\ttimestamp: Date.now(),\n\t};\n\n\t// Report violation\n\tconst reporter = globalConfig.reporter || consoleReporter;\n\treporter.report(violation);\n\n\treturn false;\n}\n\n/**\n * Type guard invariant - asserts type with runtime check\n *\n * @example\n * ```typescript\n * const maybeUser = getUser();\n * typeInvariant(maybeUser, isUser, \"user-type\", \"Expected User type\");\n * // maybeUser is now typed as User\n * ```\n */\nexport function typeInvariant<T>(\n\tvalue: unknown,\n\tguard: (v: unknown) => v is T,\n\tinvariantId: string,\n\tmessage: string,\n\tcontext?: Record<string, unknown>,\n): asserts value is T {\n\tinvariant(guard(value), invariantId, message, {\n\t\t...context,\n\t\tactualType: typeof value,\n\t\tactualValue: value,\n\t});\n}\n\n/**\n * Create a scoped invariant function for a specific domain\n *\n * @example\n * ```typescript\n * const storageInvariant = createScopedInvariant(\"storage\");\n * storageInvariant(path.exists, \"path-exists\", \"Storage path must exist\");\n * // Reports as \"storage:path-exists\"\n * ```\n */\nexport function createScopedInvariant(scope: string) {\n\treturn function scopedInvariant(\n\t\tcondition: unknown,\n\t\tid: string,\n\t\tmessage: string,\n\t\tcontext?: Record<string, unknown>,\n\t): asserts condition {\n\t\tinvariant(condition, `${scope}:${id}`, message, context);\n\t};\n}\n\n// =============================================================================\n// Predefined Invariant Helpers\n// =============================================================================\n\n/**\n * Assert value is not null or undefined\n */\nexport function assertDefined<T>(\n\tvalue: T | null | undefined,\n\tinvariantId: string,\n\tmessage: string,\n): asserts value is T {\n\tinvariant(value != null, invariantId, message, { value });\n}\n\n/**\n * Assert value is a non-empty string\n */\nexport function assertNonEmptyString(value: unknown, invariantId: string, message: string): asserts value is string {\n\tinvariant(typeof value === \"string\" && value.length > 0, invariantId, message, {\n\t\tactualType: typeof value,\n\t\tlength: typeof value === \"string\" ? value.length : \"N/A\",\n\t});\n}\n\n/**\n * Assert value is a positive number\n */\nexport function assertPositiveNumber(value: unknown, invariantId: string, message: string): asserts value is number {\n\tinvariant(typeof value === \"number\" && value > 0 && !Number.isNaN(value), invariantId, message, {\n\t\tactualType: typeof value,\n\t\tvalue,\n\t});\n}\n\n/**\n * Assert array is non-empty\n */\nexport function assertNonEmptyArray<T>(value: unknown, invariantId: string, message: string): asserts value is T[] {\n\tinvariant(Array.isArray(value) && value.length > 0, invariantId, message, {\n\t\tisArray: Array.isArray(value),\n\t\tlength: Array.isArray(value) ? value.length : \"N/A\",\n\t});\n}\n\n/**\n * Assert path is within allowed root (prevents path traversal)\n */\nexport function assertPathWithinRoot(path: string, root: string, invariantId: string): void {\n\tconst normalizedPath = path.replace(/\\\\/g, \"/\");\n\tconst normalizedRoot = root.replace(/\\\\/g, \"/\");\n\n\tinvariant(\n\t\tnormalizedPath.startsWith(normalizedRoot) && !normalizedPath.includes(\"..\"),\n\t\tinvariantId,\n\t\t\"Path must be within allowed root directory\",\n\t\t{ path, root },\n\t);\n}\n","/**\n * Architecture Rules Runner\n *\n * Wraps ts-arch to provide:\n * 1. Declarative rule definitions\n * 2. Project-specific rule configuration\n * 3. Integration with SnapBack's layer architecture\n * 4. Reporting for MCP and CI integration\n *\n * @packageDocumentation\n */\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/**\n * Architecture rule definition\n */\nexport interface ArchRule {\n\t/** Unique rule identifier */\n\tid: string;\n\t/** Human-readable description */\n\tdescription: string;\n\t/** Source pattern (files/folders that should NOT import target) */\n\tsource: string | string[];\n\t/** Target pattern (files/folders that should NOT be imported) */\n\ttarget: string | string[];\n\t/** Rule type */\n\ttype: \"no-dependency\" | \"cycle-free\" | \"layer-dependency\";\n\t/** Severity: error fails build, warning just reports */\n\tseverity: \"error\" | \"warning\";\n\t/** Optional: specific files to exclude from this rule */\n\texclude?: string[];\n}\n\n/**\n * Architecture rule violation\n */\nexport interface ArchViolation {\n\t/** Rule that was violated */\n\truleId: string;\n\t/** Rule description */\n\truleDescription: string;\n\t/** Severity */\n\tseverity: \"error\" | \"warning\";\n\t/** Source file that has the bad import */\n\tsourceFile: string;\n\t/** Target file that should not be imported */\n\ttargetFile?: string;\n\t/** Import path as written in code */\n\timportPath?: string;\n\t/** Line number of violation */\n\tline?: number;\n}\n\n/**\n * Architecture check result\n */\nexport interface ArchCheckResult {\n\t/** Whether all rules passed */\n\tpassed: boolean;\n\t/** Total rules checked */\n\trulesChecked: number;\n\t/** Rules that passed */\n\trulesPassed: number;\n\t/** All violations found */\n\tviolations: ArchViolation[];\n\t/** Execution time in ms */\n\tdurationMs: number;\n\t/** Detailed results per rule */\n\truleResults: Array<{\n\t\truleId: string;\n\t\tpassed: boolean;\n\t\tviolations: ArchViolation[];\n\t}>;\n}\n\n/**\n * Architecture runner configuration\n */\nexport interface ArchRunnerConfig {\n\t/** Workspace root directory */\n\tworkspaceRoot: string;\n\t/** Path to tsconfig.json (default: auto-detect) */\n\ttsconfigPath?: string;\n\t/** Custom rules to add to defaults */\n\tcustomRules?: ArchRule[];\n\t/** Override default rules entirely */\n\toverrideDefaultRules?: boolean;\n\t/** Patterns to exclude from all checks */\n\tglobalExclude?: string[];\n}\n\n// =============================================================================\n// Default SnapBack Layer Rules\n// =============================================================================\n\n/**\n * SnapBack Layer Architecture:\n *\n * Presentation (VSCode, Web, CLI)\n * ↓ can import\n * Service (API, MCP, SDK)\n * ↓ can import\n * Core (Guardian, Engine)\n * ↓ can import\n * Intelligence (Validation, Learning)\n *\n * Key constraint: Presentation CANNOT import Infrastructure directly\n */\nexport const SNAPBACK_LAYER_RULES: ArchRule[] = [\n\t{\n\t\tid: \"presentation-no-infrastructure\",\n\t\tdescription: \"Presentation layer (apps/) cannot import @snapback/infrastructure directly\",\n\t\tsource: [\"apps/vscode\", \"apps/web\", \"apps/cli\"],\n\t\ttarget: [\"@snapback/infrastructure\", \"packages/infrastructure\"],\n\t\ttype: \"no-dependency\",\n\t\tseverity: \"error\",\n\t},\n\t{\n\t\tid: \"core-no-presentation\",\n\t\tdescription: \"Core packages cannot import presentation layer\",\n\t\tsource: [\"packages/core\", \"packages/intelligence\"],\n\t\ttarget: [\"apps/vscode\", \"apps/web\", \"apps/cli\"],\n\t\ttype: \"no-dependency\",\n\t\tseverity: \"error\",\n\t},\n\t{\n\t\tid: \"sdk-no-vscode\",\n\t\tdescription: \"SDK cannot import VS Code specific modules\",\n\t\tsource: [\"packages/sdk\", \"packages-oss/sdk\"],\n\t\ttarget: [\"vscode\", \"apps/vscode\"],\n\t\ttype: \"no-dependency\",\n\t\tseverity: \"error\",\n\t},\n\t{\n\t\tid: \"contracts-standalone\",\n\t\tdescription: \"Contracts package should have no internal dependencies\",\n\t\tsource: [\"packages/contracts\"],\n\t\ttarget: [\"packages/core\", \"packages/infrastructure\", \"packages/intelligence\", \"packages/sdk\", \"apps/\"],\n\t\ttype: \"no-dependency\",\n\t\tseverity: \"error\",\n\t},\n\t{\n\t\tid: \"storage-workspace-only\",\n\t\tdescription: \"Storage operations must use workspace paths, not global paths\",\n\t\tsource: [\"**/storage/**\", \"**/snapshot/**\"],\n\t\ttarget: [\"globalStorageUri\", \"globalState\"],\n\t\ttype: \"no-dependency\",\n\t\tseverity: \"warning\",\n\t},\n\t{\n\t\tid: \"no-circular-core\",\n\t\tdescription: \"Core packages must be free of circular dependencies\",\n\t\tsource: [\"packages/core/src\"],\n\t\ttarget: [],\n\t\ttype: \"cycle-free\",\n\t\tseverity: \"error\",\n\t},\n\t{\n\t\tid: \"no-circular-intelligence\",\n\t\tdescription: \"Intelligence package must be free of circular dependencies\",\n\t\tsource: [\"packages/intelligence/src\"],\n\t\ttarget: [],\n\t\ttype: \"cycle-free\",\n\t\tseverity: \"error\",\n\t},\n];\n\n// =============================================================================\n// Architecture Rules Runner\n// =============================================================================\n\n/**\n * Run architecture rules check\n *\n * Uses static analysis to verify import relationships without\n * requiring ts-arch as a runtime dependency.\n *\n * @example\n * ```typescript\n * const result = await runArchCheck({\n * workspaceRoot: process.cwd(),\n * customRules: [{\n * id: \"my-rule\",\n * description: \"Custom rule\",\n * source: \"src/api\",\n * target: \"src/ui\",\n * type: \"no-dependency\",\n * severity: \"error\"\n * }]\n * });\n *\n * if (!result.passed) {\n * console.error(\"Architecture violations:\", result.violations);\n * }\n * ```\n */\nexport async function runArchCheck(config: ArchRunnerConfig): Promise<ArchCheckResult> {\n\tconst startTime = Date.now();\n\n\t// Combine rules\n\tconst rules = config.overrideDefaultRules\n\t\t? config.customRules || []\n\t\t: [...SNAPBACK_LAYER_RULES, ...(config.customRules || [])];\n\n\tconst violations: ArchViolation[] = [];\n\tconst ruleResults: ArchCheckResult[\"ruleResults\"] = [];\n\n\t// Check each rule\n\tfor (const rule of rules) {\n\t\tconst ruleViolations = await checkRule(rule, config);\n\t\truleResults.push({\n\t\t\truleId: rule.id,\n\t\t\tpassed: ruleViolations.length === 0,\n\t\t\tviolations: ruleViolations,\n\t\t});\n\t\tviolations.push(...ruleViolations);\n\t}\n\n\tconst errorCount = violations.filter((v) => v.severity === \"error\").length;\n\n\treturn {\n\t\tpassed: errorCount === 0,\n\t\trulesChecked: rules.length,\n\t\trulesPassed: ruleResults.filter((r) => r.passed).length,\n\t\tviolations,\n\t\tdurationMs: Date.now() - startTime,\n\t\truleResults,\n\t};\n}\n\n/**\n * Check a single architecture rule\n */\nasync function checkRule(rule: ArchRule, config: ArchRunnerConfig): Promise<ArchViolation[]> {\n\tconst violations: ArchViolation[] = [];\n\n\tswitch (rule.type) {\n\t\tcase \"no-dependency\":\n\t\t\tviolations.push(...(await checkNoDependency(rule, config)));\n\t\t\tbreak;\n\t\tcase \"cycle-free\":\n\t\t\tviolations.push(...(await checkCycleFree(rule, config)));\n\t\t\tbreak;\n\t\tcase \"layer-dependency\":\n\t\t\t// Future: validate layer hierarchy\n\t\t\tbreak;\n\t}\n\n\treturn violations;\n}\n\n/**\n * Check no-dependency rule using grep-based static analysis\n */\nasync function checkNoDependency(rule: ArchRule, config: ArchRunnerConfig): Promise<ArchViolation[]> {\n\tconst violations: ArchViolation[] = [];\n\tconst { join, relative } = await import(\"node:path\");\n\n\tconst sources = Array.isArray(rule.source) ? rule.source : [rule.source];\n\tconst targets = Array.isArray(rule.target) ? rule.target : [rule.target];\n\n\tfor (const source of sources) {\n\t\tconst sourceDir = join(config.workspaceRoot, source);\n\n\t\tfor (const target of targets) {\n\t\t\t// Build grep pattern for import/require of target\n\t\t\tconst patterns = [\n\t\t\t\t`from ['\"]${escapeRegex(target)}`, // ES import\n\t\t\t\t`from ['\"]${escapeRegex(target)}/`, // ES import subpath\n\t\t\t\t`require\\\\(['\"]${escapeRegex(target)}`, // CommonJS require\n\t\t\t\t`require\\\\(['\"]${escapeRegex(target)}/`, // CommonJS require subpath\n\t\t\t\t`import\\\\(['\"]${escapeRegex(target)}`, // Dynamic import\n\t\t\t];\n\n\t\t\tconst pattern = patterns.join(\"|\");\n\n\t\t\ttry {\n\t\t\t\tconst result = await runGrep(sourceDir, pattern, config.globalExclude);\n\n\t\t\t\tfor (const match of result) {\n\t\t\t\t\t// Skip excluded files\n\t\t\t\t\tif (rule.exclude?.some((ex) => match.file.includes(ex))) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tviolations.push({\n\t\t\t\t\t\truleId: rule.id,\n\t\t\t\t\t\truleDescription: rule.description,\n\t\t\t\t\t\tseverity: rule.severity,\n\t\t\t\t\t\tsourceFile: relative(config.workspaceRoot, match.file),\n\t\t\t\t\t\ttargetFile: target,\n\t\t\t\t\t\timportPath: match.match,\n\t\t\t\t\t\tline: match.line,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\t// Directory might not exist, skip\n\t\t\t}\n\t\t}\n\t}\n\n\treturn violations;\n}\n\n/**\n * Check cycle-free rule using madge\n */\nasync function checkCycleFree(rule: ArchRule, config: ArchRunnerConfig): Promise<ArchViolation[]> {\n\tconst violations: ArchViolation[] = [];\n\tconst { existsSync } = await import(\"node:fs\");\n\tconst { join, relative } = await import(\"node:path\");\n\n\tconst sources = Array.isArray(rule.source) ? rule.source : [rule.source];\n\n\tfor (const source of sources) {\n\t\tconst sourceDir = join(config.workspaceRoot, source);\n\n\t\tif (!existsSync(sourceDir)) {\n\t\t\tcontinue;\n\t\t}\n\n\t\ttry {\n\t\t\t// Dynamic import madge\n\t\t\tconst madgeModule = await import(\"madge\");\n\t\t\tconst madge = madgeModule.default || madgeModule;\n\n\t\t\tconst result = await madge(sourceDir, {\n\t\t\t\tfileExtensions: [\"ts\", \"tsx\", \"js\", \"jsx\"],\n\t\t\t\texcludeRegExp: [\n\t\t\t\t\t/node_modules/,\n\t\t\t\t\t/dist/,\n\t\t\t\t\t/\\.next/,\n\t\t\t\t\t/\\.test\\./,\n\t\t\t\t\t/\\.spec\\./,\n\t\t\t\t\t/__tests__/,\n\t\t\t\t\t/__mocks__/,\n\t\t\t\t\t...(config.globalExclude?.map((p) => new RegExp(p)) || []),\n\t\t\t\t],\n\t\t\t\tdetectiveOptions: { ts: { skipTypeImports: true } },\n\t\t\t});\n\n\t\t\tconst cycles = result.circular() as string[][];\n\n\t\t\tfor (const cycle of cycles) {\n\t\t\t\tviolations.push({\n\t\t\t\t\truleId: rule.id,\n\t\t\t\t\truleDescription: rule.description,\n\t\t\t\t\tseverity: rule.severity,\n\t\t\t\t\tsourceFile: relative(config.workspaceRoot, join(sourceDir, cycle[0])),\n\t\t\t\t\timportPath: cycle.join(\" -> \"),\n\t\t\t\t});\n\t\t\t}\n\t\t} catch {\n\t\t\t// madge might fail for some directories\n\t\t}\n\t}\n\n\treturn violations;\n}\n\n// =============================================================================\n// Helpers\n// =============================================================================\n\ninterface GrepMatch {\n\tfile: string;\n\tline: number;\n\tmatch: string;\n}\n\n/**\n * Run grep to find import patterns\n */\nasync function runGrep(dir: string, pattern: string, exclude?: string[]): Promise<GrepMatch[]> {\n\tconst { spawn } = await import(\"node:child_process\");\n\tconst { existsSync } = await import(\"node:fs\");\n\n\tif (!existsSync(dir)) {\n\t\treturn [];\n\t}\n\n\treturn new Promise((resolve) => {\n\t\tconst args = [\n\t\t\t\"-r\", // recursive\n\t\t\t\"-n\", // line numbers\n\t\t\t\"-E\", // extended regex\n\t\t\t\"--include=*.ts\",\n\t\t\t\"--include=*.tsx\",\n\t\t\t\"--include=*.js\",\n\t\t\t\"--include=*.jsx\",\n\t\t];\n\n\t\t// Add exclusions\n\t\tfor (const ex of exclude || []) {\n\t\t\targs.push(`--exclude-dir=${ex}`);\n\t\t}\n\t\targs.push(\"--exclude-dir=node_modules\");\n\t\targs.push(\"--exclude-dir=dist\");\n\t\targs.push(\"--exclude-dir=.next\");\n\n\t\targs.push(pattern);\n\t\targs.push(dir);\n\n\t\tconst proc = spawn(\"grep\", args, {\n\t\t\tcwd: dir,\n\t\t\tstdio: [\"pipe\", \"pipe\", \"pipe\"],\n\t\t});\n\n\t\tlet stdout = \"\";\n\t\tproc.stdout?.on(\"data\", (data) => {\n\t\t\tstdout += data.toString();\n\t\t});\n\n\t\tproc.on(\"close\", () => {\n\t\t\tconst matches: GrepMatch[] = [];\n\t\t\tconst lines = stdout.split(\"\\n\").filter(Boolean);\n\n\t\t\tfor (const line of lines) {\n\t\t\t\t// Parse grep output: file:line:content\n\t\t\t\tconst colonIdx = line.indexOf(\":\");\n\t\t\t\tif (colonIdx === -1) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tconst file = line.slice(0, colonIdx);\n\t\t\t\tconst rest = line.slice(colonIdx + 1);\n\t\t\t\tconst lineNumIdx = rest.indexOf(\":\");\n\t\t\t\tif (lineNumIdx === -1) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tconst lineNum = Number.parseInt(rest.slice(0, lineNumIdx), 10);\n\t\t\t\tconst content = rest.slice(lineNumIdx + 1);\n\n\t\t\t\tmatches.push({\n\t\t\t\t\tfile,\n\t\t\t\t\tline: lineNum,\n\t\t\t\t\tmatch: content.trim(),\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tresolve(matches);\n\t\t});\n\n\t\tproc.on(\"error\", () => {\n\t\t\tresolve([]);\n\t\t});\n\t});\n}\n\n/**\n * Escape string for use in regex\n */\nfunction escapeRegex(str: string): string {\n\treturn str.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\n// =============================================================================\n// Rule Builders (Fluent API)\n// =============================================================================\n\n/**\n * Fluent rule builder for creating custom rules\n *\n * @example\n * ```typescript\n * const rule = createRule(\"my-rule\", \"Description\")\n * .filesIn(\"src/api\")\n * .shouldNotDependOn(\"src/ui\")\n * .withSeverity(\"error\")\n * .build();\n * ```\n */\nexport function createRule(id: string, description: string) {\n\tconst rule: Partial<ArchRule> = { id, description, severity: \"error\" };\n\n\treturn {\n\t\tfilesIn(pattern: string | string[]) {\n\t\t\trule.source = pattern;\n\t\t\treturn this;\n\t\t},\n\t\tshouldNotDependOn(pattern: string | string[]) {\n\t\t\trule.target = pattern;\n\t\t\trule.type = \"no-dependency\";\n\t\t\treturn this;\n\t\t},\n\t\tshouldBeCycleFree() {\n\t\t\trule.type = \"cycle-free\";\n\t\t\trule.target = [];\n\t\t\treturn this;\n\t\t},\n\t\twithSeverity(severity: \"error\" | \"warning\") {\n\t\t\trule.severity = severity;\n\t\t\treturn this;\n\t\t},\n\t\texcluding(patterns: string[]) {\n\t\t\trule.exclude = patterns;\n\t\t\treturn this;\n\t\t},\n\t\tbuild(): ArchRule {\n\t\t\tif (!rule.source) {\n\t\t\t\tthrow new Error(`Rule ${id} must specify source with filesIn()`);\n\t\t\t}\n\t\t\tif (!rule.type) {\n\t\t\t\tthrow new Error(`Rule ${id} must specify constraint type`);\n\t\t\t}\n\t\t\treturn rule as ArchRule;\n\t\t},\n\t};\n}\n","/**\n * Device Authorization Client (RFC 8628)\n *\n * Shared client for device authorization flow used by CLI and VSCode extension.\n * Implements OAuth 2.0 Device Authorization Grant (RFC 8628) for devices\n * with limited input capabilities or where browser OAuth callbacks don't work.\n *\n * @see https://tools.ietf.org/html/rfc8628\n */\n\nimport ky, { type KyInstance } from \"ky\";\n\n/**\n * Device code response from authorization server (RFC 8628 Section 3.2)\n */\nexport interface DeviceCodeResponse {\n\t/** Device code for polling requests */\n\tdevice_code: string;\n\t/** User-friendly code to display for verification */\n\tuser_code: string;\n\t/** URL where user enters the user code */\n\tverification_uri: string;\n\t/** Optional: Pre-filled verification URI with user code */\n\tverification_uri_complete?: string;\n\t/** Seconds until device code expires */\n\texpires_in: number;\n\t/** Recommended polling interval in seconds (minimum 5) */\n\tinterval: number;\n}\n\n/**\n * Token response on successful authorization\n */\nexport interface TokenResponse {\n\t/** Bearer token for API access */\n\taccess_token: string;\n\t/** Token type (always \"Bearer\") */\n\ttoken_type: \"Bearer\";\n\t/** Token expiration time in seconds */\n\texpires_in?: number;\n\t/** Optional refresh token */\n\trefresh_token?: string;\n\t/** Granted scopes (space-separated) */\n\tscope?: string;\n}\n\n/**\n * RFC 8628 error codes during polling\n */\nexport type DeviceAuthError =\n\t| \"authorization_pending\"\n\t| \"slow_down\"\n\t| \"expired_token\"\n\t| \"access_denied\"\n\t| \"invalid_request\";\n\n/**\n * Error response during token polling\n */\nexport interface DeviceAuthErrorResponse {\n\terror: DeviceAuthError;\n\terror_description?: string;\n}\n\n/**\n * Auth result returned to consumers\n */\nexport interface AuthResult {\n\tapi_key: string;\n\tuser_id: string;\n\ttier: \"free\" | \"pro\" | \"enterprise\";\n\taccess_token: string;\n\trefresh_token?: string;\n\texpires_in?: number;\n}\n\n/**\n * Flow state for tracking authentication progress\n */\nexport type FlowState = \"idle\" | \"requesting_code\" | \"waiting_for_approval\" | \"approved\" | \"cancelled\" | \"error\";\n\n/**\n * Event callbacks for tracking authentication progress\n */\nexport interface DeviceAuthCallbacks {\n\t/** Called when device code is received and user should visit verification URL */\n\tonDeviceCode?: (response: DeviceCodeResponse) => void;\n\t/** Called on each poll attempt */\n\tonPoll?: (attempt: number, intervalMs: number) => void;\n\t/** Called when polling interval is increased (slow_down response) */\n\tonSlowDown?: (newIntervalMs: number) => void;\n\t/** Called when authorization succeeds */\n\tonApproved?: (result: AuthResult) => void;\n\t/** Called when an error occurs */\n\tonError?: (error: Error, code?: DeviceAuthError) => void;\n\t/** Called when flow is cancelled */\n\tonCancelled?: () => void;\n}\n\n/**\n * Configuration for DeviceAuthClient\n */\nexport interface DeviceAuthClientConfig {\n\t/** Base URL for API (e.g., \"https://api.snapback.dev/api\") */\n\tbaseUrl: string;\n\t/** Client identifier for the requesting application */\n\tclientId: string;\n\t/** Optional scopes to request */\n\tscope?: string;\n\t/** Custom HTTP client (for testing) */\n\thttpClient?: KyInstance;\n\t/** Optional AbortSignal for cancellation */\n\tsignal?: AbortSignal;\n}\n\n/**\n * Device Authorization Client\n *\n * Implements RFC 8628 OAuth 2.0 Device Authorization Grant.\n * Used by CLI and VSCode extension for authentication in environments\n * where browser OAuth callbacks don't work (WSL, Remote SSH, Codespaces).\n *\n * @example\n * ```typescript\n * const client = new DeviceAuthClient({\n * baseUrl: \"https://api.snapback.dev/api\",\n * clientId: \"vscode-extension\",\n * });\n *\n * const result = await client.authenticate({\n * onDeviceCode: (response) => {\n * console.log(`Visit ${response.verification_uri}`);\n * console.log(`Enter code: ${response.user_code}`);\n * },\n * onApproved: (result) => {\n * console.log(`Authenticated as ${result.user_id}`);\n * },\n * });\n * ```\n */\nexport class DeviceAuthClient {\n\tprivate http: KyInstance;\n\tprivate config: DeviceAuthClientConfig;\n\tprivate state: FlowState = \"idle\";\n\tprivate abortController: AbortController | null = null;\n\tprivate currentInterval = 5000; // Default 5 seconds\n\n\tconstructor(config: DeviceAuthClientConfig) {\n\t\tthis.config = config;\n\t\tthis.http =\n\t\t\tconfig.httpClient ??\n\t\t\tky.create({\n\t\t\t\tprefixUrl: config.baseUrl,\n\t\t\t\ttimeout: 30000,\n\t\t\t});\n\t}\n\n\t/**\n\t * Get current flow state\n\t */\n\tgetState(): FlowState {\n\t\treturn this.state;\n\t}\n\n\t/**\n\t * Cancel the authentication flow\n\t */\n\tcancel(): void {\n\t\tthis.abortController?.abort();\n\t\tthis.state = \"cancelled\";\n\t}\n\n\t/**\n\t * Start device authorization flow\n\t *\n\t * @param callbacks - Event callbacks for tracking progress\n\t * @returns AuthResult on success\n\t * @throws Error on failure or cancellation\n\t */\n\tasync authenticate(callbacks?: DeviceAuthCallbacks): Promise<AuthResult> {\n\t\t// Prevent concurrent authentications\n\t\tif (this.state === \"requesting_code\" || this.state === \"waiting_for_approval\") {\n\t\t\tthrow new Error(\"Authentication already in progress\");\n\t\t}\n\n\t\tthis.abortController = new AbortController();\n\t\tthis.state = \"requesting_code\";\n\n\t\ttry {\n\t\t\t// Step 1: Request device code\n\t\t\tconst deviceCodeResponse = await this.requestDeviceCode();\n\t\t\tcallbacks?.onDeviceCode?.(deviceCodeResponse);\n\n\t\t\t// Step 2: Set up polling\n\t\t\tthis.currentInterval = deviceCodeResponse.interval * 1000;\n\t\t\tthis.state = \"waiting_for_approval\";\n\n\t\t\t// Step 3: Poll for token\n\t\t\tconst result = await this.pollForToken(deviceCodeResponse, callbacks);\n\n\t\t\tthis.state = \"approved\";\n\t\t\tcallbacks?.onApproved?.(result);\n\n\t\t\treturn result;\n\t\t} catch (error) {\n\t\t\t// Note: state could be \"cancelled\" if cancel() was called from another context\n\t\t\tconst currentState = this.state as FlowState;\n\t\t\tif (currentState !== \"cancelled\") {\n\t\t\t\tthis.state = \"error\";\n\t\t\t}\n\n\t\t\tconst err = error instanceof Error ? error : new Error(String(error));\n\n\t\t\tif (currentState === \"cancelled\") {\n\t\t\t\tcallbacks?.onCancelled?.();\n\t\t\t} else {\n\t\t\t\tcallbacks?.onError?.(err);\n\t\t\t}\n\n\t\t\tthrow err;\n\t\t}\n\t}\n\n\t/**\n\t * Request device code from authorization server (RFC 8628 Section 3.1)\n\t */\n\tprivate async requestDeviceCode(): Promise<DeviceCodeResponse> {\n\t\tconst signal = this.mergeSignals();\n\n\t\ttry {\n\t\t\tconst response = await this.http\n\t\t\t\t.post(\"deviceAuth/requestCode\", {\n\t\t\t\t\tjson: {\n\t\t\t\t\t\tclient_id: this.config.clientId,\n\t\t\t\t\t\tscope: this.config.scope,\n\t\t\t\t\t},\n\t\t\t\t\tsignal,\n\t\t\t\t})\n\t\t\t\t.json<DeviceCodeResponse>();\n\n\t\t\tif (!response.device_code) {\n\t\t\t\tthrow new Error(\"Invalid device code response: missing device_code\");\n\t\t\t}\n\n\t\t\treturn response;\n\t\t} catch (error) {\n\t\t\tthis.handleAbortError(error);\n\t\t\tthrow new Error(`Device code request failed: ${error instanceof Error ? error.message : String(error)}`);\n\t\t}\n\t}\n\n\t/**\n\t * Poll for token with RFC 8628 compliant error handling\n\t */\n\tprivate async pollForToken(\n\t\tdeviceCodeResponse: DeviceCodeResponse,\n\t\tcallbacks?: DeviceAuthCallbacks,\n\t): Promise<AuthResult> {\n\t\tconst { device_code, expires_in } = deviceCodeResponse;\n\t\tconst startTime = Date.now();\n\t\tconst timeoutMs = expires_in * 1000;\n\t\tlet attempt = 0;\n\n\t\twhile (true) {\n\t\t\t// Check for timeout\n\t\t\tif (Date.now() - startTime > timeoutMs) {\n\t\t\t\tthrow new Error(\"Device code expired - authentication timeout\");\n\t\t\t}\n\n\t\t\t// Check for cancellation\n\t\t\tif (this.abortController?.signal.aborted) {\n\t\t\t\tthis.state = \"cancelled\";\n\t\t\t\tthrow new Error(\"Authentication cancelled\");\n\t\t\t}\n\n\t\t\t// Wait before polling\n\t\t\tawait this.delay(this.currentInterval);\n\n\t\t\tattempt++;\n\t\t\tcallbacks?.onPoll?.(attempt, this.currentInterval);\n\n\t\t\ttry {\n\t\t\t\tconst signal = this.mergeSignals();\n\n\t\t\t\tconst response = await this.http\n\t\t\t\t\t.post(\"deviceAuth/pollToken\", {\n\t\t\t\t\t\tjson: {\n\t\t\t\t\t\t\tdevice_code,\n\t\t\t\t\t\t\tgrant_type: \"urn:ietf:params:oauth:grant-type:device_code\",\n\t\t\t\t\t\t\tclient_id: this.config.clientId,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tsignal,\n\t\t\t\t\t})\n\t\t\t\t\t.json<TokenResponse | DeviceAuthErrorResponse>();\n\n\t\t\t\t// Check for success\n\t\t\t\tif (\"access_token\" in response) {\n\t\t\t\t\treturn this.mapTokenToAuthResult(response);\n\t\t\t\t}\n\n\t\t\t\t// Handle RFC 8628 error codes\n\t\t\t\tif (\"error\" in response) {\n\t\t\t\t\tswitch (response.error) {\n\t\t\t\t\t\tcase \"authorization_pending\":\n\t\t\t\t\t\t\t// User hasn't approved yet - continue polling\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase \"slow_down\":\n\t\t\t\t\t\t\t// Server requested slower polling - increase interval by 5s\n\t\t\t\t\t\t\tthis.currentInterval += 5000;\n\t\t\t\t\t\t\tcallbacks?.onSlowDown?.(this.currentInterval);\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase \"access_denied\":\n\t\t\t\t\t\t\tcallbacks?.onError?.(new Error(\"Authorization denied by user\"), \"access_denied\");\n\t\t\t\t\t\t\tthrow new Error(\"Authorization denied by user\");\n\n\t\t\t\t\t\tcase \"expired_token\":\n\t\t\t\t\t\t\tcallbacks?.onError?.(new Error(\"Device code expired\"), \"expired_token\");\n\t\t\t\t\t\t\tthrow new Error(\"Device code expired on server\");\n\n\t\t\t\t\t\tcase \"invalid_request\":\n\t\t\t\t\t\t\tcallbacks?.onError?.(new Error(\"Invalid device code\"), \"invalid_request\");\n\t\t\t\t\t\t\tthrow new Error(\"Invalid device code format\");\n\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tthrow new Error(`Unknown error: ${response.error}`);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tthis.handleAbortError(error);\n\n\t\t\t\t// Re-throw terminal errors\n\t\t\t\tif (error instanceof Error) {\n\t\t\t\t\tif (\n\t\t\t\t\t\terror.message.includes(\"cancelled\") ||\n\t\t\t\t\t\terror.message.includes(\"denied\") ||\n\t\t\t\t\t\terror.message.includes(\"expired\") ||\n\t\t\t\t\t\terror.message.includes(\"Invalid\")\n\t\t\t\t\t) {\n\t\t\t\t\t\tthrow error;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// Network errors - continue polling\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Map token response to AuthResult\n\t */\n\tprivate mapTokenToAuthResult(token: TokenResponse): AuthResult {\n\t\t// In production, user_id and tier would be extracted from JWT claims\n\t\t// For now, use placeholder values that should be updated by the caller\n\t\treturn {\n\t\t\tapi_key: token.access_token,\n\t\t\tuser_id: \"user-from-token\", // Extract from JWT claims\n\t\t\ttier: \"free\", // Extract from JWT claims\n\t\t\taccess_token: token.access_token,\n\t\t\trefresh_token: token.refresh_token,\n\t\t\texpires_in: token.expires_in,\n\t\t};\n\t}\n\n\t/**\n\t * Delay execution with cancellation support\n\t */\n\tprivate delay(ms: number): Promise<void> {\n\t\treturn new Promise((resolve) => {\n\t\t\tconst timeout = setTimeout(resolve, ms);\n\n\t\t\tthis.abortController?.signal.addEventListener(\n\t\t\t\t\"abort\",\n\t\t\t\t() => {\n\t\t\t\t\tclearTimeout(timeout);\n\t\t\t\t\tresolve();\n\t\t\t\t},\n\t\t\t\t{ once: true },\n\t\t\t);\n\t\t});\n\t}\n\n\t/**\n\t * Merge configured signal with internal abort controller\n\t */\n\tprivate mergeSignals(): AbortSignal | undefined {\n\t\tconst signals: AbortSignal[] = [];\n\n\t\tif (this.abortController?.signal) {\n\t\t\tsignals.push(this.abortController.signal);\n\t\t}\n\n\t\tif (this.config.signal) {\n\t\t\tsignals.push(this.config.signal);\n\t\t}\n\n\t\tif (signals.length === 0) {\n\t\t\treturn undefined;\n\t\t}\n\t\tif (signals.length === 1) {\n\t\t\treturn signals[0];\n\t\t}\n\n\t\t// For multiple signals, create a combined controller\n\t\tconst combined = new AbortController();\n\n\t\tfor (const signal of signals) {\n\t\t\tif (signal.aborted) {\n\t\t\t\tcombined.abort();\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tsignal.addEventListener(\"abort\", () => combined.abort(), { once: true });\n\t\t}\n\n\t\treturn combined.signal;\n\t}\n\n\t/**\n\t * Handle abort errors consistently\n\t */\n\tprivate handleAbortError(error: unknown): void {\n\t\tif (error instanceof Error && error.name === \"AbortError\") {\n\t\t\tthis.state = \"cancelled\";\n\t\t\tthrow new Error(\"Authentication cancelled\");\n\t\t}\n\t}\n}\n\n/**\n * Create a device auth client with default configuration\n */\nexport function createDeviceAuthClient(\n\tbaseUrl: string,\n\tclientId: string,\n\toptions?: Partial<DeviceAuthClientConfig>,\n): DeviceAuthClient {\n\treturn new DeviceAuthClient({\n\t\tbaseUrl,\n\t\tclientId,\n\t\t...options,\n\t});\n}\n","import QuickLRU from \"quick-lru\";\n\nexport interface CacheConfig {\n\tenabled: boolean;\n\tttl: Record<string, number>;\n\tmaxSize?: number;\n}\n\n/**\n * Generic LRU cache with TTL support\n * @template T - The type of values stored in the cache\n */\nexport class LRUCache<T = unknown> {\n\tprivate cache: QuickLRU<string, { value: T; expiry: number }>;\n\tprivate config: CacheConfig;\n\n\tconstructor(config: CacheConfig) {\n\t\tthis.config = {\n\t\t\tmaxSize: 1000,\n\t\t\t...config,\n\t\t};\n\n\t\tthis.cache = new QuickLRU({\n\t\t\tmaxSize: this.config.maxSize || 1000,\n\t\t});\n\t}\n\n\t/**\n\t * Get a value from the cache\n\t * @returns The cached value or null if not found/expired\n\t */\n\tget(key: string): T | null {\n\t\tif (!this.config.enabled) {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst item = this.cache.get(key);\n\t\tif (!item) {\n\t\t\treturn null;\n\t\t}\n\n\t\t// Check if item has expired (atomic check)\n\t\tconst now = Date.now();\n\t\tif (now > item.expiry) {\n\t\t\tthis.cache.delete(key);\n\t\t\treturn null;\n\t\t}\n\n\t\treturn item.value;\n\t}\n\n\t/**\n\t * Set a value in the cache\n\t * @param key - Cache key\n\t * @param value - Value to cache\n\t * @param ttlSeconds - Time to live in seconds (default: 300)\n\t */\n\tset(key: string, value: T, ttlSeconds = 300): void {\n\t\tif (!this.config.enabled) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst expiry = Date.now() + ttlSeconds * 1000;\n\t\tthis.cache.set(key, { value, expiry });\n\t}\n\n\t/**\n\t * Check if a key exists in the cache and is not expired\n\t */\n\thas(key: string): boolean {\n\t\tif (!this.config.enabled) {\n\t\t\treturn false;\n\t\t}\n\n\t\tconst item = this.cache.get(key);\n\t\tif (!item) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Check if item has expired (atomic check)\n\t\tconst now = Date.now();\n\t\tif (now > item.expiry) {\n\t\t\tthis.cache.delete(key);\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Delete a key from the cache\n\t */\n\tdelete(key: string): boolean {\n\t\treturn this.cache.delete(key);\n\t}\n\n\t/**\n\t * Clear all items from the cache\n\t */\n\tclear(): void {\n\t\tthis.cache.clear();\n\t}\n\n\t/**\n\t * Get the number of items in the cache\n\t */\n\tsize(): number {\n\t\treturn this.cache.size;\n\t}\n}\n","import crypto from \"node:crypto\";\nimport type { FileMetadata } from \"@snapback-oss/contracts\";\n\n// Define file extensions by category at module level for better performance\nconst CODE_EXTENSIONS = [\n\t\"ts\",\n\t\"js\",\n\t\"jsx\",\n\t\"tsx\",\n\t\"py\",\n\t\"java\",\n\t\"c\",\n\t\"cpp\",\n\t\"h\",\n\t\"hpp\",\n\t\"rb\",\n\t\"go\",\n\t\"php\",\n\t\"pl\",\n\t\"rs\",\n\t\"swift\",\n\t\"kt\",\n\t\"dart\",\n\t\"scala\",\n\t\"sql\",\n];\n\nconst CONFIG_EXTENSIONS = [\n\t\"json\",\n\t\"env\",\n\t\"yml\",\n\t\"yaml\",\n\t\"xml\",\n\t\"html\",\n\t\"css\",\n\t\"scss\",\n\t\"less\",\n\t\"map\",\n\t\"lock\",\n\t\"conf\",\n\t\"ini\",\n\t\"bat\",\n\t\"ps1\",\n];\n\nconst DOCUMENT_EXTENSIONS = [\"md\", \"txt\", \"csv\", \"log\", \"pdf\", \"docx\", \"doc\", \"xlsx\", \"xls\", \"pptx\", \"ppt\"];\n\nconst IMAGE_EXTENSIONS = [\"svg\", \"png\", \"jpg\", \"jpeg\", \"gif\", \"bmp\", \"ico\", \"webp\", \"avif\"];\n\nconst MEDIA_EXTENSIONS = [\"mp4\", \"mov\", \"avi\", \"mkv\", \"mp3\", \"wav\", \"ogg\", \"flac\", \"aac\", \"m4a\", \"webm\"];\n\nconst ARCHIVE_EXTENSIONS = [\"zip\", \"tar\", \"gz\", \"tgz\", \"rar\", \"7z\"];\nconst DATABASE_EXTENSIONS = [\"db\", \"db3\", \"sqlite\", \"dbf\", \"bak\"];\nconst BINARY_EXTENSIONS = [\"wasm\"];\n\n// Combine all extensions and pre-compile regex pattern for performance\nconst ALL_EXTENSIONS = [\n\t...CODE_EXTENSIONS,\n\t...CONFIG_EXTENSIONS,\n\t...DOCUMENT_EXTENSIONS,\n\t...IMAGE_EXTENSIONS,\n\t...MEDIA_EXTENSIONS,\n\t...ARCHIVE_EXTENSIONS,\n\t...DATABASE_EXTENSIONS,\n\t...BINARY_EXTENSIONS,\n];\n\n// Pre-compiled regex pattern to avoid repeated RegExp construction\nconst FILE_EXTENSION_REGEX = new RegExp(`\\\\b\\\\w+\\\\.(${ALL_EXTENSIONS.join(\"|\")})\\\\b`, \"gi\");\n\nexport class PrivacySanitizer {\n\tconstructor(\n\t\tprivate config: {\n\t\t\thashFilePaths: boolean;\n\t\t\tanonymizeWorkspace: boolean;\n\t\t},\n\t) {}\n\n\t/**\n\t * Sanitize file metadata to ensure privacy\n\t * Removes any potentially sensitive data\n\t */\n\tsanitize(metadata: FileMetadata): FileMetadata {\n\t\t// Create defensive copy to prevent mutating original\n\t\tconst copy = structuredClone(metadata) as any;\n\n\t\t// Hash file path if enabled\n\t\tif (this.config.hashFilePaths && \"path\" in copy) {\n\t\t\tconst filePath = copy.path;\n\t\t\tconst hashedPath = this.hashFilePath(filePath);\n\t\t\tcopy.pathHash = hashedPath;\n\t\t\t// Keep path field but populate with hash to satisfy contracts\n\t\t\tcopy.path = hashedPath;\n\t\t}\n\n\t\t// Remove sensitive risk factors\n\t\tif (copy.risk?.factors) {\n\t\t\t// The new RiskScore has factors as objects, not strings\n\t\t\tcopy.risk.factors = copy.risk.factors.map((factor: any) => ({\n\t\t\t\t...factor,\n\t\t\t\ttype: this.sanitizeString(factor.type),\n\t\t\t}));\n\t\t}\n\n\t\treturn copy as FileMetadata;\n\t}\n\n\t/**\n\t * Validate that metadata contains no sensitive data\n\t */\n\tisPrivacySafe(metadata: any): boolean {\n\t\t// Blacklist of forbidden properties\n\t\tconst forbiddenProps = [\"content\", \"sourceCode\", \"fileContent\", \"code\", \"text\", \"body\", \"fullPath\"];\n\n\t\t// Check for forbidden properties\n\t\tfor (const prop of forbiddenProps) {\n\t\t\tif (prop in metadata) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\t// Allow path if it's hashed (matches pathHash)\n\t\tif (\"path\" in metadata && \"pathHash\" in metadata) {\n\t\t\t// If both exist, path should equal pathHash when hashing is enabled\n\t\t\tif (metadata.path !== metadata.pathHash) {\n\t\t\t\treturn false; // path is not hashed, forbidden\n\t\t\t}\n\t\t} else if (\"path\" in metadata && !(\"pathHash\" in metadata)) {\n\t\t\t// path exists without pathHash, forbidden\n\t\t\treturn false;\n\t\t}\n\n\t\t// Check nested objects\n\t\tfor (const [_key, value] of Object.entries(metadata)) {\n\t\t\tif (typeof value === \"object\" && value !== null) {\n\t\t\t\tif (!this.isPrivacySafe(value)) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Check for suspiciously large strings (potential code content)\n\t\t\tif (typeof value === \"string\" && value.length > 1000) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Hash file path with workspace salt\n\t */\n\tprivate hashFilePath(filePath: string): string {\n\t\treturn crypto.createHash(\"sha256\").update(filePath).digest(\"hex\");\n\t}\n\n\t/**\n\t * Sanitize string to remove specific identifiers\n\t */\n\tprivate sanitizeString(str: string): string {\n\t\t// Handle undefined or null strings\n\t\tif (!str) {\n\t\t\treturn \"\";\n\t\t}\n\n\t\t// Prevent ReDoS by limiting input size\n\t\tif (str.length > 10000) {\n\t\t\tthrow new Error(\"Input too large for sanitization\");\n\t\t}\n\n\t\t// Replace specific file names with generic placeholders\n\t\t// Use safer regex patterns that don't cause backtracking\n\t\t// Use pre-compiled regex for better performance\n\t\treturn str\n\t\t\t.replace(/\"[^\"]*\"/g, '\"<redacted>\"') // Remove quoted strings (safer)\n\t\t\t.replace(FILE_EXTENSION_REGEX, \"<file>\") // Remove file names with known extensions\n\t\t\t.replace(/\\/[\\w/]+/g, \"<path>\"); // Remove paths (safer)\n\t}\n\n\t/**\n\t * Public method to sanitize individual risk factors\n\t * @param factor - Risk factor string to sanitize\n\t * @returns Sanitized risk factor string\n\t */\n\tpublic sanitizeFactor(factor: string): string {\n\t\treturn this.sanitizeString(factor);\n\t}\n}\n","import type { AnalyticsResponse, FileMetadata } from \"@snapback-oss/contracts\";\nimport { logger } from \"@snapback-oss/infrastructure\";\nimport ky from \"ky\";\nimport pRetry, { AbortError } from \"p-retry\";\nimport { z } from \"zod\";\nimport { LRUCache } from \"./cache/lru-cache\";\nimport { PrivacySanitizer } from \"./privacy/sanitizer\";\n\n// Zod schemas for validation\nconst SDKConfigSchema = z.object({\n\tendpoint: z.string().url(),\n\tapiKey: z.string().min(1, \"API key is required\"),\n\tprivacy: z.object({\n\t\thashFilePaths: z.boolean(),\n\t\tanonymizeWorkspace: z.boolean(),\n\t}),\n\tcache: z.object({\n\t\tenabled: z.boolean(),\n\t\tttl: z.record(z.string(), z.number()),\n\t}),\n\tretry: z.object({\n\t\tmaxRetries: z.number().min(0),\n\t\tbackoffMs: z.number().min(0),\n\t}),\n});\n\nconst WorkspaceIdSchema = z.string().min(1, \"Workspace ID is required\");\nconst FilesArraySchema = z.array(z.any()).min(1, \"At least one file is required\");\n\nexport type ClientSurface = \"vscode\" | \"mcp\" | \"cli\" | \"web\";\nexport interface Envelope {\n\tsession_id: string;\n\trequest_id: string;\n\tworkspace_id?: string;\n\tclient: ClientSurface;\n}\n\nexport interface SnapbackClientOptions {\n\tbaseUrl: string;\n\tapiKey?: string;\n\tsurface: ClientSurface;\n\tfetchImpl?: typeof fetch;\n\tnow?: () => number;\n\tbatchMax?: number;\n\tbatchIntervalMs?: number;\n\tretryBaseMs?: number;\n\tretryMaxMs?: number;\n}\n\nexport interface SDKConfig {\n\tendpoint: string;\n\tapiKey: string;\n\n\tprivacy: {\n\t\thashFilePaths: boolean;\n\t\tanonymizeWorkspace: boolean;\n\t};\n\n\tcache: {\n\t\tenabled: boolean;\n\t\tttl: Record<string, number>;\n\t};\n\n\tretry: {\n\t\tmaxRetries: number;\n\t\tbackoffMs: number;\n\t};\n}\n\n/**\n * Local fallback for when API is unavailable\n */\nclass LocalFallback {\n\tgenerateRecommendations(): AnalyticsResponse[\"snapshotRecommendations\"] {\n\t\t// In a real implementation, this would use local heuristics\n\t\treturn {\n\t\t\tshouldCreateSnapshot: false,\n\t\t\treason: \"Using local fallback - API unavailable\",\n\t\t\turgency: \"low\",\n\t\t\tsuggestedTiming: \"24h\",\n\t\t};\n\t}\n}\n\nexport class SnapbackClient {\n\tprivate sanitizer: PrivacySanitizer;\n\tprivate cache: LRUCache;\n\tprivate config: SDKConfig;\n\tprivate httpClient: typeof ky;\n\tprivate localFallback: LocalFallback;\n\n\tconstructor(config: SDKConfig) {\n\t\t// Validate config with zod\n\t\tthis.config = SDKConfigSchema.parse(config);\n\t\tthis.sanitizer = new PrivacySanitizer(config.privacy);\n\t\tthis.cache = new LRUCache(config.cache);\n\t\tthis.localFallback = new LocalFallback();\n\n\t\t// Initialize HTTP client with enhanced configuration\n\t\tthis.httpClient = ky.extend({\n\t\t\tprefixUrl: config.endpoint,\n\t\t\theaders: {\n\t\t\t\t\"X-API-Key\": config.apiKey,\n\t\t\t\t\"X-SnapBack-SDK\": \"1.0.0\",\n\t\t\t},\n\t\t\tretry: {\n\t\t\t\tlimit: config.retry.maxRetries,\n\t\t\t\tmethods: [\"get\", \"post\", \"put\", \"delete\", \"patch\"],\n\t\t\t\tstatusCodes: [408, 413, 429, 500, 502, 503, 504],\n\t\t\t\t// Add exponential backoff configuration\n\t\t\t\tbackoffLimit: config.retry.backoffMs * 10, // Maximum backoff time\n\t\t\t},\n\t\t\ttimeout: 30000, // 30 second timeout\n\t\t});\n\t}\n\n\t/**\n\t * Get the HTTP client instance\n\t * @returns The ky HTTP client instance\n\t */\n\tpublic getHttpClient(): typeof ky {\n\t\treturn this.httpClient;\n\t}\n\n\t/**\n\t * Parse Retry-After header and return delay in milliseconds\n\t * @param retryAfter Retry-After header value\n\t * @returns Delay in milliseconds\n\t */\n\tprivate parseRetryAfter(retryAfter: string): number {\n\t\t// Check if it's a number (seconds)\n\t\tif (/^\\d+$/.test(retryAfter)) {\n\t\t\treturn Number.parseInt(retryAfter, 10) * 1000;\n\t\t}\n\n\t\t// Check if it's a date\n\t\tconst date = new Date(retryAfter);\n\t\tif (!Number.isNaN(date.getTime())) {\n\t\t\treturn Math.max(0, date.getTime() - Date.now());\n\t\t}\n\n\t\t// Default to 1 second if parsing fails\n\t\treturn 1000;\n\t}\n\n\t/**\n\t * Enhanced HTTP request with custom retry logic including Retry-After handling\n\t */\n\tprivate async httpRequest<T>(\n\t\trequestFn: () => Promise<T>,\n\t\toptions?: {\n\t\t\tretryLimit?: number;\n\t\t\tonRetry?: (error: Error, attempt: number) => void;\n\t\t},\n\t): Promise<T> {\n\t\tconst retryLimit = options?.retryLimit ?? this.config.retry.maxRetries;\n\n\t\treturn pRetry(\n\t\t\tasync () => {\n\t\t\t\ttry {\n\t\t\t\t\treturn await requestFn();\n\t\t\t\t} catch (error: any) {\n\t\t\t\t\t// Handle 429 with Retry-After header\n\t\t\t\t\tif (error.response?.status === 429) {\n\t\t\t\t\t\tconst retryAfter = error.response.headers.get(\"Retry-After\");\n\t\t\t\t\t\tif (retryAfter) {\n\t\t\t\t\t\t\tconst delay = this.parseRetryAfter(retryAfter);\n\t\t\t\t\t\t\t// Wait for the specified delay before retrying\n\t\t\t\t\t\t\tawait new Promise((resolve) => setTimeout(resolve, delay));\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// Re-throw to trigger retry\n\t\t\t\t\t\tthrow error;\n\t\t\t\t\t}\n\n\t\t\t\t\t// For other errors, re-throw as AbortError to prevent retry\n\t\t\t\t\tif (error.response?.status && error.response.status >= 400 && error.response.status < 500) {\n\t\t\t\t\t\tthrow new AbortError(error);\n\t\t\t\t\t}\n\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\t\t\t},\n\t\t\t{\n\t\t\t\tretries: retryLimit,\n\t\t\t\tfactor: 2,\n\t\t\t\tminTimeout: this.config.retry.backoffMs,\n\t\t\t\tmaxTimeout: this.config.retry.backoffMs * 2 ** retryLimit,\n\t\t\t\trandomize: true,\n\t\t\t\tonFailedAttempt: (error) => {\n\t\t\t\t\tif (options?.onRetry) {\n\t\t\t\t\t\toptions.onRetry(error, error.attemptNumber);\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 * Send file metadata batch to API\n\t * Automatically sanitizes metadata to ensure privacy\n\t */\n\tasync sendMetadata(workspaceId: string, files: FileMetadata[]): Promise<{ accepted: number; rejected: number }> {\n\t\t// Validate inputs with zod\n\t\tWorkspaceIdSchema.parse(workspaceId);\n\t\tFilesArraySchema.parse(files);\n\n\t\t// Privacy validation - ensures no file contents\n\t\tconst sanitized = files.map((f) => this.sanitizer.sanitize(f));\n\n\t\t// Validate all metadata is privacy-safe\n\t\tfor (const file of sanitized) {\n\t\t\tif (!this.sanitizer.isPrivacySafe(file)) {\n\t\t\t\tthrow new Error(\"Privacy validation failed: file contains sensitive data\");\n\t\t\t}\n\t\t}\n\n\t\ttry {\n\t\t\tconst response = await this.httpRequest(\n\t\t\t\t() =>\n\t\t\t\t\tthis.httpClient\n\t\t\t\t\t\t.post(\"v1/metadata/files/batch\", {\n\t\t\t\t\t\t\tjson: {\n\t\t\t\t\t\t\t\tworkspaceId,\n\t\t\t\t\t\t\t\tfiles: sanitized,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\ttimeout: 30000,\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.json<{ accepted: number; rejected: number }>(),\n\t\t\t\t{\n\t\t\t\t\tonRetry: (error, attempt) => {\n\t\t\t\t\t\tlogger.warn(`Attempt ${attempt} failed. Retrying...`, { error: error.message });\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t);\n\n\t\t\treturn response;\n\t\t} catch (error) {\n\t\t\t// Graceful degradation - don't fail if API unavailable\n\t\t\tlogger.warn(\"API metadata upload failed, continuing with local operation\", {\n\t\t\t\terror: (error as Error).message,\n\t\t\t});\n\t\t\treturn { accepted: 0, rejected: files.length };\n\t\t}\n\t}\n\n\t/**\n\t * Get analytics for workspace\n\t * Uses cache when available\n\t */\n\tasync getAnalytics(workspaceId: string, options?: { forceRefresh?: boolean }): Promise<AnalyticsResponse> {\n\t\t// Validate inputs with zod\n\t\tWorkspaceIdSchema.parse(workspaceId);\n\n\t\tconst cacheKey = `analytics:${workspaceId}`;\n\n\t\t// Check cache first\n\t\tif (!options?.forceRefresh && this.cache.has(cacheKey)) {\n\t\t\treturn this.cache.get(cacheKey) as AnalyticsResponse;\n\t\t}\n\n\t\ttry {\n\t\t\tconst response = await this.httpRequest(\n\t\t\t\t() =>\n\t\t\t\t\tthis.httpClient\n\t\t\t\t\t\t.get(`v1/analytics/workspace/${workspaceId}`, {\n\t\t\t\t\t\t\ttimeout: 30000,\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.json<AnalyticsResponse>(),\n\t\t\t\t{\n\t\t\t\t\tonRetry: (error, attempt) => {\n\t\t\t\t\t\tlogger.warn(`Analytics API attempt ${attempt} failed. Retrying...`, { error: error.message });\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t);\n\n\t\t\t// Cache successful response with TTL from config\n\t\t\tconst ttl = this.config.cache.ttl.analytics || 3600;\n\t\t\tthis.cache.set(cacheKey, response, ttl);\n\n\t\t\treturn response;\n\t\t} catch (error) {\n\t\t\t// Return cached data if available, even if stale\n\t\t\tif (this.cache.has(cacheKey)) {\n\t\t\t\tlogger.warn(\"API unavailable, using stale cached analytics\");\n\t\t\t\treturn this.cache.get(cacheKey) as AnalyticsResponse;\n\t\t\t}\n\n\t\t\tthrow new Error(`Failed to fetch analytics: ${(error as Error).message}`);\n\t\t}\n\t}\n\n\t/**\n\t * Get smart recommendations\n\t */\n\tasync getRecommendations(workspaceId: string): Promise<AnalyticsResponse[\"snapshotRecommendations\"]> {\n\t\t// Validate inputs with zod\n\t\tWorkspaceIdSchema.parse(workspaceId);\n\n\t\ttry {\n\t\t\tconst response = await this.httpRequest(\n\t\t\t\t() =>\n\t\t\t\t\tthis.httpClient\n\t\t\t\t\t\t.get(\"v1/intelligence/recommendations\", {\n\t\t\t\t\t\t\tsearchParams: {\n\t\t\t\t\t\t\t\tworkspaceId,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\ttimeout: 30000,\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.json<AnalyticsResponse>(),\n\t\t\t\t{\n\t\t\t\t\tonRetry: (error, attempt) => {\n\t\t\t\t\t\tlogger.warn(`Recommendations API attempt ${attempt} failed. Retrying...`, {\n\t\t\t\t\t\t\terror: error.message,\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\treturn response.snapshotRecommendations;\n\t\t} catch (error) {\n\t\t\t// Fallback to local heuristics\n\t\t\tlogger.warn(\"API unavailable, using local fallback for recommendations\", {\n\t\t\t\terror: (error as Error).message,\n\t\t\t});\n\t\t\treturn this.localFallback.generateRecommendations();\n\t\t}\n\t}\n\n\t/**\n\t * Health check endpoint\n\t */\n\tasync healthCheck(): Promise<{ status: \"ok\" | \"error\"; version: string }> {\n\t\ttry {\n\t\t\tconst response = await this.httpClient.get(\"health\").json<{ status: \"ok\" | \"error\"; version: string }>();\n\t\t\treturn response;\n\t\t} catch (_error) {\n\t\t\treturn { status: \"error\", version: \"unknown\" };\n\t\t}\n\t}\n}\n\n// Export SnapbackAnalyticsClient as an alias for SnapbackClient\nexport { SnapbackClient as SnapbackAnalyticsClient };\n","import type { ProtectedFile, ProtectionLevel } from \"@snapback-oss/contracts\";\nimport type { KyInstance } from \"ky\";\nimport type QuickLRU from \"quick-lru\";\n\nexport class ProtectionClient {\n\tconstructor(\n\t\tprivate http: KyInstance,\n\t\tprivate cache: QuickLRU<string, unknown>,\n\t) {}\n\n\tasync protect(path: string, level: ProtectionLevel, reason?: string): Promise<ProtectedFile> {\n\t\tconst response = await this.http\n\t\t\t.post(\"protection\", {\n\t\t\t\tjson: { path, level, reason },\n\t\t\t})\n\t\t\t.json<ProtectedFile>();\n\n\t\t// Invalidate cache\n\t\tthis.cache.delete(`protection:${path}`);\n\t\tthis.invalidateListCache();\n\n\t\treturn response;\n\t}\n\n\tasync unprotect(path: string): Promise<void> {\n\t\tawait this.http.delete(\"protection\", {\n\t\t\tjson: { path },\n\t\t});\n\n\t\t// Invalidate cache\n\t\tthis.cache.delete(`protection:${path}`);\n\t\tthis.invalidateListCache();\n\t}\n\n\tasync get(path: string): Promise<ProtectedFile | null> {\n\t\tconst cacheKey = `protection:${path}`;\n\n\t\tconst cached = this.cache.get(cacheKey);\n\t\t// Check if cached value exists (not just truthy check)\n\t\tif (cached !== undefined) {\n\t\t\t// Use special sentinel value for cached 404s\n\t\t\treturn cached === null ? null : (cached as ProtectedFile);\n\t\t}\n\n\t\ttry {\n\t\t\tconst response = await this.http\n\t\t\t\t.get(\"protection\", {\n\t\t\t\t\tsearchParams: { path },\n\t\t\t\t})\n\t\t\t\t.json<ProtectedFile>();\n\t\t\tthis.cache.set(cacheKey, response);\n\t\t\treturn response;\n\t\t} catch (error) {\n\t\t\t// If 404, cache null to prevent repeated API calls\n\t\t\tif ((error as any).response?.status === 404) {\n\t\t\t\tthis.cache.set(cacheKey, null);\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tasync list(filters?: { level?: ProtectionLevel }): Promise<ProtectedFile[]> {\n\t\tconst cacheKey = `protection:list:${JSON.stringify(filters || {})}`;\n\n\t\tconst cached = this.cache.get(cacheKey);\n\t\tif (cached) {\n\t\t\treturn cached as ProtectedFile[];\n\t\t}\n\n\t\t// Filter out undefined values for searchParams\n\t\tconst searchParams: Record<string, string> = {};\n\t\tif (filters?.level) {\n\t\t\tsearchParams.level = String(filters.level);\n\t\t}\n\n\t\tconst response = await this.http\n\t\t\t.get(\"protection/list\", {\n\t\t\t\tsearchParams: Object.keys(searchParams).length > 0 ? searchParams : undefined,\n\t\t\t})\n\t\t\t.json<ProtectedFile[]>();\n\n\t\tthis.cache.set(cacheKey, response);\n\t\treturn response;\n\t}\n\n\tasync update(path: string, level: ProtectionLevel, reason?: string): Promise<ProtectedFile> {\n\t\tconst response = await this.http\n\t\t\t.put(\"protection\", {\n\t\t\t\tjson: { path, level, reason },\n\t\t\t})\n\t\t\t.json<ProtectedFile>();\n\n\t\t// Invalidate cache\n\t\tthis.cache.delete(`protection:${path}`);\n\t\tthis.invalidateListCache();\n\n\t\treturn response;\n\t}\n\n\t/**\n\t * Invalidate all protection list caches (including filtered lists)\n\t */\n\tprivate invalidateListCache(): void {\n\t\t// Iterate through all cache keys and delete those starting with \"protection:list\"\n\t\tfor (const key of this.cache.keys()) {\n\t\t\tif (key.startsWith(\"protection:list\")) {\n\t\t\t\tthis.cache.delete(key);\n\t\t\t}\n\t\t}\n\t}\n}\n","import type { Snapshot, SnapshotFilters } from \"@snapback-oss/contracts\";\nimport type { KyInstance } from \"ky\";\nimport type QuickLRU from \"quick-lru\";\n\nexport class SnapshotClient {\n\tconstructor(\n\t\tprivate http: KyInstance,\n\t\tprivate cache: QuickLRU<string, unknown>,\n\t) {}\n\n\tasync create(data: {\n\t\tfilePath: string;\n\t\tcontent: string;\n\t\tmessage?: string;\n\t\tprotected?: boolean;\n\t}): Promise<Snapshot> {\n\t\tconst response = await this.http\n\t\t\t.post(\"snapshots\", {\n\t\t\t\tjson: {\n\t\t\t\t\tfilePath: data.filePath,\n\t\t\t\t\tcontent: data.content,\n\t\t\t\t\tmessage: data.message,\n\t\t\t\t\tprotected: data.protected,\n\t\t\t\t},\n\t\t\t})\n\t\t\t.json<Snapshot>();\n\n\t\t// Invalidate all snapshot list caches (including filtered lists)\n\t\tthis.invalidateListCache();\n\n\t\treturn response;\n\t}\n\n\tasync list(filters?: SnapshotFilters): Promise<Snapshot[]> {\n\t\tconst cacheKey = `snapshots:list:${JSON.stringify(filters || {})}`;\n\n\t\tconst cached = this.cache.get(cacheKey);\n\t\tif (cached) {\n\t\t\treturn cached as Snapshot[];\n\t\t}\n\n\t\t// Filter out undefined values for searchParams\n\t\tconst searchParams: Record<string, any> = {};\n\t\tif (filters) {\n\t\t\tObject.entries(filters).forEach(([key, value]) => {\n\t\t\t\tif (value !== undefined) {\n\t\t\t\t\tif (value instanceof Date) {\n\t\t\t\t\t\t// Serialize dates to ISO strings for portable HTTP transmission\n\t\t\t\t\t\tsearchParams[key] = value.toISOString();\n\t\t\t\t\t} else {\n\t\t\t\t\t\tsearchParams[key] = value;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tconst response = await this.http\n\t\t\t.get(\"snapshots\", {\n\t\t\t\tsearchParams: Object.keys(searchParams).length > 0 ? searchParams : undefined,\n\t\t\t})\n\t\t\t.json<Snapshot[]>();\n\n\t\tthis.cache.set(cacheKey, response);\n\t\treturn response;\n\t}\n\n\tasync get(id: string): Promise<Snapshot> {\n\t\tconst cacheKey = `snapshot:${id}`;\n\n\t\tconst cached = this.cache.get(cacheKey);\n\t\tif (cached) {\n\t\t\treturn cached as Snapshot;\n\t\t}\n\n\t\tconst response = await this.http.get(`snapshots/${id}`).json<Snapshot>();\n\t\tthis.cache.set(cacheKey, response);\n\t\treturn response;\n\t}\n\n\tasync delete(id: string): Promise<void> {\n\t\tawait this.http.delete(`snapshots/${id}`);\n\n\t\t// Invalidate cache\n\t\tthis.cache.delete(`snapshot:${id}`);\n\t\tthis.invalidateListCache();\n\t}\n\n\tasync restore(id: string): Promise<{ success: boolean; restoredFiles: string[] }> {\n\t\tconst response = await this.http\n\t\t\t.post(`snapshots/${id}/restore`)\n\t\t\t.json<{ success: boolean; restoredFiles: string[] }>();\n\t\treturn response;\n\t}\n\n\tasync update(\n\t\tid: string,\n\t\tdata: {\n\t\t\tmessage?: string;\n\t\t\tprotected?: boolean;\n\t\t},\n\t): Promise<Snapshot> {\n\t\tconst response = await this.http\n\t\t\t.put(`snapshots/${id}`, {\n\t\t\t\tjson: data,\n\t\t\t})\n\t\t\t.json<Snapshot>();\n\n\t\t// Invalidate cache\n\t\tthis.cache.delete(`snapshot:${id}`);\n\t\tthis.invalidateListCache();\n\n\t\treturn response;\n\t}\n\n\t/**\n\t * Invalidate all snapshot list caches (including filtered lists)\n\t */\n\tprivate invalidateListCache(): void {\n\t\t// Iterate through all cache keys and delete those starting with \"snapshots:list\"\n\t\tfor (const key of this.cache.keys()) {\n\t\t\tif (key.startsWith(\"snapshots:list\")) {\n\t\t\t\tthis.cache.delete(key);\n\t\t\t}\n\t\t}\n\t}\n}\n","import type { SDKConfig } from \"./types\";\n\nexport const defaultConfig: SDKConfig = {\n\tendpoint: \"https://api.snapback.dev\",\n\tapiKey: \"\",\n\n\tprivacy: {\n\t\thashFilePaths: true,\n\t\tanonymizeWorkspace: false,\n\t},\n\n\tcache: {\n\t\tenabled: true,\n\t\tttl: {\n\t\t\tanalytics: 3600, // 1 hour\n\t\t\trecommendations: 1800, // 30 minutes\n\t\t\tpatterns: 7200, // 2 hours\n\t\t},\n\t},\n\n\tretry: {\n\t\tmaxRetries: 3,\n\t\tbackoffMs: 1000,\n\t},\n};\n\nexport function createConfig(overrides: Partial<SDKConfig> = {}): SDKConfig {\n\treturn {\n\t\t...defaultConfig,\n\t\t...overrides,\n\t\tprivacy: {\n\t\t\t...defaultConfig.privacy,\n\t\t\t...overrides.privacy,\n\t\t},\n\t\tcache: {\n\t\t\t...defaultConfig.cache,\n\t\t\t...overrides.cache,\n\t\t\tttl: {\n\t\t\t\t...defaultConfig.cache.ttl,\n\t\t\t\t...overrides.cache?.ttl,\n\t\t\t},\n\t\t},\n\t\tretry: {\n\t\t\t...defaultConfig.retry,\n\t\t\t...overrides.retry,\n\t\t},\n\t};\n}\n","/**\n * ConfigDetector - Platform-agnostic configuration file detection and validation\n *\n * This module provides utilities for detecting, parsing, and validating common\n * configuration files across different platforms.\n *\n * @module ConfigDetector\n */\n\n/**\n * Interface for file system providers\n *\n * Different platforms implement this interface to provide their\n * specific method of file system operations.\n */\nexport interface IFileSystemProvider {\n\t/**\n\t * Glob for files matching patterns\n\t *\n\t * @param patterns - Array of glob patterns to match\n\t * @param cwd - Current working directory\n\t * @param options - Glob options including ignore patterns\n\t * @returns Promise that resolves to array of matched file paths\n\t */\n\tglob(patterns: string[], cwd: string, options?: { ignore?: string[] }): Promise<string[]>;\n\n\t/**\n\t * Read a file's contents\n\t *\n\t * @param filePath - Path to the file\n\t * @returns Promise that resolves to file contents as string\n\t */\n\treadFile(filePath: string): Promise<string>;\n}\n\n/**\n * Configuration file metadata\n */\nexport interface ConfigFile {\n\t/** Type of configuration file */\n\ttype: string;\n\n\t/** Full path to the file */\n\tpath: string;\n\n\t/** File name */\n\tname: string;\n}\n\n/**\n * Result of parsing a configuration file\n */\nexport interface ConfigParseResult {\n\t/** Parsed content */\n\tcontent: unknown;\n\n\t/** Whether the file was successfully parsed */\n\tvalid: boolean;\n\n\t/** Error message if parsing failed */\n\terror?: string;\n\n\t/** Extracted metadata */\n\tmetadata?: Record<string, unknown>;\n}\n\n/**\n * Result of validating a configuration file\n */\nexport interface ConfigValidationResult {\n\t/** Whether the configuration is valid */\n\tvalid: boolean;\n\n\t/** List of validation errors */\n\terrors: string[];\n\n\t/** List of validation warnings */\n\twarnings: string[];\n}\n\n/**\n * Configuration change event\n */\nexport interface ConfigChange {\n\t/** Type of change */\n\ttype: \"added\" | \"modified\" | \"deleted\";\n\n\t/** Path to the changed file */\n\tfile: string;\n\n\t/** Timestamp of the change */\n\ttimestamp: number;\n}\n\n/**\n * package.json structure\n */\ninterface PackageJson {\n\tname?: string;\n\tversion?: string;\n\tdependencies?: Record<string, string>;\n\tdevDependencies?: Record<string, string>;\n\tscripts?: Record<string, string>;\n\t[key: string]: unknown;\n}\n\n/**\n * tsconfig.json structure\n */\ninterface TsConfig {\n\tcompilerOptions?: {\n\t\ttarget?: string | number;\n\t\tmodule?: string | number;\n\t\t[key: string]: unknown;\n\t};\n\t[key: string]: unknown;\n}\n\n/**\n * Generic config content\n */\ntype ConfigContent = Record<string, unknown>;\n\n/**\n * ConfigDetector options\n */\nexport interface ConfigDetectorOptions {\n\t/** Patterns to exclude from detection */\n\texclude?: string[];\n}\n\n/**\n * ConfigDetector - Platform-agnostic configuration file detection and validation\n *\n * Detects and validates common configuration files like package.json, tsconfig.json,\n * .env files, and various build tool configurations using dependency injection\n * for file system operations.\n *\n * @example\n * ```typescript\n * // Node.js example\n * import { glob } from 'fast-glob';\n * import { readFile } from 'fs/promises';\n *\n * const fsProvider = {\n * glob: (patterns, cwd, options) => glob(patterns, { cwd, ...options }),\n * readFile: (path) => readFile(path, 'utf-8')\n * };\n *\n * const detector = new ConfigDetector('/workspace', fsProvider);\n * const files = await detector.detectConfigFiles();\n * ```\n */\nexport class ConfigDetector {\n\tprivate workspaceRoot: string;\n\tprivate fileSystem: IFileSystemProvider;\n\tprivate excludePatterns: string[];\n\tprivate configFiles: Map<string, ConfigFile> = new Map();\n\tprivate changeHandlers: Array<(change: ConfigChange) => void> = [];\n\n\t/**\n\t * Creates a new ConfigDetector\n\t *\n\t * @param workspaceRoot - Root directory to search for configuration files\n\t * @param fileSystem - File system provider for platform-specific operations\n\t * @param options - Configuration options\n\t */\n\tconstructor(workspaceRoot: string, fileSystem: IFileSystemProvider, options?: ConfigDetectorOptions) {\n\t\tthis.workspaceRoot = workspaceRoot;\n\t\tthis.fileSystem = fileSystem;\n\t\tthis.excludePatterns = options?.exclude || [\"node_modules/**\", \".git/**\", \"dist/**\", \"build/**\"];\n\t}\n\n\t/**\n\t * Detect all configuration files in the workspace\n\t *\n\t * @returns Promise that resolves to array of detected configuration files\n\t */\n\tasync detectConfigFiles(): Promise<ConfigFile[]> {\n\t\tconst patterns = [\n\t\t\t\"package.json\",\n\t\t\t\"tsconfig.json\",\n\t\t\t\".env*\",\n\t\t\t\".eslintrc*\",\n\t\t\t\".prettierrc*\",\n\t\t\t\"jest.config.*\",\n\t\t\t\"vitest.config.*\",\n\t\t\t\"webpack.config.*\",\n\t\t\t\"next.config.*\",\n\t\t\t\"vite.config.*\",\n\t\t];\n\n\t\tconst globPatterns = patterns.map((pattern) => `**/${pattern}`);\n\n\t\ttry {\n\t\t\tconst files = await this.fileSystem.glob(globPatterns, this.workspaceRoot, {\n\t\t\t\tignore: this.excludePatterns,\n\t\t\t});\n\n\t\t\tconst configFiles: ConfigFile[] = files.map((file) => {\n\t\t\t\tconst fullPath = `${this.workspaceRoot}/${file}`;\n\t\t\t\tconst type = this.determineConfigType(file);\n\t\t\t\tconst name = file.split(\"/\").pop() || file;\n\n\t\t\t\treturn {\n\t\t\t\t\ttype,\n\t\t\t\t\tpath: fullPath,\n\t\t\t\t\tname,\n\t\t\t\t};\n\t\t\t});\n\n\t\t\t// Update internal cache\n\t\t\tthis.configFiles.clear();\n\t\t\tfor (const config of configFiles) {\n\t\t\t\tthis.configFiles.set(config.path, config);\n\t\t\t}\n\n\t\t\treturn configFiles;\n\t\t} catch (_error) {\n\t\t\t// Log error if logger is available\n\t\t\treturn [];\n\t\t}\n\t}\n\n\t/**\n\t * Determine configuration file type from filename\n\t *\n\t * @param fileName - The file name to analyze\n\t * @returns The configuration type\n\t */\n\tprivate determineConfigType(fileName: string): string {\n\t\tif (fileName.includes(\".env\")) {\n\t\t\treturn \"env\";\n\t\t}\n\t\tif (fileName.includes(\"package.json\")) {\n\t\t\treturn \"package.json\";\n\t\t}\n\t\tif (fileName.includes(\"tsconfig\")) {\n\t\t\treturn \"tsconfig\";\n\t\t}\n\t\tif (fileName.includes(\".eslintrc\")) {\n\t\t\treturn \"eslint\";\n\t\t}\n\t\tif (fileName.includes(\".prettierrc\")) {\n\t\t\treturn \"prettier\";\n\t\t}\n\t\tif (fileName.includes(\"jest.config\")) {\n\t\t\treturn \"jest\";\n\t\t}\n\t\tif (fileName.includes(\"vitest.config\")) {\n\t\t\treturn \"vitest\";\n\t\t}\n\t\tif (fileName.includes(\"webpack.config\")) {\n\t\t\treturn \"webpack\";\n\t\t}\n\t\tif (fileName.includes(\"next.config\")) {\n\t\t\treturn \"next\";\n\t\t}\n\t\tif (fileName.includes(\"vite.config\")) {\n\t\t\treturn \"vite\";\n\t\t}\n\t\treturn \"unknown\";\n\t}\n\n\t/**\n\t * Parse a configuration file\n\t *\n\t * @param filePath - Path to the configuration file\n\t * @returns Promise that resolves to parse result\n\t */\n\tasync parseConfigFile(filePath: string): Promise<ConfigParseResult> {\n\t\ttry {\n\t\t\tconst content = await this.fileSystem.readFile(filePath);\n\n\t\t\t// Try to parse as JSON first\n\t\t\tif (filePath.endsWith(\".json\") || filePath.includes(\"package.json\") || filePath.includes(\"tsconfig\")) {\n\t\t\t\ttry {\n\t\t\t\t\tconst parsed = JSON.parse(content);\n\t\t\t\t\treturn {\n\t\t\t\t\t\tcontent: parsed,\n\t\t\t\t\t\tvalid: true,\n\t\t\t\t\t\tmetadata: this.extractMetadata(parsed, filePath),\n\t\t\t\t\t};\n\t\t\t\t} catch (jsonError) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tcontent: null,\n\t\t\t\t\t\tvalid: false,\n\t\t\t\t\t\terror: `Invalid JSON: ${(jsonError as Error).message}`,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// For non-JSON files, return as text\n\t\t\treturn {\n\t\t\t\tcontent,\n\t\t\t\tvalid: true,\n\t\t\t};\n\t\t} catch (error) {\n\t\t\treturn {\n\t\t\t\tcontent: null,\n\t\t\t\tvalid: false,\n\t\t\t\terror: `Failed to read file: ${(error as Error).message}`,\n\t\t\t};\n\t\t}\n\t}\n\n\t/**\n\t * Extract metadata from configuration content\n\t *\n\t * @param content - Parsed configuration content\n\t * @param filePath - Path to the file (used to determine type)\n\t * @returns Extracted metadata or undefined\n\t */\n\tprivate extractMetadata(content: ConfigContent, filePath: string): Record<string, unknown> | undefined {\n\t\tif (!content || typeof content !== \"object\") {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst metadata: Record<string, unknown> = {};\n\n\t\tif (filePath.includes(\"package.json\")) {\n\t\t\tconst pkg = content as PackageJson;\n\t\t\tif (pkg.dependencies) {\n\t\t\t\tmetadata.dependencies = Object.keys(pkg.dependencies);\n\t\t\t}\n\t\t\tif (pkg.devDependencies) {\n\t\t\t\tmetadata.devDependencies = Object.keys(pkg.devDependencies);\n\t\t\t}\n\t\t\tif (pkg.scripts) {\n\t\t\t\tmetadata.scripts = Object.keys(pkg.scripts);\n\t\t\t}\n\t\t}\n\n\t\treturn Object.keys(metadata).length > 0 ? metadata : undefined;\n\t}\n\n\t/**\n\t * Validate a configuration file\n\t *\n\t * @param filePath - Path to the configuration file\n\t * @returns Promise that resolves to validation result\n\t */\n\tasync validateConfig(filePath: string): Promise<ConfigValidationResult> {\n\t\tconst result: ConfigValidationResult = {\n\t\t\tvalid: true,\n\t\t\terrors: [],\n\t\t\twarnings: [],\n\t\t};\n\n\t\ttry {\n\t\t\tconst parseResult = await this.parseConfigFile(filePath);\n\n\t\t\tif (!parseResult.valid) {\n\t\t\t\tresult.valid = false;\n\t\t\t\tresult.errors.push(parseResult.error || \"Failed to parse config file\");\n\t\t\t\treturn result;\n\t\t\t}\n\n\t\t\t// Add specific validation rules based on file type\n\t\t\tif (filePath.includes(\"package.json\")) {\n\t\t\t\tthis.validatePackageJson(parseResult.content as ConfigContent, result);\n\t\t\t} else if (filePath.includes(\"tsconfig\")) {\n\t\t\t\tthis.validateTsConfig(parseResult.content as ConfigContent, result);\n\t\t\t}\n\n\t\t\treturn result;\n\t\t} catch (error) {\n\t\t\tresult.valid = false;\n\t\t\tresult.errors.push(`Validation error: ${(error as Error).message}`);\n\t\t\treturn result;\n\t\t}\n\t}\n\n\t/**\n\t * Validate package.json content\n\t *\n\t * @param content - Parsed package.json content\n\t * @param result - Validation result to update\n\t */\n\tprivate validatePackageJson(content: ConfigContent, result: ConfigValidationResult): void {\n\t\tconst pkg = content as PackageJson;\n\n\t\tif (!pkg.name) {\n\t\t\tresult.errors.push(\"Missing required field: name\");\n\t\t\tresult.valid = false;\n\t\t}\n\n\t\tif (!pkg.version) {\n\t\t\tresult.errors.push(\"Missing required field: version\");\n\t\t\tresult.valid = false;\n\t\t}\n\t}\n\n\t/**\n\t * Validate tsconfig.json content\n\t *\n\t * @param content - Parsed tsconfig.json content\n\t * @param result - Validation result to update\n\t */\n\tprivate validateTsConfig(content: ConfigContent, result: ConfigValidationResult): void {\n\t\tconst tsconfig = content as TsConfig;\n\n\t\tif (tsconfig && typeof tsconfig === \"object\" && tsconfig.compilerOptions) {\n\t\t\t// Basic validation for tsconfig\n\t\t\tif (tsconfig.compilerOptions.target && typeof tsconfig.compilerOptions.target !== \"string\") {\n\t\t\t\tresult.warnings.push(\"compilerOptions.target should be a string\");\n\t\t\t}\n\n\t\t\tif (tsconfig.compilerOptions.module && typeof tsconfig.compilerOptions.module !== \"string\") {\n\t\t\t\tresult.warnings.push(\"compilerOptions.module should be a string\");\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Register a handler for configuration changes\n\t *\n\t * @param handler - Function to call when configuration changes\n\t */\n\tonConfigChange(handler: (change: ConfigChange) => void): void {\n\t\tthis.changeHandlers.push(handler);\n\t}\n}\n","/**\n * SnapBackRC Parser - Platform-agnostic .snapbackrc configuration parser\n *\n * This module provides utilities for parsing, validating, and merging\n * .snapbackrc configuration files across different platforms.\n *\n * @module SnapBackRCParser\n */\n\nimport type { ProtectionRule, SnapBackPolicies, SnapBackRC, SnapBackSettings } from \"./types\";\n\n/**\n * Result of parsing a configuration\n */\nexport interface ParseResult {\n\t/** Whether the configuration is valid */\n\tisValid: boolean;\n\n\t/** The parsed configuration (if valid) */\n\tconfig?: SnapBackRC;\n\n\t/** List of validation errors (if invalid) */\n\terrors?: string[];\n\n\t/** List of validation warnings */\n\twarnings?: string[];\n}\n\n/**\n * Options for merging configurations\n */\nexport interface MergeOptions {\n\t/** Provenance for base configuration */\n\tbaseProvenance?: string;\n\n\t/** Provenance for override configuration */\n\toverrideProvenance?: string;\n}\n\n/**\n * Valid protection levels\n */\nconst VALID_PROTECTION_LEVELS = [\"Watched\", \"Warning\", \"Protected\"] as const;\n\n/**\n * SnapBackRCParser - Parses and validates .snapbackrc configuration files\n *\n * Provides platform-agnostic parsing and validation of SnapBack configuration\n * files with support for merging multiple configurations and tracking provenance.\n *\n * @example\n * ```typescript\n * const parser = new SnapBackRCParser();\n * const result = parser.parse(configString);\n *\n * if (result.isValid) {\n * console.log(\"Config is valid:\", result.config);\n * } else {\n * console.error(\"Validation errors:\", result.errors);\n * }\n * ```\n */\nexport class SnapBackRCParser {\n\t/**\n\t * Parse a .snapbackrc configuration string\n\t *\n\t * @param content - The configuration file content as a string\n\t * @returns Parse result with validation status and errors\n\t */\n\tparse(content: string): ParseResult {\n\t\tconst errors: string[] = [];\n\t\tconst warnings: string[] = [];\n\n\t\t// Step 1: Parse JSON\n\t\tlet config: SnapBackRC;\n\t\ttry {\n\t\t\tconfig = JSON.parse(content) as SnapBackRC;\n\t\t} catch (error) {\n\t\t\treturn {\n\t\t\t\tisValid: false,\n\t\t\t\terrors: [`Invalid JSON: ${error instanceof Error ? error.message : String(error)}`],\n\t\t\t};\n\t\t}\n\n\t\t// Step 2: Validate structure\n\t\tconst validationErrors = this.validate(config);\n\t\terrors.push(...validationErrors);\n\n\t\treturn {\n\t\t\tisValid: errors.length === 0,\n\t\t\tconfig: errors.length === 0 ? config : undefined,\n\t\t\terrors: errors.length > 0 ? errors : undefined,\n\t\t\twarnings: warnings.length > 0 ? warnings : undefined,\n\t\t};\n\t}\n\n\t/**\n\t * Validate a configuration object\n\t *\n\t * @param config - The configuration to validate\n\t * @returns Array of validation error messages\n\t */\n\tprivate validate(config: SnapBackRC): string[] {\n\t\tconst errors: string[] = [];\n\n\t\t// Validate protection rules\n\t\tif (config.protection !== undefined) {\n\t\t\tif (!Array.isArray(config.protection)) {\n\t\t\t\terrors.push(\"protection must be an array\");\n\t\t\t} else {\n\t\t\t\tfor (let i = 0; i < config.protection.length; i++) {\n\t\t\t\t\tconst rule = config.protection[i];\n\t\t\t\t\tconst ruleErrors = this.validateProtectionRule(rule, i);\n\t\t\t\t\terrors.push(...ruleErrors);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Validate ignore patterns\n\t\tif (config.ignore !== undefined && !Array.isArray(config.ignore)) {\n\t\t\terrors.push(\"ignore must be an array of strings\");\n\t\t}\n\n\t\t// Validate settings\n\t\tif (config.settings !== undefined) {\n\t\t\tconst settingsErrors = this.validateSettings(config.settings);\n\t\t\terrors.push(...settingsErrors);\n\t\t}\n\n\t\t// Validate policies\n\t\tif (config.policies !== undefined) {\n\t\t\tconst policyErrors = this.validatePolicies(config.policies);\n\t\t\terrors.push(...policyErrors);\n\t\t}\n\n\t\treturn errors;\n\t}\n\n\t/**\n\t * Validate a single protection rule\n\t *\n\t * @param rule - The protection rule to validate\n\t * @param index - The index of the rule in the array\n\t * @returns Array of validation error messages\n\t */\n\tprivate validateProtectionRule(rule: ProtectionRule, index: number): string[] {\n\t\tconst errors: string[] = [];\n\t\tconst prefix = `protection[${index}]`;\n\n\t\t// Check required fields\n\t\tif (!rule.pattern) {\n\t\t\terrors.push(`${prefix}: pattern is required`);\n\t\t}\n\n\t\tif (!rule.level) {\n\t\t\terrors.push(`${prefix}: level is required`);\n\t\t} else if (!VALID_PROTECTION_LEVELS.includes(rule.level)) {\n\t\t\terrors.push(`${prefix}: level must be one of ${VALID_PROTECTION_LEVELS.join(\", \")} (got \"${rule.level}\")`);\n\t\t}\n\n\t\t// Validate optional fields\n\t\tif (rule.debounce !== undefined && (typeof rule.debounce !== \"number\" || rule.debounce < 0)) {\n\t\t\terrors.push(`${prefix}: debounce must be a non-negative number`);\n\t\t}\n\n\t\tif (rule.excludeFrom !== undefined && !Array.isArray(rule.excludeFrom)) {\n\t\t\terrors.push(`${prefix}: excludeFrom must be an array of strings`);\n\t\t}\n\n\t\tif (rule.autoSnapshot !== undefined && typeof rule.autoSnapshot !== \"boolean\") {\n\t\t\terrors.push(`${prefix}: autoSnapshot must be a boolean`);\n\t\t}\n\n\t\treturn errors;\n\t}\n\n\t/**\n\t * Validate settings\n\t *\n\t * @param settings - The settings to validate\n\t * @returns Array of validation error messages\n\t */\n\tprivate validateSettings(settings: SnapBackSettings): string[] {\n\t\tconst errors: string[] = [];\n\n\t\tif (settings.maxSnapshots !== undefined) {\n\t\t\tif (typeof settings.maxSnapshots !== \"number\" || settings.maxSnapshots < 1) {\n\t\t\t\terrors.push(\"settings.maxSnapshots must be a positive number\");\n\t\t\t}\n\t\t}\n\n\t\tif (\n\t\t\tsettings.defaultProtectionLevel !== undefined &&\n\t\t\t!VALID_PROTECTION_LEVELS.includes(settings.defaultProtectionLevel)\n\t\t) {\n\t\t\terrors.push(`settings.defaultProtectionLevel must be one of ${VALID_PROTECTION_LEVELS.join(\", \")}`);\n\t\t}\n\n\t\tif (\n\t\t\tsettings.protectionDebounce !== undefined &&\n\t\t\t(typeof settings.protectionDebounce !== \"number\" || settings.protectionDebounce < 0)\n\t\t) {\n\t\t\terrors.push(\"settings.protectionDebounce must be a non-negative number\");\n\t\t}\n\n\t\tif (\n\t\t\tsettings.maxStorageSize !== undefined &&\n\t\t\t(typeof settings.maxStorageSize !== \"number\" || settings.maxStorageSize < 0)\n\t\t) {\n\t\t\terrors.push(\"settings.maxStorageSize must be a non-negative number\");\n\t\t}\n\n\t\tif (\n\t\t\tsettings.parallelOperations !== undefined &&\n\t\t\t(typeof settings.parallelOperations !== \"number\" || settings.parallelOperations < 1)\n\t\t) {\n\t\t\terrors.push(\"settings.parallelOperations must be a positive number\");\n\t\t}\n\n\t\treturn errors;\n\t}\n\n\t/**\n\t * Validate policies\n\t *\n\t * @param policies - The policies to validate\n\t * @returns Array of validation error messages\n\t */\n\tprivate validatePolicies(policies: SnapBackPolicies): string[] {\n\t\tconst errors: string[] = [];\n\n\t\tif (\n\t\t\tpolicies.minimumProtectionLevel !== undefined &&\n\t\t\t!VALID_PROTECTION_LEVELS.includes(policies.minimumProtectionLevel)\n\t\t) {\n\t\t\terrors.push(`policies.minimumProtectionLevel must be one of ${VALID_PROTECTION_LEVELS.join(\", \")}`);\n\t\t}\n\n\t\treturn errors;\n\t}\n\n\t/**\n\t * Merge two configurations\n\t *\n\t * Combines two configurations with the override taking precedence.\n\t * Arrays are concatenated, objects are deeply merged.\n\t *\n\t * @param base - The base configuration\n\t * @param override - The override configuration\n\t * @param options - Merge options including provenance tracking\n\t * @returns Merged configuration\n\t */\n\tmerge(base: SnapBackRC, override: SnapBackRC, options?: MergeOptions): SnapBackRC {\n\t\tconst result: SnapBackRC = {};\n\n\t\t// Merge protection rules (concatenate)\n\t\tif (base.protection || override.protection) {\n\t\t\tresult.protection = [];\n\n\t\t\tif (base.protection) {\n\t\t\t\tresult.protection.push(\n\t\t\t\t\t...base.protection.map((rule) => ({\n\t\t\t\t\t\t...rule,\n\t\t\t\t\t\t_provenance: options?.baseProvenance,\n\t\t\t\t\t})),\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (override.protection) {\n\t\t\t\tresult.protection.push(\n\t\t\t\t\t...override.protection.map((rule) => ({\n\t\t\t\t\t\t...rule,\n\t\t\t\t\t\t_provenance: options?.overrideProvenance,\n\t\t\t\t\t})),\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\t// Merge ignore patterns (concatenate and deduplicate)\n\t\tif (base.ignore || override.ignore) {\n\t\t\tconst ignoreSet = new Set<string>();\n\n\t\t\tif (base.ignore) {\n\t\t\t\tfor (const pattern of base.ignore) {\n\t\t\t\t\tignoreSet.add(pattern);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (override.ignore) {\n\t\t\t\tfor (const pattern of override.ignore) {\n\t\t\t\t\tignoreSet.add(pattern);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tresult.ignore = Array.from(ignoreSet);\n\t\t}\n\n\t\t// Merge settings (deep merge, override takes precedence)\n\t\tif (base.settings || override.settings) {\n\t\t\tresult.settings = {\n\t\t\t\t...base.settings,\n\t\t\t\t...override.settings,\n\t\t\t};\n\t\t}\n\n\t\t// Merge policies (deep merge, override takes precedence)\n\t\tif (base.policies || override.policies) {\n\t\t\tresult.policies = {\n\t\t\t\t...base.policies,\n\t\t\t\t...override.policies,\n\t\t\t};\n\t\t}\n\n\t\t// Merge hooks (override takes precedence)\n\t\tif (base.hooks || override.hooks) {\n\t\t\tresult.hooks = {\n\t\t\t\t...base.hooks,\n\t\t\t\t...override.hooks,\n\t\t\t};\n\t\t}\n\n\t\t// Merge templates (concatenate)\n\t\tif (base.templates || override.templates) {\n\t\t\tresult.templates = [...(base.templates || []), ...(override.templates || [])];\n\t\t}\n\n\t\treturn result;\n\t}\n\n\t/**\n\t * Filter configuration by pattern\n\t *\n\t * Returns a new configuration containing only protection rules\n\t * that match the given pattern.\n\t *\n\t * @param config - The configuration to filter\n\t * @param pattern - The pattern to match\n\t * @returns Filtered configuration\n\t */\n\tfilterByPattern(config: SnapBackRC, pattern: string): SnapBackRC {\n\t\tconst result: SnapBackRC = {\n\t\t\t...config,\n\t\t};\n\n\t\tif (config.protection) {\n\t\t\tresult.protection = config.protection.filter((rule) => rule.pattern === pattern);\n\t\t}\n\n\t\treturn result;\n\t}\n}\n","/**\n * AI Presence Detector - Detects presence of AI coding assistants\n *\n * This module provides platform-agnostic utilities for detecting the presence\n * of AI coding assistants like GitHub Copilot, Claude, and other popular tools.\n *\n * The detector uses dependency injection to work across different platforms:\n * - VSCode: Uses vscode.extensions API\n * - CLI: Can check process list or config files\n * - Web: Can check browser extensions or API integrations\n *\n * @module AIPresenceDetector\n */\n\nimport type { AIPresenceInfo } from \"../session/SessionTagger\";\n\n/**\n * Known AI assistant extension/tool IDs\n *\n * Maps friendly names to their platform-specific identifiers.\n * For VSCode, these are extension IDs. For other platforms, these\n * could be process names, package names, or other identifiers.\n */\nexport const AI_EXTENSION_IDS = {\n\tGITHUB_COPILOT: \"github.copilot\",\n\tGITHUB_COPILOT_CHAT: \"github.copilot-chat\",\n\tCLAUDE: \"claude.claude\",\n\tTABNINE: \"tabnine.tabnine-vscode\",\n\tCODEIUM: \"codeium.codeium\",\n\tAMAZON_Q: \"amazonwebservices.aws-toolkit-vscode\",\n\tCONTINUE: \"continue.continue\",\n\tBLACKBOX: \"blackboxapp.blackbox\",\n\tWINDSURF: \"windsurf.windsurf\",\n} as const;\n\n/**\n * Type for AI assistant names\n */\nexport type AIAssistantName = keyof typeof AI_EXTENSION_IDS;\n\n/**\n * Interface for extension/tool providers\n *\n * Different platforms implement this interface to provide their\n * specific method of listing installed extensions/tools.\n */\nexport interface IExtensionProvider {\n\t/**\n\t * Returns a list of all installed extension/tool IDs\n\t *\n\t * @returns Array of extension/tool identifiers\n\t */\n\tgetAllExtensionIds(): string[];\n}\n\n/**\n * Human-readable names for AI assistants\n */\nconst ASSISTANT_DISPLAY_NAMES: Record<AIAssistantName, string> = {\n\tGITHUB_COPILOT: \"GitHub Copilot\",\n\tGITHUB_COPILOT_CHAT: \"GitHub Copilot Chat\",\n\tCLAUDE: \"Claude\",\n\tTABNINE: \"Tabnine\",\n\tCODEIUM: \"Codeium\",\n\tAMAZON_Q: \"Amazon Q\",\n\tCONTINUE: \"Continue\",\n\tBLACKBOX: \"Blackbox\",\n\tWINDSURF: \"Windsurf\",\n};\n\n/**\n * AIPresenceDetector - Platform-agnostic AI assistant detection\n *\n * Detects the presence of AI coding assistants across different platforms\n * using dependency injection for platform-specific extension/tool listing.\n *\n * @example\n * ```typescript\n * // VSCode example\n * const vscodeProvider: IExtensionProvider = {\n * getAllExtensionIds: () => vscode.extensions.all.map(ext => ext.id)\n * };\n * const detector = new AIPresenceDetector(vscodeProvider);\n * const presence = detector.detectAIPresence();\n * // { hasAI: true, detectedAssistants: ['GITHUB_COPILOT'], ... }\n * ```\n */\nexport class AIPresenceDetector {\n\tprivate extensionProvider: IExtensionProvider;\n\n\t/**\n\t * Creates a new AIPresenceDetector\n\t *\n\t * @param extensionProvider - Platform-specific extension provider\n\t */\n\tconstructor(extensionProvider: IExtensionProvider) {\n\t\tthis.extensionProvider = extensionProvider;\n\t}\n\n\t/**\n\t * Detects the presence of AI coding assistants\n\t *\n\t * Queries the extension provider and matches against known AI assistant\n\t * identifiers to determine which assistants are currently installed.\n\t *\n\t * @returns Information about detected AI assistants\n\t */\n\tdetectAIPresence(): AIPresenceInfo {\n\t\tconst installedExtensionIds = this.extensionProvider.getAllExtensionIds();\n\t\tconst detectedAssistants: string[] = [];\n\n\t\t// Check each known AI assistant\n\t\tfor (const [name, id] of Object.entries(AI_EXTENSION_IDS)) {\n\t\t\tif (installedExtensionIds.includes(id)) {\n\t\t\t\t// Only add if not already in the list (handles duplicates)\n\t\t\t\tif (!detectedAssistants.includes(name)) {\n\t\t\t\t\tdetectedAssistants.push(name);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn {\n\t\t\thasAI: detectedAssistants.length > 0,\n\t\t\tdetectedAssistants,\n\t\t\tassistantDetails: ASSISTANT_DISPLAY_NAMES,\n\t\t};\n\t}\n\n\t/**\n\t * Checks if a specific AI assistant is installed\n\t *\n\t * @param assistantName - Name of the AI assistant to check\n\t * @returns True if the assistant is installed\n\t */\n\tisAIAssistantInstalled(assistantName: AIAssistantName): boolean {\n\t\tconst extensionId = AI_EXTENSION_IDS[assistantName];\n\t\tconst installedExtensionIds = this.extensionProvider.getAllExtensionIds();\n\t\treturn installedExtensionIds.includes(extensionId);\n\t}\n\n\t/**\n\t * Gets a list of all installed AI assistants\n\t *\n\t * @returns Array of installed AI assistant names\n\t */\n\tgetInstalledAIAssistants(): AIAssistantName[] {\n\t\tconst installedExtensionIds = this.extensionProvider.getAllExtensionIds();\n\t\tconst installed: AIAssistantName[] = [];\n\n\t\tfor (const [name, id] of Object.entries(AI_EXTENSION_IDS)) {\n\t\t\tif (installedExtensionIds.includes(id)) {\n\t\t\t\tinstalled.push(name as AIAssistantName);\n\t\t\t}\n\t\t}\n\n\t\treturn installed;\n\t}\n}\n","/**\n * @fileoverview Burst Heuristics Detector - Detects AI-like editing bursts\n *\n * This module provides utilities for detecting rapid, large insertions that\n * might indicate AI-assisted coding sessions. It analyzes editing patterns\n * to identify characteristic AI behaviors.\n *\n * Migrated from apps/vscode to SDK for platform-wide reuse.\n */\n\nimport { THRESHOLDS } from \"../../config/Thresholds\";\n\n/**\n * Configuration for burst detection\n * Uses centralized THRESHOLDS from SDK config (Phase 15)\n */\nconst DEFAULT_BURST_CONFIG = {\n\t/** Time window in milliseconds to consider for burst detection */\n\ttimeWindow: THRESHOLDS.burst.timeWindow,\n\n\t/** Minimum number of characters inserted to qualify as burst */\n\tminCharsInserted: THRESHOLDS.burst.minCharsInserted,\n\n\t/** Maximum time between keystrokes to qualify as burst */\n\tmaxKeystrokeInterval: THRESHOLDS.burst.maxKeystrokeInterval,\n\n\t/** Minimum number of lines affected to qualify as burst */\n\tminLinesAffected: THRESHOLDS.burst.minLinesAffected,\n\n\t/** Minimum ratio of inserted to deleted chars to qualify as burst */\n\tminInsertDeleteRatio: THRESHOLDS.burst.minInsertDeleteRatio,\n};\n\n/**\n * Configuration interface for burst detection\n */\nexport interface BurstDetectorConfig {\n\t/** Time window in milliseconds to consider for burst detection */\n\ttimeWindow?: number;\n\n\t/** Minimum number of characters inserted to qualify as burst */\n\tminCharsInserted?: number;\n\n\t/** Maximum time between keystrokes to qualify as burst */\n\tmaxKeystrokeInterval?: number;\n\n\t/** Minimum number of lines affected to qualify as burst */\n\tminLinesAffected?: number;\n\n\t/** Minimum ratio of inserted to deleted chars to qualify as burst */\n\tminInsertDeleteRatio?: number;\n}\n\n/**\n * Information about a text change event\n */\ninterface TextChangeInfo {\n\t/** Timestamp of the change */\n\ttimestamp: number;\n\n\t/** Number of characters inserted */\n\tcharsInserted: number;\n\n\t/** Number of characters deleted */\n\tcharsDeleted: number;\n\n\t/** Number of lines affected */\n\tlinesAffected: number;\n\n\t/** Time since last change */\n\tinterval: number;\n}\n\n/**\n * Results of burst detection analysis\n */\nexport interface BurstDetectionResult {\n\t/** Whether a burst pattern was detected */\n\tisBurst: boolean;\n\n\t/** Confidence level (0-1) */\n\tconfidence: number;\n\n\t/** Details about the detected burst */\n\tdetails?: {\n\t\t/** Total characters inserted */\n\t\ttotalInserted: number;\n\n\t\t/** Total characters deleted */\n\t\ttotalDeleted: number;\n\n\t\t/** Insert/delete ratio */\n\t\tratio: number;\n\n\t\t/** Number of changes in burst */\n\t\tchangeCount: number;\n\n\t\t/** Duration of burst */\n\t\tduration: number;\n\t};\n}\n\n/**\n * Tracks and detects AI-like burst patterns in editing\n */\nexport class BurstHeuristicsDetector {\n\t/** Recent text changes for analysis */\n\tprivate recentChanges: TextChangeInfo[] = [];\n\n\t/** Timestamp of last change */\n\tprivate lastChangeTime = 0;\n\n\t/** Configuration for burst detection */\n\tprivate config: Required<BurstDetectorConfig>;\n\n\t/**\n\t * Creates a new BurstHeuristicsDetector\n\t *\n\t * @param config Optional configuration to override defaults\n\t */\n\tconstructor(config?: BurstDetectorConfig) {\n\t\tthis.config = {\n\t\t\ttimeWindow: config?.timeWindow ?? DEFAULT_BURST_CONFIG.timeWindow,\n\t\t\tminCharsInserted: config?.minCharsInserted ?? DEFAULT_BURST_CONFIG.minCharsInserted,\n\t\t\tmaxKeystrokeInterval: config?.maxKeystrokeInterval ?? DEFAULT_BURST_CONFIG.maxKeystrokeInterval,\n\t\t\tminLinesAffected: config?.minLinesAffected ?? DEFAULT_BURST_CONFIG.minLinesAffected,\n\t\t\tminInsertDeleteRatio: config?.minInsertDeleteRatio ?? DEFAULT_BURST_CONFIG.minInsertDeleteRatio,\n\t\t};\n\t}\n\n\t/**\n\t * Records a text change event for burst analysis\n\t *\n\t * @param charsInserted Number of characters inserted\n\t * @param charsDeleted Number of characters deleted\n\t * @param linesAffected Number of lines affected\n\t */\n\trecordChange(charsInserted: number, charsDeleted: number, linesAffected: number): void {\n\t\tconst now = Date.now();\n\t\tconst interval = this.lastChangeTime > 0 ? now - this.lastChangeTime : 0;\n\n\t\tconst changeInfo: TextChangeInfo = {\n\t\t\ttimestamp: now,\n\t\t\tcharsInserted,\n\t\t\tcharsDeleted,\n\t\t\tlinesAffected,\n\t\t\tinterval,\n\t\t};\n\n\t\tthis.recentChanges.push(changeInfo);\n\t\tthis.lastChangeTime = now;\n\n\t\t// Trim old changes outside the time window\n\t\tthis.trimOldChanges();\n\t}\n\n\t/**\n\t * Analyzes recent changes to detect burst patterns\n\t *\n\t * @returns Burst detection result\n\t */\n\tanalyzeBurst(): BurstDetectionResult {\n\t\t// Need at least 2 changes to analyze pattern\n\t\tif (this.recentChanges.length < 2) {\n\t\t\treturn { isBurst: false, confidence: 0 };\n\t\t}\n\n\t\t// Filter changes within the time window\n\t\tconst now = Date.now();\n\t\tconst windowChanges = this.recentChanges.filter((change) => now - change.timestamp <= this.config.timeWindow);\n\n\t\t// Need at least 2 changes in window\n\t\tif (windowChanges.length < 2) {\n\t\t\treturn { isBurst: false, confidence: 0 };\n\t\t}\n\n\t\t// Calculate aggregate metrics\n\t\tconst totalInserted = windowChanges.reduce((sum, change) => sum + change.charsInserted, 0);\n\n\t\tconst totalDeleted = windowChanges.reduce((sum, change) => sum + change.charsDeleted, 0);\n\n\t\tconst totalLines = windowChanges.reduce((sum, change) => sum + change.linesAffected, 0);\n\n\t\tconst duration =\n\t\t\twindowChanges.length > 1\n\t\t\t\t? windowChanges[windowChanges.length - 1].timestamp - windowChanges[0].timestamp\n\t\t\t\t: 0;\n\n\t\t// Check burst criteria\n\t\tconst meetsCharThreshold = totalInserted >= this.config.minCharsInserted;\n\t\tconst meetsLineThreshold = totalLines >= this.config.minLinesAffected;\n\n\t\tconst ratio = totalDeleted > 0 ? totalInserted / totalDeleted : totalInserted;\n\t\tconst meetsRatioThreshold = ratio >= this.config.minInsertDeleteRatio;\n\n\t\t// Calculate average interval between changes\n\t\tconst intervals = windowChanges.slice(1).map((change, i) => change.timestamp - windowChanges[i].timestamp);\n\n\t\tconst avgInterval =\n\t\t\tintervals.length > 0 ? intervals.reduce((sum, interval) => sum + interval, 0) / intervals.length : 0;\n\n\t\tconst meetsTimingThreshold = avgInterval <= this.config.maxKeystrokeInterval;\n\n\t\t// Determine if this qualifies as a burst\n\t\tconst isBurst = meetsCharThreshold && meetsLineThreshold && meetsRatioThreshold && meetsTimingThreshold;\n\n\t\t// Calculate confidence based on how strongly criteria are met\n\t\tlet confidence = 0;\n\t\tif (isBurst) {\n\t\t\t// Base confidence on how much criteria are exceeded\n\t\t\tconst charConfidence = Math.min(1, totalInserted / (this.config.minCharsInserted * 2));\n\t\t\tconst lineConfidence = Math.min(1, totalLines / (this.config.minLinesAffected * 2));\n\t\t\tconst ratioConfidence = Math.min(1, ratio / (this.config.minInsertDeleteRatio * 2));\n\t\t\tconst timingConfidence =\n\t\t\t\tavgInterval > 0 ? Math.min(1, this.config.maxKeystrokeInterval / (avgInterval * 2)) : 1;\n\n\t\t\tconfidence = (charConfidence + lineConfidence + ratioConfidence + timingConfidence) / 4;\n\t\t}\n\n\t\treturn {\n\t\t\tisBurst,\n\t\t\tconfidence,\n\t\t\tdetails: isBurst\n\t\t\t\t? {\n\t\t\t\t\t\ttotalInserted,\n\t\t\t\t\t\ttotalDeleted,\n\t\t\t\t\t\tratio,\n\t\t\t\t\t\tchangeCount: windowChanges.length,\n\t\t\t\t\t\tduration,\n\t\t\t\t\t}\n\t\t\t\t: undefined,\n\t\t};\n\t}\n\n\t/**\n\t * Trims old changes outside the analysis time window\n\t */\n\tprivate trimOldChanges(): void {\n\t\tconst cutoffTime = Date.now() - this.config.timeWindow;\n\t\tthis.recentChanges = this.recentChanges.filter((change) => change.timestamp >= cutoffTime);\n\t}\n\n\t/**\n\t * Clears all recorded changes\n\t */\n\tclear(): void {\n\t\tthis.recentChanges = [];\n\t\tthis.lastChangeTime = 0;\n\t}\n}\n","/**\n * Cursor IDE Detection\n *\n * Detects if running in Cursor (closed-source VS Code fork with built-in AI).\n * Uses heuristic: vscode.env.appName\n *\n * Confidence: 7.0 (presence) / 8.5 (absence)\n *\n * Asymmetry rationale:\n * - appName heuristic can miss edge cases (VM, SSH, custom builds)\n * - But if vscode.env.appName does NOT include 'cursor', we're quite sure it's not Cursor\n * - \"Absence is stronger signal than presence\" for heuristic-based detection\n * - Worst case: false negative (user in Cursor, we say \"no AI\") is acceptable for v1\n * Better than false positive (user in VS Code, we claim Cursor detected)\n */\n\nexport interface IEnvironmentProvider {\n\t/**\n\t * Returns the application name (e.g., \"Cursor\", \"Visual Studio Code\")\n\t */\n\tgetAppName(): string;\n\n\t/**\n\t * Gets an environment variable value\n\t */\n\tgetEnvVar(key: string): string | undefined;\n}\n\nexport class CursorDetector {\n\tconstructor(private readonly env: IEnvironmentProvider) {}\n\n\t/**\n\t * Detects Cursor IDE presence via appName heuristic\n\t */\n\tdetect(): { hasCursor: boolean; confidence: number } {\n\t\tconst appName = this.env.getAppName().toLowerCase();\n\n\t\tif (appName.includes(\"cursor\")) {\n\t\t\treturn { hasCursor: true, confidence: 7.0 };\n\t\t}\n\n\t\treturn { hasCursor: false, confidence: 8.5 };\n\t}\n}\n","/**\n * Platform-agnostic interfaces for SessionCoordinator dependencies\n *\n * These interfaces enable SessionCoordinator to work across multiple platforms\n * (VSCode, CLI, MCP, Web) by abstracting platform-specific implementations.\n */\n\n/**\n * Generic event emitter interface for session events\n */\nexport interface IEventEmitter<T> {\n\t/**\n\t * Fire an event with the given data\n\t * @param data - Event data to emit\n\t */\n\tfire(data: T): void;\n\n\t/**\n\t * Subscribe to events\n\t * @param listener - Function to call when event is fired\n\t * @returns Disposable to unsubscribe\n\t */\n\tsubscribe(listener: (data: T) => void): IDisposable;\n\n\t/**\n\t * Dispose the emitter and clean up resources\n\t */\n\tdispose(): void;\n}\n\n/**\n * Disposable interface for cleanup\n */\nexport interface IDisposable {\n\tdispose(): void;\n}\n\n/**\n * Timer service interface for platform-agnostic timeout/interval management\n */\nexport interface ITimerService {\n\t/**\n\t * Set a timeout\n\t * @param callback - Function to call after delay\n\t * @param ms - Delay in milliseconds\n\t * @returns Timer ID for cancellation\n\t */\n\tsetTimeout(callback: () => void, ms: number): string;\n\n\t/**\n\t * Clear a timeout\n\t * @param id - Timer ID from setTimeout\n\t */\n\tclearTimeout(id: string): void;\n\n\t/**\n\t * Set an interval\n\t * @param callback - Function to call repeatedly\n\t * @param ms - Interval in milliseconds\n\t * @returns Timer ID for cancellation\n\t */\n\tsetInterval(callback: () => void, ms: number): string;\n\n\t/**\n\t * Clear an interval\n\t * @param id - Timer ID from setInterval\n\t */\n\tclearInterval(id: string): void;\n}\n\n/**\n * Logger interface for platform-agnostic logging\n */\nexport interface ILogger {\n\tdebug(message: string, data?: unknown): void;\n\tinfo(message: string, data?: unknown): void;\n\terror(message: string, error?: Error, data?: unknown): void;\n}\n\n/**\n * Storage interface for session manifests\n */\nexport interface ISessionStorage {\n\t/**\n\t * Store a session manifest\n\t * @param manifest - Session manifest to store\n\t */\n\tstoreSessionManifest(manifest: SessionManifest): Promise<void>;\n\n\t/**\n\t * List all session manifests\n\t * @returns Array of session manifests\n\t */\n\tlistSessionManifests?(): Promise<SessionManifest[]>;\n\n\t/**\n\t * Get a session manifest by ID\n\t * @param sessionId - Session ID\n\t * @returns Session manifest or null if not found\n\t */\n\tgetSessionManifest?(sessionId: string): Promise<SessionManifest | null>;\n}\n\n/**\n * No-op logger implementation (default)\n */\nexport class NoOpLogger implements ILogger {\n\tdebug(): void {}\n\tinfo(): void {}\n\terror(): void {}\n}\n\n/**\n * Node.js-based timer service implementation\n */\nexport class NodeTimerService implements ITimerService {\n\tprivate timeouts = new Map<string, NodeJS.Timeout>();\n\tprivate intervals = new Map<string, NodeJS.Timeout>();\n\tprivate nextId = 0;\n\n\tsetTimeout(callback: () => void, ms: number): string {\n\t\tconst id = `timeout_${this.nextId++}`;\n\t\tconst timeout = globalThis.setTimeout(callback, ms);\n\t\tthis.timeouts.set(id, timeout);\n\t\treturn id;\n\t}\n\n\tclearTimeout(id: string): void {\n\t\tconst timeout = this.timeouts.get(id);\n\t\tif (timeout) {\n\t\t\tglobalThis.clearTimeout(timeout);\n\t\t\tthis.timeouts.delete(id);\n\t\t}\n\t}\n\n\tsetInterval(callback: () => void, ms: number): string {\n\t\tconst id = `interval_${this.nextId++}`;\n\t\tconst interval = globalThis.setInterval(callback, ms);\n\t\tthis.intervals.set(id, interval);\n\t\treturn id;\n\t}\n\n\tclearInterval(id: string): void {\n\t\tconst interval = this.intervals.get(id);\n\t\tif (interval) {\n\t\t\tglobalThis.clearInterval(interval);\n\t\t\tthis.intervals.delete(id);\n\t\t}\n\t}\n\n\t/**\n\t * Dispose all active timers\n\t */\n\tdispose(): void {\n\t\tfor (const timeout of this.timeouts.values()) {\n\t\t\tglobalThis.clearTimeout(timeout);\n\t\t}\n\t\tfor (const interval of this.intervals.values()) {\n\t\t\tglobalThis.clearInterval(interval);\n\t\t}\n\t\tthis.timeouts.clear();\n\t\tthis.intervals.clear();\n\t}\n}\n\n// Import SessionManifest type for storage interface\nimport type { SessionManifest } from \"./types\";\n","/**\n * Experience Classifier - Platform-agnostic user experience tier classification\n *\n * This module provides utilities for classifying users into experience tiers\n * (explorer, intermediate, power user) based on their interaction patterns.\n * This enables adaptive hints and features across all platforms.\n *\n * @module ExperienceClassifier\n */\n\nimport { THRESHOLDS } from \"../../config/Thresholds\";\nimport type { ExperienceMetrics } from \"../../types/experience\";\nimport type { ILogger } from \"./interfaces\";\nimport { NoOpLogger } from \"./interfaces\";\n\n/**\n * Experience tiers for users\n */\nexport type ExperienceTier =\n\t| \"explorer\" // New users just getting started\n\t| \"intermediate\" // Regular users with some experience\n\t| \"power\" // Advanced users who use many features\n\t| \"unknown\"; // Unable to classify\n\n/**\n * Metrics used for experience classification\n */\n\n/**\n * Key-value storage interface for persisting experience data\n */\nexport interface IKeyValueStorage {\n\t/**\n\t * Get a value from storage\n\t * @param key - Storage key\n\t * @param defaultValue - Default value if key doesn't exist\n\t * @returns Value from storage or default\n\t */\n\tget<T>(key: string, defaultValue?: T): Promise<T | undefined>;\n\n\t/**\n\t * Set a value in storage\n\t * @param key - Storage key\n\t * @param value - Value to store\n\t */\n\tset<T>(key: string, value: T): Promise<void>;\n}\n\n/**\n * Configuration for experience classification thresholds\n */\nexport interface ExperienceThresholdsConfig {\n\texplorer: ExperienceMetrics;\n\tintermediate: ExperienceMetrics;\n\tpower: ExperienceMetrics;\n}\n\n/**\n * Default thresholds for experience classification\n * Uses centralized THRESHOLDS from SDK config (Phase 15)\n */\nexport const DEFAULT_EXPERIENCE_THRESHOLDS: ExperienceThresholdsConfig = THRESHOLDS.experience;\n\n/**\n * Options for ExperienceClassifier\n */\nexport interface ExperienceClassifierOptions {\n\t/** Storage adapter for persisting experience data */\n\tstorage: IKeyValueStorage;\n\n\t/** Logger for debug/info messages (optional) */\n\tlogger?: ILogger;\n\n\t/** Custom thresholds (optional) */\n\tthresholds?: ExperienceThresholdsConfig;\n}\n\n/**\n * Experience Classifier - Classifies users into experience tiers\n *\n * Platform-agnostic implementation that works across VSCode, CLI, MCP, Web.\n */\nexport class ExperienceClassifier {\n\tprivate storage: IKeyValueStorage;\n\tprivate logger: ILogger;\n\tprivate thresholds: ExperienceThresholdsConfig;\n\n\t/**\n\t * Creates a new Experience Classifier\n\t *\n\t * @param options - Configuration options\n\t */\n\tconstructor(options: ExperienceClassifierOptions) {\n\t\tthis.storage = options.storage;\n\t\tthis.logger = options.logger || new NoOpLogger();\n\t\tthis.thresholds = options.thresholds || DEFAULT_EXPERIENCE_THRESHOLDS;\n\t}\n\n\t/**\n\t * Gets the current experience tier for the user\n\t *\n\t * @returns The user's experience tier\n\t */\n\tasync getExperienceTier(): Promise<ExperienceTier> {\n\t\t// Check if tier is manually set (for testing)\n\t\tconst manualTier = await this.storage.get<ExperienceTier>(\"experienceTier\");\n\t\tif (manualTier && manualTier !== \"unknown\") {\n\t\t\treturn manualTier;\n\t\t}\n\n\t\t// Get experience metrics\n\t\tconst metrics = await this.getExperienceMetrics();\n\n\t\t// Classify based on metrics (check highest tier first)\n\t\tif (this.meetsThreshold(metrics, \"power\")) {\n\t\t\treturn \"power\";\n\t\t}\n\t\tif (this.meetsThreshold(metrics, \"intermediate\")) {\n\t\t\treturn \"intermediate\";\n\t\t}\n\t\tif (this.meetsThreshold(metrics, \"explorer\")) {\n\t\t\treturn \"explorer\";\n\t\t}\n\n\t\treturn \"unknown\";\n\t}\n\n\t/**\n\t * Checks if metrics meet or exceed a threshold tier\n\t *\n\t * @param metrics - Experience metrics\n\t * @param tier - Tier to check against\n\t * @returns True if metrics meet or exceed the tier\n\t */\n\tprivate meetsThreshold(metrics: ExperienceMetrics, tier: keyof ExperienceThresholdsConfig): boolean {\n\t\tconst threshold = this.thresholds[tier];\n\n\t\treturn (\n\t\t\tmetrics.snapshotsCreated >= threshold.snapshotsCreated &&\n\t\t\tmetrics.sessionsRecorded >= threshold.sessionsRecorded &&\n\t\t\tmetrics.protectedFiles >= threshold.protectedFiles &&\n\t\t\tmetrics.manualRestores >= threshold.manualRestores &&\n\t\t\tmetrics.aiAssistedSessions >= threshold.aiAssistedSessions &&\n\t\t\tmetrics.daysSinceFirstUse >= threshold.daysSinceFirstUse &&\n\t\t\tmetrics.commandDiversity >= threshold.commandDiversity\n\t\t);\n\t}\n\n\t/**\n\t * Gets experience metrics for the current user\n\t *\n\t * @returns Experience metrics\n\t */\n\tasync getExperienceMetrics(): Promise<ExperienceMetrics> {\n\t\t// Get metrics from storage\n\t\tconst snapshotsCreated = await this.storage.get<number>(\"snapshotsCreated\", 0);\n\t\tconst sessionsRecorded = await this.storage.get<number>(\"sessionsRecorded\", 0);\n\t\tconst protectedFiles = await this.storage.get<number>(\"protectedFiles\", 0);\n\t\tconst manualRestores = await this.storage.get<number>(\"manualRestores\", 0);\n\t\tconst aiAssistedSessions = await this.storage.get<number>(\"aiAssistedSessions\", 0);\n\t\tconst firstUseTimestamp = await this.storage.get<number>(\"firstUseTimestamp\", Date.now());\n\t\tconst commandsUsed = await this.storage.get<Record<string, number>>(\"commandsUsed\", {});\n\n\t\t// Calculate days since first use\n\t\tconst daysSinceFirstUse = Math.floor((Date.now() - (firstUseTimestamp || Date.now())) / (1000 * 60 * 60 * 24));\n\n\t\t// Calculate command diversity (0-1)\n\t\tconst commandsUsedRecord = commandsUsed || {};\n\t\tconst totalCommands = Object.values(commandsUsedRecord).reduce((sum, count) => sum + count, 0);\n\t\tconst uniqueCommands = Object.keys(commandsUsedRecord).length;\n\t\tconst commandDiversity = totalCommands > 0 ? uniqueCommands / Math.min(totalCommands, 20) : 0;\n\n\t\treturn {\n\t\t\tsnapshotsCreated: snapshotsCreated || 0,\n\t\t\tsessionsRecorded: sessionsRecorded || 0,\n\t\t\tprotectedFiles: protectedFiles || 0,\n\t\t\tmanualRestores: manualRestores || 0,\n\t\t\taiAssistedSessions: aiAssistedSessions || 0,\n\t\t\tdaysSinceFirstUse,\n\t\t\tcommandDiversity,\n\t\t};\n\t}\n\n\t/**\n\t * Updates experience metrics based on user activity\n\t *\n\t * @param activity - Type of activity to record\n\t * @param count - Number of activities to record (default: 1)\n\t */\n\tasync updateExperienceMetrics(activity: keyof ExperienceMetrics, count = 1): Promise<void> {\n\t\tconst current = await this.storage.get<number>(activity, 0);\n\t\tawait this.storage.set(activity, (current || 0) + count);\n\n\t\t// Set first use timestamp if not already set\n\t\tconst firstUseTimestamp = await this.storage.get<number>(\"firstUseTimestamp\");\n\t\tif (!firstUseTimestamp) {\n\t\t\tawait this.storage.set(\"firstUseTimestamp\", Date.now());\n\t\t}\n\n\t\tthis.logger.debug(\"Experience metrics updated\", {\n\t\t\tactivity,\n\t\t\tcount,\n\t\t\tnewValue: (current || 0) + count,\n\t\t});\n\t}\n\n\t/**\n\t * Records command usage for diversity calculation\n\t *\n\t * @param command - Command that was used\n\t */\n\tasync recordCommandUsage(command: string): Promise<void> {\n\t\tconst commandsUsed = await this.storage.get<Record<string, number>>(\"commandsUsed\", {});\n\t\tconst commandsUsedRecord = commandsUsed || {};\n\t\tcommandsUsedRecord[command] = (commandsUsedRecord[command] || 0) + 1;\n\t\tawait this.storage.set(\"commandsUsed\", commandsUsedRecord);\n\n\t\tthis.logger.debug(\"Command usage recorded\", {\n\t\t\tcommand,\n\t\t\tcount: commandsUsedRecord[command],\n\t\t});\n\t}\n\n\t/**\n\t * Sets experience tier manually (for testing)\n\t *\n\t * @param tier - Experience tier to set\n\t */\n\tasync setExperienceTier(tier: ExperienceTier): Promise<void> {\n\t\tawait this.storage.set(\"experienceTier\", tier);\n\t\tthis.logger.info(\"Experience tier manually set\", { tier });\n\t}\n\n\t/**\n\t * Resets experience tier (for testing)\n\t */\n\tasync resetExperienceTier(): Promise<void> {\n\t\tawait this.storage.set(\"experienceTier\", undefined);\n\t\tthis.logger.info(\"Experience tier reset\");\n\t}\n\n\t/**\n\t * Gets a description of the user's experience tier\n\t *\n\t * @returns Description of the experience tier\n\t */\n\tasync getExperienceTierDescription(): Promise<string> {\n\t\tconst tier = await this.getExperienceTier();\n\n\t\tswitch (tier) {\n\t\t\tcase \"explorer\":\n\t\t\t\treturn \"Welcome to SnapBack! You're just getting started with file protection.\";\n\t\t\tcase \"intermediate\":\n\t\t\t\treturn \"You're becoming a SnapBack pro! You're using multiple protection levels effectively.\";\n\t\t\tcase \"power\":\n\t\t\t\treturn \"You're a SnapBack expert! You're using the full power of the extension.\";\n\t\t\tdefault:\n\t\t\t\treturn \"We're still learning about how you use SnapBack.\";\n\t\t}\n\t}\n}\n","/**\n * SessionCoordinator - Platform-agnostic session-aware snapshot management\n *\n * This module implements session tracking for SnapBack snapshots, enabling\n * point-in-time rollback of multiple files as a cohesive unit. It tracks\n * file changes over time and automatically groups them into sessions based\n * on activity patterns.\n *\n * Core Responsibilities:\n * - Track file changes as session candidates\n * - Detect session boundaries (idle gaps, window events, etc.)\n * - Finalize sessions and create session manifests\n * - Store session manifests in persistent storage\n *\n * Session Boundary Detection:\n * - Idle gaps (90-120s of inactivity)\n * - Window blur/focus events\n * - Task start/finish events\n * - Git commit events\n * - Maximum session duration exceeded\n *\n * @module SessionCoordinator\n */\n\nimport { randomUUID } from \"node:crypto\";\nimport { THRESHOLDS } from \"../../config/Thresholds\";\nimport type { IEventEmitter, ILogger, ISessionStorage, ITimerService } from \"./interfaces\";\nimport { NodeTimerService, NoOpLogger } from \"./interfaces\";\nimport type { SessionCandidate, SessionFinalizeReason, SessionId, SessionManifest } from \"./types\";\n\n/**\n * Configuration for session detection\n */\nexport interface SessionCoordinatorConfig {\n\t/** Idle timeout in milliseconds (default: 105 seconds) */\n\tidleTimeout?: number;\n\n\t/** Minimum session duration in milliseconds (default: 5 seconds) */\n\tminSessionDuration?: number;\n\n\t/** Maximum session duration in milliseconds (default: 1 hour) */\n\tmaxSessionDuration?: number;\n\n\t/** Interval to check for long sessions in milliseconds (default: 5 minutes) */\n\tlongSessionCheckInterval?: number;\n}\n\n/**\n * Constructor options for SessionCoordinator\n */\nexport interface SessionCoordinatorOptions {\n\t/** Storage adapter for persisting session manifests (required) */\n\tstorage: ISessionStorage;\n\n\t/** Timer service for scheduling timeouts/intervals (optional) */\n\ttimers?: ITimerService;\n\n\t/** Logger for debug/info/error messages (optional) */\n\tlogger?: ILogger;\n\n\t/** Event emitter for session finalized events (optional) */\n\teventEmitter?: IEventEmitter<SessionManifest>;\n\n\t/** Configuration overrides (optional) */\n\tconfig?: SessionCoordinatorConfig;\n}\n\n/**\n * Default configuration values\n * Uses centralized THRESHOLDS from SDK config (Phase 15)\n */\nconst DEFAULT_CONFIG: Required<SessionCoordinatorConfig> = {\n\tidleTimeout: THRESHOLDS.session.idleTimeout,\n\tminSessionDuration: THRESHOLDS.session.minSessionDuration,\n\tmaxSessionDuration: THRESHOLDS.session.maxSessionDuration,\n\tlongSessionCheckInterval: 300000, // 5 minutes (not in THRESHOLDS yet)\n};\n\n/**\n * SessionCoordinator - Coordinates session-aware snapshot creation\n *\n * This class manages the lifecycle of sessions, tracking file changes\n * and determining when to finalize sessions based on various triggers.\n */\nexport class SessionCoordinator {\n\t/** Map of active session candidates by file URI */\n\tprivate candidates = new Map<string, SessionCandidate>();\n\n\t/** Timeout ID for idle detection */\n\tprivate idleTimeoutId: string | null = null;\n\n\t/** Interval ID for long session checking */\n\tprivate longSessionIntervalId: string | null = null;\n\n\t/** Current session start time */\n\tprivate sessionStart: number = Date.now();\n\n\t/** Storage adapter */\n\tprivate storage: ISessionStorage;\n\n\t/** Timer service */\n\tprivate timers: ITimerService;\n\n\t/** Logger */\n\tprivate logger: ILogger;\n\n\t/** Event emitter (optional) */\n\tprivate eventEmitter?: IEventEmitter<SessionManifest>;\n\n\t/** Configuration */\n\tprivate config: Required<SessionCoordinatorConfig>;\n\n\t/**\n\t * Creates a new SessionCoordinator\n\t *\n\t * @param options - Configuration options\n\t */\n\tconstructor(options: SessionCoordinatorOptions) {\n\t\tthis.storage = options.storage;\n\t\tthis.timers = options.timers || new NodeTimerService();\n\t\tthis.logger = options.logger || new NoOpLogger();\n\t\tthis.eventEmitter = options.eventEmitter;\n\t\tthis.config = { ...DEFAULT_CONFIG, ...options.config };\n\n\t\tthis.sessionStart = Date.now();\n\n\t\t// Start idle detection\n\t\tthis.resetIdleTimer();\n\n\t\t// Start long session monitoring\n\t\tthis.startLongSessionMonitoring();\n\t}\n\n\t/**\n\t * Add or update a file candidate in the current session\n\t *\n\t * @param uri - URI of the file\n\t * @param snapshotId - ID of the snapshot for this file\n\t * @param stats - Optional change statistics\n\t */\n\taddCandidate(uri: string, snapshotId: string, stats?: { added: number; deleted: number }): void {\n\t\tconst candidate: SessionCandidate = {\n\t\t\turi,\n\t\t\tsnapshotId,\n\t\t\tstats,\n\t\t\tupdatedAt: Date.now(),\n\t\t};\n\n\t\tthis.candidates.set(uri, candidate);\n\t\tthis.resetIdleTimer();\n\n\t\tthis.logger.debug(\"Added session candidate\", { uri, snapshotId });\n\t}\n\n\t/**\n\t * Finalize the current session with a specific reason\n\t *\n\t * @param reason - Reason for finalizing the session\n\t * @returns Session ID if finalized, null if skipped\n\t */\n\tasync finalizeSession(reason: SessionFinalizeReason): Promise<SessionId | null> {\n\t\ttry {\n\t\t\tconst now = Date.now();\n\t\t\tconst sessionDuration = now - this.sessionStart;\n\n\t\t\t// Don't create sessions that are too short OR have no candidates\n\t\t\tif (sessionDuration < this.config.minSessionDuration || this.candidates.size === 0) {\n\t\t\t\tthis.logger.debug(\"Skipping session finalization - session too short or no candidates\", {\n\t\t\t\t\tduration: sessionDuration,\n\t\t\t\t\tcandidateCount: this.candidates.size,\n\t\t\t\t});\n\t\t\t\tthis.resetSession();\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\t// Create session manifest\n\t\t\tconst sessionId: SessionId = `session-${randomUUID()}`;\n\n\t\t\tconst manifest: SessionManifest = {\n\t\t\t\tid: sessionId,\n\t\t\t\tstartedAt: this.sessionStart,\n\t\t\t\tendedAt: now,\n\t\t\t\treason,\n\t\t\t\tfiles: Array.from(this.candidates.values()).map((candidate) => ({\n\t\t\t\t\turi: candidate.uri,\n\t\t\t\t\tsnapshotId: candidate.snapshotId,\n\t\t\t\t\tchangeStats: candidate.stats,\n\t\t\t\t})),\n\t\t\t\ttags: [],\n\t\t\t};\n\n\t\t\ttry {\n\t\t\t\t// Store the session manifest\n\t\t\t\tawait this.storeSessionManifest(manifest);\n\n\t\t\t\t// Emit event if emitter is available\n\t\t\t\tif (this.eventEmitter) {\n\t\t\t\t\tthis.eventEmitter.fire(manifest);\n\t\t\t\t}\n\n\t\t\t\tthis.logger.info(\"Session finalized\", {\n\t\t\t\t\tsessionId,\n\t\t\t\t\treason,\n\t\t\t\t\tfileCount: manifest.files.length,\n\t\t\t\t\tduration: sessionDuration,\n\t\t\t\t});\n\n\t\t\t\t// Reset for next session\n\t\t\t\tthis.resetSession();\n\n\t\t\t\treturn sessionId;\n\t\t\t} catch (error) {\n\t\t\t\tthis.logger.error(\n\t\t\t\t\t`Failed to finalize session: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t\t\terror instanceof Error ? error : undefined,\n\t\t\t\t\t{\n\t\t\t\t\t\tsessionId,\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t\treturn null;\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tthis.logger.error(\"Unexpected error in finalizeSession\", error instanceof Error ? error : undefined);\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t/**\n\t * Handle window blur event - finalize session due to window focus change\n\t */\n\thandleWindowBlur(): void {\n\t\tthis.finalizeSession(\"blur\");\n\t}\n\n\t/**\n\t * Handle git commit event - finalize session due to git commit\n\t */\n\thandleGitCommit(): void {\n\t\tthis.finalizeSession(\"commit\");\n\t}\n\n\t/**\n\t * Handle task completion event - finalize session due to task completion\n\t */\n\thandleTaskCompletion(): void {\n\t\tthis.finalizeSession(\"task\");\n\t}\n\n\t/**\n\t * Handle manual session finalization\n\t */\n\thandleManualFinalization(): void {\n\t\tthis.finalizeSession(\"manual\");\n\t}\n\n\t/**\n\t * Handle idle timeout - finalize session due to inactivity\n\t */\n\tprivate handleIdleTimeout(): void {\n\t\tif (this.candidates.size > 0) {\n\t\t\tthis.finalizeSession(\"idle-break\");\n\t\t} else {\n\t\t\t// Just reset the session start time if no candidates\n\t\t\tthis.sessionStart = Date.now();\n\t\t}\n\t}\n\n\t/**\n\t * Check for long-running sessions and finalize them if needed\n\t */\n\tprivate checkLongSession(): void {\n\t\tconst now = Date.now();\n\t\tconst sessionDuration = now - this.sessionStart;\n\n\t\tif (sessionDuration > this.config.maxSessionDuration && this.candidates.size > 0) {\n\t\t\tthis.logger.info(\"Finalizing long-running session\", {\n\t\t\t\tduration: sessionDuration,\n\t\t\t\tmaxDuration: this.config.maxSessionDuration,\n\t\t\t\tcandidateCount: this.candidates.size,\n\t\t\t});\n\t\t\tthis.finalizeSession(\"max-duration\");\n\t\t}\n\t}\n\n\t/**\n\t * Reset the idle timer\n\t */\n\tprivate resetIdleTimer(): void {\n\t\tif (this.idleTimeoutId) {\n\t\t\tthis.timers.clearTimeout(this.idleTimeoutId);\n\t\t}\n\n\t\tthis.idleTimeoutId = this.timers.setTimeout(() => {\n\t\t\tthis.handleIdleTimeout();\n\t\t}, this.config.idleTimeout);\n\t}\n\n\t/**\n\t * Start monitoring for long sessions\n\t */\n\tprivate startLongSessionMonitoring(): void {\n\t\tthis.longSessionIntervalId = this.timers.setInterval(() => {\n\t\t\tthis.checkLongSession();\n\t\t}, this.config.longSessionCheckInterval);\n\t}\n\n\t/**\n\t * Reset session state for the next session\n\t */\n\tprivate resetSession(): void {\n\t\tthis.candidates.clear();\n\t\tthis.sessionStart = Date.now();\n\n\t\tif (this.idleTimeoutId) {\n\t\t\tthis.timers.clearTimeout(this.idleTimeoutId);\n\t\t}\n\t\tthis.resetIdleTimer();\n\t}\n\n\t/**\n\t * Store session manifest in persistent storage\n\t *\n\t * @param manifest - Session manifest to store\n\t */\n\tprivate async storeSessionManifest(manifest: SessionManifest): Promise<void> {\n\t\ttry {\n\t\t\tawait this.storage.storeSessionManifest(manifest);\n\t\t\tthis.logger.debug(\"Stored session manifest\", {\n\t\t\t\tsessionId: manifest.id,\n\t\t\t\tfileCount: manifest.files.length,\n\t\t\t});\n\t\t} catch (error) {\n\t\t\tthis.logger.error(\n\t\t\t\t\"Failed to store session manifest\",\n\t\t\t\terror instanceof Error ? error : new Error(String(error)),\n\t\t\t\t{\n\t\t\t\t\tsessionId: manifest.id,\n\t\t\t\t},\n\t\t\t);\n\t\t\t// Re-throw to allow caller to handle\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\t/**\n\t * Get the number of active candidates (for testing)\n\t */\n\tgetCandidateCount(): number {\n\t\treturn this.candidates.size;\n\t}\n\n\t/**\n\t * Get the session start time (for testing)\n\t */\n\tgetSessionStart(): number {\n\t\treturn this.sessionStart;\n\t}\n\n\t/**\n\t * Dispose of the session coordinator and clean up resources\n\t */\n\tdispose(): void {\n\t\tif (this.idleTimeoutId) {\n\t\t\tthis.timers.clearTimeout(this.idleTimeoutId);\n\t\t}\n\t\tif (this.longSessionIntervalId) {\n\t\t\tthis.timers.clearInterval(this.longSessionIntervalId);\n\t\t}\n\t\tif (this.eventEmitter) {\n\t\t\tthis.eventEmitter.dispose();\n\t\t}\n\t}\n}\n","/**\n * Session Summary Generator - Creates deterministic summaries for sessions\n *\n * This module provides platform-agnostic utilities for generating human-readable\n * summaries of sessions by analyzing the changes across all files in a session.\n *\n * @module SessionSummaryGenerator\n */\n\nimport * as path from \"node:path\";\nimport type { Snapshot } from \"@snapback-oss/contracts\";\nimport { createSilentLogger } from \"@snapback-oss/contracts\";\nimport type { ILogger } from \"./interfaces\";\nimport type { SessionManifest } from \"./types\";\n\n/**\n * Interface for snapshot providers\n *\n * This allows dependency injection so different platforms can provide\n * their own snapshot retrieval implementation.\n */\nexport interface ISnapshotProvider {\n\t/**\n\t * Retrieves a snapshot by ID\n\t *\n\t * @param id - Snapshot ID\n\t * @returns Promise that resolves to the snapshot or null if not found\n\t */\n\tget(id: string): Promise<Snapshot | null>;\n}\n\n/**\n * Configuration options for SessionSummaryGenerator\n */\nexport interface SessionSummaryGeneratorOptions {\n\t/** Optional snapshot provider for detailed analysis */\n\tsnapshotProvider?: ISnapshotProvider;\n\n\t/** Optional logger for debug/info messages */\n\tlogger?: ILogger;\n}\n\n/**\n * SessionSummaryGenerator - Platform-agnostic session summary generation\n *\n * Generates human-readable summaries of sessions by analyzing file changes\n * and extracting key identifiers. Supports both metadata-only and detailed\n * (content-aware) summary generation.\n *\n * @example\n * ```typescript\n * const generator = new SessionSummaryGenerator({\n * snapshotProvider: mySnapshotProvider,\n * logger: myLogger\n * });\n *\n * const summary = await generator.generateSummary(session);\n * // \"Modified 3 files over 120s - UserService, createUser, validateInput\"\n * ```\n */\nexport class SessionSummaryGenerator {\n\tprivate snapshotProvider?: ISnapshotProvider;\n\tprivate logger: ILogger;\n\n\t/**\n\t * Creates a new SessionSummaryGenerator\n\t *\n\t * @param options - Configuration options (optional)\n\t */\n\tconstructor(options?: SessionSummaryGeneratorOptions) {\n\t\tthis.snapshotProvider = options?.snapshotProvider;\n\t\tthis.logger = options?.logger || createSilentLogger();\n\t}\n\n\t/**\n\t * Generates a deterministic summary for a session\n\t *\n\t * Creates a human-readable summary that describes the changes in a session\n\t * without including any sensitive content or file paths.\n\t *\n\t * @param session - Session manifest to summarize\n\t * @returns Promise that resolves to a session summary\n\t */\n\tasync generateSummary(session: SessionManifest): Promise<string> {\n\t\ttry {\n\t\t\t// If we have a snapshot provider, we can do more detailed analysis\n\t\t\tif (this.snapshotProvider) {\n\t\t\t\treturn await this.generateDetailedSummary(session);\n\t\t\t}\n\n\t\t\t// Fallback to metadata-based summary\n\t\t\treturn this.generateMetadataSummary(session);\n\t\t} catch (error) {\n\t\t\tthis.logger.error(\"Failed to generate session summary\", error instanceof Error ? error : undefined, {\n\t\t\t\terror,\n\t\t\t});\n\t\t\treturn \"Session summary unavailable\";\n\t\t}\n\t}\n\n\t/**\n\t * Generates a detailed summary by analyzing actual file changes\n\t *\n\t * @param session - Session manifest to summarize\n\t * @returns Promise that resolves to a detailed session summary\n\t */\n\tprivate async generateDetailedSummary(session: SessionManifest): Promise<string> {\n\t\ttry {\n\t\t\t// Collect identifiers from all files in the session\n\t\t\tconst allIdentifiers = new Set<string>();\n\n\t\t\t// Process each file in the session\n\t\t\tfor (const fileEntry of session.files) {\n\t\t\t\ttry {\n\t\t\t\t\t// Retrieve the snapshot\n\t\t\t\t\tconst snapshot = await this.snapshotProvider?.get(fileEntry.snapshotId);\n\t\t\t\t\tif (snapshot?.fileContents) {\n\t\t\t\t\t\t// Extract identifiers from each file's content\n\t\t\t\t\t\tfor (const [filePath, content] of Object.entries(snapshot.fileContents)) {\n\t\t\t\t\t\t\tconst identifiers = await this.extractTopIdentifiers(content, filePath);\n\t\t\t\t\t\t\tfor (const identifier of identifiers) {\n\t\t\t\t\t\t\t\tallIdentifiers.add(identifier);\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} catch (error) {\n\t\t\t\t\tthis.logger.error(`Failed to process file ${fileEntry.uri} for summary`, undefined, {\n\t\t\t\t\t\terror,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Generate summary based on collected data\n\t\t\tconst fileCount = session.files.length;\n\t\t\tconst duration = Math.round((session.endedAt - session.startedAt) / 1000);\n\n\t\t\t// Create a more descriptive summary\n\t\t\tlet summary = \"\";\n\n\t\t\tif (fileCount === 0) {\n\t\t\t\tsummary = \"Empty session\";\n\t\t\t} else if (fileCount === 1) {\n\t\t\t\tsummary = `Modified 1 file over ${duration}s`;\n\t\t\t} else {\n\t\t\t\tsummary = `Modified ${fileCount} files over ${duration}s`;\n\t\t\t}\n\n\t\t\t// Add AI assistance indicator if detected\n\t\t\tconst aiTags = session.tags?.filter(\n\t\t\t\t(tag) => tag.includes(\"ai\") || tag.includes(\"copilot\") || tag.includes(\"claude\"),\n\t\t\t);\n\t\t\tif (aiTags && aiTags.length > 0) {\n\t\t\t\tsummary = `[AI] ${summary}`;\n\t\t\t}\n\n\t\t\t// Add key identifiers if we found any\n\t\t\tif (allIdentifiers.size > 0) {\n\t\t\t\tconst topIdentifiers = Array.from(allIdentifiers).slice(0, 3);\n\t\t\t\tsummary += ` - ${topIdentifiers.join(\", \")}`;\n\t\t\t}\n\n\t\t\treturn summary;\n\t\t} catch (error) {\n\t\t\tthis.logger.error(\n\t\t\t\t\"Failed to generate detailed session summary\",\n\t\t\t\terror instanceof Error ? error : undefined,\n\t\t\t\t{ error },\n\t\t\t);\n\t\t\treturn this.generateMetadataSummary(session);\n\t\t}\n\t}\n\n\t/**\n\t * Generates a summary based on session metadata only\n\t *\n\t * @param session - Session manifest to summarize\n\t * @returns Session summary based on metadata\n\t */\n\tprivate generateMetadataSummary(session: SessionManifest): string {\n\t\tconst fileCount = session.files.length;\n\t\tconst duration = Math.round((session.endedAt - session.startedAt) / 1000);\n\n\t\t// Create a simple summary based on session metadata\n\t\tif (fileCount === 0) {\n\t\t\treturn \"Empty session\";\n\t\t}\n\n\t\t// Add AI assistance indicator if detected\n\t\tconst aiTags = session.tags?.filter(\n\t\t\t(tag) => tag.includes(\"ai\") || tag.includes(\"copilot\") || tag.includes(\"claude\"),\n\t\t);\n\t\tconst aiPrefix = aiTags && aiTags.length > 0 ? \"[AI] \" : \"\";\n\n\t\tif (fileCount === 1) {\n\t\t\treturn `${aiPrefix}Modified 1 file over ${duration}s`;\n\t\t}\n\n\t\treturn `${aiPrefix}Modified ${fileCount} files over ${duration}s`;\n\t}\n\n\t/**\n\t * Extracts top identifiers from file content for use in summaries\n\t *\n\t * Uses regex-based extraction to identify the most important identifiers\n\t * (functions, classes, variables) in the file content.\n\t *\n\t * @param content - File content to analyze\n\t * @param filePath - Path to the file (used to determine language)\n\t * @returns Promise that resolves to array of top identifiers\n\t */\n\tasync extractTopIdentifiers(content: string, filePath: string): Promise<string[]> {\n\t\ttry {\n\t\t\t// Determine file type\n\t\t\tconst extension = path.extname(filePath).toLowerCase();\n\n\t\t\tif (extension === \".ts\" || extension === \".js\" || extension === \".tsx\" || extension === \".jsx\") {\n\t\t\t\t// Use regex extraction for TypeScript/JavaScript files\n\t\t\t\treturn this.extractIdentifiersWithRegex(content);\n\t\t\t}\n\t\t\t// For non-TS/JS files, use regex fallback\n\t\t\treturn this.extractIdentifiersWithRegex(content);\n\t\t} catch (error) {\n\t\t\tthis.logger.error(`Failed to extract identifiers from ${filePath}`, undefined, {\n\t\t\t\terror,\n\t\t\t});\n\t\t\t// Fallback to simple regex extraction\n\t\t\treturn this.extractIdentifiersWithRegex(content);\n\t\t}\n\t}\n\n\t/**\n\t * Extracts identifiers using regex patterns\n\t *\n\t * @param content - File content\n\t * @returns Array of identifiers\n\t */\n\tprivate extractIdentifiersWithRegex(content: string): string[] {\n\t\t// Extract function names, class names, and variable names\n\t\tconst patterns = [\n\t\t\t/function\\s+([a-zA-Z_$][a-zA-Z0-9_$]*)/g, // function declarations\n\t\t\t/const\\s+([a-zA-Z_$][a-zA-Z0-9_$]*)/g, // const declarations\n\t\t\t/let\\s+([a-zA-Z_$][a-zA-Z0-9_$]*)/g, // let declarations\n\t\t\t/var\\s+([a-zA-Z_$][a-zA-Z0-9_$]*)/g, // var declarations\n\t\t\t/class\\s+([a-zA-Z_$][a-zA-Z0-9_$]*)/g, // class declarations\n\t\t\t/interface\\s+([a-zA-Z_$][a-zA-Z0-9_$]*)/g, // interface declarations\n\t\t\t/async\\s+([a-zA-Z_$][a-zA-Z0-9_$]*)\\s*\\(/g, // async method declarations\n\t\t\t/([a-zA-Z_$][a-zA-Z0-9_$]*)\\s*\\([^)]*\\)\\s*\\{/g, // method/function declarations\n\t\t];\n\n\t\tconst identifiers = new Set<string>();\n\n\t\tfor (const pattern of patterns) {\n\t\t\tlet match = pattern.exec(content);\n\t\t\twhile (match !== null) {\n\t\t\t\t// Only include identifiers that are reasonably long and not common keywords\n\t\t\t\tconst identifier = match[1];\n\t\t\t\tif (identifier.length > 2 && !this.isCommonKeyword(identifier)) {\n\t\t\t\t\tidentifiers.add(identifier);\n\t\t\t\t}\n\t\t\t\tmatch = pattern.exec(content);\n\t\t\t}\n\t\t}\n\n\t\t// Return top 5 identifiers\n\t\treturn Array.from(identifiers).slice(0, 5);\n\t}\n\n\t/**\n\t * Checks if an identifier is a common keyword that should be excluded\n\t *\n\t * @param identifier - Identifier to check\n\t * @returns True if it's a common keyword\n\t */\n\tisCommonKeyword(identifier: string): boolean {\n\t\tconst commonKeywords = new Set([\n\t\t\t\"if\",\n\t\t\t\"else\",\n\t\t\t\"for\",\n\t\t\t\"while\",\n\t\t\t\"do\",\n\t\t\t\"switch\",\n\t\t\t\"case\",\n\t\t\t\"break\",\n\t\t\t\"continue\",\n\t\t\t\"try\",\n\t\t\t\"catch\",\n\t\t\t\"finally\",\n\t\t\t\"throw\",\n\t\t\t\"return\",\n\t\t\t\"yield\",\n\t\t\t\"await\",\n\t\t\t\"async\",\n\t\t\t\"function\",\n\t\t\t\"const\",\n\t\t\t\"let\",\n\t\t\t\"var\",\n\t\t\t\"class\",\n\t\t\t\"interface\",\n\t\t\t\"type\",\n\t\t\t\"enum\",\n\t\t\t\"import\",\n\t\t\t\"export\",\n\t\t\t\"from\",\n\t\t\t\"as\",\n\t\t\t\"default\",\n\t\t\t\"extends\",\n\t\t\t\"implements\",\n\t\t\t\"static\",\n\t\t\t\"public\",\n\t\t\t\"private\",\n\t\t\t\"protected\",\n\t\t\t\"readonly\",\n\t\t\t\"abstract\",\n\t\t\t\"get\",\n\t\t\t\"set\",\n\t\t\t\"constructor\",\n\t\t\t\"super\",\n\t\t\t\"this\",\n\t\t\t\"new\",\n\t\t\t\"delete\",\n\t\t\t\"typeof\",\n\t\t\t\"instanceof\",\n\t\t\t\"in\",\n\t\t\t\"of\",\n\t\t\t\"void\",\n\t\t\t\"null\",\n\t\t\t\"undefined\",\n\t\t\t\"true\",\n\t\t\t\"false\",\n\t\t\t\"boolean\",\n\t\t\t\"number\",\n\t\t\t\"string\",\n\t\t\t\"object\",\n\t\t\t\"symbol\",\n\t\t\t\"bigint\",\n\t\t\t\"any\",\n\t\t\t\"unknown\",\n\t\t\t\"never\",\n\t\t\t\"void\",\n\t\t\t\"undefined\",\n\t\t\t\"null\",\n\t\t\t\"Promise\",\n\t\t\t\"Array\",\n\t\t\t\"String\",\n\t\t\t\"Number\",\n\t\t\t\"Boolean\",\n\t\t\t\"Object\",\n\t\t\t\"Function\",\n\t\t\t\"RegExp\",\n\t\t\t\"Date\",\n\t\t\t\"Error\",\n\t\t\t\"Map\",\n\t\t\t\"Set\",\n\t\t\t\"WeakMap\",\n\t\t\t\"WeakSet\",\n\t\t\t\"Proxy\",\n\t\t\t\"Reflect\",\n\t\t]);\n\n\t\treturn commonKeywords.has(identifier);\n\t}\n}\n","/**\n * @fileoverview Session Tagger - Tags sessions based on AI presence and burst patterns\n *\n * This module provides utilities for automatically tagging sessions based on\n * detected AI assistants and burst patterns. This enables features like\n * automatic checkpointing for AI-assisted coding sessions.\n *\n * Migrated from apps/vscode to SDK for platform-wide reuse.\n */\n\nimport { THRESHOLDS } from \"../../config/Thresholds\";\nimport type { BurstDetectionResult } from \"../detection/BurstHeuristicsDetector\";\nimport type { SessionManifest } from \"./types\";\n\n/**\n * Configuration for session tagging\n */\nexport interface SessionTaggerConfig {\n\t/** Minimum burst confidence to tag as AI-assisted */\n\tminBurstConfidence?: number;\n\n\t/** Minimum session duration to tag as long-session (ms) */\n\tminLongSessionDuration?: number;\n\n\t/** Maximum session duration to tag as short-session (ms) */\n\tmaxShortSessionDuration?: number;\n\n\t/** Minimum lines added to tag as large-edits */\n\tminLargeEditLines?: number;\n\n\t/** Normalization constants for confidence calculations */\n\tnormalization?: {\n\t\t/** File count threshold for multi-file tag */\n\t\tmultiFileThreshold?: number;\n\n\t\t/** File count for normalizing multi-file confidence */\n\t\tmultiFileNormalization?: number;\n\n\t\t/** Duration for normalizing long-session confidence (ms) */\n\t\tlongSessionNormalization?: number;\n\n\t\t/** Line count for normalizing large-edits confidence */\n\t\tlargeEditsNormalization?: number;\n\t};\n}\n\n/**\n * Default configuration for session tagging (uses centralized thresholds)\n */\nconst DEFAULT_CONFIG: Required<SessionTaggerConfig> = {\n\tminBurstConfidence: THRESHOLDS.tagging.minBurstConfidence,\n\tminLongSessionDuration: THRESHOLDS.tagging.minLongSessionDuration,\n\tmaxShortSessionDuration: THRESHOLDS.tagging.maxShortSessionDuration,\n\tminLargeEditLines: THRESHOLDS.tagging.minLargeEditLines,\n\tnormalization: {\n\t\tmultiFileThreshold: THRESHOLDS.tagging.normalization.multiFileThreshold,\n\t\tmultiFileNormalization: THRESHOLDS.tagging.normalization.multiFileNormalization,\n\t\tlongSessionNormalization: THRESHOLDS.tagging.normalization.longSessionNormalization,\n\t\tlargeEditsNormalization: THRESHOLDS.tagging.normalization.largeEditsNormalization,\n\t},\n};\n\n/**\n * Tags that can be applied to sessions\n */\nexport type SessionTag =\n\t| \"ai-assisted\" // Session involved AI assistance\n\t| \"copilot-like\" // Session shows patterns similar to GitHub Copilot\n\t| \"claude-like\" // Session shows patterns similar to Claude\n\t| \"tabnine-like\" // Session shows patterns similar to Tabnine\n\t| \"codeium-like\" // Session shows patterns similar to Codeium\n\t| \"burst\" // Session contained rapid, large insertions\n\t| \"large-edits\" // Session involved significant changes\n\t| \"multi-file\" // Session involved multiple files\n\t| \"long-session\" // Session lasted longer than typical\n\t| \"short-session\" // Session was unusually short\n\t| \"git-commit\" // Session ended with a git commit\n\t| \"manual\" // Session was manually finalized\n\t| \"idle-break\" // Session ended due to inactivity\n\t| string; // Allow custom tags\n\n/**\n * Results of session tagging analysis\n */\nexport interface SessionTaggingResult {\n\t/** Tags to apply to the session */\n\ttags: SessionTag[];\n\n\t/** Confidence level for each tag (0-1) */\n\tconfidence: Record<string, number>;\n\n\t/** Reasons for each tag */\n\treasons: Record<string, string>;\n}\n\n/**\n * Information about AI presence\n */\nexport interface AIPresenceInfo {\n\t/** Whether AI assistants are present */\n\thasAI: boolean;\n\n\t/** List of detected AI assistant identifiers */\n\tdetectedAssistants: string[];\n\n\t/** Human-readable names for detected assistants */\n\tassistantDetails: Record<string, string>;\n}\n\n/**\n * Session tagger initialization options\n */\nexport interface SessionTaggerOptions {\n\t/** Optional AI presence detector function */\n\taiPresenceDetector?: () => AIPresenceInfo;\n\n\t/** Optional configuration overrides */\n\tconfig?: SessionTaggerConfig;\n}\n\n/**\n * Tracks and tags sessions based on AI presence and burst patterns\n */\nexport class SessionTagger {\n\tprivate aiPresenceDetector?: () => AIPresenceInfo;\n\tprivate config: Required<SessionTaggerConfig>;\n\n\t/**\n\t * Creates a new SessionTagger\n\t *\n\t * @param options Optional configuration and dependencies\n\t */\n\tconstructor(options?: SessionTaggerOptions) {\n\t\tthis.aiPresenceDetector = options?.aiPresenceDetector;\n\t\tthis.config = {\n\t\t\t...DEFAULT_CONFIG,\n\t\t\t...options?.config,\n\t\t\tnormalization: {\n\t\t\t\t...DEFAULT_CONFIG.normalization,\n\t\t\t\t...options?.config?.normalization,\n\t\t\t},\n\t\t};\n\t}\n\n\t/**\n\t * Analyzes a session and generates appropriate tags\n\t *\n\t * @param manifest Session manifest to analyze\n\t * @param burstResult Optional burst detection result\n\t * @returns Session tagging result with tags and confidence levels\n\t */\n\ttagSession(manifest: SessionManifest, burstResult?: BurstDetectionResult): SessionTaggingResult {\n\t\tconst tags: SessionTag[] = [...(manifest.tags || [])];\n\t\tconst confidence: Record<string, number> = {};\n\t\tconst reasons: Record<string, string> = {};\n\n\t\t// Tag based on finalization reason\n\t\tthis.addReasonTags(manifest.reason, tags, confidence, reasons);\n\n\t\t// Tag based on file count\n\t\tconst multiFileThreshold = this.config.normalization?.multiFileThreshold;\n\t\tif (multiFileThreshold && manifest.files.length > multiFileThreshold) {\n\t\t\ttags.push(\"multi-file\");\n\t\t\tconfidence[\"multi-file\"] = Math.min(\n\t\t\t\t1.0,\n\t\t\t\tmanifest.files.length / (this.config.normalization?.multiFileNormalization || 1),\n\t\t\t);\n\t\t\treasons[\"multi-file\"] = `Session involved ${manifest.files.length} files`;\n\t\t}\n\n\t\t// Tag based on session duration\n\t\tconst duration = manifest.endedAt - manifest.startedAt;\n\t\tif (duration > this.config.minLongSessionDuration) {\n\t\t\ttags.push(\"long-session\");\n\t\t\tconfidence[\"long-session\"] = Math.min(\n\t\t\t\t1.0,\n\t\t\t\tduration / (this.config.normalization?.longSessionNormalization || 1),\n\t\t\t);\n\t\t\treasons[\"long-session\"] = `Session lasted ${Math.round(duration / 60000)} minutes`;\n\t\t} else if (duration < this.config.maxShortSessionDuration) {\n\t\t\ttags.push(\"short-session\");\n\t\t\tconfidence[\"short-session\"] = Math.min(1.0, this.config.maxShortSessionDuration / duration);\n\t\t\treasons[\"short-session\"] = `Session lasted ${Math.round(duration / 1000)} seconds`;\n\t\t}\n\n\t\t// Tag based on change statistics\n\t\tconst totalAdded = manifest.files.reduce((sum, file) => {\n\t\t\treturn sum + (file.changeStats?.added || 0);\n\t\t}, 0);\n\n\t\tif (totalAdded > this.config.minLargeEditLines) {\n\t\t\ttags.push(\"large-edits\");\n\t\t\tconfidence[\"large-edits\"] = Math.min(\n\t\t\t\t1.0,\n\t\t\t\ttotalAdded / (this.config.normalization?.largeEditsNormalization || 1),\n\t\t\t);\n\t\t\treasons[\"large-edits\"] = `Session involved ${totalAdded} lines added`;\n\t\t}\n\n\t\t// Tag based on AI presence (if detector provided)\n\t\tif (this.aiPresenceDetector) {\n\t\t\tconst aiPresence = this.aiPresenceDetector();\n\t\t\tif (aiPresence.hasAI) {\n\t\t\t\ttags.push(\"ai-assisted\");\n\t\t\t\tconfidence[\"ai-assisted\"] = 0.9;\n\t\t\t\treasons[\"ai-assisted\"] = `AI assistants detected: ${aiPresence.detectedAssistants.join(\", \")}`;\n\n\t\t\t\t// Add specific AI assistant tags\n\t\t\t\tfor (const assistant of aiPresence.detectedAssistants) {\n\t\t\t\t\t// Convert assistant name to tag format (e.g., GITHUB_COPILOT -> copilot-like)\n\t\t\t\t\tconst assistantName = assistant.toLowerCase().replace(/_/g, \"-\").replace(\"github-\", \"\");\n\t\t\t\t\tconst tag = `${assistantName}-like` as SessionTag;\n\t\t\t\t\ttags.push(tag);\n\t\t\t\t\tconfidence[tag] = 0.8;\n\t\t\t\t\treasons[tag] = `Detected ${aiPresence.assistantDetails[assistant]} presence`;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Tag based on burst detection\n\t\tif (burstResult?.isBurst) {\n\t\t\ttags.push(\"burst\");\n\t\t\tconfidence.burst = burstResult.confidence;\n\t\t\treasons.burst = \"Session contained rapid, large insertions characteristic of AI assistance\";\n\t\t}\n\n\t\t// Remove duplicate tags\n\t\tconst uniqueTags = Array.from(new Set(tags));\n\n\t\treturn {\n\t\t\ttags: uniqueTags,\n\t\t\tconfidence,\n\t\t\treasons,\n\t\t};\n\t}\n\n\t/**\n\t * Updates a session manifest with appropriate tags\n\t *\n\t * @param manifest Session manifest to update\n\t * @param burstResult Optional burst detection result\n\t * @returns Updated session manifest with tags\n\t */\n\tupdateSessionWithTags(manifest: SessionManifest, burstResult?: BurstDetectionResult): SessionManifest {\n\t\tconst taggingResult = this.tagSession(manifest, burstResult);\n\n\t\treturn {\n\t\t\t...manifest,\n\t\t\ttags: taggingResult.tags,\n\t\t};\n\t}\n\n\t/**\n\t * Adds tags based on session finalization reason\n\t */\n\tprivate addReasonTags(\n\t\treason: string,\n\t\ttags: SessionTag[],\n\t\tconfidence: Record<string, number>,\n\t\treasons: Record<string, string>,\n\t): void {\n\t\tswitch (reason) {\n\t\t\tcase \"manual\":\n\t\t\t\ttags.push(\"manual\");\n\t\t\t\tconfidence.manual = 1.0;\n\t\t\t\treasons.manual = \"Session was manually finalized\";\n\t\t\t\tbreak;\n\t\t\tcase \"idle-break\":\n\t\t\t\ttags.push(\"manual\");\n\t\t\t\tconfidence.manual = 0.8;\n\t\t\t\treasons.manual = \"Session ended due to idle timeout\";\n\t\t\t\tbreak;\n\t\t\tcase \"blur\":\n\t\t\t\ttags.push(\"manual\");\n\t\t\t\tconfidence.manual = 0.8;\n\t\t\t\treasons.manual = \"Session ended when window lost focus\";\n\t\t\t\tbreak;\n\t\t\tcase \"task\":\n\t\t\t\ttags.push(\"manual\");\n\t\t\t\tconfidence.manual = 0.9;\n\t\t\t\treasons.manual = \"Session ended due to task boundary\";\n\t\t\t\tbreak;\n\t\t\tcase \"commit\":\n\t\t\t\ttags.push(\"manual\");\n\t\t\t\tconfidence.manual = 0.95;\n\t\t\t\treasons.manual = \"Session ended with git commit\";\n\t\t\t\tbreak;\n\t\t}\n\t}\n}\n","import { createCipheriv, createDecipheriv, createHash, randomBytes } from \"node:crypto\";\n\nexport interface EncryptedData {\n\tciphertext: string;\n\tiv: string;\n\tauthTag: string;\n\talgorithm: \"aes-256-gcm\";\n}\n\nexport interface EncryptedBlob {\n\tversion: number;\n\tsalt: number[]; // Uint8Array as JSON-serializable array\n\tiv: number[];\n\tciphertext: number[];\n\ttimestamp: number;\n\tchecksum: string; // SHA-256 hash of plaintext for integrity verification\n}\n\n/**\n * Zero-knowledge encryption service for SnapBack snapshots.\n * Uses AES-256-GCM + PBKDF2 key derivation.\n * Server never sees plaintext - all encryption happens client-side.\n */\nexport class EncryptionService {\n\tprivate readonly PBKDF2_ITERATIONS = 100000;\n\tprivate readonly KEY_LENGTH = 256;\n\tprivate readonly ALGORITHM = \"aes-256-gcm\";\n\tprivate readonly IV_LENGTH = 12; // 96 bits for GCM\n\n\t/**\n\t * Derive encryption key from user secret using PBKDF2\n\t */\n\tprivate async deriveKey(userSecret: string, salt: Uint8Array): Promise<CryptoKey> {\n\t\t// Import user secret as key material\n\t\tconst keyMaterial = await crypto.subtle.importKey(\n\t\t\t\"raw\",\n\t\t\tnew TextEncoder().encode(userSecret),\n\t\t\t{ name: \"PBKDF2\" },\n\t\t\tfalse,\n\t\t\t[\"deriveKey\"],\n\t\t);\n\n\t\t// Derive AES-GCM key\n\t\treturn crypto.subtle.deriveKey(\n\t\t\t{\n\t\t\t\tname: \"PBKDF2\",\n\t\t\t\tsalt: salt as unknown as ArrayBuffer, // Type assertion chain for ArrayBuffer compatibility\n\t\t\t\titerations: this.PBKDF2_ITERATIONS,\n\t\t\t\thash: \"SHA-256\",\n\t\t\t},\n\t\t\tkeyMaterial,\n\t\t\t{ name: this.ALGORITHM, length: this.KEY_LENGTH },\n\t\t\tfalse,\n\t\t\t[\"encrypt\", \"decrypt\"],\n\t\t);\n\t}\n\n\t/**\n\t * Generate SHA-256 checksum of data for integrity verification\n\t */\n\tprivate async generateChecksum(data: string): Promise<string> {\n\t\tconst buffer = new TextEncoder().encode(data);\n\t\tconst hashBuffer = await crypto.subtle.digest(\"SHA-256\", buffer);\n\t\tconst hashArray = Array.from(new Uint8Array(hashBuffer));\n\t\treturn hashArray.map((b) => b.toString(16).padStart(2, \"0\")).join(\"\");\n\t}\n\n\t/**\n\t * Encrypt a snapshot with user secret\n\t * @param snapshot - Snapshot object to encrypt\n\t * @param userSecret - User's encryption secret (from auth session or user input)\n\t * @returns Encrypted blob ready for upload\n\t */\n\tasync encryptSnapshot<T = any>(snapshot: T, userSecret: string): Promise<EncryptedBlob> {\n\t\t// Generate random salt and IV\n\t\tconst salt = crypto.getRandomValues(new Uint8Array(16));\n\t\tconst iv = crypto.getRandomValues(new Uint8Array(12));\n\n\t\t// Derive encryption key\n\t\tconst key = await this.deriveKey(userSecret, salt);\n\n\t\t// Serialize snapshot\n\t\tconst plaintext = JSON.stringify(snapshot);\n\n\t\t// Generate checksum\n\t\tconst checksum = await this.generateChecksum(plaintext);\n\n\t\t// Encrypt\n\t\tconst plaintextBuffer = new TextEncoder().encode(plaintext);\n\t\tconst ciphertextBuffer = await crypto.subtle.encrypt({ name: this.ALGORITHM, iv }, key, plaintextBuffer);\n\n\t\t// Return as JSON-serializable blob\n\t\treturn {\n\t\t\tversion: 1,\n\t\t\tsalt: Array.from(salt),\n\t\t\tiv: Array.from(iv),\n\t\t\tciphertext: Array.from(new Uint8Array(ciphertextBuffer)),\n\t\t\ttimestamp: Date.now(),\n\t\t\tchecksum,\n\t\t};\n\t}\n\n\t/**\n\t * Decrypt an encrypted blob\n\t * @param blob - Encrypted blob from cloud\n\t * @param userSecret - User's encryption secret\n\t * @returns Original snapshot object\n\t * @throws Error if decryption fails or checksum mismatch\n\t */\n\tasync decryptSnapshot<T = any>(blob: EncryptedBlob, userSecret: string): Promise<T> {\n\t\t// Reconstruct typed arrays\n\t\tconst salt = new Uint8Array(blob.salt);\n\t\tconst iv = new Uint8Array(blob.iv);\n\t\tconst ciphertext = new Uint8Array(blob.ciphertext);\n\n\t\t// Derive decryption key\n\t\tconst key = await this.deriveKey(userSecret, salt);\n\n\t\t// Decrypt\n\t\tlet plaintextBuffer: ArrayBuffer;\n\t\ttry {\n\t\t\tplaintextBuffer = await crypto.subtle.decrypt({ name: this.ALGORITHM, iv }, key, ciphertext);\n\t\t} catch (_error) {\n\t\t\tthrow new Error(\"Decryption failed. Wrong password or corrupted data.\");\n\t\t}\n\n\t\t// Decode plaintext\n\t\tconst plaintext = new TextDecoder().decode(plaintextBuffer);\n\n\t\t// Verify checksum\n\t\tconst checksum = await this.generateChecksum(plaintext);\n\t\tif (checksum !== blob.checksum) {\n\t\t\tthrow new Error(\"Checksum mismatch. Data may be corrupted.\");\n\t\t}\n\n\t\t// Parse and return\n\t\treturn JSON.parse(plaintext) as T;\n\t}\n\n\t/**\n\t * Verify if a user secret can decrypt a blob without full decryption\n\t * (Faster than full decrypt for password verification)\n\t */\n\tasync verifySecret(blob: EncryptedBlob, userSecret: string): Promise<boolean> {\n\t\ttry {\n\t\t\tawait this.decryptSnapshot(blob, userSecret);\n\t\t\treturn true;\n\t\t} catch {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t/**\n\t * Encrypt plaintext data using AES-256-GCM (legacy method for backward compatibility)\n\t *\n\t * @param plaintext Data to encrypt\n\t * @returns Encrypted data with IV and authentication tag\n\t */\n\tencrypt(plaintext: string): EncryptedData {\n\t\t// This is a simplified version that uses a fixed key for demonstration\n\t\t// In practice, you would derive a key from a user secret\n\t\tconst key = Buffer.from(\"0123456789abcdef0123456789abcdef\", \"hex\"); // 256-bit key\n\t\tconst iv = randomBytes(this.IV_LENGTH);\n\n\t\tconst cipher = createCipheriv(this.ALGORITHM, key, iv);\n\t\tconst encrypted = Buffer.concat([cipher.update(plaintext, \"utf8\"), cipher.final()]);\n\n\t\tconst authTag = cipher.getAuthTag();\n\n\t\treturn {\n\t\t\tciphertext: encrypted.toString(\"base64\"),\n\t\t\tiv: iv.toString(\"base64\"),\n\t\t\tauthTag: authTag.toString(\"base64\"),\n\t\t\talgorithm: this.ALGORITHM,\n\t\t};\n\t}\n\n\t/**\n\t * Decrypt encrypted data using AES-256-GCM (legacy method for backward compatibility)\n\t *\n\t * @param encrypted Encrypted data with IV and auth tag\n\t * @returns Decrypted plaintext\n\t */\n\tdecrypt(encrypted: EncryptedData): string {\n\t\tif (encrypted.algorithm !== this.ALGORITHM) {\n\t\t\tthrow new Error(`Unsupported algorithm: ${encrypted.algorithm}`);\n\t\t}\n\n\t\t// This is a simplified version that uses a fixed key for demonstration\n\t\t// In practice, you would derive a key from a user secret\n\t\tconst key = Buffer.from(\"0123456789abcdef0123456789abcdef\", \"hex\"); // 256-bit key\n\t\tconst decipher = createDecipheriv(this.ALGORITHM, key, Buffer.from(encrypted.iv, \"base64\"));\n\n\t\tdecipher.setAuthTag(Buffer.from(encrypted.authTag, \"base64\"));\n\n\t\tconst decrypted = Buffer.concat([\n\t\t\tdecipher.update(Buffer.from(encrypted.ciphertext, \"base64\")),\n\t\t\tdecipher.final(),\n\t\t]);\n\n\t\treturn decrypted.toString(\"utf8\");\n\t}\n\n\t/**\n\t * Compute content hash for deduplication (post-encryption)\n\t *\n\t * @param content Original plaintext content\n\t * @returns SHA-256 hash for deduplication\n\t */\n\tcomputeContentHash(content: string): string {\n\t\treturn createHash(\"sha256\").update(content).digest(\"hex\");\n\t}\n}\n","/**\n * SnapBack Error Hierarchy\n *\n * Provides structured, type-safe error classes for the entire SnapBack platform.\n * Each error includes a code, message, optional context, and optional cause for chaining.\n *\n * @module errors\n */\n\n// =============================================================================\n// BASE ERROR CLASS\n// =============================================================================\n\n/**\n * Base error class for all SnapBack errors\n *\n * @example\n * ```typescript\n * throw new SnapBackError('Operation failed', 'OPERATION_FAILED', { userId: '123' });\n * ```\n */\nexport class SnapBackError extends Error {\n\tpublic readonly timestamp: number;\n\n\tconstructor(\n\t\tmessage: string,\n\t\tpublic readonly code: string,\n\t\tpublic readonly context?: Record<string, unknown>,\n\t\tpublic readonly cause?: Error,\n\t) {\n\t\tsuper(message);\n\t\tthis.name = this.constructor.name;\n\t\tthis.timestamp = Date.now();\n\n\t\t// Maintain stack trace in V8 engines (Node.js)\n\t\tif (Error.captureStackTrace) {\n\t\t\tError.captureStackTrace(this, this.constructor);\n\t\t}\n\t}\n\n\t/**\n\t * Serialize error to JSON for logging/API responses\n\t */\n\ttoJSON(): Record<string, unknown> {\n\t\treturn {\n\t\t\tname: this.name,\n\t\t\tmessage: this.message,\n\t\t\tcode: this.code,\n\t\t\tcontext: this.context,\n\t\t\ttimestamp: this.timestamp,\n\t\t\tstack: this.stack,\n\t\t\tcause: this.cause\n\t\t\t\t? {\n\t\t\t\t\t\tname: this.cause.name,\n\t\t\t\t\t\tmessage: this.cause.message,\n\t\t\t\t\t\tstack: this.cause.stack,\n\t\t\t\t\t}\n\t\t\t\t: undefined,\n\t\t};\n\t}\n}\n\n// =============================================================================\n// SNAPSHOT ERRORS\n// =============================================================================\n\n/**\n * Base class for snapshot-related errors\n */\nexport class SnapshotError extends SnapBackError {}\n\n/**\n * Snapshot not found in storage\n */\nexport class SnapshotNotFoundError extends SnapshotError {\n\tconstructor(\n\t\tpublic readonly snapshotId: string,\n\t\tcause?: Error,\n\t) {\n\t\tsuper(`Snapshot not found: ${snapshotId}`, \"SNAPSHOT_NOT_FOUND\", { snapshotId }, cause);\n\t}\n}\n\n/**\n * Snapshot creation failed\n */\nexport class SnapshotCreationError extends SnapshotError {\n\tconstructor(message: string, context?: Record<string, unknown>, cause?: Error) {\n\t\tsuper(message, \"SNAPSHOT_CREATION_ERROR\", context, cause);\n\t}\n}\n\n/**\n * Duplicate snapshot detected (deduplication)\n */\nexport class SnapshotDuplicateError extends SnapshotError {\n\tconstructor(\n\t\tpublic readonly existingId?: string,\n\t\tcontext?: Record<string, unknown>,\n\t) {\n\t\tsuper(\n\t\t\texistingId ? `Duplicate snapshot detected (existing: ${existingId})` : \"Duplicate snapshot detected\",\n\t\t\t\"SNAPSHOT_DUPLICATE\",\n\t\t\t{ existingId, ...context },\n\t\t);\n\t}\n}\n\n/**\n * Snapshot is protected and cannot be modified/deleted\n */\nexport class SnapshotProtectedError extends SnapshotError {\n\tconstructor(public readonly snapshotId: string) {\n\t\tsuper(`Cannot modify protected snapshot: ${snapshotId}`, \"SNAPSHOT_PROTECTED\", { snapshotId });\n\t}\n}\n\n/**\n * Snapshot restore failed\n */\nexport class SnapshotRestoreError extends SnapshotError {\n\tconstructor(\n\t\tmessage: string,\n\t\tpublic readonly snapshotId: string,\n\t\tcontext?: Record<string, unknown>,\n\t\tcause?: Error,\n\t) {\n\t\tsuper(message, \"SNAPSHOT_RESTORE_ERROR\", { snapshotId, ...context }, cause);\n\t}\n}\n\n/**\n * Snapshot version incompatible\n */\nexport class SnapshotVersionError extends SnapshotError {\n\tconstructor(\n\t\tpublic readonly version: string,\n\t\tpublic readonly supportedVersions: string[],\n\t) {\n\t\tsuper(\n\t\t\t`Incompatible snapshot version: ${version}. Supported: ${supportedVersions.join(\", \")}`,\n\t\t\t\"SNAPSHOT_VERSION_INCOMPATIBLE\",\n\t\t\t{ version, supportedVersions },\n\t\t);\n\t}\n}\n\n/**\n * Snapshot verification failed (checksum mismatch)\n */\nexport class SnapshotVerificationError extends SnapshotError {\n\tconstructor(\n\t\tpublic readonly filePath: string,\n\t\tpublic readonly expected: string,\n\t\tpublic readonly actual: string,\n\t) {\n\t\tsuper(`Verification failed for ${filePath}: checksum mismatch`, \"SNAPSHOT_VERIFICATION_FAILED\", {\n\t\t\tfilePath,\n\t\t\texpected,\n\t\t\tactual,\n\t\t});\n\t}\n}\n\n// =============================================================================\n// STORAGE ERRORS\n// =============================================================================\n\n/**\n * Base class for storage-related errors\n */\nexport class StorageError extends SnapBackError {}\n\n/**\n * Storage is full\n */\nexport class StorageFullError extends StorageError {\n\tconstructor(\n\t\tpublic readonly required: number,\n\t\tpublic readonly available: number,\n\t\tcause?: Error,\n\t) {\n\t\tsuper(\n\t\t\t`Storage full: ${required}MB required, ${available}MB available`,\n\t\t\t\"STORAGE_FULL\",\n\t\t\t{ required, available, retryable: false },\n\t\t\tcause,\n\t\t);\n\t}\n}\n\n/**\n * Storage resource is locked\n */\nexport class StorageLockError extends StorageError {\n\tconstructor(\n\t\tpublic readonly resource: string,\n\t\tcause?: Error,\n\t) {\n\t\tsuper(`Resource locked: ${resource}`, \"STORAGE_LOCK\", { resource, retryable: true }, cause);\n\t}\n}\n\n/**\n * Storage IO error\n */\nexport class StorageIOError extends StorageError {\n\tconstructor(\n\t\tmessage: string,\n\t\tpublic readonly path?: string,\n\t\tcause?: Error,\n\t) {\n\t\tsuper(message, \"STORAGE_IO_ERROR\", { path }, cause);\n\t}\n}\n\n// =============================================================================\n// VALIDATION ERRORS\n// =============================================================================\n\n/**\n * Base class for validation errors\n */\nexport class ValidationError extends SnapBackError {\n\tconstructor(message: string, code = \"VALIDATION_ERROR\", context?: Record<string, unknown>, cause?: Error) {\n\t\tsuper(message, code, context, cause);\n\t}\n}\n\n/**\n * Input validation failed\n */\nexport class InputValidationError extends ValidationError {\n\tconstructor(\n\t\tmessage: string,\n\t\tpublic readonly field: string,\n\t\tpublic readonly value?: unknown,\n\t) {\n\t\tsuper(message, \"INPUT_VALIDATION_ERROR\", { field, value });\n\t}\n}\n\n/**\n * Path security validation failed\n */\nexport class PathValidationError extends ValidationError {\n\tconstructor(\n\t\tmessage: string,\n\t\tpublic readonly path: string,\n\t) {\n\t\tsuper(message, \"PATH_VALIDATION_ERROR\", { path });\n\t}\n}\n\n/**\n * Missing required content\n */\nexport class MissingContentError extends ValidationError {\n\tconstructor(public readonly filePath: string) {\n\t\tsuper(`Missing content for file: ${filePath}`, \"MISSING_CONTENT\", { filePath });\n\t}\n}\n\n// =============================================================================\n// API ERRORS\n// =============================================================================\n\n/**\n * Base class for API errors\n */\nexport class ApiError extends SnapBackError {\n\tconstructor(\n\t\tmessage: string,\n\t\tcode: string,\n\t\tpublic readonly status?: number,\n\t\tcontext?: Record<string, unknown>,\n\t\tcause?: Error,\n\t) {\n\t\tsuper(message, code, { status, ...context }, cause);\n\t}\n}\n\n/**\n * API rate limit exceeded\n */\nexport class RateLimitError extends ApiError {\n\tconstructor(\n\t\tpublic readonly retryAfter: number,\n\t\tcause?: Error,\n\t) {\n\t\tsuper(\n\t\t\t`Rate limit exceeded. Retry after ${retryAfter}ms`,\n\t\t\t\"RATE_LIMIT_EXCEEDED\",\n\t\t\t429,\n\t\t\t{ retryAfter, retryable: true },\n\t\t\tcause,\n\t\t);\n\t}\n}\n\n/**\n * API authentication failed\n */\nexport class AuthenticationError extends ApiError {\n\tconstructor(message = \"Authentication required\", cause?: Error) {\n\t\tsuper(message, \"AUTHENTICATION_REQUIRED\", 401, undefined, cause);\n\t}\n}\n\n/**\n * API authorization failed\n */\nexport class AuthorizationError extends ApiError {\n\tconstructor(message = \"Access denied\", cause?: Error) {\n\t\tsuper(message, \"ACCESS_DENIED\", 403, undefined, cause);\n\t}\n}\n\n// =============================================================================\n// TYPE GUARDS\n// =============================================================================\n\n/**\n * Check if error is a SnapBackError\n */\nexport function isSnapBackError(error: unknown): error is SnapBackError {\n\treturn error instanceof SnapBackError;\n}\n\n/**\n * Check if error is a SnapshotError\n */\nexport function isSnapshotError(error: unknown): error is SnapshotError {\n\treturn error instanceof SnapshotError;\n}\n\n/**\n * Check if error is a StorageError\n */\nexport function isStorageError(error: unknown): error is StorageError {\n\treturn error instanceof StorageError;\n}\n\n/**\n * Check if error is a ValidationError\n */\nexport function isValidationError(error: unknown): error is ValidationError {\n\treturn error instanceof ValidationError;\n}\n\n/**\n * Check if error is an ApiError\n */\nexport function isApiError(error: unknown): error is ApiError {\n\treturn error instanceof ApiError;\n}\n\n/**\n * Check if error is retryable\n */\nexport function isRetryableError(error: unknown): boolean {\n\tif (isSnapBackError(error)) {\n\t\treturn error.context?.retryable === true;\n\t}\n\treturn false;\n}\n\n// =============================================================================\n// ERROR CONVERSION\n// =============================================================================\n\n/**\n * Convert unknown error to Error instance\n */\nexport function toError(error: unknown): Error {\n\tif (error instanceof Error) {\n\t\treturn error;\n\t}\n\tif (typeof error === \"string\") {\n\t\treturn new Error(error);\n\t}\n\tif (typeof error === \"object\" && error !== null) {\n\t\tif (\"message\" in error && typeof error.message === \"string\") {\n\t\t\treturn new Error(error.message);\n\t\t}\n\t\ttry {\n\t\t\treturn new Error(JSON.stringify(error));\n\t\t} catch {\n\t\t\treturn new Error(String(error));\n\t\t}\n\t}\n\treturn new Error(String(error));\n}\n\n/**\n * Wrap any error in a SnapBackError\n */\nexport function ensureSnapBackError(\n\terror: unknown,\n\tcode = \"UNKNOWN_ERROR\",\n\tcontext?: Record<string, unknown>,\n): SnapBackError {\n\tif (error instanceof SnapBackError) {\n\t\treturn error;\n\t}\n\tconst baseError = toError(error);\n\treturn new SnapBackError(baseError.message, code, context, baseError);\n}\n","/**\n * Platform-agnostic error handling utilities\n *\n * Provides utilities for converting any value to an Error object,\n * ensuring consistent error handling across all SnapBack applications.\n *\n * @module errorHelpers\n */\n\n/**\n * Convert any value to an Error object\n *\n * This function ensures that any value can be safely converted to an Error instance,\n * which is useful for error handling in catch blocks where the caught value might not be an Error.\n *\n * @param error - The value to convert\n * @returns An Error object\n *\n * @example\n * ```typescript\n * try {\n * // Some code that might throw\n * } catch (error) {\n * const err = toError(error);\n * console.log(err.message);\n * }\n * ```\n */\nexport function toError(error: unknown): Error {\n\t// If it's already an Error (or subclass), return as-is\n\tif (error instanceof Error) {\n\t\treturn error;\n\t}\n\n\t// Convert string to Error\n\tif (typeof error === \"string\") {\n\t\treturn new Error(error);\n\t}\n\n\t// Handle objects\n\tif (typeof error === \"object\" && error !== null) {\n\t\t// If object has a message property that's a string, use it\n\t\tif (\"message\" in error && typeof error.message === \"string\") {\n\t\t\treturn new Error(error.message);\n\t\t}\n\n\t\t// Otherwise, try to stringify the object\n\t\ttry {\n\t\t\treturn new Error(JSON.stringify(error));\n\t\t} catch (_stringifyError) {\n\t\t\t// If JSON.stringify fails (circular reference), fall back to String()\n\t\t\treturn new Error(String(error));\n\t\t}\n\t}\n\n\t// For all other types (number, boolean, null, undefined, symbol, etc.)\n\treturn new Error(String(error));\n}\n","/**\n * Result Type for Type-Safe Error Handling\n *\n * Implements the Result pattern inspired by Rust and functional programming.\n * Provides type-safe error handling without exceptions.\n *\n * @module result\n */\n\nimport { toError } from \"./errorHelpers.js\";\n\n// =============================================================================\n// RESULT TYPE DEFINITION\n// =============================================================================\n\n/**\n * Discriminated union type for success/failure outcomes\n *\n * @example\n * ```typescript\n * type MyResult = Result<User, UserNotFoundError>;\n *\n * // Success case\n * const success: MyResult = { success: true, value: user };\n *\n * // Error case\n * const failure: MyResult = { success: false, error: new UserNotFoundError() };\n * ```\n */\nexport type Result<T, E = Error> = { success: true; value: T } | { success: false; error: E };\n\n// =============================================================================\n// CONSTRUCTORS\n// =============================================================================\n\n/**\n * Create a success Result\n *\n * @param value - The success value\n * @returns Result with success=true\n *\n * @example\n * ```typescript\n * const result = ok({ id: '123', name: 'Test' });\n * // { success: true, value: { id: '123', name: 'Test' } }\n * ```\n */\nexport function ok<T>(value: T): Result<T, never> {\n\treturn { success: true, value };\n}\n\n/**\n * Create a failure Result\n *\n * @param error - The error value\n * @returns Result with success=false\n *\n * @example\n * ```typescript\n * const result = err(new NotFoundError('User not found'));\n * // { success: false, error: NotFoundError }\n * ```\n */\nexport function err<E>(error: E): Result<never, E> {\n\treturn { success: false, error };\n}\n\n// =============================================================================\n// TYPE GUARDS\n// =============================================================================\n\n/**\n * Check if Result is success\n *\n * @param result - Result to check\n * @returns True if success, narrows type to { success: true; value: T }\n *\n * @example\n * ```typescript\n * if (isOk(result)) {\n * console.log(result.value); // TypeScript knows value exists\n * }\n * ```\n */\nexport function isOk<T, E>(result: Result<T, E>): result is { success: true; value: T } {\n\treturn result.success === true;\n}\n\n/**\n * Check if Result is failure\n *\n * @param result - Result to check\n * @returns True if failure, narrows type to { success: false; error: E }\n *\n * @example\n * ```typescript\n * if (isErr(result)) {\n * console.error(result.error.message); // TypeScript knows error exists\n * }\n * ```\n */\nexport function isErr<T, E>(result: Result<T, E>): result is { success: false; error: E } {\n\treturn result.success === false;\n}\n\n// =============================================================================\n// TRANSFORMATIONS\n// =============================================================================\n\n/**\n * Map the success value of a Result\n *\n * @param result - Result to transform\n * @param fn - Function to apply to success value\n * @returns New Result with transformed value\n *\n * @example\n * ```typescript\n * const userResult = ok({ id: '123', name: 'Alice' });\n * const nameResult = map(userResult, u => u.name);\n * // { success: true, value: 'Alice' }\n * ```\n */\nexport function map<T, U, E>(result: Result<T, E>, fn: (value: T) => U): Result<U, E> {\n\tif (isOk(result)) {\n\t\treturn ok(fn(result.value));\n\t}\n\treturn result;\n}\n\n/**\n * Map the error value of a Result\n *\n * @param result - Result to transform\n * @param fn - Function to apply to error value\n * @returns New Result with transformed error\n *\n * @example\n * ```typescript\n * const result = err(new Error('original'));\n * const mapped = mapErr(result, e => new WrappedError(e));\n * ```\n */\nexport function mapErr<T, E, F>(result: Result<T, E>, fn: (error: E) => F): Result<T, F> {\n\tif (isErr(result)) {\n\t\treturn err(fn(result.error));\n\t}\n\treturn result;\n}\n\n/**\n * Chain Result-returning operations (flatMap/bind)\n *\n * @param result - Initial Result\n * @param fn - Function that returns a Result\n * @returns New Result from the chain\n *\n * @example\n * ```typescript\n * const result = andThen(\n * getUser(id),\n * user => getProfile(user.id)\n * );\n * ```\n */\nexport function andThen<T, U, E>(result: Result<T, E>, fn: (value: T) => Result<U, E>): Result<U, E> {\n\tif (isOk(result)) {\n\t\treturn fn(result.value);\n\t}\n\treturn result;\n}\n\n// =============================================================================\n// UNWRAPPING\n// =============================================================================\n\n/**\n * Get the success value or throw if error\n *\n * @param result - Result to unwrap\n * @returns The success value\n * @throws The error if Result is failure\n *\n * @example\n * ```typescript\n * const value = unwrap(result); // Throws if error\n * ```\n */\nexport function unwrap<T, E>(result: Result<T, E>): T {\n\tif (isOk(result)) {\n\t\treturn result.value;\n\t}\n\tif (result.error instanceof Error) {\n\t\tthrow result.error;\n\t}\n\tthrow new Error(String(result.error));\n}\n\n/**\n * Get the success value or return a default\n *\n * @param result - Result to unwrap\n * @param defaultValue - Value to return if error\n * @returns The success value or default\n *\n * @example\n * ```typescript\n * const name = unwrapOr(getUser(id), { name: 'Unknown' }).name;\n * ```\n */\nexport function unwrapOr<T, E>(result: Result<T, E>, defaultValue: T): T {\n\tif (isOk(result)) {\n\t\treturn result.value;\n\t}\n\treturn defaultValue;\n}\n\n/**\n * Get the success value or compute a default from the error\n *\n * @param result - Result to unwrap\n * @param fn - Function to compute default from error\n * @returns The success value or computed default\n */\nexport function unwrapOrElse<T, E>(result: Result<T, E>, fn: (error: E) => T): T {\n\tif (isOk(result)) {\n\t\treturn result.value;\n\t}\n\treturn fn(result.error);\n}\n\n// =============================================================================\n// PROMISE INTEGRATION\n// =============================================================================\n\n/**\n * Convert a Promise to a Result\n *\n * @param promise - Promise to convert\n * @returns Promise of Result\n *\n * @example\n * ```typescript\n * const result = await fromPromise(fetch('/api/users'));\n * if (isErr(result)) {\n * console.error('Network error:', result.error.message);\n * }\n * ```\n */\nexport async function fromPromise<T>(promise: Promise<T>): Promise<Result<T, Error>> {\n\ttry {\n\t\tconst value = await promise;\n\t\treturn ok(value);\n\t} catch (error) {\n\t\treturn err(toError(error));\n\t}\n}\n\n/**\n * Convert a Promise to a Result with custom error mapper\n *\n * @param promise - Promise to convert\n * @param errorMapper - Function to map caught error\n * @returns Promise of Result\n */\nexport async function fromPromiseWith<T, E>(\n\tpromise: Promise<T>,\n\terrorMapper: (error: unknown) => E,\n): Promise<Result<T, E>> {\n\ttry {\n\t\tconst value = await promise;\n\t\treturn ok(value);\n\t} catch (error) {\n\t\treturn err(errorMapper(error));\n\t}\n}\n\n// =============================================================================\n// COMBINATORS\n// =============================================================================\n\n/**\n * Combine multiple Results into a single Result of array\n *\n * @param results - Array of Results\n * @returns Result containing array of values, or first error\n *\n * @example\n * ```typescript\n * const results = [ok(1), ok(2), ok(3)];\n * const combined = sequence(results);\n * // { success: true, value: [1, 2, 3] }\n *\n * const withError = [ok(1), err('fail'), ok(3)];\n * const failed = sequence(withError);\n * // { success: false, error: 'fail' }\n * ```\n */\nexport function sequence<T, E>(results: Result<T, E>[]): Result<T[], E> {\n\tconst values: T[] = [];\n\tfor (const result of results) {\n\t\tif (isErr(result)) {\n\t\t\treturn result;\n\t\t}\n\t\tvalues.push(result.value);\n\t}\n\treturn ok(values);\n}\n\n/**\n * Try multiple fallback operations until one succeeds\n *\n * @param operations - Array of Result-returning operations\n * @returns First success or last error\n */\nexport function tryAll<T, E>(operations: Array<() => Result<T, E>>): Result<T, E[]> {\n\tconst errors: E[] = [];\n\tfor (const op of operations) {\n\t\tconst result = op();\n\t\tif (isOk(result)) {\n\t\t\treturn result;\n\t\t}\n\t\terrors.push(result.error);\n\t}\n\treturn err(errors);\n}\n\n// =============================================================================\n// SIDE EFFECTS\n// =============================================================================\n\n/**\n * Execute side effect on success without changing the Result\n *\n * @param result - Result to tap\n * @param fn - Side effect function\n * @returns Original Result unchanged\n *\n * @example\n * ```typescript\n * const result = tap(getUserResult, user => {\n * analytics.track('user_fetched', { id: user.id });\n * });\n * ```\n */\nexport function tap<T, E>(result: Result<T, E>, fn: (value: T) => void): Result<T, E> {\n\tif (isOk(result)) {\n\t\tfn(result.value);\n\t}\n\treturn result;\n}\n\n/**\n * Execute side effect on error without changing the Result\n *\n * @param result - Result to tap\n * @param fn - Side effect function\n * @returns Original Result unchanged\n */\nexport function tapErr<T, E>(result: Result<T, E>, fn: (error: E) => void): Result<T, E> {\n\tif (isErr(result)) {\n\t\tfn(result.error);\n\t}\n\treturn result;\n}\n\n// =============================================================================\n// PATTERN MATCHING\n// =============================================================================\n\n/**\n * Pattern match on Result for exhaustive handling\n *\n * @param result - Result to match\n * @param handlers - Object with ok and err handlers\n * @returns Result of the matched handler\n *\n * @example\n * ```typescript\n * const message = match(result, {\n * ok: user => `Welcome, ${user.name}!`,\n * err: error => `Error: ${error.message}`,\n * });\n * ```\n */\nexport function match<T, E, R>(\n\tresult: Result<T, E>,\n\thandlers: {\n\t\tok: (value: T) => R;\n\t\terr: (error: E) => R;\n\t},\n): R {\n\tif (isOk(result)) {\n\t\treturn handlers.ok(result.value);\n\t}\n\treturn handlers.err(result.error);\n}\n\n// =============================================================================\n// PROMISE CONVERSION\n// =============================================================================\n\n/**\n * Convert a Result to a Promise\n *\n * @param result - Result to convert\n * @returns Promise that resolves with value or rejects with error\n *\n * @example\n * ```typescript\n * const result = ok(42);\n * const value = await toPromise(result); // 42\n *\n * const failed = err(new Error('fail'));\n * await toPromise(failed); // Rejects with Error('fail')\n * ```\n */\nexport function toPromise<T, E>(result: Result<T, E>): Promise<T> {\n\tif (isOk(result)) {\n\t\treturn Promise.resolve(result.value);\n\t}\n\tif (result.error instanceof Error) {\n\t\treturn Promise.reject(result.error);\n\t}\n\treturn Promise.reject(new Error(String(result.error)));\n}\n\n// =============================================================================\n// ADDITIONAL COMBINATORS\n// =============================================================================\n\n/**\n * Combine multiple Results into a single Result of array (fail-fast)\n * Alias for sequence() with a more common name\n *\n * @param results - Array of Results\n * @returns Result containing array of values, or first error\n *\n * @example\n * ```typescript\n * const results = [ok(1), ok(2), ok(3)];\n * const combined = all(results);\n * // { success: true, value: [1, 2, 3] }\n *\n * const withError = [ok(1), err('fail'), ok(3)];\n * const failed = all(withError);\n * // { success: false, error: 'fail' }\n * ```\n */\nexport function all<T, E>(results: Result<T, E>[]): Result<T[], E> {\n\treturn sequence(results);\n}\n\n/**\n * Combine multiple Results, collecting all errors instead of fail-fast\n *\n * @param results - Array of Results to combine\n * @returns Result with all values or array of all errors\n *\n * @example\n * ```typescript\n * const results = [ok(1), err('error1'), ok(3), err('error2')];\n * const combined = allOrErrors(results);\n * // { success: false, error: ['error1', 'error2'] }\n *\n * const allOk = [ok(1), ok(2), ok(3)];\n * const success = allOrErrors(allOk);\n * // { success: true, value: [1, 2, 3] }\n * ```\n */\nexport function allOrErrors<T, E>(results: Result<T, E>[]): Result<T[], E[]> {\n\tconst values: T[] = [];\n\tconst errors: E[] = [];\n\n\tfor (const result of results) {\n\t\tif (isOk(result)) {\n\t\t\tvalues.push(result.value);\n\t\t} else {\n\t\t\terrors.push(result.error);\n\t\t}\n\t}\n\n\tif (errors.length > 0) {\n\t\treturn err(errors);\n\t}\n\treturn ok(values);\n}\n\n// =============================================================================\n// TRY-CATCH WRAPPERS\n// =============================================================================\n\n/**\n * Wrap a synchronous function to return a Result instead of throwing\n *\n * @param fn - Function to wrap\n * @returns New function that returns Result\n *\n * @example\n * ```typescript\n * const safeParseInt = tryCatch((str: string) => {\n * const num = parseInt(str, 10);\n * if (isNaN(num)) throw new Error('Not a number');\n * return num;\n * });\n *\n * const result = safeParseInt('42'); // { success: true, value: 42 }\n * const failed = safeParseInt('abc'); // { success: false, error: Error }\n * ```\n */\nexport function tryCatch<T, Args extends unknown[]>(fn: (...args: Args) => T): (...args: Args) => Result<T, Error> {\n\treturn (...args: Args): Result<T, Error> => {\n\t\ttry {\n\t\t\treturn ok(fn(...args));\n\t\t} catch (error) {\n\t\t\treturn err(toError(error));\n\t\t}\n\t};\n}\n\n/**\n * Wrap an asynchronous function to return a Result instead of throwing\n *\n * @param fn - Async function to wrap\n * @returns New async function that returns Result\n *\n * @example\n * ```typescript\n * const safeFetch = tryCatchAsync(async (url: string) => {\n * const response = await fetch(url);\n * return await response.json();\n * });\n *\n * const result = await safeFetch('https://api.example.com/data');\n * if (isOk(result)) {\n * console.log(result.value);\n * }\n * ```\n */\nexport function tryCatchAsync<T, Args extends unknown[]>(\n\tfn: (...args: Args) => Promise<T>,\n): (...args: Args) => Promise<Result<T, Error>> {\n\treturn async (...args: Args): Promise<Result<T, Error>> => {\n\t\ttry {\n\t\t\tconst value = await fn(...args);\n\t\t\treturn ok(value);\n\t\t} catch (error) {\n\t\t\treturn err(toError(error));\n\t\t}\n\t};\n}\n","/**\n * Atomic File Write Utilities\n *\n * Provides atomic file write operations using write-then-rename pattern\n * to prevent corrupted files if the process crashes mid-write.\n *\n * CONSOLIDATES:\n * - apps/vscode/src/storage/utils/atomicWrite.ts (async, VS Code API)\n * - packages/mcp/src/validation.ts (sync, Node.js fs)\n *\n * @module fs/atomic\n */\n\nimport { randomBytes } from \"node:crypto\";\nimport { renameSync, unlinkSync, writeFileSync } from \"node:fs\";\nimport { rename, unlink, writeFile } from \"node:fs/promises\";\nimport type { Result } from \"../utils/result\";\nimport { err, ok } from \"../utils/result\";\n\n/**\n * Options for atomic file write operations\n */\nexport interface AtomicWriteOptions {\n\t/** Text encoding (default: 'utf8') */\n\tencoding?: BufferEncoding;\n\t/** Maximum file size in bytes (default: 10MB) */\n\tmaxSize?: number;\n\t/** File permissions mode (Unix-style) */\n\tmode?: number;\n}\n\n/**\n * Default maximum file size: 10MB\n */\nexport const DEFAULT_MAX_SIZE = 10 * 1024 * 1024;\n\n/**\n * Atomically write content to a file (async).\n *\n * Uses write-then-rename pattern:\n * 1. Write content to temporary file in same directory\n * 2. Atomically rename temp file to target (OS guarantees atomicity on same filesystem)\n * 3. Clean up temp file on failure\n *\n * **Use for:**\n * - VS Code extension (non-blocking required for UI responsiveness)\n * - Large file writes (>1MB)\n * - Server-side operations\n * - Async workflows\n *\n * @param path - Target file path\n * @param content - Content to write (string or Buffer)\n * @param options - Write options\n * @returns Result with success or error\n *\n * @example\n * ```typescript\n * const result = await atomicWriteFile(\n * \"/path/to/file.json\",\n * JSON.stringify(data, null, 2)\n * );\n *\n * if (isErr(result)) {\n * console.error(\"Write failed:\", result.error);\n * }\n * ```\n */\nexport async function atomicWriteFile(\n\tpath: string,\n\tcontent: string | Buffer,\n\toptions: AtomicWriteOptions = {},\n): Promise<Result<void, Error>> {\n\tconst { encoding = \"utf8\", maxSize = DEFAULT_MAX_SIZE, mode } = options;\n\n\ttry {\n\t\t// Convert string to Buffer if needed\n\t\tconst buffer = typeof content === \"string\" ? Buffer.from(content, encoding) : content;\n\n\t\t// Size limit check\n\t\tif (buffer.length > maxSize) {\n\t\t\treturn err(new Error(`Content size (${buffer.length} bytes) exceeds maximum allowed (${maxSize} bytes)`));\n\t\t}\n\n\t\t// Generate temp file path in same directory (ensures same filesystem for atomic rename)\n\t\tconst tempSuffix = randomBytes(8).toString(\"hex\");\n\t\tconst tempPath = `${path}.${tempSuffix}.tmp`;\n\n\t\ttry {\n\t\t\t// Step 1: Write to temp file\n\t\t\tawait writeFile(tempPath, buffer, { mode });\n\n\t\t\t// Step 2: Atomic rename (OS guarantees atomicity on same filesystem)\n\t\t\tawait rename(tempPath, path);\n\n\t\t\treturn ok(undefined);\n\t\t} catch (error) {\n\t\t\t// Clean up temp file on failure\n\t\t\ttry {\n\t\t\t\tawait unlink(tempPath);\n\t\t\t} catch {\n\t\t\t\t// Ignore cleanup errors\n\t\t\t}\n\t\t\tthrow error;\n\t\t}\n\t} catch (error) {\n\t\treturn err(error instanceof Error ? error : new Error(String(error)));\n\t}\n}\n\n/**\n * Atomically write content to a file (sync).\n *\n * Uses write-then-rename pattern for atomic operations.\n *\n * **Use for:**\n * - CLI tools where blocking is acceptable\n * - Configuration file writes during initialization\n * - Small files (<1MB)\n * - Synchronous workflows\n *\n * @param path - Target file path\n * @param content - Content to write\n * @param options - Write options\n * @returns Result with success or error\n *\n * @example\n * ```typescript\n * const result = atomicWriteFileSync(\n * \"/path/to/config.json\",\n * JSON.stringify(config, null, 2)\n * );\n *\n * if (!result.success) {\n * console.error(\"Write failed:\", result.error);\n * }\n * ```\n */\nexport function atomicWriteFileSync(\n\tpath: string,\n\tcontent: string,\n\toptions: AtomicWriteOptions = {},\n): { success: true } | { success: false; error: string } {\n\tconst { encoding = \"utf8\", maxSize = DEFAULT_MAX_SIZE, mode } = options;\n\n\ttry {\n\t\t// Size limit check\n\t\tconst contentSize = Buffer.byteLength(content, encoding);\n\t\tif (contentSize > maxSize) {\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\terror: `Content size (${contentSize} bytes) exceeds maximum allowed (${maxSize} bytes)`,\n\t\t\t};\n\t\t}\n\n\t\t// Generate temp file path in same directory (ensures same filesystem for atomic rename)\n\t\tconst tempSuffix = randomBytes(8).toString(\"hex\");\n\t\tconst tempPath = `${path}.${tempSuffix}.tmp`;\n\n\t\ttry {\n\t\t\t// Step 1: Write to temp file\n\t\t\twriteFileSync(tempPath, content, { encoding, mode });\n\n\t\t\t// Step 2: Atomic rename (same filesystem = atomic on POSIX)\n\t\t\trenameSync(tempPath, path);\n\n\t\t\treturn { success: true };\n\t\t} catch (error) {\n\t\t\t// Clean up temp file on failure\n\t\t\ttry {\n\t\t\t\tunlinkSync(tempPath);\n\t\t\t} catch {\n\t\t\t\t// Ignore cleanup errors\n\t\t\t}\n\t\t\tthrow error;\n\t\t}\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\treturn { success: false, error: `Atomic write failed: ${message}` };\n\t}\n}\n","import crypto from \"node:crypto\";\nimport { logger } from \"@snapback-oss/infrastructure\";\nimport type { Envelope, SnapbackClient } from \"./client\";\n\n/**\n * Helper functions for the Snapback SDK\n * Provides high-level interfaces for analyze, evaluatePolicy, and ingestTelemetry\n */\n\nexport interface AnalyzeRequest {\n\tcontent: string;\n\tfilePath: string;\n\tlanguage?: string;\n}\n\nexport interface AnalyzeResponse {\n\tdecision: \"allow\" | \"review\" | \"block\";\n\tconfidence: number;\n\trules_hit: string[];\n\tmetadata?: Record<string, any>;\n}\n\nexport interface PolicyEvaluationRequest {\n\tpolicyId?: string;\n\tcontext: Record<string, any>;\n}\n\nexport interface PolicyEvaluationResponse {\n\tdecision: \"allow\" | \"review\" | \"block\";\n\tconfidence: number;\n\trules_hit: string[];\n\tpolicyVersion: string;\n}\n\nexport interface TelemetryData {\n\teventType: string;\n\tpayload: Record<string, any>;\n\ttimestamp: number;\n}\n\nexport interface TelemetryResponse {\n\tid: string;\n\treceived: boolean;\n}\n\n/**\n * Analyze code using the Snapback API\n * @param client The Snapback client instance\n * @param envelope The request envelope\n * @param request The analysis request\n * @returns The analysis response\n */\nexport async function analyze(\n\tclient: SnapbackClient,\n\tenvelope: Envelope,\n\trequest: AnalyzeRequest,\n): Promise<AnalyzeResponse> {\n\t// Ensure request has a valid request_id\n\tconst idempotentEnvelope = ensureIdempotentRequestId(envelope);\n\n\ttry {\n\t\tconst response = await client\n\t\t\t.getHttpClient()\n\t\t\t.post(\"v1/analyze\", {\n\t\t\t\tjson: {\n\t\t\t\t\t...request,\n\t\t\t\t\tenvelope: idempotentEnvelope,\n\t\t\t\t},\n\t\t\t\ttimeout: 30000,\n\t\t\t})\n\t\t\t.json<AnalyzeResponse>();\n\n\t\treturn response;\n\t} catch (error) {\n\t\tlogger.error(\"Analysis failed\", { error: error as Error });\n\t\tthrow new Error(`Analysis failed: ${(error as Error).message}`);\n\t}\n}\n\n/**\n * Evaluate policy using the Snapback API\n * @param client The Snapback client instance\n * @param envelope The request envelope\n * @param request The policy evaluation request\n * @returns The policy evaluation response\n */\nexport async function evaluatePolicy(\n\tclient: SnapbackClient,\n\tenvelope: Envelope,\n\trequest: PolicyEvaluationRequest,\n): Promise<PolicyEvaluationResponse> {\n\t// Ensure request has a valid request_id\n\tconst idempotentEnvelope = ensureIdempotentRequestId(envelope);\n\n\ttry {\n\t\tconst response = await client\n\t\t\t.getHttpClient()\n\t\t\t.post(\"v1/policy/evaluate\", {\n\t\t\t\tjson: {\n\t\t\t\t\t...request,\n\t\t\t\t\tenvelope: idempotentEnvelope,\n\t\t\t\t},\n\t\t\t\ttimeout: 30000,\n\t\t\t})\n\t\t\t.json<PolicyEvaluationResponse>();\n\n\t\treturn response;\n\t} catch (error) {\n\t\tlogger.error(\"Policy evaluation failed\", { error: error as Error });\n\t\tthrow new Error(`Policy evaluation failed: ${(error as Error).message}`);\n\t}\n}\n\n/**\n * Ingest telemetry data using the Snapback API\n * @param client The Snapback client instance\n * @param envelope The request envelope\n * @param data The telemetry data\n * @returns The telemetry response\n */\nexport async function ingestTelemetry(\n\tclient: SnapbackClient,\n\tenvelope: Envelope,\n\tdata: TelemetryData,\n): Promise<TelemetryResponse> {\n\t// Ensure request has a valid request_id\n\tconst idempotentEnvelope = ensureIdempotentRequestId(envelope);\n\n\ttry {\n\t\tconst response = await client\n\t\t\t.getHttpClient()\n\t\t\t.post(\"v1/telemetry\", {\n\t\t\t\tjson: {\n\t\t\t\t\t...data,\n\t\t\t\t\tenvelope: idempotentEnvelope,\n\t\t\t\t},\n\t\t\t\ttimeout: 30000,\n\t\t\t})\n\t\t\t.json<TelemetryResponse>();\n\n\t\treturn response;\n\t} catch (error) {\n\t\tlogger.error(\"Telemetry ingestion failed\", { error: error as Error });\n\t\tthrow new Error(`Telemetry ingestion failed: ${(error as Error).message}`);\n\t}\n}\n\n/**\n * Ensure request_id is idempotent\n * @param envelope The request envelope\n * @returns Envelope with guaranteed unique request_id\n */\nexport function ensureIdempotentRequestId(envelope: Envelope): Envelope {\n\t// If request_id is not provided, generate one\n\tif (!envelope.request_id) {\n\t\treturn {\n\t\t\t...envelope,\n\t\t\trequest_id: generateRequestId(),\n\t\t};\n\t}\n\n\t// Otherwise return as-is\n\treturn envelope;\n}\n\n/**\n * Generate a unique request ID\n * @returns Unique request ID\n */\nfunction generateRequestId(): string {\n\treturn `${Date.now()}-${crypto.randomUUID().substring(0, 10)}`;\n}\n","/**\n * Unified Hash Utilities\n *\n * Consolidated from:\n * - apps/vscode/src/storage/utils/hash.ts\n * - packages-oss/sdk/src/privacy/hasher.ts\n * - packages/engine/src/runtime/storage.ts (inline usage)\n *\n * Provides SHA-256 hashing for:\n * - Content-addressable blob storage\n * - Privacy-preserving telemetry (file paths, workspace IDs)\n * - Content deduplication\n *\n * @module hash\n */\n\nimport crypto from \"node:crypto\";\n\n/**\n * Core SHA-256 hashing function\n *\n * @param input - String to hash\n * @returns Lowercase hexadecimal SHA-256 hash\n *\n * @example\n * ```typescript\n * const hash = sha256(\"hello world\");\n * // Returns: \"b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9\"\n * ```\n */\nexport function sha256(input: string): string {\n\treturn crypto.createHash(\"sha256\").update(input, \"utf-8\").digest(\"hex\");\n}\n\n/**\n * Generate SHA-256 hash of content\n *\n * Alias for sha256() with explicit use case naming.\n * Used for content-addressable blob storage.\n *\n * @param content - Content to hash\n * @returns Lowercase hexadecimal SHA-256 hash\n *\n * @example\n * ```typescript\n * const hash = hashContent(\"const x = 1;\");\n * // Use with getBlobPath() for storage\n * const blobPath = getBlobPath(hash);\n * ```\n */\nexport function hashContent(content: string): string {\n\treturn sha256(content);\n}\n\n/**\n * Hash file path for anonymization\n *\n * Used in privacy-preserving telemetry to anonymize file paths\n * while maintaining ability to track unique files.\n *\n * @param filePath - File path to hash\n * @returns Lowercase hexadecimal SHA-256 hash\n *\n * @example\n * ```typescript\n * const hash = hashFilePath(\"/workspace/src/auth.ts\");\n * // Returns anonymized hash for telemetry\n * ```\n */\nexport function hashFilePath(filePath: string): string {\n\treturn sha256(filePath);\n}\n\n/**\n * Hash workspace ID for anonymization\n *\n * Used in privacy-preserving telemetry to anonymize workspace identifiers\n * while maintaining ability to track per-workspace usage.\n *\n * @param workspaceId - Workspace identifier to hash\n * @returns Lowercase hexadecimal SHA-256 hash\n *\n * @example\n * ```typescript\n * const hash = hashWorkspaceId(\"/Users/user/projects/myapp\");\n * // Returns anonymized hash for telemetry\n * ```\n */\nexport function hashWorkspaceId(workspaceId: string): string {\n\treturn sha256(workspaceId);\n}\n\n/**\n * Get sharded blob path from hash\n *\n * Creates multi-level directory structure to avoid too many files in one directory.\n * Default 2-level sharding: ab/cd/abcd1234...\n *\n * @param hash - SHA-256 hash (lowercase hex string)\n * @param levels - Number of directory levels (default: 2)\n * @returns Sharded path string\n *\n * @example\n * ```typescript\n * // Default 2-level sharding\n * getBlobPath(\"abcd1234567890\");\n * // Returns: \"ab/cd/abcd1234567890\"\n *\n * // Custom 3-level sharding\n * getBlobPath(\"abcd1234567890\", 3);\n * // Returns: \"ab/cd/12/abcd1234567890\"\n * ```\n */\nexport function getBlobPath(hash: string, levels = 2): string {\n\tconst segments: string[] = [];\n\n\tfor (let i = 0; i < levels; i++) {\n\t\tsegments.push(hash.slice(i * 2, (i + 1) * 2));\n\t}\n\n\tsegments.push(hash);\n\n\treturn segments.join(\"/\");\n}\n","export class PrivacyValidator {\n\t/**\n\t * Check that payload contains only metadata\n\t */\n\tisMetadataOnly(data: any): boolean {\n\t\t// Forbidden properties\n\t\tconst forbidden = [\n\t\t\t\"content\",\n\t\t\t\"sourceCode\",\n\t\t\t\"fileContent\",\n\t\t\t\"code\",\n\t\t\t\"text\",\n\t\t\t\"body\",\n\t\t\t\"filePath\", // Only hashed paths allowed\n\t\t\t\"fullPath\",\n\t\t\t\"absolutePath\",\n\t\t];\n\n\t\t// Check for forbidden properties\n\t\tconst props = this.getAllProps(data);\n\t\tfor (const prop of forbidden) {\n\t\t\tif (props.includes(prop)) {\n\t\t\t\tconsole.warn(`Privacy violation: forbidden property '${prop}' in request`);\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\t// Check for suspiciously large strings\n\t\tconst strings = this.getAllStrings(data);\n\t\tfor (const str of strings) {\n\t\t\tif (str.length > 1000) {\n\t\t\t\tconsole.warn(`Privacy violation: string too large (${str.length} chars)`);\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// Check for code-like patterns\n\t\t\tif (this.looksLikeCode(str)) {\n\t\t\t\tconsole.warn(\"Privacy violation: string contains code-like patterns\");\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Get all property names recursively\n\t */\n\tprivate getAllProps(obj: any, prefix = \"\"): string[] {\n\t\tlet props: string[] = [];\n\n\t\tfor (const [key, value] of Object.entries(obj)) {\n\t\t\tconst fullKey = prefix ? `${prefix}.${key}` : key;\n\t\t\tprops.push(fullKey);\n\n\t\t\tif (typeof value === \"object\" && value !== null && !Array.isArray(value)) {\n\t\t\t\tprops = props.concat(this.getAllProps(value, fullKey));\n\t\t\t}\n\t\t}\n\n\t\treturn props;\n\t}\n\n\t/**\n\t * Get all string values recursively\n\t */\n\tprivate getAllStrings(obj: any): string[] {\n\t\tlet strings: string[] = [];\n\n\t\tfor (const value of Object.values(obj)) {\n\t\t\tif (typeof value === \"string\") {\n\t\t\t\tstrings.push(value);\n\t\t\t} else if (typeof value === \"object\" && value !== null) {\n\t\t\t\tstrings = strings.concat(this.getAllStrings(value));\n\t\t\t}\n\t\t}\n\n\t\treturn strings;\n\t}\n\n\t/**\n\t * Heuristic to detect code-like strings\n\t */\n\tprivate looksLikeCode(str: string): boolean {\n\t\tconst codePatterns = [\n\t\t\t/function\\s+\\w+/,\n\t\t\t/const\\s+\\w+\\s*=/,\n\t\t\t/let\\s+\\w+\\s*=/,\n\t\t\t/var\\s+\\w+\\s*=/,\n\t\t\t/class\\s+\\w+/,\n\t\t\t/import\\s+.*from/,\n\t\t\t/export\\s+(default\\s+)?/,\n\t\t\t/if\\s*\\(/,\n\t\t\t/for\\s*\\(/,\n\t\t\t/while\\s*\\(/,\n\t\t];\n\n\t\treturn codePatterns.some((pattern) => pattern.test(str));\n\t}\n}\n","import type { ProtectedFile, ProtectionConfig, ProtectionLevel } from \"@snapback-oss/contracts\";\nimport { minimatch } from \"minimatch\";\n\nexport class ProtectionManager {\n\tprivate registry = new Map<string, ProtectedFile>();\n\tprivate config: ProtectionConfig;\n\n\tconstructor(config: ProtectionConfig) {\n\t\tthis.config = config;\n\t}\n\n\tprotect(filePath: string, level: ProtectionLevel, reason?: string): void {\n\t\tconst protectedFile: ProtectedFile = {\n\t\t\tpath: filePath,\n\t\t\tlevel,\n\t\t\treason,\n\t\t\taddedAt: new Date(),\n\t\t};\n\n\t\tthis.registry.set(filePath, protectedFile);\n\t}\n\n\tunprotect(filePath: string): void {\n\t\tthis.registry.delete(filePath);\n\t}\n\n\tgetProtection(filePath: string): ProtectedFile | null {\n\t\t// Check for direct protection first\n\t\tconst directProtection = this.registry.get(filePath);\n\t\tif (directProtection) {\n\t\t\treturn directProtection;\n\t\t}\n\n\t\t// Check pattern-based protection if enabled\n\t\tif (!this.config.enabled) {\n\t\t\treturn null;\n\t\t}\n\n\t\t// Check each pattern rule\n\t\tfor (const rule of this.config.patterns) {\n\t\t\tif (!rule.enabled) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (minimatch(filePath, rule.pattern)) {\n\t\t\t\treturn {\n\t\t\t\t\tpath: filePath,\n\t\t\t\t\tlevel: rule.level,\n\t\t\t\t\treason: rule.reason || `Matches pattern: ${rule.pattern}`,\n\t\t\t\t\taddedAt: new Date(),\n\t\t\t\t\tpattern: rule.pattern,\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tisProtected(filePath: string): boolean {\n\t\treturn this.getProtection(filePath) !== null;\n\t}\n\n\tgetLevel(filePath: string): ProtectionLevel | null {\n\t\tconst protection = this.getProtection(filePath);\n\t\treturn protection ? protection.level : null;\n\t}\n\n\tlistProtected(): ProtectedFile[] {\n\t\treturn Array.from(this.registry.values());\n\t}\n\n\tupdateLevel(filePath: string, level: ProtectionLevel): void {\n\t\tconst existing = this.registry.get(filePath);\n\t\tif (!existing) {\n\t\t\tthrow new Error(`File ${filePath} is not protected`);\n\t\t}\n\n\t\tthis.registry.set(filePath, {\n\t\t\t...existing,\n\t\t\tlevel,\n\t\t});\n\t}\n\n\tgetConfig(): ProtectionConfig {\n\t\treturn { ...this.config };\n\t}\n\n\tupdateConfig(config: ProtectionConfig): void {\n\t\tthis.config = { ...this.config, ...config };\n\t}\n}\n","import path from \"node:path\";\n\n/**\n * Custom error class for security violations\n */\nexport class SecurityError extends Error {\n\tconstructor(message: string) {\n\t\tsuper(message);\n\t\tthis.name = \"SecurityError\";\n\t}\n}\n\n/**\n * Validate file paths to prevent path traversal attacks\n * @param filePath - The file path to validate\n * @throws SecurityError if the path is invalid\n */\nexport function validatePath(filePath: string): void {\n\t// Check for null bytes (classic security issue)\n\tif (filePath.includes(\"\\0\")) {\n\t\tthrow new SecurityError(\"Null bytes in path not allowed\");\n\t}\n\n\t// Normalize the path\n\tconst normalized = path.normalize(filePath);\n\n\t// Reject absolute paths\n\tif (path.isAbsolute(normalized)) {\n\t\tthrow new SecurityError(\"Absolute paths not allowed\");\n\t}\n\n\t// Reject paths that traverse upward by checking segments\n\t// This correctly handles legitimate filenames like \"config..json\"\n\tconst segments = normalized.split(path.sep);\n\tif (segments.some((seg) => seg === \"..\")) {\n\t\tthrow new SecurityError(\"Path traversal not allowed\");\n\t}\n}\n\n/**\n * Sanitize input for JSON to prevent injection attacks\n * @param obj - The object to sanitize\n * @throws SecurityError if dangerous patterns are found\n */\nexport function sanitizeForJSON(obj: any): any {\n\tconst str = JSON.stringify(obj);\n\n\treturn JSON.parse(str);\n}\n","import { createHash } from \"node:crypto\";\nimport type { FileInput, Snapshot } from \"@snapback-oss/contracts\";\nimport QuickLRU from \"quick-lru\";\nimport { THRESHOLDS } from \"../config/Thresholds\";\nimport type { StorageAdapter } from \"../storage/StorageAdapter\";\n\nexport class SnapshotDeduplication {\n\tprivate hashCache: QuickLRU<string, string>;\n\n\tconstructor(private cacheSize = THRESHOLDS.resources.dedupCacheSize) {\n\t\tthis.hashCache = new QuickLRU({ maxSize: this.cacheSize });\n\t}\n\n\t/**\n\t * Hash file content using SHA-256\n\t */\n\thashContent(content: string): string {\n\t\treturn createHash(\"sha256\").update(content).digest(\"hex\");\n\t}\n\n\t/**\n\t * Hash multiple files content\n\t */\n\thashFiles(files: FileInput[]): string {\n\t\t// Sort files for consistent hashing\n\t\tconst sorted = [...files].sort((a, b) => a.path.localeCompare(b.path));\n\n\t\tconst content = sorted.map((f) => `${f.path}:${f.action}:${f.content}`).join(\"|\");\n\n\t\treturn this.hashContent(content);\n\t}\n\n\t/**\n\t * Check if content is already stored (deduplication)\n\t */\n\tasync isDuplicate(\n\t\tfiles: FileInput[],\n\t\tstorage: StorageAdapter,\n\t): Promise<{ isDuplicate: boolean; existingId?: string }> {\n\t\tconst hash = this.hashFiles(files);\n\n\t\t// Check cache first\n\t\tconst cachedId = this.hashCache.get(hash);\n\t\tif (cachedId) {\n\t\t\treturn { isDuplicate: true, existingId: cachedId };\n\t\t}\n\n\t\t// If storage supports hash-based lookup, use it for O(1) performance\n\t\t// This is a more efficient approach than loading all snapshots\n\t\tif (this.supportsHashLookup(storage)) {\n\t\t\tconst existing = await this.getByContentHash(storage, hash);\n\t\t\tif (existing) {\n\t\t\t\tthis.hashCache.set(hash, existing.id);\n\t\t\t\treturn { isDuplicate: true, existingId: existing.id };\n\t\t\t}\n\t\t} else {\n\t\t\t// Fallback to original approach for storages that don't support hash lookup\n\t\t\t// Check storage (query by content hash if supported)\n\t\t\t// For now, we'll do a simple check by comparing content\n\t\t\tconst allSnapshots = await storage.list();\n\n\t\t\tfor (const snapshot of allSnapshots) {\n\t\t\t\t// Check if this snapshot has the same files and content\n\t\t\t\tif (snapshot.files?.length === files.length) {\n\t\t\t\t\tconst isMatch = files.every((file) => snapshot.fileContents?.[file.path] === file.content);\n\n\t\t\t\t\tif (isMatch) {\n\t\t\t\t\t\tthis.hashCache.set(hash, snapshot.id);\n\t\t\t\t\t\treturn { isDuplicate: true, existingId: snapshot.id };\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn { isDuplicate: false };\n\t}\n\n\t/**\n\t * Check if storage adapter supports hash-based lookup\n\t */\n\tprivate supportsHashLookup(storage: StorageAdapter): boolean {\n\t\t// This would be implemented by storage adapters that support hash indexing\n\t\treturn \"getByContentHash\" in storage;\n\t}\n\n\t/**\n\t * Get snapshot by content hash (if supported by storage)\n\t */\n\tprivate async getByContentHash(storage: StorageAdapter, hash: string): Promise<Snapshot | null> {\n\t\tif (storage.getByContentHash) {\n\t\t\treturn await storage.getByContentHash(hash);\n\t\t}\n\t\treturn null;\n\t}\n\n\t/**\n\t * Record hash for future deduplication checks\n\t */\n\trecordHash(snapshotId: string, files: FileInput[]): void {\n\t\tconst hash = this.hashFiles(files);\n\t\tthis.hashCache.set(hash, snapshotId);\n\t}\n\n\t/**\n\t * Clear hash from cache for a deleted snapshot\n\t * This prevents the dedup cache from referencing non-existent snapshots\n\t */\n\tclearHash(snapshotId: string): void {\n\t\t// Find and remove all cache entries that reference this snapshot ID\n\t\tfor (const [hash, cachedId] of this.hashCache.entries()) {\n\t\t\tif (cachedId === snapshotId) {\n\t\t\t\tthis.hashCache.delete(hash);\n\t\t\t}\n\t\t}\n\t}\n}\n","import type { FileInput } from \"@snapback-oss/contracts\";\n\nexport class SnapshotNaming {\n\t/**\n\t * Generate snapshot name based on naming strategy\n\t */\n\tgenerateName(files: FileInput[], strategy: \"git\" | \"semantic\" | \"timestamp\" | \"custom\" = \"semantic\"): string {\n\t\tswitch (strategy) {\n\t\t\tcase \"git\":\n\t\t\t\treturn this.gitStrategy(files);\n\t\t\tcase \"semantic\":\n\t\t\t\treturn this.semanticStrategy(files);\n\t\t\tcase \"timestamp\":\n\t\t\t\treturn this.timestampStrategy();\n\t\t\tdefault:\n\t\t\t\treturn this.semanticStrategy(files);\n\t\t}\n\t}\n\n\t/**\n\t * Git strategy - would parse git commit message (simplified implementation)\n\t */\n\tprivate gitStrategy(files: FileInput[]): string {\n\t\t// In a real implementation, this would integrate with git\n\t\t// For now, fall back to semantic strategy\n\t\treturn this.semanticStrategy(files);\n\t}\n\n\t/**\n\t * Semantic strategy - analyze file operations\n\t */\n\tprivate semanticStrategy(files: FileInput[]): string {\n\t\tif (files.length === 1) {\n\t\t\tconst file = files[0];\n\t\t\tconst fileName = file.path.split(\"/\").pop() || \"file\";\n\t\t\treturn `${this.capitalize(file.action)} ${fileName}`;\n\t\t}\n\n\t\t// Analyze file operations\n\t\tconst actionCounts = files.reduce(\n\t\t\t(acc, f) => {\n\t\t\t\tacc[f.action] = (acc[f.action] || 0) + 1;\n\t\t\t\treturn acc;\n\t\t\t},\n\t\t\t{} as Record<string, number>,\n\t\t);\n\n\t\tconst primaryAction = Object.entries(actionCounts).sort((a, b) => (b[1] as number) - (a[1] as number))[0];\n\n\t\tif (primaryAction) {\n\t\t\treturn `${this.capitalize(String(primaryAction[0]))} ${files.length} files`;\n\t\t}\n\n\t\treturn `Snapshot of ${files.length} files`;\n\t}\n\n\t/**\n\t * Timestamp strategy - use current timestamp\n\t */\n\tprivate timestampStrategy(): string {\n\t\treturn `Snapshot ${new Date().toISOString()}`;\n\t}\n\n\t/**\n\t * Capitalize first letter of string\n\t */\n\tprivate capitalize(str: string): string {\n\t\treturn str.charAt(0).toUpperCase() + str.slice(1);\n\t}\n}\n","import { randomUUID } from \"node:crypto\";\nimport { existsSync } from \"node:fs\";\nimport * as fs from \"node:fs/promises\";\nimport * as path from \"node:path\";\nimport type {\n\tCreateSnapshotOptions,\n\tFileInput,\n\tSnapshot,\n\tSnapshotFilters,\n\tSnapshotRestoreResult,\n} from \"@snapback-oss/contracts\";\nimport type { StorageAdapter } from \"../storage/StorageAdapter\";\nimport { validatePath } from \"../utils/security\";\nimport { SnapshotDeduplication } from \"./SnapshotDeduplication\";\nimport { SnapshotNaming } from \"./SnapshotNaming\";\n\nexport interface SnapshotManagerOptions {\n\tenableDeduplication?: boolean;\n\tnamingStrategy?: \"git\" | \"semantic\" | \"timestamp\";\n\tautoProtect?: boolean;\n}\n\nexport class SnapshotManager {\n\tprivate deduplication: SnapshotDeduplication;\n\tprivate naming: SnapshotNaming;\n\n\tconstructor(\n\t\tprivate storage: StorageAdapter,\n\t\tprivate options: SnapshotManagerOptions = {},\n\t) {\n\t\tthis.deduplication = new SnapshotDeduplication();\n\t\tthis.naming = new SnapshotNaming();\n\t}\n\n\tasync create(files: FileInput[], options?: CreateSnapshotOptions): Promise<Snapshot> {\n\t\treturn this.createSnapshot(files, options);\n\t}\n\n\t/**\n\t * Convenience method for creating a snapshot with a single file\n\t * @param params - Object containing filePath and content\n\t * @param options - Snapshot options\n\t * @returns Created snapshot\n\t */\n\tasync createTest(\n\t\tparams: { filePath: string; content: string },\n\t\toptions?: CreateSnapshotOptions,\n\t): Promise<Snapshot> {\n\t\tconst fileInput: FileInput = {\n\t\t\tpath: params.filePath,\n\t\t\tcontent: params.content,\n\t\t\taction: \"modify\",\n\t\t};\n\t\treturn this.createSnapshot([fileInput], options);\n\t}\n\n\tprivate async createSnapshot(files: FileInput[], options?: CreateSnapshotOptions): Promise<Snapshot> {\n\t\t// Validate all file paths to prevent path traversal attacks\n\t\tawait Promise.all(files.map((file) => Promise.resolve(validatePath(file.path))));\n\t\t// Check for duplicates if deduplication is enabled\n\t\tif (this.options.enableDeduplication) {\n\t\t\tconst { isDuplicate, existingId } = await this.deduplication.isDuplicate(files, this.storage);\n\n\t\t\tif (isDuplicate && existingId) {\n\t\t\t\tthrow new Error(\"Duplicate snapshot detected\");\n\t\t\t}\n\t\t}\n\n\t\t// Generate name\n\t\tconst name = options?.description || this.naming.generateName(files, this.options.namingStrategy);\n\n\t\t// Create snapshot with explicit version for type safety\n\t\tconst snapshot: Snapshot = {\n\t\t\tid: randomUUID(),\n\t\t\ttimestamp: Date.now(),\n\t\t\tversion: \"1.0\",\n\t\t\tmeta: {\n\t\t\t\tname,\n\t\t\t\tprotected: options?.protected || this.options.autoProtect || false,\n\t\t\t},\n\t\t\tfiles: files.map((f) => f.path),\n\t\t\tfileContents: files.reduce(\n\t\t\t\t(acc, f) => {\n\t\t\t\t\tacc[f.path] = f.content;\n\t\t\t\t\treturn acc;\n\t\t\t\t},\n\t\t\t\t{} as Record<string, string>,\n\t\t\t),\n\t\t};\n\n\t\t// Compute content hash for deduplication\n\t\tconst contentHash = this.options.enableDeduplication ? this.deduplication.hashFiles(files) : undefined;\n\n\t\t// Save with content hash for indexed lookups\n\t\tawait this.storage.save(snapshot, contentHash);\n\n\t\t// Record hash for deduplication cache\n\t\tif (this.options.enableDeduplication && contentHash) {\n\t\t\tthis.deduplication.recordHash(snapshot.id, files);\n\t\t}\n\n\t\treturn snapshot;\n\t}\n\n\tasync list(filters?: SnapshotFilters): Promise<Snapshot[]> {\n\t\treturn this.storage.list(filters);\n\t}\n\n\tasync get(id: string): Promise<Snapshot | null> {\n\t\treturn this.storage.get(id);\n\t}\n\n\tasync delete(id: string): Promise<void> {\n\t\tconst snapshot = await this.storage.get(id);\n\t\tif (!snapshot) {\n\t\t\tthrow new Error(`Snapshot ${id} not found`);\n\t\t}\n\n\t\tif (snapshot.meta?.protected) {\n\t\t\tthrow new Error(`Cannot delete protected snapshot ${id}`);\n\t\t}\n\n\t\tawait this.storage.delete(id);\n\n\t\t// Clear dedup cache to prevent referencing deleted snapshot\n\t\tif (this.options.enableDeduplication) {\n\t\t\tthis.deduplication.clearHash(id);\n\t\t}\n\t}\n\n\t/**\n\t * Restore snapshot to target directory with atomic guarantees\n\t * @param id Snapshot ID to restore\n\t * @param targetPath Target directory path (optional, for actual file system restore)\n\t * @param options Restore options\n\t * @returns Restore result with list of restored files and any errors\n\t */\n\tasync restore(\n\t\tid: string,\n\t\ttargetPath?: string,\n\t\toptions?: { dryRun?: boolean; onProgress?: (progress: number) => void },\n\t): Promise<SnapshotRestoreResult> {\n\t\tconst snapshot = await this.storage.get(id);\n\t\tif (!snapshot) {\n\t\t\tthrow new Error(`Snapshot ${id} not found`);\n\t\t}\n\n\t\t// If no target path provided, return snapshot metadata only (metadata restore)\n\t\tif (!targetPath) {\n\t\t\treturn {\n\t\t\t\tsuccess: true,\n\t\t\t\trestoredFiles: snapshot.files || [],\n\t\t\t\terrors: [],\n\t\t\t};\n\t\t}\n\n\t\t// Dry run mode - just validate without writing files\n\t\tif (options?.dryRun) {\n\t\t\tconst errors: string[] = [];\n\t\t\tconst fileContents = snapshot.fileContents || {};\n\n\t\t\tfor (const filePath of snapshot.files || []) {\n\t\t\t\tif (!fileContents[filePath]) {\n\t\t\t\t\terrors.push(`Missing content for file: ${filePath}`);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tsuccess: errors.length === 0,\n\t\t\t\trestoredFiles: snapshot.files || [],\n\t\t\t\terrors,\n\t\t\t};\n\t\t}\n\n\t\t// Perform actual atomic file system restore\n\t\treturn await this.restoreAtomic(snapshot, targetPath, options);\n\t}\n\n\t/**\n\t * Atomic restore implementation with staging and rollback\n\t */\n\tprivate async restoreAtomic(\n\t\tsnapshot: Snapshot,\n\t\ttargetPath: string,\n\t\toptions?: { onProgress?: (progress: number) => void },\n\t): Promise<SnapshotRestoreResult> {\n\t\tconst errors: string[] = [];\n\t\tconst restoredFiles: string[] = [];\n\t\tconst stagingDir = `${targetPath}.staging`;\n\t\tconst backupDir = `${targetPath}.backup`;\n\t\tlet targetBackedUp = false;\n\n\t\ttry {\n\t\t\tconst fileContents = snapshot.fileContents || {};\n\t\t\tconst files = snapshot.files || [];\n\t\t\tconst totalFiles = files.length;\n\n\t\t\t// Step 1: Create staging directory\n\t\t\tif (existsSync(stagingDir)) {\n\t\t\t\tawait fs.rm(stagingDir, { recursive: true, force: true });\n\t\t\t}\n\t\t\tawait fs.mkdir(stagingDir, { recursive: true });\n\n\t\t\t// Step 2: Extract all files to staging and validate\n\t\t\tfor (let i = 0; i < totalFiles; i++) {\n\t\t\t\tconst filePath = files[i];\n\t\t\t\tconst content = fileContents[filePath];\n\n\t\t\t\tif (!content) {\n\t\t\t\t\tthrow new Error(`Missing content for file: ${filePath}`);\n\t\t\t\t}\n\n\t\t\t\t// Write to staging\n\t\t\t\tconst targetFilePath = path.join(stagingDir, filePath);\n\t\t\t\tawait fs.mkdir(path.dirname(targetFilePath), { recursive: true });\n\t\t\t\tawait fs.writeFile(targetFilePath, content, \"utf-8\");\n\n\t\t\t\trestoredFiles.push(filePath);\n\n\t\t\t\t// Report progress\n\t\t\t\tif (options?.onProgress) {\n\t\t\t\t\tconst progress = Math.round(((i + 1) / totalFiles) * 90);\n\t\t\t\t\toptions.onProgress(progress);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Step 3: Backup existing target directory\n\t\t\tif (existsSync(targetPath)) {\n\t\t\t\tif (existsSync(backupDir)) {\n\t\t\t\t\tawait fs.rm(backupDir, { recursive: true, force: true });\n\t\t\t\t}\n\t\t\t\tawait fs.rename(targetPath, backupDir);\n\t\t\t\ttargetBackedUp = true;\n\t\t\t}\n\n\t\t\tif (options?.onProgress) {\n\t\t\t\toptions.onProgress(95);\n\t\t\t}\n\n\t\t\t// Step 4: Atomic swap - rename staging to target\n\t\t\tawait fs.rename(stagingDir, targetPath);\n\n\t\t\tif (options?.onProgress) {\n\t\t\t\toptions.onProgress(100);\n\t\t\t}\n\n\t\t\t// Step 5: Clean up backup on success\n\t\t\tif (existsSync(backupDir)) {\n\t\t\t\tawait fs.rm(backupDir, { recursive: true, force: true });\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tsuccess: true,\n\t\t\t\trestoredFiles,\n\t\t\t\terrors: [],\n\t\t\t};\n\t\t} catch (error) {\n\t\t\t// Rollback: restore from backup if it exists\n\t\t\tif (targetBackedUp && existsSync(backupDir)) {\n\t\t\t\ttry {\n\t\t\t\t\tif (existsSync(targetPath)) {\n\t\t\t\t\t\tawait fs.rm(targetPath, { recursive: true, force: true });\n\t\t\t\t\t}\n\t\t\t\t\tawait fs.rename(backupDir, targetPath);\n\t\t\t\t} catch (rollbackError) {\n\t\t\t\t\terrors.push(\n\t\t\t\t\t\t`Rollback failed: ${rollbackError instanceof Error ? rollbackError.message : String(rollbackError)}`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Clean up staging directory\n\t\t\tif (existsSync(stagingDir)) {\n\t\t\t\ttry {\n\t\t\t\t\tawait fs.rm(stagingDir, { recursive: true, force: true });\n\t\t\t\t} catch {\n\t\t\t\t\t// Ignore cleanup errors\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst errorMessage = error instanceof Error ? error.message : String(error);\n\t\t\terrors.push(errorMessage);\n\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\trestoredFiles,\n\t\t\t\terrors,\n\t\t\t};\n\t\t}\n\t}\n\n\tasync protect(id: string): Promise<void> {\n\t\tconst snapshot = await this.storage.get(id);\n\t\tif (!snapshot) {\n\t\t\tthrow new Error(`Snapshot ${id} not found`);\n\t\t}\n\n\t\t// Create defensive copy to prevent mutating original object\n\t\tconst updated: Snapshot = {\n\t\t\t...snapshot,\n\t\t\tmeta: {\n\t\t\t\t...snapshot.meta,\n\t\t\t\tprotected: true,\n\t\t\t},\n\t\t};\n\n\t\t// Reuse the exact stored content hash to preserve deduplication\n\t\tconst contentHash =\n\t\t\tthis.options.enableDeduplication && \"getStoredContentHash\" in this.storage\n\t\t\t\t? await (this.storage as any).getStoredContentHash(id)\n\t\t\t\t: undefined;\n\n\t\tawait this.storage.save(updated, contentHash);\n\t}\n\n\tasync unprotect(id: string): Promise<void> {\n\t\tconst snapshot = await this.storage.get(id);\n\t\tif (!snapshot) {\n\t\t\tthrow new Error(`Snapshot ${id} not found`);\n\t\t}\n\n\t\t// Create defensive copy to prevent mutating original object\n\t\tconst updated: Snapshot = {\n\t\t\t...snapshot,\n\t\t\tmeta: {\n\t\t\t\t...snapshot.meta,\n\t\t\t\tprotected: false,\n\t\t\t},\n\t\t};\n\n\t\t// Reuse the exact stored content hash to preserve deduplication\n\t\tconst contentHash =\n\t\t\tthis.options.enableDeduplication && \"getStoredContentHash\" in this.storage\n\t\t\t\t? await (this.storage as any).getStoredContentHash(id)\n\t\t\t\t: undefined;\n\n\t\tawait this.storage.save(updated, contentHash);\n\t}\n\n\tasync search(criteria: { content?: string; message?: string }): Promise<Snapshot[]> {\n\t\t// If storage supports optimized search, use it\n\t\tif (this.supportsOptimizedSearch(this.storage)) {\n\t\t\treturn await this.optimizedSearch(this.storage, criteria);\n\t\t}\n\n\t\t// Fallback to loading all snapshots (inefficient but works)\n\t\tconst all = await this.storage.list();\n\n\t\treturn all.filter((snapshot) => {\n\t\t\tif (criteria.content) {\n\t\t\t\tconst hasContent = Object.values(snapshot.fileContents || {}).some(\n\t\t\t\t\t(content) => content != null && criteria.content && String(content).includes(criteria.content),\n\t\t\t\t);\n\t\t\t\tif (!hasContent) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (criteria.message) {\n\t\t\t\tconst _name = snapshot.meta?.name || \"\";\n\t\t\t\tif (criteria.message) {\n\t\t\t\t\tconst name = snapshot.meta?.name || \"\";\n\t\t\t\t\tif (criteria.message && typeof name === \"string\" && !name.includes(criteria.message)) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn true;\n\t\t});\n\t}\n\n\t/**\n\t * Check if storage adapter supports optimized search\n\t */\n\tprivate supportsOptimizedSearch(storage: StorageAdapter): boolean {\n\t\treturn \"search\" in storage && typeof (storage as any).search === \"function\";\n\t}\n\n\t/**\n\t * Perform optimized search using storage adapter capabilities\n\t */\n\tprivate async optimizedSearch(\n\t\tstorage: StorageAdapter,\n\t\tcriteria: { content?: string; message?: string },\n\t): Promise<Snapshot[]> {\n\t\t// This would delegate to storage adapter's optimized search implementation\n\t\t// For now, fallback to the original approach\n\t\tconst all = await storage.list();\n\n\t\treturn all.filter((snapshot) => {\n\t\t\tif (criteria.content) {\n\t\t\t\tconst hasContent = Object.values(snapshot.fileContents || {}).some(\n\t\t\t\t\t(content) => content != null && String(content).includes(criteria.content ?? \"\"),\n\t\t\t\t);\n\t\t\t\tif (!hasContent) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (criteria.message) {\n\t\t\t\tconst name = snapshot.meta?.name || \"\";\n\t\t\t\tif (criteria.message && typeof name === \"string\" && !name.includes(criteria.message)) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn true;\n\t\t});\n\t}\n}\n","export class StorageError extends Error {\n\tconstructor(\n\t\tmessage: string,\n\t\tpublic code?: string,\n\t\tpublic details?: unknown,\n\t) {\n\t\tsuper(message);\n\t\tthis.name = \"StorageError\";\n\t}\n}\n\nexport class StorageConnectionError extends StorageError {\n\tconstructor(message: string, details?: unknown) {\n\t\tsuper(message, \"STORAGE_CONNECTION_ERROR\", details);\n\t\tthis.name = \"StorageConnectionError\";\n\t}\n}\n\nexport class StorageTransactionError extends StorageError {\n\tconstructor(message: string, details?: unknown) {\n\t\tsuper(message, \"STORAGE_TRANSACTION_ERROR\", details);\n\t\tthis.name = \"StorageTransactionError\";\n\t}\n}\n\nexport class StorageFullError extends StorageError {\n\tconstructor(message: string, details?: unknown) {\n\t\tsuper(message, \"STORAGE_FULL_ERROR\", details);\n\t\tthis.name = \"StorageFullError\";\n\t}\n}\n\nexport class StorageLockError extends StorageError {\n\tconstructor(message: string, details?: unknown) {\n\t\tsuper(message, \"STORAGE_LOCK_ERROR\", details);\n\t\tthis.name = \"StorageLockError\";\n\t}\n}\n\nexport class CorruptedDataError extends StorageError {\n\tconstructor(message: string, details?: unknown) {\n\t\tsuper(message, \"CORRUPTED_DATA_ERROR\", details);\n\t\tthis.name = \"CorruptedDataError\";\n\t}\n}\n","import type { Snapshot, SnapshotFilters } from \"@snapback-oss/contracts\";\nimport { logger } from \"@snapback-oss/infrastructure\";\nimport type Database from \"better-sqlite3\";\nimport { sanitizeForJSON } from \"../utils/security\";\nimport type { StorageAdapter } from \"./StorageAdapter\";\nimport {\n\tCorruptedDataError,\n\tStorageConnectionError,\n\tStorageError,\n\tStorageFullError,\n\tStorageLockError,\n} from \"./StorageErrors\";\n\n// Lazy-loaded better-sqlite3 instance\nlet DatabaseConstructor: typeof Database | null = null;\nlet loadError: Error | null = null;\n\nasync function loadBetterSqlite3(): Promise<typeof Database> {\n\tif (DatabaseConstructor) {\n\t\treturn DatabaseConstructor;\n\t}\n\n\tif (loadError) {\n\t\tthrow loadError;\n\t}\n\n\ttry {\n\t\tconst module = await import(\"better-sqlite3\");\n\t\tDatabaseConstructor = module.default;\n\t\treturn DatabaseConstructor;\n\t} catch (error) {\n\t\tloadError = error instanceof Error ? error : new Error(String(error));\n\t\tthrow new StorageConnectionError(\"Failed to load better-sqlite3\", {\n\t\t\tcause: loadError,\n\t\t});\n\t}\n}\n\nexport class LocalStorage implements StorageAdapter {\n\tprivate db: Database.Database | null = null;\n\tprivate dbPath: string;\n\n\tconstructor(dbPath: string) {\n\t\tthis.dbPath = dbPath;\n\t}\n\n\tprivate async ensureInitialized(): Promise<void> {\n\t\tif (this.db) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst DB = await loadBetterSqlite3();\n\t\tthis.db = new DB(this.dbPath);\n\t\tthis.initSchema();\n\t}\n\n\tprivate initSchema(): void {\n\t\tif (!this.db) {\n\t\t\tthrow new StorageError(\"Database not initialized\", \"DB_NOT_INITIALIZED\");\n\t\t}\n\t\tthis.db.exec(`\n CREATE TABLE IF NOT EXISTS snapshots (\n id TEXT PRIMARY KEY,\n timestamp INTEGER NOT NULL,\n name TEXT,\n protected INTEGER DEFAULT 0,\n files TEXT,\n file_contents TEXT,\n metadata TEXT,\n content_hash TEXT,\n created_at INTEGER DEFAULT (strftime('%s', 'now'))\n );\n\n CREATE INDEX IF NOT EXISTS idx_timestamp ON snapshots(timestamp DESC);\n CREATE INDEX IF NOT EXISTS idx_protected ON snapshots(protected);\n CREATE INDEX IF NOT EXISTS idx_created_at ON snapshots(created_at DESC);\n CREATE INDEX IF NOT EXISTS idx_name ON snapshots(name);\n CREATE INDEX IF NOT EXISTS idx_content_hash ON snapshots(content_hash);\n `);\n\t}\n\n\tasync save(snapshot: Snapshot, contentHash?: string): Promise<void> {\n\t\tawait this.ensureInitialized();\n\t\ttry {\n\t\t\t// Sanitize inputs to prevent injection attacks\n\t\t\tconst sanitizedFiles = sanitizeForJSON(snapshot.files || []);\n\t\t\tconst sanitizedFileContents = sanitizeForJSON(snapshot.fileContents || {});\n\t\t\tconst sanitizedMeta = sanitizeForJSON(snapshot.meta || {});\n\n\t\t\tconst stmt = this.db?.prepare(`\n INSERT OR REPLACE INTO snapshots (\n id, timestamp, name, protected, files, file_contents, metadata, content_hash\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?)\n `);\n\t\t\tif (!stmt) {\n\t\t\t\tthrow new StorageError(\"Failed to prepare save statement\", \"DB_PREPARE_ERROR\");\n\t\t\t}\n\n\t\t\tstmt.run(\n\t\t\t\tsnapshot.id,\n\t\t\t\tsnapshot.timestamp,\n\t\t\t\tsnapshot.meta?.name || null,\n\t\t\t\tsnapshot.meta?.protected ? 1 : 0,\n\t\t\t\tJSON.stringify(sanitizedFiles),\n\t\t\t\tJSON.stringify(sanitizedFileContents),\n\t\t\t\tJSON.stringify(sanitizedMeta),\n\t\t\t\tcontentHash || null,\n\t\t\t);\n\t\t} catch (error: any) {\n\t\t\tif (error.code === \"SQLITE_BUSY\") {\n\t\t\t\tthrow new StorageLockError(\"Database locked\", {\n\t\t\t\t\tretryable: true,\n\t\t\t\t\tcause: error,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (error.code === \"SQLITE_FULL\") {\n\t\t\t\tthrow new StorageFullError(\"Disk full\", {\n\t\t\t\t\tretryable: false,\n\t\t\t\t\tcause: error,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (error.code === \"SQLITE_CANTOPEN\") {\n\t\t\t\tthrow new StorageConnectionError(\"Cannot open database\", {\n\t\t\t\t\tcause: error,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tthrow new StorageError(\"Save failed\", error.code, { cause: error });\n\t\t}\n\t}\n\n\tasync get(id: string): Promise<Snapshot | null> {\n\t\tawait this.ensureInitialized();\n\t\ttry {\n\t\t\tconst stmt = this.db?.prepare(\"SELECT * FROM snapshots WHERE id = ?\");\n\t\t\tif (!stmt) {\n\t\t\t\tthrow new StorageError(\"Failed to prepare get statement\", \"DB_PREPARE_ERROR\");\n\t\t\t}\n\t\t\tconst row = stmt.get(id) as any;\n\n\t\t\tif (!row) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\treturn this.deserializeSnapshot(row);\n\t\t} catch (error: any) {\n\t\t\tif (error.code === \"SQLITE_BUSY\") {\n\t\t\t\tthrow new StorageLockError(\"Database locked\", {\n\t\t\t\t\tretryable: true,\n\t\t\t\t\tcause: error,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (error.code === \"SQLITE_CANTOPEN\") {\n\t\t\t\tthrow new StorageConnectionError(\"Cannot open database\", {\n\t\t\t\t\tcause: error,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tthrow new StorageError(\"Get failed\", error.code, { cause: error });\n\t\t}\n\t}\n\n\tasync getByContentHash(hash: string): Promise<Snapshot | null> {\n\t\tawait this.ensureInitialized();\n\t\ttry {\n\t\t\tconst stmt = this.db?.prepare(\"SELECT * FROM snapshots WHERE content_hash = ? LIMIT 1\");\n\t\t\tif (!stmt) {\n\t\t\t\tthrow new StorageError(\"Failed to prepare getByContentHash statement\", \"DB_PREPARE_ERROR\");\n\t\t\t}\n\t\t\tconst row = stmt.get(hash) as any;\n\n\t\t\tif (!row) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\treturn this.deserializeSnapshot(row);\n\t\t} catch (error: any) {\n\t\t\tif (error.code === \"SQLITE_BUSY\") {\n\t\t\t\tthrow new StorageLockError(\"Database locked\", {\n\t\t\t\t\tretryable: true,\n\t\t\t\t\tcause: error,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (error.code === \"SQLITE_CANTOPEN\") {\n\t\t\t\tthrow new StorageConnectionError(\"Cannot open database\", {\n\t\t\t\t\tcause: error,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tthrow new StorageError(\"GetByContentHash failed\", error.code, {\n\t\t\t\tcause: error,\n\t\t\t});\n\t\t}\n\t}\n\n\t/**\n\t * Get the stored content hash for a snapshot (for preserving hash on updates)\n\t */\n\tasync getStoredContentHash(id: string): Promise<string | null> {\n\t\tawait this.ensureInitialized();\n\t\ttry {\n\t\t\tconst stmt = this.db?.prepare(\"SELECT content_hash FROM snapshots WHERE id = ?\");\n\t\t\tif (!stmt) {\n\t\t\t\tthrow new StorageError(\"Failed to prepare getStoredContentHash statement\", \"DB_PREPARE_ERROR\");\n\t\t\t}\n\t\t\tconst row = stmt.get(id) as any;\n\n\t\t\treturn row?.content_hash || null;\n\t\t} catch (error: any) {\n\t\t\tif (error.code === \"SQLITE_BUSY\") {\n\t\t\t\tthrow new StorageLockError(\"Database locked\", {\n\t\t\t\t\tretryable: true,\n\t\t\t\t\tcause: error,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (error.code === \"SQLITE_CANTOPEN\") {\n\t\t\t\tthrow new StorageConnectionError(\"Cannot open database\", {\n\t\t\t\t\tcause: error,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tthrow new StorageError(\"GetStoredContentHash failed\", error.code, {\n\t\t\t\tcause: error,\n\t\t\t});\n\t\t}\n\t}\n\n\tasync list(filters?: SnapshotFilters): Promise<Snapshot[]> {\n\t\tawait this.ensureInitialized();\n\t\ttry {\n\t\t\tlet query = \"SELECT * FROM snapshots WHERE 1=1\";\n\t\t\tconst params: any[] = [];\n\n\t\t\tif (filters?.protected !== undefined) {\n\t\t\t\tquery += \" AND protected = ?\";\n\t\t\t\tparams.push(filters.protected ? 1 : 0);\n\t\t\t}\n\n\t\t\tif (filters?.after) {\n\t\t\t\tquery += \" AND timestamp >= ?\";\n\t\t\t\tparams.push(filters.after.getTime());\n\t\t\t}\n\n\t\t\tif (filters?.before) {\n\t\t\t\tquery += \" AND timestamp < ?\";\n\t\t\t\tparams.push(filters.before.getTime());\n\t\t\t}\n\n\t\t\tquery += \" ORDER BY timestamp DESC\";\n\n\t\t\t// Validate that offset is only used with limit for efficient querying\n\t\t\tif (filters?.offset && !filters?.limit) {\n\t\t\t\t// Log a warning about inefficient query pattern\n\t\t\t\tlogger.warn(\n\t\t\t\t\t\"Using OFFSET without LIMIT can lead to inefficient queries. Consider setting a limit for better performance.\",\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (filters?.limit) {\n\t\t\t\tquery += \" LIMIT ?\";\n\t\t\t\tparams.push(filters.limit);\n\t\t\t}\n\n\t\t\tif (filters?.offset) {\n\t\t\t\tquery += \" OFFSET ?\";\n\t\t\t\tparams.push(filters.offset);\n\t\t\t}\n\n\t\t\tconst stmt = this.db?.prepare(query);\n\t\t\tif (!stmt) {\n\t\t\t\tthrow new StorageError(\"Failed to prepare list statement\", \"DB_PREPARE_ERROR\");\n\t\t\t}\n\t\t\tconst rows = stmt.all(...params) as any[];\n\n\t\t\tlet snapshots = rows.map((row) => this.deserializeSnapshot(row));\n\n\t\t\t// Filter by filePath in memory (since files is stored as JSON array)\n\t\t\tif (filters?.filePath) {\n\t\t\t\tsnapshots = snapshots.filter((snapshot) => snapshot.files?.includes(filters.filePath ?? \"\"));\n\t\t\t}\n\n\t\t\treturn snapshots;\n\t\t} catch (error: any) {\n\t\t\tif (error.code === \"SQLITE_BUSY\") {\n\t\t\t\tthrow new StorageLockError(\"Database locked\", {\n\t\t\t\t\tretryable: true,\n\t\t\t\t\tcause: error,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (error.code === \"SQLITE_CANTOPEN\") {\n\t\t\t\tthrow new StorageConnectionError(\"Cannot open database\", {\n\t\t\t\t\tcause: error,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tthrow new StorageError(\"List failed\", error.code, { cause: error });\n\t\t}\n\t}\n\n\tasync delete(id: string): Promise<void> {\n\t\tawait this.ensureInitialized();\n\t\ttry {\n\t\t\tconst stmt = this.db?.prepare(\"DELETE FROM snapshots WHERE id = ?\");\n\t\t\tif (!stmt) {\n\t\t\t\tthrow new StorageError(\"Failed to prepare delete statement\", \"DB_PREPARE_ERROR\");\n\t\t\t}\n\t\t\tstmt.run(id);\n\t\t} catch (error: any) {\n\t\t\tif (error.code === \"SQLITE_BUSY\") {\n\t\t\t\tthrow new StorageLockError(\"Database locked\", {\n\t\t\t\t\tretryable: true,\n\t\t\t\t\tcause: error,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (error.code === \"SQLITE_CANTOPEN\") {\n\t\t\t\tthrow new StorageConnectionError(\"Cannot open database\", {\n\t\t\t\t\tcause: error,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tthrow new StorageError(\"Delete failed\", error.code, {\n\t\t\t\tcause: error,\n\t\t\t});\n\t\t}\n\t}\n\n\tasync close(): Promise<void> {\n\t\tif (!this.db) {\n\t\t\treturn;\n\t\t}\n\t\ttry {\n\t\t\tthis.db.close();\n\t\t\tthis.db = null;\n\t\t} catch (error: any) {\n\t\t\tif (error.code === \"SQLITE_BUSY\") {\n\t\t\t\tthrow new StorageLockError(\"Database locked\", {\n\t\t\t\t\tretryable: true,\n\t\t\t\t\tcause: error,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tthrow new StorageError(\"Close failed\", error.code, {\n\t\t\t\tcause: error,\n\t\t\t});\n\t\t}\n\t}\n\n\tprivate deserializeSnapshot(row: any): Snapshot {\n\t\ttry {\n\t\t\treturn {\n\t\t\t\tid: row.id,\n\t\t\t\ttimestamp: row.timestamp,\n\t\t\t\tversion: row.version || \"1.0\",\n\t\t\t\tmeta: JSON.parse(row.metadata || \"{}\"),\n\t\t\t\tfiles: JSON.parse(row.files || \"[]\"),\n\t\t\t\tfileContents: JSON.parse(row.file_contents || \"{}\"),\n\t\t\t};\n\t\t} catch (error: any) {\n\t\t\tthrow new CorruptedDataError(`Failed to deserialize snapshot ${row.id}`, {\n\t\t\t\tcause: error,\n\t\t\t\tsnapshotId: row.id,\n\t\t\t});\n\t\t}\n\t}\n}\n","import type { Snapshot, SnapshotFilters } from \"@snapback-oss/contracts\";\nimport type { StorageAdapter } from \"./StorageAdapter\";\n\n/**\n * In-memory storage implementation\n * Useful for testing and temporary snapshots\n * Data is lost when instance is destroyed\n */\nexport class MemoryStorage implements StorageAdapter {\n\tprivate snapshots: Map<string, Snapshot> = new Map();\n\n\tasync save(snapshot: Snapshot, _contentHash?: string): Promise<void> {\n\t\t// Deep clone to prevent external mutations while preserving types\n\t\t// Note: MemoryStorage doesn't persist contentHash since it's transient\n\t\tthis.snapshots.set(snapshot.id, this.cloneSnapshot(snapshot));\n\t}\n\n\tasync get(id: string): Promise<Snapshot | null> {\n\t\tconst snapshot = this.snapshots.get(id);\n\t\treturn snapshot ? this.cloneSnapshot(snapshot) : null;\n\t}\n\n\tasync list(filters?: SnapshotFilters): Promise<Snapshot[]> {\n\t\tlet snapshots = Array.from(this.snapshots.values());\n\n\t\t// Apply filters\n\t\tif (filters?.filePath) {\n\t\t\tsnapshots = snapshots.filter((s) =>\n\t\t\t\ts.files?.some(\n\t\t\t\t\t(f: string) => f === filters.filePath || (filters.filePath && f.includes(filters.filePath)),\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\n\t\tif (filters?.before) {\n\t\t\tconst beforeMs = filters.before.getTime();\n\t\t\tsnapshots = snapshots.filter((s) => s.timestamp < beforeMs);\n\t\t}\n\n\t\tif (filters?.after) {\n\t\t\tconst afterMs = filters.after.getTime();\n\t\t\tsnapshots = snapshots.filter((s) => s.timestamp >= afterMs);\n\t\t}\n\n\t\tif (filters?.protected !== undefined) {\n\t\t\tsnapshots = snapshots.filter((s) => (s.meta?.protected ?? false) === filters.protected);\n\t\t}\n\n\t\t// Sort by timestamp descending (newest first)\n\t\tsnapshots.sort((a, b) => b.timestamp - a.timestamp);\n\n\t\t// Apply limit\n\t\tif (filters?.limit) {\n\t\t\tsnapshots = snapshots.slice(0, filters.limit);\n\t\t}\n\n\t\t// Deep clone to prevent external mutations while preserving types\n\t\treturn snapshots.map((s) => this.cloneSnapshot(s));\n\t}\n\n\tasync delete(id: string): Promise<void> {\n\t\tthis.snapshots.delete(id);\n\t}\n\n\tasync close(): Promise<void> {\n\t\tthis.snapshots.clear();\n\t}\n\n\t/**\n\t * Deep clone snapshot while preserving type information\n\t */\n\tprivate cloneSnapshot(snapshot: Snapshot): Snapshot {\n\t\t// Use structuredClone if available (Node 17+), otherwise fallback to JSON approach\n\t\tif (typeof structuredClone !== \"undefined\") {\n\t\t\treturn structuredClone(snapshot);\n\t\t}\n\n\t\t// Fallback for older Node versions - should not be reached in modern environments\n\t\treturn structuredClone(snapshot);\n\t}\n\n\t/**\n\t * Get total count of snapshots (for testing)\n\t */\n\tget size(): number {\n\t\treturn this.snapshots.size;\n\t}\n}\n","import type { FileInput, ProtectionConfig } from \"@snapback-oss/contracts\";\nimport { SnapbackAnalyticsClient, SnapbackClient } from \"./client\";\nimport { ProtectionManager } from \"./protection/ProtectionManager\";\nimport { SnapshotManager } from \"./snapshot/SnapshotManager\";\nimport { LocalStorage } from \"./storage/LocalStorage\";\nimport { MemoryStorage } from \"./storage/MemoryStorage\";\nimport type { StorageAdapter } from \"./storage/StorageAdapter\";\n\n// Define the SnapshotFilters interface\nexport interface SnapshotFilters {\n\tlimit?: number;\n\toffset?: number;\n\tprotected?: boolean;\n\tbefore?: Date;\n\tafter?: Date;\n}\n\nexport interface SnapbackOptions {\n\t/**\n\t * Storage configuration\n\t * Can be a path to SQLite database, StorageAdapter instance, or 'memory' for testing\n\t */\n\tstorage?: string | StorageAdapter;\n\n\t/**\n\t * Protection configuration\n\t */\n\tprotection?: ProtectionConfig;\n\n\t/**\n\t * Cloud API configuration (optional)\n\t * If provided, enables cloud sync functionality\n\t */\n\tcloud?: {\n\t\tbaseUrl: string;\n\t\tapiKey: string;\n\t\ttimeout?: number;\n\t\tretries?: number;\n\t};\n\n\t/**\n\t * Enable deduplication for local snapshots\n\t */\n\tenableDeduplication?: boolean;\n\n\t/**\n\t * Auto-protect configuration files\n\t */\n\tautoProtectConfigs?: boolean;\n}\n\n/**\n * Unified Snapback SDK entry point\n * Combines local snapshot management with optional cloud sync\n *\n * @example\n * ```typescript\n * // Local-only mode\n * const snapback = new Snapback({\n * storage: './snapshots.db',\n * protection: {\n * patterns: [{ pattern: '**\\/*.env', level: 'block' }],\n * defaultLevel: 'watch',\n * enabled: true\n * }\n * });\n *\n * // Cloud-enabled mode\n * const snapback = new Snapback({\n * storage: './snapshots.db',\n * cloud: {\n * baseUrl: 'https://api.snapback.dev',\n * apiKey: 'your-api-key'\n * }\n * });\n * ```\n */\nexport class Snapback {\n\tprivate storage: StorageAdapter;\n\tprivate snapshotManager: SnapshotManager;\n\tprivate protectionManager: ProtectionManager;\n\tprivate cloudClient?: SnapbackClient;\n\tprivate analyticsClient?: SnapbackAnalyticsClient;\n\n\tconstructor(options: SnapbackOptions) {\n\t\t// Initialize storage\n\t\tif (typeof options.storage === \"string\") {\n\t\t\tif (options.storage === \":memory:\") {\n\t\t\t\tthis.storage = new MemoryStorage();\n\t\t\t} else {\n\t\t\t\tthis.storage = new LocalStorage(options.storage);\n\t\t\t}\n\t\t} else if (options.storage) {\n\t\t\tthis.storage = options.storage;\n\t\t} else {\n\t\t\t// Default to in-memory storage for testing\n\t\t\tthis.storage = new MemoryStorage();\n\t\t}\n\n\t\t// Initialize protection manager\n\t\tconst protectionConfig: ProtectionConfig = {\n\t\t\tpatterns: options.protection?.patterns || [],\n\t\t\tdefaultLevel: options.protection?.defaultLevel || \"watch\",\n\t\t\tenabled: options.protection?.enabled !== false,\n\t\t\tautoProtectConfigs: options.autoProtectConfigs !== false,\n\t\t};\n\n\t\tthis.protectionManager = new ProtectionManager(protectionConfig);\n\n\t\t// Initialize snapshot manager\n\t\tthis.snapshotManager = new SnapshotManager(this.storage, {\n\t\t\tenableDeduplication: options.enableDeduplication,\n\t\t\tautoProtect: options.autoProtectConfigs,\n\t\t});\n\n\t\t// Initialize cloud client if configured\n\t\tif (options.cloud) {\n\t\t\tconst sdkConfig = {\n\t\t\t\tendpoint: options.cloud.baseUrl,\n\t\t\t\tapiKey: options.cloud.apiKey,\n\t\t\t\tprivacy: {\n\t\t\t\t\thashFilePaths: true,\n\t\t\t\t\tanonymizeWorkspace: false,\n\t\t\t\t},\n\t\t\t\tcache: {\n\t\t\t\t\tenabled: true,\n\t\t\t\t\tttl: {\n\t\t\t\t\t\tanalytics: 3600,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tretry: {\n\t\t\t\t\tmaxRetries: options.cloud.retries || 3,\n\t\t\t\t\tbackoffMs: options.cloud.timeout || 1000,\n\t\t\t\t},\n\t\t\t};\n\n\t\t\tthis.cloudClient = new SnapbackClient(sdkConfig);\n\t\t\tthis.analyticsClient = new SnapbackAnalyticsClient(sdkConfig);\n\t\t}\n\t}\n\n\t/**\n\t * Create a snapshot of files\n\t * @param files - Files to snapshot\n\t * @param options - Snapshot options\n\t * @returns Created snapshot\n\t */\n\tasync createSnapshot(\n\t\tfiles: Array<{\n\t\t\tpath: string;\n\t\t\tcontent: string;\n\t\t\taction?: \"add\" | \"modify\" | \"delete\";\n\t\t}>,\n\t\toptions?: { description?: string; protected?: boolean },\n\t) {\n\t\tconst fileInputs: FileInput[] = files.map((file) => ({\n\t\t\tpath: file.path,\n\t\t\tcontent: file.content,\n\t\t\taction: file.action || \"modify\",\n\t\t}));\n\t\treturn this.snapshotManager.create(fileInputs, options);\n\t}\n\n\t/**\n\t * Save a single file snapshot\n\t * @param path - File path\n\t * @param content - File content\n\t * @param description - Optional description\n\t * @returns Created snapshot\n\t */\n\tasync save(path: string, content: string, description?: string) {\n\t\treturn this.snapshotManager.create([{ path, content, action: \"modify\" }], { description });\n\t}\n\n\t/**\n\t * List snapshots with optional filters\n\t * @param filters - Filter options\n\t * @returns Array of snapshots\n\t */\n\tasync listSnapshots(filters?: SnapshotFilters) {\n\t\treturn this.snapshotManager.list(filters);\n\t}\n\n\t/**\n\t * Get a specific snapshot by ID\n\t * @param id - Snapshot ID\n\t * @returns Snapshot or null if not found\n\t */\n\tasync getSnapshot(id: string) {\n\t\treturn this.snapshotManager.get(id);\n\t}\n\n\t/**\n\t * Delete a snapshot by ID\n\t * @param id - Snapshot ID\n\t */\n\tasync deleteSnapshot(id: string) {\n\t\treturn this.snapshotManager.delete(id);\n\t}\n\n\t/**\n\t * Restore a snapshot\n\t * @param id - Snapshot ID\n\t * @returns Restore result\n\t */\n\tasync restoreSnapshot(id: string) {\n\t\treturn this.snapshotManager.restore(id);\n\t}\n\n\t/**\n\t * Protect a snapshot\n\t * @param id - Snapshot ID\n\t */\n\tasync protectSnapshot(id: string) {\n\t\treturn this.snapshotManager.protect(id);\n\t}\n\n\t/**\n\t * Unprotect a snapshot\n\t * @param id - Snapshot ID\n\t */\n\tasync unprotectSnapshot(id: string) {\n\t\treturn this.snapshotManager.unprotect(id);\n\t}\n\n\t/**\n\t * Protect a file path\n\t * @param filePath - File path to protect\n\t * @param level - Protection level\n\t * @param reason - Optional reason\n\t */\n\tprotectFile(filePath: string, level: \"watch\" | \"warn\" | \"block\", reason?: string) {\n\t\tthis.protectionManager.protect(filePath, level, reason);\n\t}\n\n\t/**\n\t * Check if a file is protected\n\t * @param filePath - File path to check\n\t * @returns Protection level or null if not protected\n\t */\n\tgetProtectionLevel(filePath: string) {\n\t\treturn this.protectionManager.getLevel(filePath);\n\t}\n\n\t/**\n\t * Close the storage connection\n\t */\n\tasync close() {\n\t\tif (\"close\" in this.storage && typeof this.storage.close === \"function\") {\n\t\t\tawait this.storage.close();\n\t\t}\n\t}\n\n\t/**\n\t * Get the underlying snapshot manager for advanced operations\n\t */\n\tget snapshots() {\n\t\treturn this.snapshotManager;\n\t}\n\n\t/**\n\t * Get the underlying protection manager for advanced operations\n\t */\n\tget protection() {\n\t\treturn this.protectionManager;\n\t}\n\n\t/**\n\t * Get the cloud client if configured\n\t */\n\tget cloud() {\n\t\treturn this.cloudClient;\n\t}\n\n\t/**\n\t * Get the analytics client if configured\n\t */\n\tget analytics() {\n\t\treturn this.analyticsClient;\n\t}\n}\n","/**\n * SessionDeduplication - Prevents duplicate session creation\n *\n * Strategy:\n * - Compute session fingerprint from sorted file change hashes\n * - Check against recent sessions (last 100)\n * - If fingerprint matches AND time delta < threshold, skip creation\n *\n * Performance:\n * - Uses LRU cache for session fingerprints\n * - O(n log n) for sorting, O(1) cache lookup\n */\n\nimport * as crypto from \"node:crypto\";\nimport type { SessionChange } from \"@snapback-oss/contracts/session\";\nimport QuickLRU from \"quick-lru\";\n\n/**\n * Deduplication configuration\n */\nexport interface SessionDeduplicationOptions {\n\t/** Maximum time between sessions to consider duplicates (default: 5 minutes) */\n\ttimeDeltaMs?: number;\n\n\t/** Cache size for session fingerprints (default: 100) */\n\tcacheSize?: number;\n\n\t/** Minimum number of files to trigger deduplication (default: 5) */\n\tminFilesForDedup?: number;\n}\n\n/**\n * Session fingerprint for deduplication\n */\ninterface SessionFingerprint {\n\tfingerprint: string;\n\ttimestamp: number;\n\tsessionId: string;\n\tchangeCount: number;\n}\n\n/**\n * Deduplication result\n */\nexport interface DeduplicationResult {\n\tisDuplicate: boolean;\n\treason?: string;\n\texistingSessionId?: string;\n\tfingerprint: string;\n}\n\n/**\n * SessionDeduplication - Detects and prevents duplicate sessions\n */\nexport class SessionDeduplication {\n\tprivate readonly timeDeltaMs: number;\n\tprivate readonly minFilesForDedup: number;\n\tprivate readonly fingerprintCache: QuickLRU<string, SessionFingerprint>;\n\n\tconstructor(options: SessionDeduplicationOptions = {}) {\n\t\tthis.timeDeltaMs = options.timeDeltaMs ?? 5 * 60 * 1000; // 5 minutes\n\t\tthis.minFilesForDedup = options.minFilesForDedup ?? 5;\n\n\t\tthis.fingerprintCache = new QuickLRU({\n\t\t\tmaxSize: options.cacheSize ?? 100,\n\t\t});\n\t}\n\n\t/**\n\t * Compute session fingerprint from file changes\n\t */\n\tcomputeFingerprint(changes: SessionChange[]): string {\n\t\tif (changes.length === 0) {\n\t\t\treturn \"\";\n\t\t}\n\n\t\t// Extract file paths and operations\n\t\tconst items = changes.map((change) => {\n\t\t\tconst path = change.p;\n\t\t\tconst op = change.op;\n\t\t\tconst hNew = change.hNew || \"\";\n\t\t\tconst hOld = change.hOld || \"\";\n\n\t\t\t// Combine path, operation, and hashes\n\t\t\treturn `${path}:${op}:${hOld}:${hNew}`;\n\t\t});\n\n\t\t// Sort for deterministic fingerprint\n\t\titems.sort();\n\n\t\t// Hash the sorted items\n\t\tconst hash = crypto.createHash(\"sha256\");\n\t\tfor (const item of items) {\n\t\t\thash.update(item);\n\t\t}\n\n\t\treturn hash.digest(\"hex\");\n\t}\n\n\t/**\n\t * Check if session is a duplicate\n\t */\n\tcheckDuplicate(changes: SessionChange[], timestamp: number): DeduplicationResult {\n\t\t// Skip deduplication for small sessions\n\t\tif (changes.length < this.minFilesForDedup) {\n\t\t\tconst fingerprint = this.computeFingerprint(changes);\n\t\t\treturn {\n\t\t\t\tisDuplicate: false,\n\t\t\t\treason: \"Session too small for deduplication\",\n\t\t\t\tfingerprint,\n\t\t\t};\n\t\t}\n\n\t\t// Compute fingerprint\n\t\tconst fingerprint = this.computeFingerprint(changes);\n\n\t\t// Check cache for existing fingerprint\n\t\tconst existing = this.fingerprintCache.get(fingerprint);\n\n\t\tif (!existing) {\n\t\t\t// No duplicate found\n\t\t\treturn {\n\t\t\t\tisDuplicate: false,\n\t\t\t\tfingerprint,\n\t\t\t};\n\t\t}\n\n\t\t// Check time delta\n\t\tconst timeDelta = timestamp - existing.timestamp;\n\n\t\tif (timeDelta > this.timeDeltaMs) {\n\t\t\t// Too much time elapsed, not a duplicate\n\t\t\treturn {\n\t\t\t\tisDuplicate: false,\n\t\t\t\treason: `Time delta ${timeDelta}ms exceeds threshold ${this.timeDeltaMs}ms`,\n\t\t\t\tfingerprint,\n\t\t\t};\n\t\t}\n\n\t\t// Duplicate detected\n\t\treturn {\n\t\t\tisDuplicate: true,\n\t\t\treason: `Duplicate of session ${existing.sessionId} (time delta: ${timeDelta}ms)`,\n\t\t\texistingSessionId: existing.sessionId,\n\t\t\tfingerprint,\n\t\t};\n\t}\n\n\t/**\n\t * Register a session fingerprint\n\t */\n\tregister(sessionId: string, changes: SessionChange[], timestamp: number): void {\n\t\tconst fingerprint = this.computeFingerprint(changes);\n\n\t\tthis.fingerprintCache.set(fingerprint, {\n\t\t\tfingerprint,\n\t\t\ttimestamp,\n\t\t\tsessionId,\n\t\t\tchangeCount: changes.length,\n\t\t});\n\t}\n\n\t/**\n\t * Remove a session fingerprint\n\t */\n\tunregister(sessionId: string): void {\n\t\t// Find and remove all entries for this sessionId\n\t\tfor (const [fingerprint, data] of this.fingerprintCache.entries()) {\n\t\t\tif (data.sessionId === sessionId) {\n\t\t\t\tthis.fingerprintCache.delete(fingerprint);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Clear all fingerprints\n\t */\n\tclear(): void {\n\t\tthis.fingerprintCache.clear();\n\t}\n\n\t/**\n\t * Get cache statistics\n\t */\n\tgetStats(): {\n\t\tsize: number;\n\t\tmaxSize: number;\n\t} {\n\t\treturn {\n\t\t\tsize: this.fingerprintCache.size,\n\t\t\tmaxSize: this.fingerprintCache.maxSize,\n\t\t};\n\t}\n}\n","/**\n * @fileoverview SimpleChangeTracker - Metrics-only change tracking\n *\n * Tracks aggregate metrics for code changes without storing individual events.\n * Determines \"large inserts\" based on multi-line + size thresholds.\n */\n\nexport interface ChangeEvent {\n\tchars: number;\n\tlines: number;\n\tisInsert: boolean;\n\tisMultiLine: boolean;\n}\n\nexport interface ChangeMetrics {\n\ttotalChars: number;\n\ttotalLines: number;\n\tlargeInsertCount: number;\n\tmultiLineInsertCount: number;\n}\n\n/**\n * Threshold for considering an insert \"large\"\n * - Must be multi-line (isMultiLine = true)\n * - AND must be an insert (isInsert = true)\n * - AND must meet minimum size: ≥100 chars OR ≥5 lines\n */\nconst LARGE_INSERT_THRESHOLD = {\n\tminChars: 100,\n\tminLines: 5,\n} as const;\n\nexport class SimpleChangeTracker {\n\tprivate totalChars = 0;\n\tprivate totalLines = 0;\n\tprivate largeInsertCount = 0;\n\tprivate multiLineInsertCount = 0;\n\n\t/**\n\t * Records a change event and updates aggregate metrics\n\t */\n\trecordChange(event: ChangeEvent): void {\n\t\tthis.totalChars += event.chars;\n\t\tthis.totalLines += event.lines;\n\n\t\t// Count multi-line inserts\n\t\tif (event.isInsert && event.isMultiLine) {\n\t\t\tthis.multiLineInsertCount++;\n\t\t}\n\n\t\t// Count large inserts: must be insert + multi-line + meet size threshold\n\t\tif (this.isLargeInsert(event)) {\n\t\t\tthis.largeInsertCount++;\n\t\t}\n\t}\n\n\t/**\n\t * Determines if a change qualifies as a \"large insert\"\n\t */\n\tprivate isLargeInsert(event: ChangeEvent): boolean {\n\t\tif (!event.isInsert || !event.isMultiLine) {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn event.chars >= LARGE_INSERT_THRESHOLD.minChars || event.lines >= LARGE_INSERT_THRESHOLD.minLines;\n\t}\n\n\t/**\n\t * Returns current aggregate metrics snapshot\n\t */\n\tsnapshot(): ChangeMetrics {\n\t\treturn {\n\t\t\ttotalChars: this.totalChars,\n\t\t\ttotalLines: this.totalLines,\n\t\t\tlargeInsertCount: this.largeInsertCount,\n\t\t\tmultiLineInsertCount: this.multiLineInsertCount,\n\t\t};\n\t}\n\n\t/**\n\t * Clears all accumulated metrics\n\t */\n\treset(): void {\n\t\tthis.totalChars = 0;\n\t\tthis.totalLines = 0;\n\t\tthis.largeInsertCount = 0;\n\t\tthis.multiLineInsertCount = 0;\n\t}\n}\n","/**\n * @fileoverview AiSessionTracker - Session-level AI usage classification\n *\n * Classifies AI assistance level based on:\n * - Environment detection (provider presence)\n * - Change patterns (large inserts, total volume)\n *\n * Key principles:\n * - Truth-first: never claims \"AI wrote this code\"\n * - Confidence capping: inference-only scenarios capped at 7.5\n * - Anti-paste guard: single huge insert ≠ heavy AI usage\n */\n\nimport type { SimpleChangeTracker } from \"./SimpleChangeTracker\";\n\nexport type { ChangeEvent, ChangeMetrics } from \"./SimpleChangeTracker\";\nexport { SimpleChangeTracker } from \"./SimpleChangeTracker\";\n\nexport type AiAssistLevel = \"none\" | \"light\" | \"medium\" | \"heavy\" | \"unknown\";\n\nexport interface AiEnvDetection {\n\tprovider: \"cursor\" | \"claude\" | \"none\" | \"unknown\";\n\thasAI: boolean;\n\tconfidence: number;\n}\n\nexport interface AiSessionResult {\n\tlevel: AiAssistLevel;\n\tconfidence: number;\n\tprovider: AiEnvDetection[\"provider\"];\n\treasoning: string;\n\tmetrics: ReturnType<SimpleChangeTracker[\"snapshot\"]>;\n}\n\n/**\n * Classification thresholds\n */\nconst THRESHOLDS = {\n\t// Light: 1 large insert with modest total chars\n\tlight: {\n\t\tminLargeInserts: 1,\n\t\tmaxTotalChars: 800,\n\t},\n\t// Medium: 2+ large inserts OR higher volume\n\tmedium: {\n\t\tminLargeInserts: 2,\n\t\tminTotalChars: 400,\n\t},\n\t// Heavy: 3+ large inserts AND high total volume\n\theavy: {\n\t\tminLargeInserts: 3,\n\t\tminTotalChars: 2000,\n\t},\n\t// Anti-paste guard: if only 1 large insert, cap at medium regardless of size\n\tmaxLargeInsertsForSinglePaste: 1,\n} as const;\n\n/**\n * Confidence caps\n */\nconst CONFIDENCE = {\n\tunknown: 0,\n\tnoneWithNoProvider: 8.5,\n\tnoneWithProvider: 7.5,\n\tinferenceOnlyCap: 7.5, // When classification is based only on patterns, not provider\n\twithProvider: 9,\n} as const;\n\nexport class AiSessionTracker {\n\tprivate sessionId: string | null = null;\n\n\tconstructor(\n\t\tprivate readonly detectEnv: () => AiEnvDetection,\n\t\tprivate readonly changeTracker: SimpleChangeTracker,\n\t\tprivate isEnabled = true,\n\t) {}\n\n\t/**\n\t * Starts a new session\n\t */\n\tstartSession(sessionId: string): void {\n\t\tthis.sessionId = sessionId;\n\t}\n\n\t/**\n\t * Records a change event\n\t */\n\trecordChange(event: import(\"./SimpleChangeTracker\").ChangeEvent): void {\n\t\tif (!this.isEnabled) {\n\t\t\treturn; // Silent no-op when disabled\n\t\t}\n\t\tthis.changeTracker.recordChange(event);\n\t}\n\n\t/**\n\t * Finalizes the session and returns classification result\n\t */\n\tfinalizeSession(): AiSessionResult {\n\t\t// Early guard: disabled takes priority\n\t\tif (!this.isEnabled) {\n\t\t\treturn {\n\t\t\t\tlevel: \"unknown\",\n\t\t\t\tconfidence: 0,\n\t\t\t\tprovider: \"none\",\n\t\t\t\treasoning: \"AI detection disabled\",\n\t\t\t\tmetrics: this.changeTracker.snapshot(),\n\t\t\t};\n\t\t}\n\n\t\tif (!this.sessionId) {\n\t\t\treturn {\n\t\t\t\tlevel: \"unknown\",\n\t\t\t\tconfidence: CONFIDENCE.unknown,\n\t\t\t\tprovider: \"none\",\n\t\t\t\treasoning: \"No session started\",\n\t\t\t\tmetrics: this.changeTracker.snapshot(),\n\t\t\t};\n\t\t}\n\n\t\t// Capture environment detection at finalization time\n\t\tconst provider = this.detectEnv();\n\n\t\tconst metrics = this.changeTracker.snapshot();\n\t\tconst level = this.classifyLevel(metrics, provider);\n\t\tconst confidence = this.calculateConfidence(level, provider, metrics);\n\t\tconst reasoning = this.generateReasoning(level, provider, metrics);\n\n\t\treturn {\n\t\t\tlevel,\n\t\t\tconfidence,\n\t\t\tprovider: provider.provider,\n\t\t\treasoning,\n\t\t\tmetrics,\n\t\t};\n\t}\n\n\t/**\n\t * Resets session state\n\t */\n\treset(): void {\n\t\tthis.sessionId = null;\n\t\tthis.changeTracker.reset();\n\t}\n\n\tprivate classifyLevel(\n\t\tmetrics: ReturnType<SimpleChangeTracker[\"snapshot\"]>,\n\t\t_provider: AiEnvDetection,\n\t): AiAssistLevel {\n\t\tconst { largeInsertCount, totalChars } = metrics;\n\n\t\t// No large inserts → none (regardless of provider)\n\t\tif (largeInsertCount === 0) {\n\t\t\treturn \"none\";\n\t\t}\n\n\t\t// Anti-paste guard: single large insert (even if huge) → max medium\n\t\tif (largeInsertCount === THRESHOLDS.maxLargeInsertsForSinglePaste) {\n\t\t\t// If it's a modest insert, classify as light\n\t\t\tif (totalChars <= THRESHOLDS.light.maxTotalChars) {\n\t\t\t\treturn \"light\";\n\t\t\t}\n\t\t\t// Otherwise medium (never heavy for single insert)\n\t\t\treturn \"medium\";\n\t\t}\n\n\t\t// Heavy: multiple large inserts + high volume\n\t\tif (largeInsertCount >= THRESHOLDS.heavy.minLargeInserts && totalChars >= THRESHOLDS.heavy.minTotalChars) {\n\t\t\treturn \"heavy\";\n\t\t}\n\n\t\t// Medium: 2+ large inserts OR significant volume\n\t\tif (largeInsertCount >= THRESHOLDS.medium.minLargeInserts || totalChars >= THRESHOLDS.medium.minTotalChars) {\n\t\t\treturn \"medium\";\n\t\t}\n\n\t\t// Light: has large inserts but below medium threshold\n\t\treturn \"light\";\n\t}\n\n\t/**\n\t * Calculates confidence score based on signals available\n\t */\n\tprivate calculateConfidence(\n\t\tlevel: AiAssistLevel,\n\t\tprovider: AiEnvDetection,\n\t\t_metrics: ReturnType<SimpleChangeTracker[\"snapshot\"]>,\n\t): number {\n\t\tif (level === \"unknown\") {\n\t\t\treturn CONFIDENCE.unknown;\n\t\t}\n\n\t\tif (level === \"none\") {\n\t\t\treturn provider.hasAI ? CONFIDENCE.noneWithProvider : CONFIDENCE.noneWithNoProvider;\n\t\t}\n\n\t\t// For non-none classifications based on patterns:\n\t\t// If we have a known provider, use higher confidence\n\t\tif (provider.hasAI && provider.provider !== \"unknown\" && provider.provider !== \"none\") {\n\t\t\t// Still cap below absolute certainty since we're inferring usage from patterns\n\t\t\treturn Math.min(provider.confidence, CONFIDENCE.inferenceOnlyCap);\n\t\t}\n\n\t\t// No provider or unknown provider → cap at inference-only level\n\t\treturn CONFIDENCE.inferenceOnlyCap;\n\t}\n\n\t/**\n\t * Generates human-readable reasoning\n\t */\n\tprivate generateReasoning(\n\t\tlevel: AiAssistLevel,\n\t\tprovider: AiEnvDetection,\n\t\tmetrics: ReturnType<SimpleChangeTracker[\"snapshot\"]>,\n\t): string {\n\t\tif (level === \"unknown\") {\n\t\t\treturn \"No session started\";\n\t\t}\n\n\t\tconst providerName =\n\t\t\tprovider.provider === \"cursor\" ? \"Cursor\" : provider.provider === \"claude\" ? \"Claude\" : null;\n\n\t\tif (level === \"none\") {\n\t\t\tif (providerName) {\n\t\t\t\treturn `${providerName} detected but no large inserts observed`;\n\t\t\t}\n\t\t\treturn \"No AI provider detected, no large inserts\";\n\t\t}\n\n\t\t// For non-none levels, build reasoning\n\t\tconst parts: string[] = [];\n\n\t\t// Provider context\n\t\tif (providerName) {\n\t\t\tparts.push(`${providerName} detected`);\n\t\t} else if (provider.provider === \"unknown\") {\n\t\t\tparts.push(\"No AI provider detected\");\n\t\t}\n\n\t\t// Pattern description\n\t\tconst { largeInsertCount, totalChars } = metrics;\n\n\t\tif (largeInsertCount === 1) {\n\t\t\tparts.push(\"single large insert\");\n\t\t} else {\n\t\t\tparts.push(`${largeInsertCount} large inserts`);\n\t\t}\n\n\t\tparts.push(`(${totalChars} chars total)`);\n\n\t\t// Level-specific suffix\n\t\tif (level === \"heavy\") {\n\t\t\tparts.push(\"- heavy AI-like usage inferred from change patterns\");\n\t\t} else if (level === \"medium\") {\n\t\t\tparts.push(\"- multiple large inserts inferred from change patterns\");\n\t\t} else {\n\t\t\tparts.push(\"- inferred from change patterns\");\n\t\t}\n\n\t\treturn parts.join(\", \");\n\t}\n}\n","/**\n * Privacy-safe analytics factory for session events\n *\n * PRIVACY GUARANTEES:\n * - NO workspace IDs (hashed or not)\n * - NO file paths or filenames\n * - NO token_counts (prevents client name leakage)\n * - K-anonymity: ext_counts only if ≥3 changes\n * - Solo tier opt-in: ext_counts requires explicit consent\n *\n * These factories are the ONLY safe way to emit session analytics.\n * DO NOT construct analytics events manually elsewhere.\n */\n\nimport type { SessionChange } from \"@snapback-oss/contracts/session\";\n\n/**\n * Session analytics metadata for SESSION_STARTED\n */\nexport interface SessionStartedMeta {\n\tchangeCount: 0;\n\tdurationMs?: number;\n\ttier: \"free\" | \"solo\";\n}\n\n/**\n * Session analytics metadata for SESSION_FINALIZED\n */\nexport interface SessionFinalizedMeta {\n\tchangeCount: number;\n\tdurationMs: number;\n\ttier: \"free\" | \"solo\";\n\text_counts?: Record<string, number>;\n}\n\n/**\n * Create privacy-safe SESSION_STARTED event\n *\n * @param tier - User tier (free or solo)\n * @returns Safe analytics event metadata\n */\nexport function makeSafeSessionStartedEvent(tier: \"free\" | \"solo\"): SessionStartedMeta {\n\treturn {\n\t\tchangeCount: 0,\n\t\ttier,\n\t};\n}\n\n/**\n * Create privacy-safe SESSION_FINALIZED event\n *\n * @param changeCount - Number of file changes tracked\n * @param durationMs - Session duration in milliseconds\n * @param tier - User tier (free or solo)\n * @param consent - User has explicitly consented to analytics (Solo tier only)\n * @param changes - File changes (used only for extension histogram if consent granted)\n * @returns Safe analytics event metadata\n */\nexport function makeSafeSessionFinalizedEvent(\n\tchangeCount: number,\n\tdurationMs: number,\n\ttier: \"free\" | \"solo\",\n\tconsent: boolean,\n\tchanges?: SessionChange[],\n): SessionFinalizedMeta {\n\tconst base: SessionFinalizedMeta = {\n\t\tchangeCount,\n\t\tdurationMs,\n\t\ttier,\n\t};\n\n\t// Only emit ext_counts for Solo tier with consent and ≥3 changes (k-anonymity)\n\tif (tier === \"solo\" && consent && changeCount >= 3 && changes) {\n\t\tconst extCounts = computeExtensionHistogram(changes);\n\t\tif (Object.keys(extCounts).length > 0) {\n\t\t\tbase.ext_counts = extCounts;\n\t\t}\n\t}\n\n\treturn base;\n}\n\n/**\n * Compute extension histogram from file changes\n * Only extracts file extensions, never paths or names\n *\n * @param changes - Session changes\n * @returns Extension histogram (e.g., {'.ts': 12, '.json': 3})\n */\nfunction computeExtensionHistogram(changes: SessionChange[]): Record<string, number> {\n\tconst counts: Record<string, number> = {};\n\n\tfor (const change of changes) {\n\t\t// Extract extension from relative path\n\t\tconst ext = getFileExtension(change.p);\n\t\tif (ext) {\n\t\t\tcounts[ext] = (counts[ext] || 0) + 1;\n\t\t}\n\t}\n\n\treturn counts;\n}\n\n/**\n * Extract file extension from path\n * Returns null for files without extensions or directories\n *\n * @param path - File path (relative)\n * @returns Extension with dot (e.g., '.ts') or null\n */\nfunction getFileExtension(path: string): string | null {\n\tconst lastDot = path.lastIndexOf(\".\");\n\tconst lastSlash = path.lastIndexOf(\"/\");\n\n\t// No extension or dot is part of directory name\n\tif (lastDot === -1 || lastDot < lastSlash) {\n\t\treturn null;\n\t}\n\n\tconst ext = path.slice(lastDot);\n\n\t// Filter out noise (e.g., '.bak-sessionId', '.tmp')\n\tif (ext.includes(\"-\") || ext.length > 8) {\n\t\treturn null;\n\t}\n\n\treturn ext.toLowerCase();\n}\n","/**\n * SessionManager - Tracks file changes during logical work sessions\n *\n * Design Principles:\n * - Lazy hash computation: Defer SHA-256 hashing until session finalize (<50ms tracking)\n * - POSIX path normalization: Store paths with / separator (cross-platform)\n * - Privacy-safe analytics: No workspace IDs, file paths, or file names transmitted\n * - Idle boundary detection: Auto-finalize after 15 minutes of inactivity\n * - Batch flushing: Persist changes every 50 changes or 5 seconds\n *\n * Performance Budgets:\n * - track(): <50ms (lazy hashing, in-memory buffering)\n * - finalize(): <500ms (batch hash computation, database flush)\n */\n\nimport * as fs from \"node:fs/promises\";\nimport * as path from \"node:path\";\nimport type {\n\tChangeOp,\n\tEOLType,\n\tSessionChange,\n\tSessionManifestV1,\n\tSessionSummary,\n\tSessionTrigger,\n} from \"@snapback-oss/contracts/session\";\nimport { minimatch } from \"minimatch\";\nimport { nanoid } from \"nanoid\";\nimport { AiSessionTracker } from \"../ai/AiSessionTracker\";\nimport { SimpleChangeTracker } from \"../ai/SimpleChangeTracker\";\nimport { CursorDetector } from \"../core/detection/CursorDetector\";\nimport type { BlobStore } from \"../storage/BlobStore\";\nimport { makeSafeSessionFinalizedEvent, makeSafeSessionStartedEvent } from \"./sessionAnalytics\";\n\n/**\n * SessionManager configuration options\n */\nexport interface SessionManagerOptions {\n\t/** VS Code workspace folder URI (multi-root safe) */\n\tworkspaceUri: string;\n\n\t/** Workspace root path (absolute file system path) */\n\tworkspaceRoot: string;\n\n\t/** BlobStore for content-addressable storage */\n\tblobStore: BlobStore;\n\n\t/** Idle timeout in milliseconds (default: 15 minutes) */\n\tidleMs?: number;\n\n\t/** Batch size for flushing changes (default: 50) */\n\tflushBatchSize?: number;\n\n\t/** Flush interval in milliseconds (default: 5 seconds) */\n\tflushIntervalMs?: number;\n\n\t/** Ignore patterns (.snapbackignore) */\n\tignorePatterns?: string[];\n\n\t/** User tier for analytics */\n\ttier?: \"free\" | \"solo\";\n\n\t/** Analytics consent (Solo tier only) */\n\tconsent?: boolean;\n\n\t/** Database connection (SQLite) */\n\tdb?: any; // TODO: Type this properly with better-sqlite3\n\n\t/** AI detection enabled flag (wired from settings) */\n\taiDetectionEnabled?: boolean;\n}\n\n/**\n * Factory function to create AI tracker with Cursor detector\n * Initializes tracker with AI detection enabled setting\n */\nfunction createAiTracker(options: SessionManagerOptions): AiSessionTracker {\n\t// Create Cursor detector with system environment\n\tconst cursorDetector = new CursorDetector({\n\t\tgetAppName: () => {\n\t\t\t// In VS Code context, app name comes from vscode.env.appName\n\t\t\t// For testing, fall back to environment variable\n\t\t\treturn process.env.VSCODE_APP_NAME || process.env.APP_NAME || \"unknown\";\n\t\t},\n\t\tgetEnvVar: (key: string) => process.env[key],\n\t});\n\n\t// Environment detection function (Cursor detection)\n\tconst detectEnv = () => {\n\t\tconst cursorResult = cursorDetector.detect();\n\n\t\t// Return in AiEnvDetection format\n\t\treturn {\n\t\t\tprovider: cursorResult.hasCursor ? (\"cursor\" as const) : (\"none\" as const),\n\t\t\thasAI: cursorResult.hasCursor,\n\t\t\tconfidence: cursorResult.confidence,\n\t\t};\n\t};\n\n\t// Create SimpleChangeTracker internally\n\tconst changeTracker = new SimpleChangeTracker();\n\n\t// Create tracker with AI detection enabled setting\n\tconst tracker = new AiSessionTracker(\n\t\tdetectEnv,\n\t\tchangeTracker,\n\t\toptions.aiDetectionEnabled ?? true, // Default: enabled\n\t);\n\n\treturn tracker;\n}\n\n/**\n * SessionManager configuration options\n */\nexport interface SessionManagerOptions {\n\t/** VS Code workspace folder URI (multi-root safe) */\n\tworkspaceUri: string;\n\n\t/** Workspace root path (absolute file system path) */\n\tworkspaceRoot: string;\n\n\t/** BlobStore for content-addressable storage */\n\tblobStore: BlobStore;\n\n\t/** Idle timeout in milliseconds (default: 15 minutes) */\n\tidleMs?: number;\n\n\t/** Batch size for flushing changes (default: 50) */\n\tflushBatchSize?: number;\n\n\t/** Flush interval in milliseconds (default: 5 seconds) */\n\tflushIntervalMs?: number;\n\n\t/** Ignore patterns (.snapbackignore) */\n\tignorePatterns?: string[];\n\n\t/** User tier for analytics */\n\ttier?: \"free\" | \"solo\";\n\n\t/** Analytics consent (Solo tier only) */\n\tconsent?: boolean;\n\n\t/** Database connection (SQLite) */\n\tdb?: any; // TODO: Type this properly with better-sqlite3\n}\n\n/**\n * Session state for active session\n */\ninterface ActiveSessionState {\n\tsessionId: string;\n\tstartedAt: number;\n\ttriggers: Set<SessionTrigger>;\n\tchangeBuffer: SessionChange[];\n}\n\n/**\n * SessionManager - Core session tracking implementation\n */\nexport class SessionManager {\n\tprivate activeSession: ActiveSessionState | null = null;\n\tprivate idleTimer: NodeJS.Timeout | null = null;\n\tprivate flushTimer: NodeJS.Timeout | null = null;\n\tprivate aiTracker: AiSessionTracker;\n\n\tprivate readonly idleMs: number;\n\tprivate readonly flushBatchSize: number;\n\tprivate readonly flushIntervalMs: number;\n\tprivate readonly ignorePatterns: string[];\n\tprivate readonly tier: \"free\" | \"solo\";\n\tprivate readonly consent: boolean;\n\n\tconstructor(private readonly options: SessionManagerOptions) {\n\t\tthis.idleMs = options.idleMs ?? 15 * 60_000; // 15 minutes\n\t\tthis.flushBatchSize = options.flushBatchSize ?? 50;\n\t\tthis.flushIntervalMs = options.flushIntervalMs ?? 5000; // 5 seconds\n\t\tthis.tier = options.tier ?? \"free\";\n\t\tthis.consent = options.consent ?? false;\n\n\t\t// Initialize AI tracker\n\t\tthis.aiTracker = createAiTracker(options);\n\n\t\t// Default ignore patterns\n\t\tthis.ignorePatterns = options.ignorePatterns ?? [\n\t\t\t\"node_modules/**\",\n\t\t\t\".next/**\",\n\t\t\t\"dist/**\",\n\t\t\t\"build/**\",\n\t\t\t\"coverage/**\",\n\t\t\t\".git/**\",\n\t\t\t\"*.log\",\n\t\t\t\"*.tmp\",\n\t\t\t\"*.swp\",\n\t\t\t\".DS_Store\",\n\t\t];\n\n\t\t// Run crash recovery on initialization (async, non-blocking)\n\t\tthis.runCrashRecovery().catch((err) => {\n\t\t\tconsole.error(\"[SessionManager] Crash recovery failed:\", err);\n\t\t});\n\t}\n\n\t/**\n\t * Run crash recovery on startup\n\t * Recovers any pending rollback transactions that were interrupted\n\t */\n\tprivate async runCrashRecovery(): Promise<void> {\n\t\tconst startTime = performance.now();\n\n\t\tconst { SessionRecovery } = await import(\"./SessionRecovery.js\");\n\t\tconst recovery = new SessionRecovery(this.options.workspaceRoot);\n\n\t\tconst results = await recovery.recoverAll();\n\n\t\tconst duration = performance.now() - startTime;\n\n\t\tif (results.length > 0) {\n\t\t\tconst recovered = results.filter((r) => r.status === \"recovered\").length;\n\t\t\tconst failed = results.filter((r) => r.status === \"failed\").length;\n\t\t\tconst totalFilesRestored = results.reduce((sum, r) => sum + r.filesRestored, 0);\n\n\t\t\tconsole.log(\n\t\t\t\t`[SessionManager] Recovery complete: ${recovered} recovered, ${failed} failed, ${totalFilesRestored} files restored (${duration.toFixed(0)}ms)`,\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Start a new session\n\t */\n\tasync start(): Promise<{ sessionId: string }> {\n\t\t// If there's already an active session, finalize it first\n\t\tif (this.activeSession) {\n\t\t\tawait this.finalize();\n\t\t}\n\n\t\t// Generate session ID\n\t\tconst sessionId = nanoid();\n\t\tconst startedAt = Date.now();\n\n\t\t// Initialize active session state\n\t\tthis.activeSession = {\n\t\t\tsessionId,\n\t\t\tstartedAt,\n\t\t\ttriggers: new Set([\"filewatch\"]),\n\t\t\tchangeBuffer: [],\n\t\t};\n\n\t\t// Insert into database (if available)\n\t\tif (this.options.db) {\n\t\t\tconst triggerBitmask = this.encodeTriggers(this.activeSession.triggers);\n\t\t\tawait this.options.db.run(\n\t\t\t\t`INSERT INTO sessions (session_id, workspace_uri, started_at, triggers, change_count)\n VALUES (?, ?, ?, ?, 0)`,\n\t\t\t\t[sessionId, this.options.workspaceUri, startedAt, triggerBitmask],\n\t\t\t);\n\t\t}\n\n\t\t// Start idle timer\n\t\tthis.startIdleTimer();\n\n\t\t// Start flush timer\n\t\tthis.startFlushTimer();\n\n\t\t// Start AI detection session\n\t\tthis.aiTracker.startSession(sessionId);\n\n\t\t// Emit analytics: SESSION_STARTED\n\t\tthis.emitSessionStarted();\n\n\t\treturn { sessionId };\n\t}\n\n\t/**\n\t * Track a file change\n\t */\n\ttrack(\n\t\tabsolutePath: string,\n\t\top: ChangeOp,\n\t\tmeta?: {\n\t\t\tfromPath?: string;\n\t\t\toldUri?: string;\n\t\t\tnewUri?: string;\n\t\t\tsize?: number;\n\t\t\tmtime?: number;\n\t\t\tmode?: number;\n\t\t},\n\t): void {\n\t\tconst startTime = performance.now();\n\n\t\tif (!this.activeSession) {\n\t\t\t// No active session - silently ignore\n\t\t\treturn;\n\t\t}\n\n\t\t// Convert to relative POSIX path\n\t\tconst relPath = this.normalizePath(absolutePath);\n\n\t\t// Check ignore patterns\n\t\tif (this.shouldIgnore(relPath)) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Extract fromPath for rename operations\n\t\tlet fromPath: string | undefined;\n\t\tif (op === \"renamed\" && meta) {\n\t\t\tif (meta.fromPath) {\n\t\t\t\tfromPath = this.normalizePath(meta.fromPath);\n\t\t\t} else if (meta.oldUri) {\n\t\t\t\t// TODO: Parse VS Code URI properly\n\t\t\t\t// For now, assume it's a file:// URI\n\t\t\t\tconst oldAbsPath = meta.oldUri.replace(\"file://\", \"\");\n\t\t\t\tfromPath = this.normalizePath(oldAbsPath);\n\t\t\t}\n\t\t}\n\n\t\t// Create SessionChange (defer hash computation)\n\t\tconst change: SessionChange = {\n\t\t\tp: relPath,\n\t\t\top,\n\t\t\tfrom: fromPath,\n\t\t\t// Metadata captured immediately\n\t\t\tsizeAfter: meta?.size,\n\t\t\tmtimeAfter: meta?.mtime,\n\t\t\tmodeAfter: meta?.mode,\n\t\t\t// Hashes computed during finalize\n\t\t\t// hOld: undefined,\n\t\t\t// hNew: undefined,\n\t\t};\n\n\t\t// Add to buffer\n\t\tthis.activeSession.changeBuffer.push(change);\n\n\t\t// Record change in AI tracker\n\t\tthis.aiTracker.recordChange({\n\t\t\tchars: change.sizeAfter ?? 0,\n\t\t\tlines: 1, // TODO: Parse actual line count from change\n\t\t\tisInsert: change.op === \"created\",\n\t\t\tisMultiLine: false, // TODO: Determine from content\n\t\t});\n\n\t\t// Reset idle timer (activity detected)\n\t\tthis.resetIdleTimer();\n\n\t\t// Check if we should flush\n\t\tif (this.activeSession.changeBuffer.length >= this.flushBatchSize) {\n\t\t\tthis.scheduleFlush();\n\t\t}\n\n\t\tconst duration = performance.now() - startTime;\n\t\tif (duration > 10) {\n\t\t\tconsole.log(`[SessionManager] track() took ${duration.toFixed(1)}ms (op=${op})`);\n\t\t}\n\t}\n\n\t/**\n\t * Finalize the active session\n\t */\n\tasync finalize(): Promise<{ sessionId: string; changeCount: number }> {\n\t\tconst startTime = performance.now();\n\n\t\tif (!this.activeSession) {\n\t\t\tthrow new Error(\"No active session to finalize\");\n\t\t}\n\n\t\tconst { sessionId, startedAt, triggers, changeBuffer } = this.activeSession;\n\t\tconst changeCount = changeBuffer.length;\n\t\tconst endedAt = Date.now();\n\t\tconst durationMs = endedAt - startedAt;\n\n\t\t// Cancel timers\n\t\tthis.cancelTimers();\n\n\t\t// Add manual trigger if explicitly finalized\n\t\ttriggers.add(\"manual\");\n\n\t\t// Compute deferred hashes (lazy computation)\n\t\tawait this.computeDeferredHashes(changeBuffer);\n\n\t\t// Flush changes to database\n\t\tif (this.options.db && changeBuffer.length > 0) {\n\t\t\tconst stmt = this.options.db.prepare(\n\t\t\t\t`INSERT INTO session_changes\n (session_id, rel_path, op, from_path, size_after, mtime_after, mode_after, h_old, h_new, eol_after)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n\t\t\t);\n\n\t\t\tfor (const change of changeBuffer) {\n\t\t\t\tstmt.run(\n\t\t\t\t\tsessionId,\n\t\t\t\t\tchange.p,\n\t\t\t\t\tchange.op,\n\t\t\t\t\tchange.from ?? null,\n\t\t\t\t\tchange.sizeAfter ?? null,\n\t\t\t\t\tchange.mtimeAfter ?? null,\n\t\t\t\t\tchange.modeAfter ?? null,\n\t\t\t\t\tchange.hOld ?? null,\n\t\t\t\t\tchange.hNew ?? null,\n\t\t\t\t\tchange.eolAfter ?? null,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\t// Update session in database\n\t\tif (this.options.db) {\n\t\t\tconst triggerBitmask = this.encodeTriggers(triggers);\n\n\t\t\t// Finalize AI detection session and get results\n\t\t\tconst aiResult = this.aiTracker.finalizeSession();\n\n\t\t\t// Update session with AI detection results\n\t\t\tawait this.options.db.run(\n\t\t\t\t`UPDATE sessions\n SET ended_at = ?, change_count = ?, triggers = ?,\n ai_assist_level = ?, ai_confidence_score = ?, ai_provider = ?, ai_metadata = ?\n WHERE session_id = ?`,\n\t\t\t\t[\n\t\t\t\t\tendedAt,\n\t\t\t\t\tchangeCount,\n\t\t\t\t\ttriggerBitmask,\n\t\t\t\t\taiResult.level,\n\t\t\t\t\taiResult.confidence,\n\t\t\t\t\taiResult.provider,\n\t\t\t\t\tJSON.stringify({\n\t\t\t\t\t\treasoning: aiResult.reasoning,\n\t\t\t\t\t\tmetrics: aiResult.metrics,\n\t\t\t\t\t}),\n\t\t\t\t\tsessionId,\n\t\t\t\t],\n\t\t\t);\n\n\t\t\t// Generate offline name\n\t\t\tconst name = this.generateOfflineName(changeBuffer);\n\t\t\tawait this.options.db.run(\"UPDATE sessions SET name = ? WHERE session_id = ?\", [name, sessionId]);\n\t\t}\n\n\t\t// Emit analytics: SESSION_FINALIZED\n\t\tthis.emitSessionFinalized(changeCount, durationMs, changeBuffer);\n\n\t\t// Clear active session\n\t\tthis.activeSession = null;\n\n\t\tconst totalDuration = performance.now() - startTime;\n\t\tconsole.log(\n\t\t\t`[SessionManager] finalize() took ${totalDuration.toFixed(0)}ms (sessionId=${sessionId}, changes=${changeCount})`,\n\t\t);\n\n\t\treturn { sessionId, changeCount };\n\t}\n\n\t/**\n\t * Get current session status\n\t */\n\tcurrent(): { sessionId: string | null; changeCount: number } {\n\t\tif (!this.activeSession) {\n\t\t\treturn { sessionId: null, changeCount: 0 };\n\t\t}\n\t\treturn {\n\t\t\tsessionId: this.activeSession.sessionId,\n\t\t\tchangeCount: this.activeSession.changeBuffer.length,\n\t\t};\n\t}\n\n\t/**\n\t * List recent sessions\n\t */\n\tasync list(limit = 20): Promise<SessionSummary[]> {\n\t\tif (!this.options.db) {\n\t\t\treturn [];\n\t\t}\n\n\t\tconst rows = await this.options.db.all(\n\t\t\t`SELECT session_id, workspace_uri, started_at, ended_at, name, triggers, change_count\n FROM sessions\n WHERE workspace_uri = ?\n ORDER BY started_at DESC\n LIMIT ?`,\n\t\t\t[this.options.workspaceUri, limit],\n\t\t);\n\n\t\treturn rows.map((row: any) => ({\n\t\t\tsessionId: row.session_id,\n\t\t\tstartedAt: new Date(row.started_at).toISOString(),\n\t\t\tendedAt: row.ended_at ? new Date(row.ended_at).toISOString() : undefined,\n\t\t\tname: row.name,\n\t\t\tchangeCount: row.change_count,\n\t\t\ttriggers: this.decodeTriggers(row.triggers),\n\t\t}));\n\t}\n\n\t/**\n\t * Get session manifest\n\t */\n\tasync getManifest(sessionId: string): Promise<SessionManifestV1> {\n\t\tif (!this.options.db) {\n\t\t\tthrow new Error(\"Database not available\");\n\t\t}\n\n\t\t// Get session metadata\n\t\tconst session = await this.options.db.get(\"SELECT * FROM sessions WHERE session_id = ?\", [sessionId]);\n\n\t\tif (!session) {\n\t\t\tthrow new Error(`Session not found: ${sessionId}`);\n\t\t}\n\n\t\t// Get file changes\n\t\tconst changes = await this.options.db.all(\"SELECT * FROM session_changes WHERE session_id = ? ORDER BY id\", [\n\t\t\tsessionId,\n\t\t]);\n\n\t\t// Get linked snapshots\n\t\tconst snapshots = await this.options.db.all(\"SELECT snapshot_id FROM session_snapshots WHERE session_id = ?\", [\n\t\t\tsessionId,\n\t\t]);\n\n\t\treturn {\n\t\t\tschema: \"sb.session.v1\",\n\t\t\tsessionId: session.session_id,\n\t\t\tstartedAt: new Date(session.started_at).toISOString(),\n\t\t\tendedAt: session.ended_at ? new Date(session.ended_at).toISOString() : undefined,\n\t\t\tworkspaceUri: session.workspace_uri,\n\t\t\tname: session.name,\n\t\t\ttriggers: this.decodeTriggers(session.triggers),\n\t\t\tchangeCount: session.change_count,\n\t\t\tfilesChanged: changes.map((c: any) => this.dbRowToSessionChange(c)),\n\t\t\tsnapshots: snapshots.map((s: any) => s.snapshot_id),\n\t\t};\n\t}\n\n\t/**\n\t * Rollback a session to its starting state\n\t *\n\t * This is a wrapper that delegates to SessionRollback for the actual rollback logic.\n\t * Returns a Result type for safe error handling.\n\t */\n\tasync rollback(\n\t\tsessionId: string,\n\t\toptions?: import(\"./SessionRollback.js\").RollbackOptions,\n\t): Promise<import(\"./SessionRollback.js\").RollbackResult> {\n\t\t// Get session manifest\n\t\tconst manifest = await this.getManifest(sessionId);\n\n\t\t// Import SessionRollback dynamically to avoid circular dependencies\n\t\tconst { SessionRollback } = await import(\"./SessionRollback.js\");\n\n\t\t// Create rollback instance\n\t\tconst rollback = new SessionRollback(this.options.workspaceRoot, this.options.blobStore);\n\n\t\t// Execute rollback\n\t\treturn rollback.rollback(manifest, options);\n\t}\n\n\t// =========================================================================\n\t// Private Helper Methods\n\t// =========================================================================\n\n\t/**\n\t * Normalize path to POSIX-style relative path\n\t */\n\tprivate normalizePath(absolutePath: string): string {\n\t\tconst relPath = path.relative(this.options.workspaceRoot, absolutePath);\n\t\t// Convert Windows backslashes to forward slashes\n\t\treturn relPath.split(path.sep).join(\"/\");\n\t}\n\n\t/**\n\t * Check if path should be ignored\n\t */\n\tprivate shouldIgnore(relPath: string): boolean {\n\t\treturn this.ignorePatterns.some((pattern) => minimatch(relPath, pattern, { dot: true }));\n\t}\n\n\t/**\n\t * Compute deferred SHA-256 hashes\n\t */\n\tprivate async computeDeferredHashes(changes: SessionChange[]): Promise<void> {\n\t\tfor (const change of changes) {\n\t\t\tconst absPath = path.join(this.options.workspaceRoot, change.p);\n\n\t\t\ttry {\n\t\t\t\t// Compute hNew for created/modified files\n\t\t\t\tif (change.op !== \"deleted\") {\n\t\t\t\t\tconst content = await fs.readFile(absPath);\n\t\t\t\t\tconst result = await this.options.blobStore.put(content);\n\t\t\t\t\tif (result.ok) {\n\t\t\t\t\t\tchange.hNew = result.value;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// TODO: Compute hOld for modified/deleted files\n\t\t\t\t// This requires reading the old content from BlobStore or file backup\n\t\t\t} catch (error) {\n\t\t\t\t// File may have been deleted/moved - skip hash computation\n\t\t\t\tconsole.warn(`Failed to hash ${change.p}:`, error);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Generate offline session name from file changes\n\t */\n\tprivate generateOfflineName(changes: SessionChange[]): string {\n\t\tif (changes.length === 0) {\n\t\t\treturn \"Empty session\";\n\t\t}\n\n\t\t// Extract unique file stems (without extension)\n\t\tconst stems = new Set<string>();\n\t\tfor (const change of changes.slice(0, 10)) {\n\t\t\tconst basename = path.basename(change.p, path.extname(change.p));\n\t\t\tstems.add(basename);\n\t\t}\n\n\t\tconst stemList = Array.from(stems).slice(0, 3);\n\t\tif (stemList.length === 0) {\n\t\t\treturn `Updated ${changes.length} files`;\n\t\t}\n\n\t\treturn `Updated ${stemList.join(\", \")}`;\n\t}\n\n\t/**\n\t * Encode trigger set to bitmask\n\t */\n\tprivate encodeTriggers(triggers: Set<SessionTrigger>): number {\n\t\tlet mask = 0;\n\t\tfor (const trigger of triggers) {\n\t\t\tif (trigger === \"filewatch\") {\n\t\t\t\tmask |= 1;\n\t\t\t}\n\t\t\tif (trigger === \"pre-commit\") {\n\t\t\t\tmask |= 2;\n\t\t\t}\n\t\t\tif (trigger === \"manual\") {\n\t\t\t\tmask |= 4;\n\t\t\t}\n\t\t\tif (trigger === \"idle-finalize\") {\n\t\t\t\tmask |= 8;\n\t\t\t}\n\t\t}\n\t\treturn mask;\n\t}\n\n\t/**\n\t * Decode bitmask to trigger array\n\t */\n\tprivate decodeTriggers(mask: number): SessionTrigger[] {\n\t\tconst triggers: SessionTrigger[] = [];\n\t\tif (mask & 1) {\n\t\t\ttriggers.push(\"filewatch\");\n\t\t}\n\t\tif (mask & 2) {\n\t\t\ttriggers.push(\"pre-commit\");\n\t\t}\n\t\tif (mask & 4) {\n\t\t\ttriggers.push(\"manual\");\n\t\t}\n\t\tif (mask & 8) {\n\t\t\ttriggers.push(\"idle-finalize\");\n\t\t}\n\t\treturn triggers;\n\t}\n\n\t/**\n\t * Convert database row to SessionChange\n\t */\n\tprivate dbRowToSessionChange(row: any): SessionChange {\n\t\treturn {\n\t\t\tp: row.rel_path,\n\t\t\top: row.op as ChangeOp,\n\t\t\tfrom: row.from_path ?? undefined,\n\t\t\thOld: row.h_old ?? undefined,\n\t\t\thNew: row.h_new ?? undefined,\n\t\t\tsizeBefore: row.size_before ?? undefined,\n\t\t\tsizeAfter: row.size_after ?? undefined,\n\t\t\tmtimeBefore: row.mtime_before ?? undefined,\n\t\t\tmtimeAfter: row.mtime_after ?? undefined,\n\t\t\tmodeBefore: row.mode_before ?? undefined,\n\t\t\tmodeAfter: row.mode_after ?? undefined,\n\t\t\teolBefore: row.eol_before as EOLType | undefined,\n\t\t\teolAfter: row.eol_after as EOLType | undefined,\n\t\t};\n\t}\n\n\t/**\n\t * Start idle timer\n\t */\n\tprivate startIdleTimer(): void {\n\t\tthis.idleTimer = setTimeout(() => {\n\t\t\tthis.autoFinalize();\n\t\t}, this.idleMs);\n\t}\n\n\t/**\n\t * Reset idle timer (activity detected)\n\t */\n\tprivate resetIdleTimer(): void {\n\t\tif (this.idleTimer) {\n\t\t\tclearTimeout(this.idleTimer);\n\t\t}\n\t\tthis.startIdleTimer();\n\t}\n\n\t/**\n\t * Start flush timer\n\t */\n\tprivate startFlushTimer(): void {\n\t\tthis.flushTimer = setTimeout(() => {\n\t\t\tthis.scheduleFlush();\n\t\t}, this.flushIntervalMs);\n\t}\n\n\t/**\n\t * Schedule a flush operation\n\t */\n\tprivate scheduleFlush(): void {\n\t\t// TODO: Implement periodic flushing to database\n\t\t// For now, we flush everything during finalize\n\t}\n\n\t/**\n\t * Cancel all timers\n\t */\n\tprivate cancelTimers(): void {\n\t\tif (this.idleTimer) {\n\t\t\tclearTimeout(this.idleTimer);\n\t\t\tthis.idleTimer = null;\n\t\t}\n\t\tif (this.flushTimer) {\n\t\t\tclearTimeout(this.flushTimer);\n\t\t\tthis.flushTimer = null;\n\t\t}\n\t}\n\n\t/**\n\t * Auto-finalize on idle timeout\n\t */\n\tprivate async autoFinalize(): Promise<void> {\n\t\tif (!this.activeSession) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Add idle-finalize trigger\n\t\tthis.activeSession.triggers.add(\"idle-finalize\");\n\n\t\t// Finalize session\n\t\tawait this.finalize();\n\t}\n\n\t/**\n\t * Emit SESSION_STARTED analytics event\n\t */\n\tprivate emitSessionStarted(): void {\n\t\tconst event = makeSafeSessionStartedEvent(this.tier);\n\t\t// TODO: Wire to actual analytics client when available\n\t\tconsole.log(\"[SessionManager] SESSION_STARTED:\", event);\n\t}\n\n\t/**\n\t * Emit SESSION_FINALIZED analytics event\n\t */\n\tprivate emitSessionFinalized(changeCount: number, durationMs: number, changes: SessionChange[]): void {\n\t\tconst event = makeSafeSessionFinalizedEvent(changeCount, durationMs, this.tier, this.consent, changes);\n\t\t// TODO: Wire to actual analytics client when available\n\t\tconsole.log(\"[SessionManager] SESSION_FINALIZED:\", event);\n\t}\n}\n","/**\n * Session Module - Session-based change tracking exports\n */\n\nexport * from \"./SessionDeduplication\";\nexport * from \"./SessionManager\";\nexport * from \"./SessionRecovery\";\nexport * from \"./SessionRollback\";\nexport * from \"./sessionAnalytics\";\n","/**\n * FileConflictResolver.ts\n *\n * Platform-agnostic file conflict resolution for snapshot restore operations.\n * Handles file path conflicts, atomic writes, and permission issues.\n *\n * Features:\n * - Atomic write pattern (temp file + rename)\n * - Permission validation before write\n * - File rename/move detection via content hashing\n * - Filename similarity matching (Levenshtein distance)\n *\n * @module snapshot/FileConflictResolver\n * @performance Atomic write < 100ms for typical files\n *\n * @example\n * ```typescript\n * import { FileConflictResolver } from '@snapback-oss/sdk';\n *\n * const resolver = new FileConflictResolver({\n * fileSearchProvider: mySearchProvider, // Optional, for findRenamedFile\n * logger: myLogger // Optional\n * });\n *\n * // Restore a file with conflict handling\n * const result = await resolver.resolveAndWrite(\n * '/path/to/file.ts',\n * 'file contents',\n * { created: Date.now() }\n * );\n * ```\n */\n\nimport * as crypto from \"node:crypto\";\nimport * as fsSync from \"node:fs\";\nimport * as fs from \"node:fs/promises\";\nimport * as path from \"node:path\";\nimport type { ILogger } from \"../core/session/interfaces\";\nimport { NoOpLogger } from \"../core/session/interfaces\";\n\n/**\n * Result of a conflict resolution operation\n */\nexport interface ConflictResult {\n\t/** Whether the conflict was successfully resolved */\n\tresolved: boolean;\n\t/** Action taken to resolve the conflict */\n\taction: \"restored\" | \"skipped\" | \"merged\";\n\t/** Target file path */\n\tpath: string;\n\t/** Error if resolution failed */\n\terror?: Error;\n}\n\n/**\n * Metadata about the original file being restored\n */\nexport interface RestoreMetadata {\n\t/** Original creation timestamp (milliseconds since epoch) */\n\tcreated: number;\n\t/** Original file permissions (optional) */\n\tpermissions?: number;\n}\n\n/**\n * File search result for rename detection\n */\nexport interface FileSearchResult {\n\t/** File path */\n\tpath: string;\n\t/** File content (for hash comparison) */\n\tcontent?: string;\n}\n\n/**\n * Provider interface for file search operations (platform-specific)\n *\n * This allows the conflict resolver to search for renamed/moved files\n * without depending on a specific platform (e.g., VS Code workspace API).\n */\nexport interface IFileSearchProvider {\n\t/**\n\t * Find files matching a pattern in the workspace\n\t *\n\t * @param workspaceRoot - Root directory to search\n\t * @param extension - File extension to filter by (e.g., \".ts\")\n\t * @param excludePattern - Glob pattern to exclude (e.g., \"node_modules\")\n\t * @param maxResults - Maximum number of results to return\n\t * @returns Array of file paths matching the pattern\n\t */\n\tfindFiles(\n\t\tworkspaceRoot: string,\n\t\textension: string,\n\t\texcludePattern?: string,\n\t\tmaxResults?: number,\n\t): Promise<string[]>;\n\n\t/**\n\t * Read file content for hash comparison\n\t *\n\t * @param filePath - Path to the file\n\t * @returns File content as string\n\t */\n\treadFile(filePath: string): Promise<string>;\n}\n\n/**\n * Options for FileConflictResolver\n */\nexport interface FileConflictResolverOptions {\n\t/** Logger instance for debug output */\n\tlogger?: ILogger;\n\t/** File search provider for rename detection (optional) */\n\tfileSearchProvider?: IFileSearchProvider;\n\t/** Workspace root for relative path operations (optional) */\n\tworkspaceRoot?: string;\n}\n\n/**\n * FileConflictResolver - Handles file conflicts during snapshot restore\n *\n * Provides platform-agnostic conflict resolution with:\n * - Atomic write operations (temp file + rename pattern)\n * - Permission validation\n * - File rename/move detection\n * - Filename similarity matching\n */\nexport class FileConflictResolver {\n\tprivate readonly logger: ILogger;\n\tprivate readonly fileSearchProvider?: IFileSearchProvider;\n\tprivate readonly workspaceRoot?: string;\n\n\tconstructor(options: FileConflictResolverOptions = {}) {\n\t\tthis.logger = options.logger ?? new NoOpLogger();\n\t\tthis.fileSearchProvider = options.fileSearchProvider;\n\t\tthis.workspaceRoot = options.workspaceRoot;\n\t}\n\n\t/**\n\t * Attempt to restore a file, handling conflicts.\n\t * Uses atomic write pattern: write to temp file, then rename.\n\t *\n\t * @param targetPath - Path where the file should be restored\n\t * @param content - File content to write\n\t * @param _originalMetadata - Original file metadata (for future use)\n\t * @returns Conflict resolution result\n\t *\n\t * @performance < 100ms for typical files\n\t */\n\tasync resolveAndWrite(\n\t\ttargetPath: string,\n\t\tcontent: string,\n\t\t_originalMetadata: RestoreMetadata,\n\t): Promise<ConflictResult> {\n\t\ttry {\n\t\t\t// 1. Check write permissions\n\t\t\tconst hasPermission = await this.checkPermissions(targetPath);\n\t\t\tif (!hasPermission) {\n\t\t\t\tthis.logger.debug(\"No write permission for target path\", { targetPath });\n\t\t\t\treturn {\n\t\t\t\t\tresolved: false,\n\t\t\t\t\taction: \"skipped\",\n\t\t\t\t\tpath: targetPath,\n\t\t\t\t\terror: new Error(`No write permission for ${targetPath}`),\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// 2. Ensure parent directory exists\n\t\t\tconst parentDir = path.dirname(targetPath);\n\t\t\tawait fs.mkdir(parentDir, { recursive: true });\n\n\t\t\t// 3. Atomic write: temp file + rename pattern\n\t\t\tconst tempPath = `${targetPath}.snapback-tmp-${Date.now()}`;\n\t\t\ttry {\n\t\t\t\tawait fs.writeFile(tempPath, content, \"utf8\");\n\t\t\t\tawait fs.rename(tempPath, targetPath);\n\t\t\t} catch (writeError) {\n\t\t\t\t// Clean up temp file on failure\n\t\t\t\ttry {\n\t\t\t\t\tawait fs.unlink(tempPath);\n\t\t\t\t} catch {\n\t\t\t\t\t// Ignore cleanup errors\n\t\t\t\t}\n\t\t\t\tthrow writeError;\n\t\t\t}\n\n\t\t\tthis.logger.debug(\"File restored successfully\", { targetPath });\n\t\t\treturn {\n\t\t\t\tresolved: true,\n\t\t\t\taction: \"restored\",\n\t\t\t\tpath: targetPath,\n\t\t\t};\n\t\t} catch (error) {\n\t\t\tthis.logger.error(\"Failed to restore file\", error instanceof Error ? error : undefined, { targetPath });\n\t\t\treturn {\n\t\t\t\tresolved: false,\n\t\t\t\taction: \"skipped\",\n\t\t\t\tpath: targetPath,\n\t\t\t\terror: error instanceof Error ? error : new Error(String(error)),\n\t\t\t};\n\t\t}\n\t}\n\n\t/**\n\t * Detect if a file was renamed/moved since snapshot.\n\t * Uses content hash matching to find moved files.\n\t *\n\t * Requires a fileSearchProvider to be configured.\n\t *\n\t * @param originalPath - Original file path from snapshot\n\t * @param contentHash - SHA-256 hash of the original content\n\t * @returns New file path if found, null otherwise\n\t */\n\tasync findRenamedFile(originalPath: string, contentHash: string): Promise<string | null> {\n\t\tif (!this.fileSearchProvider || !this.workspaceRoot) {\n\t\t\tthis.logger.debug(\"File search not available - no provider or workspace root configured\");\n\t\t\treturn null;\n\t\t}\n\n\t\tconst originalFileName = path.basename(originalPath);\n\t\tconst originalExt = path.extname(originalPath);\n\n\t\ttry {\n\t\t\t// Search for files with same extension\n\t\t\tconst files = await this.fileSearchProvider.findFiles(\n\t\t\t\tthis.workspaceRoot,\n\t\t\t\toriginalExt,\n\t\t\t\t\"**/node_modules/**\",\n\t\t\t\t100,\n\t\t\t);\n\n\t\t\tfor (const filePath of files) {\n\t\t\t\ttry {\n\t\t\t\t\tconst content = await this.fileSearchProvider.readFile(filePath);\n\t\t\t\t\tconst hash = this.hashContent(content);\n\n\t\t\t\t\tif (hash === contentHash) {\n\t\t\t\t\t\t// Found matching content - this is likely the renamed file\n\t\t\t\t\t\tthis.logger.debug(\"Found renamed file by content hash\", { originalPath, newPath: filePath });\n\t\t\t\t\t\treturn filePath;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Also check for similar filename (fuzzy match)\n\t\t\t\t\tconst fileName = path.basename(filePath);\n\t\t\t\t\tif (this.isSimilarFileName(originalFileName, fileName)) {\n\t\t\t\t\t\t// Check if content is at least 80% similar\n\t\t\t\t\t\tconst similarity = this.calculateSimilarity(contentHash, hash);\n\t\t\t\t\t\tif (similarity > 0.8) {\n\t\t\t\t\t\t\tthis.logger.debug(\"Found renamed file by similarity\", {\n\t\t\t\t\t\t\t\toriginalPath,\n\t\t\t\t\t\t\t\tnewPath: filePath,\n\t\t\t\t\t\t\t\tsimilarity,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\treturn filePath;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} catch {\n\t\t\t\t\t// Skip files that can't be read\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tthis.logger.debug(\"Error searching for renamed file\", {\n\t\t\t\toriginalPath,\n\t\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\t});\n\t\t}\n\n\t\treturn null;\n\t}\n\n\t/**\n\t * Verify write permissions before attempting restore.\n\t *\n\t * @param targetPath - Path to check permissions for\n\t * @returns True if write permission is available\n\t */\n\tasync checkPermissions(targetPath: string): Promise<boolean> {\n\t\ttry {\n\t\t\t// Check if file exists\n\t\t\ttry {\n\t\t\t\tawait fs.access(targetPath, fs.constants.W_OK);\n\t\t\t\treturn true;\n\t\t\t} catch {\n\t\t\t\t// File doesn't exist, check parent directory\n\t\t\t\tconst parentDir = path.dirname(targetPath);\n\t\t\t\ttry {\n\t\t\t\t\tawait fs.access(parentDir, fs.constants.W_OK);\n\t\t\t\t\treturn true;\n\t\t\t\t} catch {\n\t\t\t\t\t// Parent doesn't exist, check if we can create it\n\t\t\t\t\tconst rootDir = this.findExistingAncestor(parentDir);\n\t\t\t\t\tif (rootDir) {\n\t\t\t\t\t\tawait fs.access(rootDir, fs.constants.W_OK);\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t} catch {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t/**\n\t * Hash file content using SHA-256\n\t *\n\t * @param content - Content to hash\n\t * @returns SHA-256 hash as hex string\n\t */\n\thashContent(content: string): string {\n\t\treturn crypto.createHash(\"sha256\").update(content).digest(\"hex\");\n\t}\n\n\t/**\n\t * Find the nearest existing ancestor directory.\n\t *\n\t * @param dirPath - Starting directory path\n\t * @returns Nearest existing ancestor path, or null\n\t */\n\tfindExistingAncestor(dirPath: string): string | null {\n\t\tlet current = dirPath;\n\t\tconst root = path.parse(current).root;\n\n\t\twhile (current !== root) {\n\t\t\ttry {\n\t\t\t\tfsSync.accessSync(current);\n\t\t\t\treturn current;\n\t\t\t} catch {\n\t\t\t\tcurrent = path.dirname(current);\n\t\t\t}\n\t\t}\n\n\t\treturn root;\n\t}\n\n\t/**\n\t * Check if two filenames are similar (for rename detection).\n\t *\n\t * Uses multiple heuristics:\n\t * - Exact base name match\n\t * - One name contains the other\n\t * - Levenshtein distance < 30% of max length\n\t *\n\t * @param name1 - First filename\n\t * @param name2 - Second filename\n\t * @returns True if filenames are considered similar\n\t */\n\tisSimilarFileName(name1: string, name2: string): boolean {\n\t\tconst base1 = path.basename(name1, path.extname(name1)).toLowerCase();\n\t\tconst base2 = path.basename(name2, path.extname(name2)).toLowerCase();\n\n\t\t// Same base name\n\t\tif (base1 === base2) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// One contains the other\n\t\tif (base1.includes(base2) || base2.includes(base1)) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// Edit distance check (Levenshtein)\n\t\tconst distance = this.levenshteinDistance(base1, base2);\n\t\tconst maxLen = Math.max(base1.length, base2.length);\n\t\treturn distance / maxLen < 0.3; // Less than 30% difference\n\t}\n\n\t/**\n\t * Calculate Levenshtein distance between two strings.\n\t *\n\t * @param str1 - First string\n\t * @param str2 - Second string\n\t * @returns Edit distance as integer\n\t */\n\tlevenshteinDistance(str1: string, str2: string): number {\n\t\tconst m = str1.length;\n\t\tconst n = str2.length;\n\t\tconst dp: number[][] = Array.from({ length: m + 1 }, () => Array(n + 1).fill(0));\n\n\t\tfor (let i = 0; i <= m; i++) {\n\t\t\tdp[i][0] = i;\n\t\t}\n\t\tfor (let j = 0; j <= n; j++) {\n\t\t\tdp[0][j] = j;\n\t\t}\n\n\t\tfor (let i = 1; i <= m; i++) {\n\t\t\tfor (let j = 1; j <= n; j++) {\n\t\t\t\tif (str1[i - 1] === str2[j - 1]) {\n\t\t\t\t\tdp[i][j] = dp[i - 1][j - 1];\n\t\t\t\t} else {\n\t\t\t\t\tdp[i][j] = 1 + Math.min(dp[i - 1][j], dp[i][j - 1], dp[i - 1][j - 1]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn dp[m][n];\n\t}\n\n\t/**\n\t * Calculate similarity between two hashes.\n\t *\n\t * Note: SHA-256 hashes are cryptographic - different content produces\n\t * completely different hashes. This returns 1.0 for exact match, 0.0 otherwise.\n\t * For actual content similarity, compare the content directly.\n\t *\n\t * @param hash1 - First hash\n\t * @param hash2 - Second hash\n\t * @returns Similarity score (1.0 = exact match, 0.0 = different)\n\t */\n\tcalculateSimilarity(hash1: string, hash2: string): number {\n\t\treturn hash1 === hash2 ? 1.0 : 0.0;\n\t}\n}\n","/**\n * Retry utility with exponential backoff\n *\n * Provides a unified implementation for retry logic across the codebase.\n * Consolidates 6+ separate retry implementations into a single, well-tested utility.\n *\n * @module retry\n */\n\nexport interface RetryOptions {\n\t/** Maximum number of retry attempts */\n\tmaxAttempts: number;\n\t/** Base delay in milliseconds between retries */\n\tbaseDelayMs: number;\n\t/** Maximum delay cap in milliseconds (default: 30000) */\n\tmaxDelayMs?: number;\n\t/** Add random jitter to prevent thundering herd (default: false) */\n\tjitter?: boolean;\n\t/** Callback invoked before each retry attempt */\n\tonRetry?: (attempt: number, error: Error) => void;\n}\n\n/**\n * Execute an async operation with retry logic and exponential backoff\n *\n * @param operation - Async function to execute\n * @param options - Retry configuration options\n * @returns Result of the operation\n * @throws Last error if all retry attempts fail\n *\n * @example\n * ```typescript\n * // Basic usage with 3 retries\n * const result = await withRetry(\n * async () => fetch('https://api.example.com/data'),\n * { maxAttempts: 3, baseDelayMs: 1000 }\n * );\n *\n * // With jitter and retry callback\n * const result = await withRetry(\n * async () => processData(),\n * {\n * maxAttempts: 5,\n * baseDelayMs: 100,\n * jitter: true,\n * onRetry: (attempt, error) => {\n * logger.warn(`Retry attempt ${attempt} after error`, { error });\n * }\n * }\n * );\n * ```\n */\nexport async function withRetry<T>(operation: () => Promise<T>, options: RetryOptions): Promise<T> {\n\tconst { maxAttempts, baseDelayMs, maxDelayMs = 30000, jitter = false, onRetry } = options;\n\n\tfor (let attempt = 1; attempt <= maxAttempts; attempt++) {\n\t\ttry {\n\t\t\treturn await operation();\n\t\t} catch (error) {\n\t\t\t// Re-throw on last attempt\n\t\t\tif (attempt === maxAttempts) {\n\t\t\t\tthrow error;\n\t\t\t}\n\n\t\t\t// Calculate backoff delay\n\t\t\tconst delay = calculateBackoff(attempt, baseDelayMs, maxDelayMs, jitter);\n\n\t\t\t// Invoke callback if provided\n\t\t\tif (onRetry) {\n\t\t\t\tonRetry(attempt, error instanceof Error ? error : new Error(String(error)));\n\t\t\t}\n\n\t\t\t// Wait before next retry\n\t\t\tawait new Promise((resolve) => setTimeout(resolve, delay));\n\t\t}\n\t}\n\n\t// TypeScript exhaustiveness check\n\tthrow new Error(\"Retry failed - should never reach\");\n}\n\n/**\n * Calculate exponential backoff delay with optional jitter\n *\n * Formula: min(baseMs * 2^(attempt - 1), maxMs) [+ jitter]\n *\n * @param attempt - Current attempt number (1-based)\n * @param baseMs - Base delay in milliseconds\n * @param maxMs - Maximum delay cap\n * @param jitter - Whether to add random jitter (0-100% of calculated delay)\n * @returns Delay in milliseconds\n *\n * @example\n * ```typescript\n * // Attempt 1: 1000ms\n * // Attempt 2: 2000ms\n * // Attempt 3: 4000ms\n * const delay = calculateBackoff(3, 1000, 30000, false); // 4000\n * ```\n */\nexport function calculateBackoff(attempt: number, baseMs: number, maxMs: number, jitter: boolean): number {\n\t// Exponential backoff: baseMs * 2^(attempt - 1)\n\tconst exponential = baseMs * 2 ** (attempt - 1);\n\n\t// Cap at maximum delay\n\tconst capped = Math.min(exponential, maxMs);\n\n\t// Add jitter if enabled (random 0-100% of delay)\n\tif (jitter) {\n\t\tconst jitterAmount = Math.random() * capped;\n\t\treturn capped + jitterAmount;\n\t}\n\n\treturn capped;\n}\n\n/**\n * Get recommended retry options for common scenarios\n */\nexport const RetryPresets = {\n\t/** Fast retries for network requests (max 5s delay) */\n\tnetwork: {\n\t\tmaxAttempts: 3,\n\t\tbaseDelayMs: 1000,\n\t\tmaxDelayMs: 5000,\n\t\tjitter: true,\n\t} as RetryOptions,\n\n\t/** Medium retries for API calls (max 30s delay) */\n\tapi: {\n\t\tmaxAttempts: 5,\n\t\tbaseDelayMs: 2000,\n\t\tmaxDelayMs: 30000,\n\t\tjitter: true,\n\t} as RetryOptions,\n\n\t/** Aggressive retries for critical operations (max 1min delay) */\n\tcritical: {\n\t\tmaxAttempts: 10,\n\t\tbaseDelayMs: 1000,\n\t\tmaxDelayMs: 60000,\n\t\tjitter: true,\n\t} as RetryOptions,\n\n\t/** Quick retries for fast operations (max 2s delay) */\n\tfast: {\n\t\tmaxAttempts: 3,\n\t\tbaseDelayMs: 100,\n\t\tmaxDelayMs: 2000,\n\t\tjitter: false,\n\t} as RetryOptions,\n} as const;\n","/**\n * Snapshot Retry Hook with Automatic Error Resolution\n *\n * Provides intelligent retry logic for snapshot creation failures with:\n * - Automatic error diagnosis\n * - Path resolution fixes\n * - Working directory correction\n * - Clear user feedback\n *\n * @module snapshot/retry-hook\n */\n\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport type { Result } from \"../utils/result.js\";\nimport { err, ok } from \"../utils/result.js\";\nimport { calculateBackoff } from \"../utils/retry.js\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\n/**\n * Error types that can be diagnosed and potentially auto-fixed\n */\nexport type DiagnosisType =\n\t| \"FILE_NOT_FOUND\"\n\t| \"ABSOLUTE_PATH_REJECTED\"\n\t| \"PERMISSION_DENIED\"\n\t| \"WORKSPACE_MISMATCH\"\n\t| \"WORKING_DIRECTORY_MISMATCH\"\n\t| \"STORAGE_FULL\"\n\t| \"UNKNOWN\";\n\n/**\n * Diagnostic information about snapshot failure\n */\nexport interface SnapshotDiagnosis {\n\t/** Type of error identified */\n\ttype: DiagnosisType;\n\t/** Human-readable message describing the issue */\n\tmessage: string;\n\t/** Root cause analysis */\n\tcause: string;\n\t/** Suggested fix to resolve the issue */\n\tsuggestedFix: string;\n\t/** Action required from user (or \"Automatic\" if auto-fixable) */\n\tuserAction: string;\n\t/** Whether this error can be automatically fixed */\n\tcanAutoFix: boolean;\n\t/** Confidence level of diagnosis (0-1) */\n\tconfidence: number;\n\t/** Files affected by this error */\n\taffectedFiles?: string[];\n}\n\n/**\n * Snapshot creation parameters\n */\nexport interface SnapshotParams {\n\t/** Files to include in snapshot */\n\tfiles: string[];\n\t/** Reason for creating snapshot */\n\treason: string;\n\t/** What triggered the snapshot */\n\ttrigger: \"manual\" | \"mcp\" | \"ai_assist\" | \"session_end\" | \"pre_commit\";\n\t/** Workspace root directory */\n\tworkspaceRoot?: string;\n\t/** How to handle missing files */\n\tonMissingFile?: \"error\" | \"warn\" | \"skip\";\n\t/** Whether to suggest alternatives for missing files */\n\tsuggestAlternatives?: boolean;\n}\n\n/**\n * Result of snapshot creation with retry\n */\nexport interface SnapshotRetryResult<T> {\n\t/** Whether snapshot was created successfully */\n\tsuccess: boolean;\n\t/** The created snapshot (if successful) */\n\tsnapshot?: T;\n\t/** Error message (if failed) */\n\terror?: string;\n\t/** Suggestion for user action */\n\tsuggestion?: string;\n\t/** Detailed diagnostics (if failed) */\n\tdiagnostics?: SnapshotDiagnosis;\n\t/** Which attempt succeeded (1-based) */\n\tattempt?: number;\n\t/** Total attempts made */\n\ttotalAttempts?: number;\n}\n\n/**\n * Configuration for retry behavior\n */\nexport interface RetryConfig {\n\t/** Maximum number of retry attempts */\n\tmaxRetries: number;\n\t/** Base delay in milliseconds */\n\tdelayMs: number;\n\t/** Use exponential backoff */\n\texponentialBackoff: boolean;\n\t/** Enable automatic fixes */\n\tautoFix: boolean;\n\t/** Enable verbose logging */\n\tverbose: boolean;\n}\n\n// =============================================================================\n// DIAGNOSIS FUNCTIONS\n// =============================================================================\n\n/**\n * Diagnose why a snapshot creation failed\n *\n * @param error - The error that occurred\n * @param files - Files that were being snapshotted\n * @param workspaceRoot - The workspace root directory\n * @returns Diagnosis with suggested fixes\n */\nexport function diagnoseSnapshotFailure(error: unknown, files: string[], workspaceRoot: string): SnapshotDiagnosis {\n\tconst errorMessage = error instanceof Error ? error.message : String(error);\n\n\t// FILE_NOT_FOUND - File doesn't exist\n\tif (\n\t\terrorMessage.includes(\"ENOENT\") ||\n\t\terrorMessage.includes(\"no such file\") ||\n\t\terrorMessage.toLowerCase().includes(\"file not found\")\n\t) {\n\t\tconst missingFiles = files.filter((f) => {\n\t\t\tconst fullPath = path.isAbsolute(f) ? f : path.join(workspaceRoot, f);\n\t\t\treturn !fs.existsSync(fullPath);\n\t\t});\n\n\t\treturn {\n\t\t\ttype: \"FILE_NOT_FOUND\",\n\t\t\tmessage: \"One or more files do not exist\",\n\t\t\tcause: \"The specified file paths could not be found on disk\",\n\t\t\tsuggestedFix: \"Check file paths and ensure files exist\",\n\t\t\tuserAction:\n\t\t\t\tmissingFiles.length > 0\n\t\t\t\t\t? `Create missing files: ${missingFiles.join(\", \")}`\n\t\t\t\t\t: \"Verify file paths are correct\",\n\t\t\tcanAutoFix: false,\n\t\t\tconfidence: 0.95,\n\t\t\taffectedFiles: missingFiles.length > 0 ? missingFiles : undefined,\n\t\t};\n\t}\n\n\t// ABSOLUTE_PATH_REJECTED - Absolute paths when relative expected\n\tif (errorMessage.includes(\"absolute\") || errorMessage.includes(\"Absolute paths not allowed\")) {\n\t\tconst absolutePaths = files.filter((f) => path.isAbsolute(f));\n\n\t\treturn {\n\t\t\ttype: \"ABSOLUTE_PATH_REJECTED\",\n\t\t\tmessage: \"Snapshot tool requires relative paths\",\n\t\t\tcause: \"Absolute paths were provided instead of relative paths\",\n\t\t\tsuggestedFix: \"Convert absolute paths to relative paths from workspace root\",\n\t\t\tuserAction: \"Automatic: Converting to relative paths\",\n\t\t\tcanAutoFix: true,\n\t\t\tconfidence: 1.0,\n\t\t\taffectedFiles: absolutePaths,\n\t\t};\n\t}\n\n\t// PERMISSION_DENIED - No read access\n\tif (errorMessage.includes(\"EACCES\") || errorMessage.includes(\"permission denied\")) {\n\t\treturn {\n\t\t\ttype: \"PERMISSION_DENIED\",\n\t\t\tmessage: \"Permission denied when accessing files\",\n\t\t\tcause: \"The current user does not have read permission for one or more files\",\n\t\t\tsuggestedFix: \"Check file permissions or run with appropriate privileges\",\n\t\t\tuserAction: \"Run: chmod +r <file> or check file ownership\",\n\t\t\tcanAutoFix: false,\n\t\t\tconfidence: 0.9,\n\t\t};\n\t}\n\n\t// WORKSPACE_MISMATCH - Wrong workspace root\n\tif (errorMessage.includes(\"workspace\") || errorMessage.includes(\"outside workspace\")) {\n\t\treturn {\n\t\t\ttype: \"WORKSPACE_MISMATCH\",\n\t\t\tmessage: \"Files are outside the workspace root\",\n\t\t\tcause: \"The workspace root does not contain all specified files\",\n\t\t\tsuggestedFix: \"Ensure all files are within the workspace directory\",\n\t\t\tuserAction: \"Automatic: Resolving paths from correct workspace root\",\n\t\t\tcanAutoFix: true,\n\t\t\tconfidence: 0.85,\n\t\t};\n\t}\n\n\t// WORKING_DIRECTORY_MISMATCH - Wrong CWD\n\tif (errorMessage.includes(\"cwd\") || errorMessage.includes(\"working directory\")) {\n\t\treturn {\n\t\t\ttype: \"WORKING_DIRECTORY_MISMATCH\",\n\t\t\tmessage: \"Current working directory mismatch\",\n\t\t\tcause: \"The process is not running from the expected workspace root\",\n\t\t\tsuggestedFix: \"Change to the correct working directory\",\n\t\t\tuserAction: \"Automatic: Adjusting paths for current directory\",\n\t\t\tcanAutoFix: true,\n\t\t\tconfidence: 0.8,\n\t\t};\n\t}\n\n\t// STORAGE_FULL - No disk space\n\tif (errorMessage.includes(\"ENOSPC\") || errorMessage.includes(\"no space\")) {\n\t\treturn {\n\t\t\ttype: \"STORAGE_FULL\",\n\t\t\tmessage: \"Insufficient disk space\",\n\t\t\tcause: \"The disk does not have enough free space for the snapshot\",\n\t\t\tsuggestedFix: \"Free up disk space and try again\",\n\t\t\tuserAction: \"Clear temporary files or expand disk storage\",\n\t\t\tcanAutoFix: false,\n\t\t\tconfidence: 0.95,\n\t\t};\n\t}\n\n\t// UNKNOWN - Catch-all\n\treturn {\n\t\ttype: \"UNKNOWN\",\n\t\tmessage: \"Unknown error during snapshot creation\",\n\t\tcause: errorMessage,\n\t\tsuggestedFix: \"Check the error message and logs for details\",\n\t\tuserAction: \"Review error details and try again\",\n\t\tcanAutoFix: false,\n\t\tconfidence: 0.3,\n\t};\n}\n\n/**\n * Apply automatic fix for diagnosed error\n *\n * @param diagnosis - The diagnosis to fix\n * @param context - Mutable context with files and workspace info\n * @returns True if fix was applied\n */\nexport async function applyAutomaticFix(\n\tdiagnosis: SnapshotDiagnosis,\n\tcontext: { files: string[]; workspaceRoot: string },\n): Promise<boolean> {\n\tswitch (diagnosis.type) {\n\t\tcase \"ABSOLUTE_PATH_REJECTED\": {\n\t\t\t// Convert absolute paths to relative\n\t\t\tcontext.files = context.files.map((f) => {\n\t\t\t\tif (path.isAbsolute(f)) {\n\t\t\t\t\treturn path.relative(context.workspaceRoot, f);\n\t\t\t\t}\n\t\t\t\treturn f;\n\t\t\t});\n\t\t\treturn true;\n\t\t}\n\n\t\tcase \"WORKSPACE_MISMATCH\":\n\t\tcase \"WORKING_DIRECTORY_MISMATCH\": {\n\t\t\t// Normalize paths relative to workspace\n\t\t\tcontext.files = context.files.map((f) => {\n\t\t\t\tif (path.isAbsolute(f)) {\n\t\t\t\t\treturn path.relative(context.workspaceRoot, f);\n\t\t\t\t}\n\t\t\t\t// Check if file exists relative to cwd but not workspace\n\t\t\t\tconst fromCwd = path.resolve(process.cwd(), f);\n\t\t\t\tif (fs.existsSync(fromCwd)) {\n\t\t\t\t\treturn path.relative(context.workspaceRoot, fromCwd);\n\t\t\t\t}\n\t\t\t\treturn f;\n\t\t\t});\n\t\t\treturn true;\n\t\t}\n\n\t\tdefault:\n\t\t\treturn false;\n\t}\n}\n\n// =============================================================================\n// RETRY HOOK\n// =============================================================================\n\nconst DEFAULT_RETRY_CONFIG: RetryConfig = {\n\tmaxRetries: 3,\n\tdelayMs: 100,\n\texponentialBackoff: true,\n\tautoFix: true,\n\tverbose: false,\n};\n\n/**\n * Create snapshot with automatic retry and error resolution\n *\n * @param params - Snapshot creation parameters\n * @param snapshotFn - Function to create snapshot (injected for testability)\n * @param config - Retry configuration\n * @returns Result with snapshot or error diagnostics\n *\n * @example\n * ```typescript\n * const result = await createSnapshotWithRetry(\n * {\n * files: ['src/index.ts', 'src/utils.ts'],\n * reason: 'Pre-deployment snapshot',\n * trigger: 'manual',\n * workspaceRoot: '/path/to/workspace'\n * },\n * async (params) => snapshotManager.create(params.files, { description: params.reason })\n * );\n *\n * if (!result.success) {\n * console.error(result.error);\n * console.log('Suggestion:', result.suggestion);\n * }\n * ```\n */\nexport async function createSnapshotWithRetry<T>(\n\tparams: SnapshotParams,\n\tsnapshotFn: (params: SnapshotParams) => Promise<T>,\n\tconfig: Partial<RetryConfig> = {},\n): Promise<SnapshotRetryResult<T>> {\n\tconst cfg = { ...DEFAULT_RETRY_CONFIG, ...config };\n\tconst { workspaceRoot = process.cwd() } = params;\n\n\tlet lastError: Error | null = null;\n\tlet lastDiagnosis: SnapshotDiagnosis | null = null;\n\n\t// Mutable context for auto-fixes\n\tconst context = {\n\t\tfiles: [...params.files],\n\t\tworkspaceRoot,\n\t};\n\n\tfor (let attempt = 1; attempt <= cfg.maxRetries; attempt++) {\n\t\ttry {\n\t\t\tif (cfg.verbose && attempt > 1) {\n\t\t\t\tconsole.error(`[SnapBack Retry] Attempt ${attempt}/${cfg.maxRetries}`);\n\t\t\t}\n\n\t\t\t// Apply delay with exponential backoff\n\t\t\tif (attempt > 1) {\n\t\t\t\tconst delay = cfg.exponentialBackoff\n\t\t\t\t\t? calculateBackoff(attempt - 1, cfg.delayMs, 30000, false)\n\t\t\t\t\t: cfg.delayMs;\n\t\t\t\tawait new Promise((resolve) => setTimeout(resolve, delay));\n\t\t\t}\n\n\t\t\t// Attempt snapshot creation with current context\n\t\t\tconst snapshot = await snapshotFn({\n\t\t\t\t...params,\n\t\t\t\tfiles: context.files,\n\t\t\t});\n\n\t\t\t// Success!\n\t\t\tif (cfg.verbose && attempt > 1) {\n\t\t\t\tconsole.error(`[SnapBack Retry] ✅ Succeeded on attempt ${attempt}`);\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tsuccess: true,\n\t\t\t\tsnapshot,\n\t\t\t\tattempt,\n\t\t\t\ttotalAttempts: attempt,\n\t\t\t};\n\t\t} catch (error) {\n\t\t\tlastError = error instanceof Error ? error : new Error(String(error));\n\n\t\t\t// Diagnose the failure\n\t\t\tconst diagnosis = diagnoseSnapshotFailure(error, context.files, context.workspaceRoot);\n\t\t\tlastDiagnosis = diagnosis;\n\n\t\t\tif (cfg.verbose) {\n\t\t\t\tconsole.error(`[SnapBack Retry] ❌ Attempt ${attempt}/${cfg.maxRetries} failed`);\n\t\t\t\tconsole.error(`[SnapBack Retry] 🔍 Diagnosis: ${diagnosis.type}`);\n\t\t\t\tconsole.error(`[SnapBack Retry] 📋 ${diagnosis.message}`);\n\t\t\t\tconsole.error(`[SnapBack Retry] 💡 ${diagnosis.suggestedFix}`);\n\t\t\t}\n\n\t\t\t// Try automatic fix if enabled\n\t\t\tif (cfg.autoFix && diagnosis.canAutoFix && attempt < cfg.maxRetries) {\n\t\t\t\tconst fixApplied = await applyAutomaticFix(diagnosis, context);\n\n\t\t\t\tif (fixApplied) {\n\t\t\t\t\tif (cfg.verbose) {\n\t\t\t\t\t\tconsole.error(`[SnapBack Retry] 🔧 Applied automatic fix: ${diagnosis.userAction}`);\n\t\t\t\t\t}\n\t\t\t\t\tcontinue; // Retry with fix\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// No fix possible or last attempt - bail out\n\t\t\tif (attempt === cfg.maxRetries) {\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\t// Log that we're retrying without fix\n\t\t\tif (cfg.verbose && !diagnosis.canAutoFix) {\n\t\t\t\tconsole.error(\"[SnapBack Retry] ⚠️ No automatic fix available, retrying anyway...\");\n\t\t\t}\n\t\t}\n\t}\n\n\t// All retries exhausted\n\treturn {\n\t\tsuccess: false,\n\t\terror: lastError?.message || \"Unknown error\",\n\t\tsuggestion: lastDiagnosis?.userAction || \"Check logs for details\",\n\t\tdiagnostics: lastDiagnosis || undefined,\n\t\tattempt: cfg.maxRetries,\n\t\ttotalAttempts: cfg.maxRetries,\n\t};\n}\n\n/**\n * Result-based version of createSnapshotWithRetry\n *\n * @param params - Snapshot creation parameters\n * @param snapshotFn - Function to create snapshot\n * @param config - Retry configuration\n * @returns Result<T, SnapshotDiagnosis>\n */\nexport async function createSnapshotWithRetrySafe<T>(\n\tparams: SnapshotParams,\n\tsnapshotFn: (params: SnapshotParams) => Promise<T>,\n\tconfig: Partial<RetryConfig> = {},\n): Promise<Result<T, SnapshotDiagnosis>> {\n\tconst result = await createSnapshotWithRetry(params, snapshotFn, config);\n\n\tif (result.success && result.snapshot) {\n\t\treturn ok(result.snapshot);\n\t}\n\n\treturn err(\n\t\tresult.diagnostics || {\n\t\t\ttype: \"UNKNOWN\",\n\t\t\tmessage: result.error || \"Unknown error\",\n\t\t\tcause: \"Snapshot creation failed after all retries\",\n\t\t\tsuggestedFix: result.suggestion || \"Check logs for details\",\n\t\t\tuserAction: \"Review error and try again\",\n\t\t\tcanAutoFix: false,\n\t\t\tconfidence: 0.1,\n\t\t},\n\t);\n}\n\n/**\n * Format diagnosis for user-friendly output\n */\nexport function formatDiagnosis(diagnosis: SnapshotDiagnosis): string {\n\tconst confidencePercent = Math.round(diagnosis.confidence * 100);\n\tconst autoFixBadge = diagnosis.canAutoFix ? \"✅ Auto-fixable\" : \"❌ Manual fix required\";\n\n\treturn `\n🔍 Snapshot Failure Diagnosis\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\nType: ${diagnosis.type}\nConfidence: ${confidencePercent}%\n${autoFixBadge}\n\n📋 Issue:\n ${diagnosis.message}\n\n🔎 Root Cause:\n ${diagnosis.cause}\n\n💡 Suggested Fix:\n ${diagnosis.suggestedFix}\n\n👤 Action Required:\n ${diagnosis.userAction}\n${diagnosis.affectedFiles ? `\\n📁 Affected Files:\\n${diagnosis.affectedFiles.map((f) => ` - ${f}`).join(\"\\n\")}` : \"\"}\n`.trim();\n}\n","import type { ILogger } from \"../core/session/interfaces\";\nimport { NoOpLogger } from \"../core/session/interfaces\";\nimport { toError } from \"../utils/errorHelpers\";\n\n/**\n * SnapshotDeletionService - Safe snapshot deletion with confirmation and auto-cleanup\n *\n * Provides intelligent snapshot deletion with multiple safety features:\n * - Protected snapshot guards\n * - User confirmation dialogs\n * - Bulk deletion with age filtering\n * - Automatic cleanup scheduling\n * - Minimum snapshot preservation\n *\n * @module snapshot/SnapshotDeletionService\n * @performance Single deletion < 50ms, bulk deletion < 500ms for 100 snapshots\n * @security All deletions require explicit confirmation or skipConfirmation flag\n *\n * @example\n * ```typescript\n * import { SnapshotDeletionService } from '@snapback-oss/sdk';\n *\n * const service = new SnapshotDeletionService(snapshotManager, confirmationService, {\n * logger: myLogger // optional\n * });\n *\n * // Delete single snapshot with confirmation\n * const result = await service.deleteSnapshot('snapshot-id');\n *\n * // Delete without confirmation\n * await service.deleteSnapshot('snapshot-id', { skipConfirmation: true });\n *\n * // Delete protected snapshot\n * await service.deleteSnapshot('snapshot-id', { unprotectFirst: true });\n *\n * // Bulk delete old snapshots\n * await service.deleteOlderThan(Date.now() - 30 * 24 * 60 * 60 * 1000, true);\n *\n * // Auto-cleanup\n * await service.autoCleanup({\n * enabled: true,\n * olderThanDays: 30,\n * keepProtected: true,\n * minimumSnapshots: 10\n * });\n * ```\n */\n\n/**\n * Options for snapshot deletion operations\n */\nexport interface DeletionOptions {\n\t/** Skip user confirmation dialog */\n\tskipConfirmation?: boolean;\n\t/** Unprotect snapshot before deletion (otherwise throws error) */\n\tunprotectFirst?: boolean;\n}\n\n/**\n * Result of a deletion operation\n */\nexport interface DeletionResult {\n\t/** Whether the operation completed successfully */\n\tsuccess: boolean;\n\t/** Number of snapshots deleted */\n\tdeletedCount: number;\n\t/** Error message if operation failed */\n\terror?: string;\n}\n\n/**\n * Configuration for automatic cleanup\n */\nexport interface AutoCleanupConfig {\n\t/** Whether auto-cleanup is enabled */\n\tenabled: boolean;\n\t/** Delete snapshots older than this many days */\n\tolderThanDays: number;\n\t/** Keep protected snapshots even if old */\n\tkeepProtected: boolean;\n\t/** Never delete below this minimum count */\n\tminimumSnapshots: number;\n}\n\n/**\n * Minimal snapshot interface for deletion service\n */\nexport interface DeletableSnapshot {\n\tid: string;\n\tname: string;\n\ttimestamp: number;\n\tisProtected: boolean;\n\t[key: string]: unknown;\n}\n\n/**\n * Minimal SnapshotManager interface for deletion operations\n */\nexport interface ISnapshotManagerForDeletion {\n\tget(id: string): Promise<DeletableSnapshot | undefined>;\n\tgetAll(): Promise<DeletableSnapshot[]>;\n\tdelete(id: string): Promise<void>;\n\tunprotect(id: string): Promise<void>;\n}\n\n/**\n * Confirmation service interface for user prompts\n */\nexport interface IConfirmationService {\n\tconfirm(message: string, detail?: string): Promise<boolean>;\n}\n\n/**\n * Options for SnapshotDeletionService\n */\nexport interface SnapshotDeletionServiceOptions {\n\t/** Logger instance for debug output */\n\tlogger?: ILogger;\n}\n\n/**\n * SnapshotDeletionService - Manages safe snapshot deletion operations\n */\nexport class SnapshotDeletionService {\n\tprivate readonly logger: ILogger;\n\n\tconstructor(\n\t\tprivate readonly snapshotManager: ISnapshotManagerForDeletion,\n\t\tprivate readonly confirmationService: IConfirmationService,\n\t\toptions: SnapshotDeletionServiceOptions = {},\n\t) {\n\t\tthis.logger = options.logger ?? new NoOpLogger();\n\t}\n\n\t/**\n\t * Delete a single snapshot with safety checks\n\t *\n\t * @param snapshotId - ID of snapshot to delete\n\t * @param options - Deletion options\n\t * @returns Deletion result with success status and count\n\t * @throws Error if snapshot is protected and unprotectFirst is false\n\t * @throws Error if snapshot does not exist\n\t *\n\t * @performance < 50ms including confirmation dialog\n\t */\n\tasync deleteSnapshot(snapshotId: string, options: DeletionOptions = {}): Promise<DeletionResult> {\n\t\t// 1. Validate snapshot exists\n\t\tconst snapshot = await this.snapshotManager.get(snapshotId);\n\t\tif (!snapshot) {\n\t\t\tthrow new Error(`Snapshot not found: ${snapshotId}`);\n\t\t}\n\n\t\t// 2. Safety check: Protected snapshot\n\t\tif (snapshot.isProtected && !options.unprotectFirst) {\n\t\t\tthrow new Error(\"Cannot delete protected snapshot. Set unprotectFirst=true to override.\");\n\t\t}\n\n\t\t// 3. Unprotect if requested\n\t\tif (options.unprotectFirst && snapshot.isProtected) {\n\t\t\tawait this.snapshotManager.unprotect(snapshotId);\n\t\t}\n\n\t\t// 4. Confirmation (if not skipped)\n\t\tif (!options.skipConfirmation) {\n\t\t\tconst confirmed = await this.confirmationService.confirm(\n\t\t\t\t`Delete snapshot \"${snapshot.name}\"?`,\n\t\t\t\t\"This action cannot be undone.\",\n\t\t\t);\n\n\t\t\tif (!confirmed) {\n\t\t\t\treturn {\n\t\t\t\t\tsuccess: false,\n\t\t\t\t\tdeletedCount: 0,\n\t\t\t\t\terror: \"User cancelled deletion\",\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\t\tawait this.snapshotManager.delete(snapshotId);\n\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t\tdeletedCount: 1,\n\t\t};\n\t}\n\n\t/**\n\t * Delete all snapshots older than the specified timestamp\n\t *\n\t * @param timestamp - Cutoff timestamp (milliseconds since epoch)\n\t * @param keepProtected - If true, skip protected snapshots\n\t * @returns Deletion result with count of deleted snapshots\n\t *\n\t * @performance < 500ms for 100 snapshots\n\t */\n\tasync deleteOlderThan(timestamp: number, keepProtected = true): Promise<DeletionResult> {\n\t\tconst allSnapshots = await this.snapshotManager.getAll();\n\n\t\t// Filter snapshots to delete\n\t\tconst toDelete = allSnapshots.filter((snapshot: DeletableSnapshot) => {\n\t\t\t// Skip if newer than cutoff\n\t\t\tif (snapshot.timestamp >= timestamp) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// Skip protected if requested\n\t\t\tif (keepProtected && snapshot.isProtected) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\treturn true;\n\t\t});\n\n\t\t// Delete snapshots\n\t\tlet deletedCount = 0;\n\t\tfor (const snapshot of toDelete) {\n\t\t\ttry {\n\t\t\t\t// Unprotect if needed\n\t\t\t\tif (snapshot.isProtected) {\n\t\t\t\t\tawait this.snapshotManager.unprotect(snapshot.id);\n\t\t\t\t}\n\n\t\t\t\tawait this.snapshotManager.delete(snapshot.id);\n\t\t\t\tdeletedCount++;\n\t\t\t} catch (error) {\n\t\t\t\t// Log error but continue with other deletions\n\t\t\t\tthis.logger.error(`Failed to delete snapshot ${snapshot.id}:`, toError(error));\n\t\t\t}\n\t\t}\n\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t\tdeletedCount,\n\t\t};\n\t}\n\n\t/**\n\t * Perform automatic cleanup based on configuration\n\t *\n\t * @param config - Auto-cleanup configuration\n\t * @returns Deletion result with count of deleted snapshots\n\t */\n\tasync autoCleanup(config: AutoCleanupConfig): Promise<DeletionResult> {\n\t\t// Check if enabled\n\t\tif (!config.enabled) {\n\t\t\treturn {\n\t\t\t\tsuccess: true,\n\t\t\t\tdeletedCount: 0,\n\t\t\t};\n\t\t}\n\n\t\tconst allSnapshots = await this.snapshotManager.getAll();\n\n\t\t// Check minimum snapshot count\n\t\tif (allSnapshots.length <= config.minimumSnapshots) {\n\t\t\treturn {\n\t\t\t\tsuccess: true,\n\t\t\t\tdeletedCount: 0,\n\t\t\t};\n\t\t}\n\n\t\t// Calculate cutoff timestamp\n\t\tconst cutoffTime = Date.now() - config.olderThanDays * 24 * 60 * 60 * 1000;\n\n\t\t// Filter eligible snapshots for deletion\n\t\tconst eligibleForDeletion = allSnapshots.filter((snapshot: DeletableSnapshot) => {\n\t\t\t// Skip if newer than cutoff\n\t\t\tif (snapshot.timestamp >= cutoffTime) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// Skip protected if configured\n\t\t\tif (config.keepProtected && snapshot.isProtected) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\treturn true;\n\t\t});\n\n\t\t// Sort by timestamp (oldest first)\n\t\teligibleForDeletion.sort((a: DeletableSnapshot, b: DeletableSnapshot) => a.timestamp - b.timestamp);\n\n\t\t// Calculate how many we can delete while respecting minimum\n\t\tconst maxToDelete = allSnapshots.length - config.minimumSnapshots;\n\t\tconst toDelete = eligibleForDeletion.slice(0, Math.max(0, maxToDelete));\n\n\t\t// Delete snapshots\n\t\tlet deletedCount = 0;\n\t\tfor (const snapshot of toDelete) {\n\t\t\ttry {\n\t\t\t\t// Unprotect if needed\n\t\t\t\tif (snapshot.isProtected) {\n\t\t\t\t\tawait this.snapshotManager.unprotect(snapshot.id);\n\t\t\t\t}\n\n\t\t\t\tawait this.snapshotManager.delete(snapshot.id);\n\t\t\t\tdeletedCount++;\n\t\t\t} catch (error) {\n\t\t\t\tthis.logger.error(`Auto-cleanup failed for ${snapshot.id}:`, toError(error));\n\t\t\t}\n\t\t}\n\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t\tdeletedCount,\n\t\t};\n\t}\n\n\t/**\n\t * Check if a snapshot can be safely deleted\n\t *\n\t * @param snapshot - Snapshot to check\n\t * @returns True if snapshot can be deleted without unprotectFirst\n\t *\n\t * @performance < 1ms\n\t */\n\tcanDelete(snapshot: DeletableSnapshot): boolean {\n\t\treturn !snapshot.isProtected;\n\t}\n}\n","/**\n * SnapshotIconStrategy.ts\n *\n * Platform-agnostic snapshot icon classification based on operation type.\n * Classifies snapshots into visual icons using priority-based detection.\n *\n * Features:\n * - Priority-based detection (protected > name keywords > file extensions)\n * - Pre-compiled regex patterns for performance\n * - Conventional commit prefix matching\n * - File type detection (test, config, docs, style, API, database)\n *\n * @module snapshot/SnapshotIconStrategy\n * @performance Icon classification < 1ms, 10000 classifications < 100ms\n *\n * @example\n * ```typescript\n * import { SnapshotIconStrategy } from '@snapback-oss/sdk';\n *\n * const strategy = new SnapshotIconStrategy();\n *\n * // Protected snapshot\n * strategy.classifyIcon({\n * name: 'Critical feature',\n * files: ['src/app.ts'],\n * isProtected: true\n * }); // { icon: 'lock', color: 'charts.red' }\n *\n * // Test file snapshot\n * strategy.classifyIcon({\n * name: 'Test changes',\n * files: ['src/app.test.ts'],\n * isProtected: false\n * }); // { icon: 'beaker', color: 'charts.purple' }\n * ```\n */\n\nimport * as path from \"node:path\";\n\n/**\n * Result of icon classification containing the icon name and theme color\n *\n * The icon names are VS Code codicon names (e.g., 'lock', 'beaker', 'file-code')\n * The color values are VS Code theme color IDs (e.g., 'charts.red', 'foreground')\n */\nexport interface IconResult {\n\t/** Codicon name (e.g., 'lock', 'beaker', 'file-code') */\n\ticon: string;\n\t/** Theme color ID (e.g., 'charts.red', 'charts.purple', 'foreground') */\n\tcolor: string;\n}\n\n/**\n * Metadata describing a snapshot for icon classification\n */\nexport interface SnapshotMetadata {\n\t/** Snapshot name/description */\n\tname: string;\n\t/** List of file paths included in the snapshot */\n\tfiles: string[];\n\t/** Whether the snapshot is protected from deletion */\n\tisProtected: boolean;\n}\n\n/**\n * Icon mapping configuration (internal)\n */\ninterface IconMapping {\n\ticon: string;\n\tcolor: string;\n}\n\n/**\n * SnapshotIconStrategy classifies snapshots into visual icons based on operation type.\n *\n * Classification priority:\n * 1. Protected status (highest priority)\n * 2. Name keyword matching (conventional commits, operation keywords)\n * 3. File extension detection\n * 4. Fallback default icon\n *\n * Performance: Icon classification < 1ms, 10000 classifications < 100ms\n */\nexport class SnapshotIconStrategy {\n\t/**\n\t * Icon mapping configuration with codicon names and theme colors\n\t */\n\tprivate static readonly ICON_MAP: Record<string, IconMapping> = {\n\t\t\"file-add\": { icon: \"file-add\", color: \"charts.green\" },\n\t\t\"file-delete\": { icon: \"trash\", color: \"charts.red\" },\n\t\t\"test-changes\": { icon: \"beaker\", color: \"charts.purple\" },\n\t\t\"update-deps\": { icon: \"package\", color: \"charts.yellow\" },\n\t\t\"config-change\": {\n\t\t\ticon: \"settings-gear\",\n\t\t\tcolor: \"debugConsole.warningForeground\",\n\t\t},\n\t\trefactor: { icon: \"symbol-class\", color: \"charts.blue\" },\n\t\t\"fix-bug\": { icon: \"bug\", color: \"charts.red\" },\n\t\t\"docs-update\": { icon: \"book\", color: \"charts.blue\" },\n\t\t\"style-changes\": { icon: \"paintcan\", color: \"charts.pink\" },\n\t\t\"api-changes\": { icon: \"server\", color: \"charts.yellow\" },\n\t\tdatabase: { icon: \"database\", color: \"charts.orange\" },\n\t\tprotected: { icon: \"lock\", color: \"charts.red\" },\n\t\tdefault: { icon: \"file-code\", color: \"foreground\" },\n\t};\n\n\t/**\n\t * Pre-compiled regex patterns for performance optimization\n\t */\n\tprivate static readonly TEST_FILE_REGEX = /\\.(test|spec)\\.(ts|js|tsx|jsx)$/i;\n\tprivate static readonly CONFIG_FILE_REGEX = /\\.(config\\.(ts|js)|eslintrc|prettierrc|env)/i;\n\tprivate static readonly STYLE_FILE_REGEX = /\\.(css|scss|less|sass)$/i;\n\tprivate static readonly DOC_FILE_REGEX = /\\.(md|mdx)$/i;\n\tprivate static readonly SQL_FILE_REGEX = /\\.sql$/i;\n\tprivate static readonly SCHEMA_FILE_REGEX = /schema\\.(sql|prisma|ts|js)/i;\n\tprivate static readonly API_FILE_REGEX = /\\.api\\./i;\n\n\t/**\n\t * Package lock file patterns\n\t */\n\tprivate static readonly PACKAGE_FILES = new Set([\n\t\t\"package.json\",\n\t\t\"package-lock.json\",\n\t\t\"yarn.lock\",\n\t\t\"pnpm-lock.yaml\",\n\t]);\n\n\t/**\n\t * Config file patterns\n\t */\n\tprivate static readonly CONFIG_FILES = new Set([\"tsconfig.json\", \".eslintrc.json\", \".prettierrc\"]);\n\n\t/**\n\t * Keyword sets for name-based classification\n\t */\n\tprivate static readonly BUG_FIX_KEYWORDS = [\"fix\", \"bugfix\"];\n\tprivate static readonly REFACTOR_KEYWORDS = [\"refactor\", \"refactored\"];\n\tprivate static readonly ADDITION_KEYWORDS = [\"added\", \"created\", \"file-add\"];\n\tprivate static readonly DELETION_KEYWORDS = [\"deleted\", \"removed\", \"file-delete\"];\n\tprivate static readonly DOC_KEYWORDS = [\"docs\", \"documentation\", \"docs-update\"];\n\tprivate static readonly STYLE_KEYWORDS = [\"style\", \"styling\", \"style-changes\"];\n\tprivate static readonly API_KEYWORDS = [\"api-changes\", \"endpoint\"];\n\tprivate static readonly DATABASE_KEYWORDS = [\"database\", \"db\", \"migration\", \"schema\"];\n\tprivate static readonly PACKAGE_KEYWORDS = [\"update-deps\", \"dependencies\"];\n\tprivate static readonly CONFIG_KEYWORDS = [\"config-change\"];\n\n\t/**\n\t * Classifies a snapshot into an appropriate icon based on its metadata.\n\t *\n\t * Detection logic priority order:\n\t * 1. Protected status (highest priority)\n\t * 2. Name keywords (bug fix, deletion, refactor, etc.)\n\t * 3. File extensions (test files, package files, config files, etc.)\n\t * 4. Fallback to default icon\n\t *\n\t * @param metadata - The snapshot metadata to classify\n\t * @returns IconResult containing the codicon name and theme color\n\t */\n\tclassifyIcon(metadata: SnapshotMetadata): IconResult {\n\t\t// Priority 1: Protected status (highest priority)\n\t\tif (metadata.isProtected) {\n\t\t\treturn SnapshotIconStrategy.ICON_MAP.protected;\n\t\t}\n\n\t\t// Priority 2: Name-based keyword matching\n\t\tconst nameResult = this.classifyByName(metadata.name);\n\t\tif (nameResult) {\n\t\t\treturn nameResult;\n\t\t}\n\n\t\t// Priority 3: File extension-based classification\n\t\tconst fileResult = this.classifyByFiles(metadata.files);\n\t\tif (fileResult) {\n\t\t\treturn fileResult;\n\t\t}\n\n\t\t// Priority 4: Fallback to default icon\n\t\treturn SnapshotIconStrategy.ICON_MAP.default;\n\t}\n\n\t/**\n\t * Get the icon mapping for a specific category\n\t *\n\t * @param category - The category key (e.g., 'protected', 'test-changes')\n\t * @returns IconMapping or undefined if not found\n\t */\n\tgetIconMapping(category: string): IconMapping | undefined {\n\t\treturn SnapshotIconStrategy.ICON_MAP[category];\n\t}\n\n\t/**\n\t * Get all available icon mappings\n\t *\n\t * @returns Record of all icon mappings\n\t */\n\tgetAllIconMappings(): Record<string, IconMapping> {\n\t\treturn { ...SnapshotIconStrategy.ICON_MAP };\n\t}\n\n\t/**\n\t * Classifies based on name keywords with priority ordering.\n\t *\n\t * @param name - The snapshot name\n\t * @returns IconResult if keyword matched, null otherwise\n\t */\n\tprivate classifyByName(name: string): IconResult | null {\n\t\tconst lowerName = name.toLowerCase();\n\n\t\t// Priority 0: Check for prefix patterns (conventional commit style)\n\t\tif (this.matchesPrefixKeyword(lowerName, SnapshotIconStrategy.ADDITION_KEYWORDS)) {\n\t\t\treturn SnapshotIconStrategy.ICON_MAP[\"file-add\"];\n\t\t}\n\t\tif (this.matchesPrefixKeyword(lowerName, SnapshotIconStrategy.BUG_FIX_KEYWORDS)) {\n\t\t\treturn SnapshotIconStrategy.ICON_MAP[\"fix-bug\"];\n\t\t}\n\t\tif (this.matchesPrefixKeyword(lowerName, SnapshotIconStrategy.DELETION_KEYWORDS)) {\n\t\t\treturn SnapshotIconStrategy.ICON_MAP[\"file-delete\"];\n\t\t}\n\t\tif (this.matchesPrefixKeyword(lowerName, SnapshotIconStrategy.REFACTOR_KEYWORDS)) {\n\t\t\treturn SnapshotIconStrategy.ICON_MAP.refactor;\n\t\t}\n\t\tif (this.matchesPrefixKeyword(lowerName, SnapshotIconStrategy.DOC_KEYWORDS)) {\n\t\t\treturn SnapshotIconStrategy.ICON_MAP[\"docs-update\"];\n\t\t}\n\t\tif (this.matchesPrefixKeyword(lowerName, SnapshotIconStrategy.STYLE_KEYWORDS)) {\n\t\t\treturn SnapshotIconStrategy.ICON_MAP[\"style-changes\"];\n\t\t}\n\t\tif (this.matchesPrefixKeyword(lowerName, SnapshotIconStrategy.CONFIG_KEYWORDS)) {\n\t\t\treturn SnapshotIconStrategy.ICON_MAP[\"config-change\"];\n\t\t}\n\n\t\t// Priority 1: Bug fixes\n\t\tif (this.matchesKeyword(lowerName, SnapshotIconStrategy.BUG_FIX_KEYWORDS)) {\n\t\t\treturn SnapshotIconStrategy.ICON_MAP[\"fix-bug\"];\n\t\t}\n\n\t\t// Priority 2: Deletions\n\t\tif (this.matchesKeyword(lowerName, SnapshotIconStrategy.DELETION_KEYWORDS)) {\n\t\t\treturn SnapshotIconStrategy.ICON_MAP[\"file-delete\"];\n\t\t}\n\n\t\t// Priority 3: Refactors\n\t\tif (this.matchesKeyword(lowerName, SnapshotIconStrategy.REFACTOR_KEYWORDS)) {\n\t\t\treturn SnapshotIconStrategy.ICON_MAP.refactor;\n\t\t}\n\n\t\t// Priority 4: API changes\n\t\tif (this.matchesKeyword(lowerName, SnapshotIconStrategy.API_KEYWORDS)) {\n\t\t\treturn SnapshotIconStrategy.ICON_MAP[\"api-changes\"];\n\t\t}\n\n\t\t// Priority 5: Database operations\n\t\tif (this.matchesKeyword(lowerName, SnapshotIconStrategy.DATABASE_KEYWORDS)) {\n\t\t\treturn SnapshotIconStrategy.ICON_MAP.database;\n\t\t}\n\n\t\t// Priority 6: Docs\n\t\tif (this.matchesKeyword(lowerName, SnapshotIconStrategy.DOC_KEYWORDS)) {\n\t\t\treturn SnapshotIconStrategy.ICON_MAP[\"docs-update\"];\n\t\t}\n\n\t\t// Priority 7: Style\n\t\tif (this.matchesKeyword(lowerName, SnapshotIconStrategy.STYLE_KEYWORDS)) {\n\t\t\treturn SnapshotIconStrategy.ICON_MAP[\"style-changes\"];\n\t\t}\n\n\t\t// Priority 8: Additions\n\t\tif (this.matchesKeyword(lowerName, SnapshotIconStrategy.ADDITION_KEYWORDS)) {\n\t\t\treturn SnapshotIconStrategy.ICON_MAP[\"file-add\"];\n\t\t}\n\n\t\t// Priority 9: Package\n\t\tif (this.matchesKeyword(lowerName, SnapshotIconStrategy.PACKAGE_KEYWORDS)) {\n\t\t\treturn SnapshotIconStrategy.ICON_MAP[\"update-deps\"];\n\t\t}\n\n\t\t// Priority 10: Config\n\t\tif (this.matchesKeyword(lowerName, SnapshotIconStrategy.CONFIG_KEYWORDS)) {\n\t\t\treturn SnapshotIconStrategy.ICON_MAP[\"config-change\"];\n\t\t}\n\n\t\treturn null;\n\t}\n\n\t/**\n\t * Classifies based on file extensions and paths.\n\t *\n\t * @param files - The list of file paths\n\t * @returns IconResult if file pattern matched, null otherwise\n\t */\n\tprivate classifyByFiles(files: string[]): IconResult | null {\n\t\tif (!files || files.length === 0) {\n\t\t\treturn null;\n\t\t}\n\n\t\t// Priority 1: Test files\n\t\tif (this.containsTestFiles(files)) {\n\t\t\treturn SnapshotIconStrategy.ICON_MAP[\"test-changes\"];\n\t\t}\n\n\t\t// Priority 2: Package files\n\t\tif (this.containsPackageFiles(files)) {\n\t\t\treturn SnapshotIconStrategy.ICON_MAP[\"update-deps\"];\n\t\t}\n\n\t\t// Priority 3: Config files\n\t\tif (this.containsConfigFiles(files)) {\n\t\t\treturn SnapshotIconStrategy.ICON_MAP[\"config-change\"];\n\t\t}\n\n\t\t// Priority 4: Documentation files\n\t\tif (this.containsDocFiles(files)) {\n\t\t\treturn SnapshotIconStrategy.ICON_MAP[\"docs-update\"];\n\t\t}\n\n\t\t// Priority 5: Style files\n\t\tif (this.containsStyleFiles(files)) {\n\t\t\treturn SnapshotIconStrategy.ICON_MAP[\"style-changes\"];\n\t\t}\n\n\t\t// Priority 6: Database files\n\t\tif (this.containsDatabaseFiles(files)) {\n\t\t\treturn SnapshotIconStrategy.ICON_MAP.database;\n\t\t}\n\n\t\t// Priority 7: API files\n\t\tif (this.containsApiFiles(files)) {\n\t\t\treturn SnapshotIconStrategy.ICON_MAP[\"api-changes\"];\n\t\t}\n\n\t\treturn null;\n\t}\n\n\t/**\n\t * Checks if name matches any keyword (case-insensitive).\n\t */\n\tprivate matchesKeyword(name: string, keywords: readonly string[]): boolean {\n\t\treturn keywords.some((k) => name.includes(k));\n\t}\n\n\t/**\n\t * Checks if name starts with keyword followed by colon (conventional commit format).\n\t */\n\tprivate matchesPrefixKeyword(name: string, keywords: readonly string[]): boolean {\n\t\treturn keywords.some((k) => name.startsWith(`${k}:`));\n\t}\n\n\t/**\n\t * Checks if files contain test files.\n\t */\n\tprivate containsTestFiles(files: string[]): boolean {\n\t\treturn files.some((file) => {\n\t\t\tconst fileName = path.basename(file);\n\t\t\tconst lowerFile = file.toLowerCase();\n\t\t\treturn SnapshotIconStrategy.TEST_FILE_REGEX.test(fileName) || lowerFile.includes(\"__tests__\");\n\t\t});\n\t}\n\n\t/**\n\t * Checks if files contain package lock files.\n\t */\n\tprivate containsPackageFiles(files: string[]): boolean {\n\t\treturn files.some((file) => {\n\t\t\tconst fileName = path.basename(file);\n\t\t\treturn SnapshotIconStrategy.PACKAGE_FILES.has(fileName);\n\t\t});\n\t}\n\n\t/**\n\t * Checks if files contain configuration files.\n\t */\n\tprivate containsConfigFiles(files: string[]): boolean {\n\t\treturn files.some((file) => {\n\t\t\tconst fileName = path.basename(file);\n\t\t\tconst lowerFile = file.toLowerCase();\n\t\t\treturn (\n\t\t\t\tSnapshotIconStrategy.CONFIG_FILE_REGEX.test(fileName) ||\n\t\t\t\tSnapshotIconStrategy.CONFIG_FILES.has(fileName) ||\n\t\t\t\tlowerFile.includes(\".env\")\n\t\t\t);\n\t\t});\n\t}\n\n\t/**\n\t * Checks if files contain documentation files.\n\t */\n\tprivate containsDocFiles(files: string[]): boolean {\n\t\treturn files.some((file) => {\n\t\t\tconst fileName = path.basename(file);\n\t\t\tconst lowerFile = file.toLowerCase();\n\t\t\treturn (\n\t\t\t\tSnapshotIconStrategy.DOC_FILE_REGEX.test(fileName) ||\n\t\t\t\tlowerFile.includes(\"/docs/\") ||\n\t\t\t\tlowerFile.startsWith(\"docs/\")\n\t\t\t);\n\t\t});\n\t}\n\n\t/**\n\t * Checks if files contain style files.\n\t */\n\tprivate containsStyleFiles(files: string[]): boolean {\n\t\treturn files.some((file) => {\n\t\t\tconst fileName = path.basename(file);\n\t\t\treturn SnapshotIconStrategy.STYLE_FILE_REGEX.test(fileName);\n\t\t});\n\t}\n\n\t/**\n\t * Checks if files contain database files.\n\t */\n\tprivate containsDatabaseFiles(files: string[]): boolean {\n\t\treturn files.some((file) => {\n\t\t\tconst fileName = path.basename(file);\n\t\t\tconst lowerFile = file.toLowerCase();\n\t\t\treturn (\n\t\t\t\tSnapshotIconStrategy.SQL_FILE_REGEX.test(fileName) ||\n\t\t\t\tSnapshotIconStrategy.SCHEMA_FILE_REGEX.test(fileName) ||\n\t\t\t\tlowerFile.includes(\"/migrations/\") ||\n\t\t\t\tlowerFile.startsWith(\"migrations/\") ||\n\t\t\t\tlowerFile.includes(\"/schema/\") ||\n\t\t\t\tlowerFile.startsWith(\"schema/\")\n\t\t\t);\n\t\t});\n\t}\n\n\t/**\n\t * Checks if files contain API files.\n\t */\n\tprivate containsApiFiles(files: string[]): boolean {\n\t\treturn files.some((file) => {\n\t\t\tconst fileName = path.basename(file);\n\t\t\tconst lowerFile = file.toLowerCase();\n\t\t\treturn (\n\t\t\t\tSnapshotIconStrategy.API_FILE_REGEX.test(fileName) ||\n\t\t\t\tlowerFile.includes(\"/api/\") ||\n\t\t\t\tlowerFile.startsWith(\"api/\")\n\t\t\t);\n\t\t});\n\t}\n}\n","import { exec } from \"node:child_process\";\nimport { promises as fs } from \"node:fs\";\nimport * as path from \"node:path\";\nimport { promisify } from \"node:util\";\nimport type { ILogger } from \"../core/session/interfaces\";\nimport { NoOpLogger } from \"../core/session/interfaces\";\n\nconst execAsync = promisify(exec);\n\n/**\n * File change status types matching git diff output\n */\nexport interface FileChange {\n\tpath: string;\n\tstatus: \"added\" | \"modified\" | \"deleted\";\n\tlinesAdded: number;\n\tlinesDeleted: number;\n}\n\n/**\n * Snapshot information for name generation\n */\nexport interface SnapshotInfo {\n\tfiles: FileChange[];\n\tworkspaceRoot: string;\n\t/** Optional user-provided context (e.g., 'bug-fix', 'credentials', or custom text) */\n\tuserContext?: string;\n}\n\n/**\n * Options for SnapshotNamingStrategy\n */\nexport interface SnapshotNamingStrategyOptions {\n\t/** Logger instance for debug output */\n\tlogger?: ILogger;\n\t/** Git command timeout in milliseconds (default: 5000) */\n\tgitTimeoutMs?: number;\n\t/** Maximum name length (default: 60) */\n\tmaxNameLength?: number;\n}\n\n/**\n * Multi-tier intelligent snapshot naming strategy\n *\n * Naming Tiers (fallback chain):\n * 1. Git Analysis: Parse git diff --name-status output\n * 2. File Operations: Detect patterns from extensions/paths\n * 3. Content Analysis: Count import/function/class changes\n * 4. Fallback: Line count summary\n *\n * Performance: < 50ms for name generation\n *\n * @example\n * ```typescript\n * import { SnapshotNamingStrategy } from '@snapback-oss/sdk';\n *\n * const strategy = new SnapshotNamingStrategy('/path/to/workspace', {\n * logger: myLogger // optional\n * });\n *\n * const name = await strategy.generateName({\n * files: [{ path: 'src/auth.ts', status: 'modified', linesAdded: 10, linesDeleted: 5 }],\n * workspaceRoot: '/path/to/workspace'\n * });\n * // Returns: \"Modified auth.ts\" or \"Updated 3 imports\" etc.\n * ```\n */\nexport class SnapshotNamingStrategy {\n\tprivate readonly workspaceRoot: string;\n\tprivate readonly gitTimeoutMs: number;\n\tprivate readonly maxNameLength: number;\n\tprivate readonly logger: ILogger;\n\n\tconstructor(workspaceRoot: string, options: SnapshotNamingStrategyOptions = {}) {\n\t\tthis.workspaceRoot = workspaceRoot;\n\t\tthis.logger = options.logger ?? new NoOpLogger();\n\t\tthis.gitTimeoutMs = options.gitTimeoutMs ?? 5000;\n\t\tthis.maxNameLength = options.maxNameLength ?? 60;\n\t}\n\n\t/**\n\t * Generates a snapshot name using multi-tier fallback strategy\n\t *\n\t * @param info - Snapshot information containing file changes\n\t * @returns Promise resolving to a descriptive snapshot name\n\t */\n\tasync generateName(info: SnapshotInfo): Promise<string> {\n\t\t// Early exit for empty file list\n\t\tif (info.files.length === 0) {\n\t\t\treturn \"No changes\";\n\t\t}\n\n\t\t// Generate base name using existing intelligent strategy\n\t\tlet baseName: string;\n\n\t\t// Tier 1: Git-based naming\n\t\tconst gitName = await this.tryGitNaming(info);\n\t\tif (gitName) {\n\t\t\tbaseName = gitName;\n\t\t} else {\n\t\t\t// Tier 2: File operation pattern detection\n\t\t\tconst fileOpName = this.tryFileOperationNaming(info);\n\t\t\tif (fileOpName) {\n\t\t\t\tbaseName = fileOpName;\n\t\t\t} else {\n\t\t\t\t// Tier 3: Content analysis\n\t\t\t\tconst contentName = await this.tryContentAnalysisNaming(info);\n\t\t\t\tif (contentName) {\n\t\t\t\t\tbaseName = contentName;\n\t\t\t\t} else {\n\t\t\t\t\t// Tier 4: Fallback to line counts\n\t\t\t\t\tbaseName = this.fallbackNaming(info);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// If user provided context, prepend it (Conventional Commits style)\n\t\tif (info.userContext) {\n\t\t\tconst prefix = this.formatUserContext(info.userContext);\n\t\t\treturn `${prefix}: ${baseName}`;\n\t\t}\n\n\t\treturn baseName;\n\t}\n\n\t/**\n\t * Tier 1: Git-based naming\n\t * Attempts to use actual git commands to generate names.\n\t * Returns null if git is unavailable or no git repo exists.\n\t */\n\tprivate async tryGitNaming(info: SnapshotInfo): Promise<string | null> {\n\t\ttry {\n\t\t\t// Check if we're in a git repository\n\t\t\tconst isGitRepo = await this.execGit([\"rev-parse\", \"--git-dir\"]);\n\t\t\tif (!isGitRepo) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\t// Try to get actual git status\n\t\t\tconst gitStatus = await this.execGit([\"status\", \"--porcelain\"]);\n\t\t\tif (!gitStatus) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\t// If we have git info, generate git-style names\n\t\t\tif (info.files.length === 1) {\n\t\t\t\tconst file = info.files[0];\n\t\t\t\treturn this.generateSingleFileGitName(file.status, file.path);\n\t\t\t}\n\n\t\t\treturn this.generateMultiFileGitName(info.files);\n\t\t} catch (_error) {\n\t\t\t// Git operation failed, fall through to next tier\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t/**\n\t * Tier 2: File operation pattern detection\n\t * Detects test files, configs, dependencies with priority ordering\n\t */\n\tprivate tryFileOperationNaming(info: SnapshotInfo): string | null {\n\t\tconst files = info.files;\n\n\t\t// Priority 1: Check for test files (highest priority)\n\t\tconst testFiles = files.filter((f) => this.isTestFile(f.path));\n\t\tif (testFiles.length > 0 && testFiles.length === files.length) {\n\t\t\treturn `Updated ${testFiles.length} test${testFiles.length > 1 ? \"s\" : \"\"}`;\n\t\t}\n\n\t\t// Priority 2: Check for dependency files\n\t\tconst dependencyFiles = files.filter((f) => this.isDependencyFile(f.path));\n\t\tif (dependencyFiles.length > 0) {\n\t\t\treturn \"Updated dependencies\";\n\t\t}\n\n\t\t// Priority 3: Check for config files (all files must be configs)\n\t\tconst configFiles = files.filter((f) => this.isConfigFile(f.path));\n\t\tif (configFiles.length > 0 && configFiles.length === files.length) {\n\t\t\treturn `Modified ${configFiles.length} config${configFiles.length > 1 ? \"s\" : \"\"}`;\n\t\t}\n\n\t\t// Priority 4: Mixed types with test files - prioritize test detection\n\t\tif (testFiles.length > 0 && testFiles.length < files.length) {\n\t\t\treturn `Updated ${testFiles.length} test${testFiles.length > 1 ? \"s\" : \"\"}`;\n\t\t}\n\n\t\treturn null;\n\t}\n\n\t/**\n\t * Tier 3: Content analysis\n\t * Detects refactoring patterns, structure changes, and import modifications\n\t */\n\tprivate async tryContentAnalysisNaming(info: SnapshotInfo): Promise<string | null> {\n\t\ttry {\n\t\t\t// Count both imports and structure changes\n\t\t\tconst importCount = await this.countImportChanges(info.files);\n\t\t\tconst structureCount = await this.countStructureChanges(info.files);\n\n\t\t\t// Priority 1: Import changes (simpler, more specific)\n\t\t\tif (importCount > 0 && structureCount === 0) {\n\t\t\t\treturn `Updated ${importCount} import${importCount > 1 ? \"s\" : \"\"}`;\n\t\t\t}\n\n\t\t\t// Priority 2: Refactoring detection - multiple files with significant structure changes\n\t\t\tif (structureCount > 3 && info.files.length > 1) {\n\t\t\t\tconst commonDir = this.findCommonDirectory(info.files);\n\t\t\t\tconst moduleName = this.extractModuleName(commonDir, info.files);\n\t\t\t\treturn `Refactored ${moduleName} module (${info.files.length} files)`;\n\t\t\t}\n\n\t\t\t// Priority 3: Single file refactoring with many structure changes\n\t\t\tif (structureCount >= 3 && info.files.length === 1) {\n\t\t\t\tconst dir = path.dirname(info.files[0].path);\n\t\t\t\tconst moduleName = this.extractModuleName(dir, info.files);\n\t\t\t\treturn `Refactored ${moduleName} (${structureCount} changes)`;\n\t\t\t}\n\n\t\t\t// Priority 4: Import changes even with some structure changes\n\t\t\tif (importCount > 0) {\n\t\t\t\treturn `Updated ${importCount} import${importCount > 1 ? \"s\" : \"\"}`;\n\t\t\t}\n\n\t\t\treturn null;\n\t\t} catch (_error) {\n\t\t\t// Content analysis failed, fall through\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t/**\n\t * Tier 4: Fallback naming\n\t * Uses git-style format for code files, line count for unknown/non-code files\n\t */\n\tprivate fallbackNaming(info: SnapshotInfo): string {\n\t\tconst totalLines = info.files.reduce((sum, file) => sum + file.linesAdded + file.linesDeleted, 0);\n\t\tconst fileCount = info.files.length;\n\n\t\t// Check if files are code files (should use git-style format)\n\t\tconst allCodeFiles = info.files.every((f) => this.isCodeFile(f.path));\n\n\t\t// Single file with unknown extension: use line count format\n\t\tif (info.files.length === 1) {\n\t\t\tconst file = info.files[0];\n\n\t\t\t// Use line count format for non-code files\n\t\t\tif (!this.isCodeFile(file.path)) {\n\t\t\t\treturn `Modified 1 file (${totalLines} lines)`;\n\t\t\t}\n\n\t\t\t// Use git-style format for code files\n\t\t\treturn this.generateSingleFileGitName(file.status, file.path);\n\t\t}\n\n\t\t// Multiple files: if all non-code files, use line count\n\t\tif (!allCodeFiles) {\n\t\t\treturn `Modified ${fileCount} files (${totalLines} lines)`;\n\t\t}\n\n\t\t// Multiple code files: use git-style format\n\t\tconst hasAdditions = info.files.some((f) => f.status === \"added\");\n\t\tconst hasModifications = info.files.some((f) => f.status === \"modified\");\n\t\tconst hasDeletions = info.files.some((f) => f.status === \"deleted\");\n\n\t\tif (hasAdditions || hasModifications || hasDeletions) {\n\t\t\treturn this.generateMultiFileGitName(info.files);\n\t\t}\n\n\t\t// Final fallback: line count summary\n\t\treturn `Modified ${fileCount} files (${totalLines} lines)`;\n\t}\n\n\t/**\n\t * Execute git command with error handling\n\t */\n\tprivate async execGit(args: string[]): Promise<string | null> {\n\t\ttry {\n\t\t\tconst { stdout } = await execAsync(`git ${args.join(\" \")}`, {\n\t\t\t\tcwd: this.workspaceRoot,\n\t\t\t\ttimeout: this.gitTimeoutMs,\n\t\t\t});\n\t\t\treturn stdout.trim();\n\t\t} catch (_error) {\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t/**\n\t * Generate single-file git-style name\n\t */\n\tprivate generateSingleFileGitName(status: \"added\" | \"modified\" | \"deleted\", filePath: string): string {\n\t\tconst basename = path.basename(filePath);\n\t\tconst sanitizedName = this.sanitizeFilename(basename);\n\t\tconst truncatedName = this.truncatePath(sanitizedName, this.maxNameLength - 20);\n\n\t\tswitch (status) {\n\t\t\tcase \"added\":\n\t\t\t\treturn `Added ${truncatedName}`;\n\t\t\tcase \"modified\":\n\t\t\t\treturn `Modified ${truncatedName}`;\n\t\t\tcase \"deleted\":\n\t\t\t\treturn `Deleted ${truncatedName}`;\n\t\t}\n\t}\n\n\t/**\n\t * Generate multi-file git-style name (e.g., \"3A 2M 1D in src/auth\")\n\t */\n\tprivate generateMultiFileGitName(files: FileChange[]): string {\n\t\tconst added = files.filter((f) => f.status === \"added\").length;\n\t\tconst modified = files.filter((f) => f.status === \"modified\").length;\n\t\tconst deleted = files.filter((f) => f.status === \"deleted\").length;\n\n\t\tconst parts: string[] = [];\n\t\tif (added > 0) {\n\t\t\tparts.push(`${added}A`);\n\t\t}\n\t\tif (modified > 0) {\n\t\t\tparts.push(`${modified}M`);\n\t\t}\n\t\tif (deleted > 0) {\n\t\t\tparts.push(`${deleted}D`);\n\t\t}\n\n\t\tconst statusSummary = parts.join(\" \");\n\t\tconst commonDir = this.findCommonDirectory(files);\n\t\tconst dirName = commonDir ? this.getRelativeDirectory(commonDir) : \"workspace\";\n\n\t\treturn `${statusSummary} in ${dirName}`;\n\t}\n\n\t/**\n\t * Find common directory path for multiple files\n\t */\n\tprivate findCommonDirectory(files: FileChange[]): string {\n\t\tif (files.length === 0) {\n\t\t\treturn \"\";\n\t\t}\n\t\tif (files.length === 1) {\n\t\t\treturn path.dirname(files[0].path);\n\t\t}\n\n\t\tconst dirPaths = files.map((f) => path.dirname(f.path));\n\t\tconst segmentArrays = dirPaths.map((dir) => dir.split(path.sep));\n\t\tconst firstSegments = segmentArrays[0];\n\t\tconst commonSegments: string[] = [];\n\n\t\tfor (let i = 0; i < firstSegments.length; i++) {\n\t\t\tconst segment = firstSegments[i];\n\t\t\tconst allMatch = segmentArrays.every((segments) => segments[i] === segment);\n\t\t\tif (allMatch) {\n\t\t\t\tcommonSegments.push(segment);\n\t\t\t} else {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\treturn commonSegments.length === 0 ? \"\" : commonSegments.join(path.sep);\n\t}\n\n\t/**\n\t * Get relative directory name from absolute path\n\t */\n\tprivate getRelativeDirectory(absolutePath: string): string {\n\t\tlet relative = path.relative(this.workspaceRoot, absolutePath);\n\n\t\tif (relative) {\n\t\t\trelative = relative.split(path.sep).join(\"/\");\n\t\t\tif (relative.startsWith(\"./\")) {\n\t\t\t\trelative = relative.substring(2);\n\t\t\t}\n\t\t\tif (relative && relative !== \".\" && !relative.startsWith(\"..\")) {\n\t\t\t\treturn relative;\n\t\t\t}\n\t\t}\n\n\t\treturn \".\";\n\t}\n\n\t/**\n\t * Extract meaningful module name from directory path\n\t */\n\tprivate extractModuleName(dirPath: string, files: FileChange[]): string {\n\t\tif (!dirPath) {\n\t\t\treturn \"module\";\n\t\t}\n\n\t\tconst basename = path.basename(dirPath);\n\n\t\tif (basename.includes(\"tmp\") || basename.includes(\"test-\") || basename.startsWith(\".\")) {\n\t\t\tif (files.length > 0) {\n\t\t\t\tconst firstFile = files[0].path;\n\t\t\t\tconst parts = firstFile.split(path.sep).filter((p) => p && p !== \".\");\n\n\t\t\t\tfor (let i = parts.length - 2; i >= 0; i--) {\n\t\t\t\t\tconst part = parts[i];\n\t\t\t\t\tif (!part.includes(\"tmp\") && !part.includes(\"test-\") && !part.startsWith(\".\") && part.length > 2) {\n\t\t\t\t\t\treturn part;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn \"module\";\n\t\t}\n\n\t\treturn basename;\n\t}\n\n\t/**\n\t * Detect if file is a code file (has known code extension)\n\t */\n\tprivate isCodeFile(filePath: string): boolean {\n\t\tconst basename = path.basename(filePath);\n\t\tconst ext = path.extname(filePath).toLowerCase();\n\n\t\tconst knownCodeFiles = [\"Dockerfile\", \"Makefile\", \"README.md\", \".gitignore\"];\n\t\tif (knownCodeFiles.some((known) => basename === known || basename.endsWith(known))) {\n\t\t\treturn true;\n\t\t}\n\n\t\tif (ext && !this.isKnownCodeExtension(ext)) {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Check if extension is a known code file extension\n\t */\n\tprivate isKnownCodeExtension(ext: string): boolean {\n\t\tconst codeExtensions = [\n\t\t\t\".ts\",\n\t\t\t\".js\",\n\t\t\t\".tsx\",\n\t\t\t\".jsx\",\n\t\t\t\".py\",\n\t\t\t\".java\",\n\t\t\t\".c\",\n\t\t\t\".cpp\",\n\t\t\t\".h\",\n\t\t\t\".hpp\",\n\t\t\t\".go\",\n\t\t\t\".rs\",\n\t\t\t\".rb\",\n\t\t\t\".php\",\n\t\t\t\".cs\",\n\t\t\t\".swift\",\n\t\t\t\".kt\",\n\t\t\t\".scala\",\n\t\t\t\".html\",\n\t\t\t\".css\",\n\t\t\t\".scss\",\n\t\t\t\".sass\",\n\t\t\t\".less\",\n\t\t\t\".json\",\n\t\t\t\".xml\",\n\t\t\t\".yaml\",\n\t\t\t\".yml\",\n\t\t\t\".md\",\n\t\t\t\".config\",\n\t\t];\n\t\treturn codeExtensions.includes(ext);\n\t}\n\n\t/**\n\t * Detect if file is a test file\n\t */\n\tprivate isTestFile(filePath: string): boolean {\n\t\tconst basename = path.basename(filePath);\n\t\tconst dirname = path.dirname(filePath);\n\n\t\tif (basename.endsWith(\".test.ts\") || basename.endsWith(\".test.js\")) {\n\t\t\treturn true;\n\t\t}\n\t\tif (basename.endsWith(\".spec.ts\") || basename.endsWith(\".spec.js\")) {\n\t\t\treturn true;\n\t\t}\n\t\tif (dirname.includes(\"__tests__\")) {\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\t}\n\n\t/**\n\t * Detect if file is package.json or dependency-related\n\t */\n\tprivate isDependencyFile(filePath: string): boolean {\n\t\tconst basename = path.basename(filePath);\n\t\treturn (\n\t\t\tbasename === \"package.json\" ||\n\t\t\tbasename === \"package-lock.json\" ||\n\t\t\tbasename === \"pnpm-lock.yaml\" ||\n\t\t\tbasename === \"yarn.lock\"\n\t\t);\n\t}\n\n\t/**\n\t * Detect if file is configuration\n\t */\n\tprivate isConfigFile(filePath: string): boolean {\n\t\tconst basename = path.basename(filePath);\n\n\t\tif (basename.includes(\".config.\")) {\n\t\t\treturn true;\n\t\t}\n\t\tif (basename.includes(\"rc\")) {\n\t\t\treturn true;\n\t\t}\n\t\tif (basename.startsWith(\".env\")) {\n\t\t\treturn true;\n\t\t}\n\n\t\tconst configFiles = [\"tsconfig.json\", \"jsconfig.json\"];\n\t\treturn configFiles.includes(basename);\n\t}\n\n\t/**\n\t * Count import changes via regex\n\t */\n\tprivate async countImportChanges(files: FileChange[]): Promise<number> {\n\t\tlet importCount = 0;\n\t\tconst importRegex = /import\\s+.*from|require\\(/g;\n\n\t\tfor (const file of files) {\n\t\t\ttry {\n\t\t\t\tconst content = await fs.readFile(file.path, \"utf-8\");\n\t\t\t\tconst matches = content.match(importRegex);\n\t\t\t\tif (matches) {\n\t\t\t\t\timportCount += matches.length;\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tthis.logger.debug(\"Failed to read file for import analysis\", {\n\t\t\t\t\tpath: file.path,\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\treturn importCount;\n\t}\n\n\t/**\n\t * Count function/class changes via regex\n\t */\n\tprivate async countStructureChanges(files: FileChange[]): Promise<number> {\n\t\tlet structureCount = 0;\n\t\tconst structureRegex = /function\\s+\\w+|class\\s+\\w+|const\\s+\\w+\\s*=\\s*\\(/g;\n\n\t\tfor (const file of files) {\n\t\t\ttry {\n\t\t\t\tconst content = await fs.readFile(file.path, \"utf-8\");\n\t\t\t\tconst matches = content.match(structureRegex);\n\t\t\t\tif (matches) {\n\t\t\t\t\tstructureCount += matches.length;\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tthis.logger.debug(\"Failed to read file for structure analysis\", {\n\t\t\t\t\tpath: file.path,\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\treturn structureCount;\n\t}\n\n\t/**\n\t * Truncate long file paths for display\n\t */\n\tprivate truncatePath(filePath: string, maxLength: number): string {\n\t\tif (filePath.length <= maxLength) {\n\t\t\treturn filePath;\n\t\t}\n\t\tconst ellipsis = \"...\";\n\t\treturn filePath.substring(0, maxLength - ellipsis.length) + ellipsis;\n\t}\n\n\t/**\n\t * Sanitize filenames with special characters\n\t */\n\tprivate sanitizeFilename(filename: string): string {\n\t\treturn filename\n\t\t\t.replace(/[@#$]+/g, \" \")\n\t\t\t.replace(/\\s+/g, \" \")\n\t\t\t.trim();\n\t}\n\n\t/**\n\t * Format user-provided context into a snapshot name prefix\n\t */\n\tprivate formatUserContext(context: string): string {\n\t\tconst presetMap: Record<string, string> = {\n\t\t\t\"bug-fix\": \"fix\",\n\t\t\tcredentials: \"chore\",\n\t\t\trefactor: \"refactor\",\n\t\t\ttesting: \"test\",\n\t\t};\n\n\t\tif (presetMap[context]) {\n\t\t\treturn presetMap[context];\n\t\t}\n\n\t\tconst cleaned = context\n\t\t\t.toLowerCase()\n\t\t\t.replace(/[^a-z0-9\\s-]/g, \"\")\n\t\t\t.replace(/\\s+/g, \"-\")\n\t\t\t.trim();\n\n\t\tconst maxLength = 20;\n\t\tif (cleaned.length > maxLength) {\n\t\t\treturn cleaned.substring(0, maxLength);\n\t\t}\n\n\t\treturn cleaned || \"update\";\n\t}\n}\n","import { gunzipSync, gzipSync } from \"node:zlib\";\nimport type { Database } from \"better-sqlite3\";\nimport { StorageConnectionError, StorageError, StorageTransactionError } from \"./StorageErrors\";\n\n// Type definitions for better-sqlite3\ntype DatabaseInstance = Database;\ntype DatabaseConstructor = new (...args: any[]) => DatabaseInstance;\ntype DatabaseOptions = ConstructorParameters<DatabaseConstructor>[1];\n\n// Helper functions for compression\nfunction compress(content: string): Buffer {\n\treturn gzipSync(Buffer.from(content, \"utf-8\"), { level: 9 });\n}\n\n// UUID generation function\nfunction generateId(): string {\n\t// Generate ID with only lowercase letters and numbers\n\tconst timestampPart = Date.now().toString(36);\n\tconst randomPart = Math.random().toString(36).slice(2, 7).toLowerCase();\n\treturn `snapshot_${timestampPart}_${randomPart}`;\n}\n\n// Type for queued operations\ninterface QueuedOperation<T> {\n\tid: string;\n\toperationName: string;\n\tpriority: number;\n\toperation: () => Promise<T>;\n\tresolve: (value: T | PromiseLike<T>) => void;\n\treject: (reason?: any) => void;\n\ttimestamp: number;\n}\n\n// Simple connection pool for read operations\nclass ConnectionPool {\n\tprivate connections: DatabaseInstance[] = [];\n\tprivate availableConnections: DatabaseInstance[] = [];\n\tprivate maxConnections: number;\n\n\tconstructor(\n\t\tprivate dbPath: string,\n\t\tprivate dbOptions: DatabaseOptions | undefined,\n\t\tsize = 4,\n\t) {\n\t\tthis.maxConnections = size;\n\t}\n\n\t// Get a connection from the pool\n\tasync getConnection(): Promise<DatabaseInstance> {\n\t\t// Try to get an available connection\n\t\tif (this.availableConnections.length > 0) {\n\t\t\tconst connection = this.availableConnections.pop();\n\t\t\tif (connection) {\n\t\t\t\treturn connection;\n\t\t\t}\n\t\t}\n\n\t\t// Create a new connection if we haven't reached the limit\n\t\tif (this.connections.length < this.maxConnections) {\n\t\t\tconst db = await createDatabaseInstance(this.dbPath, this.dbOptions);\n\t\t\t// Enable WAL mode for the read connection\n\t\t\tdb.pragma(\"journal_mode = WAL\");\n\t\t\tthis.connections.push(db);\n\t\t\treturn db;\n\t\t}\n\n\t\t// If we've reached the limit, reuse an existing connection\n\t\t// This is a simple round-robin approach\n\t\tconst db = this.connections.shift();\n\t\tif (db) {\n\t\t\tthis.connections.push(db);\n\t\t\treturn db;\n\t\t}\n\n\t\t// Fallback - create a new connection\n\t\treturn await createDatabaseInstance(this.dbPath, this.dbOptions);\n\t}\n\n\t// Return a connection to the pool\n\treleaseConnection(_db: DatabaseInstance): void {\n\t\t// In this simple implementation, we don't actually release connections\n\t\t// but keep them in the pool for reuse\n\t}\n\n\t// Close all connections in the pool\n\tclose(): void {\n\t\tfor (const db of this.connections) {\n\t\t\ttry {\n\t\t\t\tdb.close();\n\t\t\t} catch (_error) {\n\t\t\t\t// Ignore errors when closing\n\t\t\t}\n\t\t}\n\t\tthis.connections = [];\n\t\tthis.availableConnections = [];\n\t}\n}\n\nlet cachedDatabaseConstructor: DatabaseConstructor | null = null;\nlet cachedDatabaseError: Error | null = null;\n\nconst tryLoadBetterSqlite3 = async (): Promise<DatabaseConstructor | null> => {\n\tif (cachedDatabaseConstructor) {\n\t\treturn cachedDatabaseConstructor;\n\t}\n\n\tif (cachedDatabaseError) {\n\t\treturn null;\n\t}\n\n\ttry {\n\t\tconst requiredModule = await import(\"better-sqlite3\");\n\t\t// ESM imports return the default export\n\t\tconst ctor = requiredModule.default as DatabaseConstructor;\n\n\t\t// Verify the native binding can actually be instantiated (ABI compatibility)\n\t\ttry {\n\t\t\tconst probe = new ctor(\":memory:\");\n\t\t\tprobe.close();\n\t\t} catch (instantiationError: unknown) {\n\t\t\tcachedDatabaseError =\n\t\t\t\tinstantiationError instanceof Error ? instantiationError : new Error(String(instantiationError));\n\t\t\treturn null;\n\t\t}\n\n\t\tcachedDatabaseConstructor = ctor;\n\t\treturn cachedDatabaseConstructor;\n\t} catch (error) {\n\t\tcachedDatabaseError =\n\t\t\terror instanceof Error\n\t\t\t\t? error\n\t\t\t\t: new Error(typeof error === \"string\" ? error : \"Unknown error loading better-sqlite3\");\n\t\treturn null;\n\t}\n};\n\nconst isBetterSqlite3Available = async (): Promise<boolean> => (await tryLoadBetterSqlite3()) !== null;\n\nconst getBetterSqlite3LoadError = (): Error | null => cachedDatabaseError;\n\nconst requireDatabaseConstructor = async (): Promise<DatabaseConstructor> => {\n\tconst betterSqlite3 = await tryLoadBetterSqlite3();\n\tif (betterSqlite3) {\n\t\treturn betterSqlite3;\n\t}\n\n\t// better-sqlite3 is not available - build detailed error message\n\tconst errorMessage = cachedDatabaseError\n\t\t? `better-sqlite3: ${cachedDatabaseError.message}`\n\t\t: \"better-sqlite3: not installed or not compatible\";\n\n\tconst detailedMessage = `No SQLite implementation available. ${errorMessage}`;\n\tconst error = new StorageConnectionError(detailedMessage);\n\n\t// Attach detailed error info for better debugging\n\t(error as any).details = {\n\t\tbetterSqlite3Error: cachedDatabaseError?.message,\n\t};\n\n\tthrow error;\n};\n\nconst createDatabaseInstance = async (pathToDatabase: string, options?: DatabaseOptions): Promise<DatabaseInstance> => {\n\tconst DatabaseCtor = await requireDatabaseConstructor();\n\treturn new DatabaseCtor(pathToDatabase, options);\n};\n\n/**\n * StorageBroker - Single-writer coordinator for SQLite storage across processes\n *\n * This broker ensures only one process writes to the SQLite database at a time,\n * preventing corruption and ensuring data consistency across the VS Code extension,\n * MCP server, and CLI components.\n *\n * Key responsibilities:\n * - Queue write operations from multiple processes\n * - Execute writes sequentially with proper locking\n * - Handle contention with retry/backoff mechanisms\n * - Provide WAL mode for concurrent reads\n *\n * @example\n * ```typescript\n * const broker = new StorageBroker('/path/to/database.db');\n * await broker.initialize();\n *\n * // Queue a write operation\n * const result = await broker.createSnapshot({\n * name: 'test',\n * files: new Map([['file.ts', 'content']]),\n * metadata: {}\n * });\n * ```\n */\nexport class StorageBroker {\n\tprivate db: DatabaseInstance | null = null;\n\tprivate readConnectionPool: ConnectionPool | null = null;\n\tprivate initialized = false;\n\tprivate operationQueue: QueuedOperation<any>[] = [];\n\tprivate isProcessingQueue = false;\n\tprivate writerId: string;\n\n\tconstructor(private dbPath: string) {\n\t\t// Generate a unique writer ID for this process\n\t\tthis.writerId = `writer_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n\t}\n\n\t/**\n\t * Initialize the storage broker and database connection\n\t */\n\tasync initialize(): Promise<void> {\n\t\tif (this.initialized) {\n\t\t\treturn;\n\t\t}\n\n\t\ttry {\n\t\t\t// Create database connection\n\t\t\tthis.db = await createDatabaseInstance(this.dbPath);\n\n\t\t\t// Enable WAL mode for better performance and concurrency\n\t\t\tif (this.db && typeof (this.db as any).pragma === \"function\") {\n\t\t\t\t(this.db as any).pragma(\"journal_mode = WAL\");\n\t\t\t}\n\n\t\t\t// Create read connection pool for concurrent reads\n\t\t\tthis.readConnectionPool = new ConnectionPool(this.dbPath, undefined, 4);\n\n\t\t\t// Run migrations to ensure schema is up to date\n\t\t\tthis.runMigrations();\n\n\t\t\tthis.initialized = true;\n\t\t} catch (error) {\n\t\t\tif (error instanceof StorageConnectionError) {\n\t\t\t\t// Re-throw database connectivity errors with full details\n\t\t\t\tthrow error;\n\t\t\t}\n\n\t\t\tif (error instanceof Error) {\n\t\t\t\t// Determine which part of initialization failed for better DX\n\t\t\t\tconst message = error.message;\n\t\t\t\tlet specificError = \"Failed to initialize storage broker\";\n\n\t\t\t\tif (message.includes(\"sqlite\")) {\n\t\t\t\t\tspecificError = `Database initialization failed: ${message}`;\n\t\t\t\t}\n\n\t\t\t\tthrow new StorageError(specificError, \"STORAGE_BROKER_INIT_ERROR\", {\n\t\t\t\t\tcause: error,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tthrow new StorageError(\"Failed to initialize storage broker\", \"STORAGE_BROKER_INIT_ERROR\", {\n\t\t\t\tcause: error,\n\t\t\t});\n\t\t}\n\t}\n\n\t/**\n\t * Get the database instance\n\t * @returns The database instance, or null if not initialized\n\t * @public This is intentionally public to allow direct database access for advanced operations\n\t */\n\tgetDatabase(): DatabaseInstance | null {\n\t\treturn this.db;\n\t}\n\n\t/**\n\t * Run database migrations to ensure schema is up to date\n\t */\n\tprivate runMigrations(): void {\n\t\tif (!this.db) {\n\t\t\tthrow new StorageError(\"Database not initialized\", \"STORAGE_NOT_INITIALIZED\");\n\t\t}\n\n\t\tthis.db.exec(`\n CREATE TABLE IF NOT EXISTS snapshots (\n id TEXT PRIMARY KEY,\n name TEXT NOT NULL,\n timestamp INTEGER NOT NULL,\n parent_id TEXT,\n metadata TEXT,\n FOREIGN KEY (parent_id) REFERENCES snapshots(id)\n );\n\n CREATE TABLE IF NOT EXISTS file_changes (\n snapshot_id TEXT NOT NULL,\n file_path TEXT NOT NULL,\n action TEXT CHECK(action IN ('add','modify','delete')),\n diff BLOB,\n storage_type TEXT DEFAULT 'diff',\n content_size INTEGER,\n PRIMARY KEY (snapshot_id, file_path),\n FOREIGN KEY (snapshot_id) REFERENCES snapshots(id) ON DELETE CASCADE\n );\n\n -- Add sessions table for session-aware snapshots\n CREATE TABLE IF NOT EXISTS sessions (\n id TEXT PRIMARY KEY,\n started_at INTEGER NOT NULL,\n ended_at INTEGER NOT NULL,\n reason TEXT NOT NULL,\n summary TEXT,\n tags TEXT,\n metadata TEXT\n );\n\n CREATE TABLE IF NOT EXISTS session_files (\n session_id TEXT NOT NULL,\n snapshot_id TEXT NOT NULL,\n file_path TEXT NOT NULL,\n added_count INTEGER DEFAULT 0,\n deleted_count INTEGER DEFAULT 0,\n PRIMARY KEY (session_id, file_path),\n FOREIGN KEY (session_id) REFERENCES sessions(id) ON DELETE CASCADE,\n FOREIGN KEY (snapshot_id) REFERENCES snapshots(id) ON DELETE CASCADE\n );\n\n -- Add queue persistence table for operation queuing\n CREATE TABLE IF NOT EXISTS queued_operations (\n id TEXT PRIMARY KEY,\n operation_name TEXT NOT NULL,\n priority INTEGER NOT NULL,\n created_at INTEGER NOT NULL,\n data BLOB,\n status TEXT CHECK(status IN ('pending','processing','completed','failed')) DEFAULT 'pending'\n );\n\n -- Single-column indexes\n CREATE INDEX IF NOT EXISTS idx_snapshot_timestamp ON snapshots(timestamp);\n CREATE INDEX IF NOT EXISTS idx_snapshot_parent ON snapshots(parent_id);\n CREATE INDEX IF NOT EXISTS idx_file_path ON file_changes(file_path);\n CREATE INDEX IF NOT EXISTS idx_session_started_at ON sessions(started_at);\n CREATE INDEX IF NOT EXISTS idx_session_ended_at ON sessions(ended_at);\n CREATE INDEX IF NOT EXISTS idx_session_reason ON sessions(reason);\n CREATE INDEX IF NOT EXISTS idx_queued_operations_priority ON queued_operations(priority);\n CREATE INDEX IF NOT EXISTS idx_queued_operations_status ON queued_operations(status);\n CREATE INDEX IF NOT EXISTS idx_queued_operations_created_at ON queued_operations(created_at);\n\n -- Covering indexes for common queries\n CREATE INDEX IF NOT EXISTS idx_snapshots_list\n ON snapshots(timestamp DESC, id, name);\n\n CREATE INDEX IF NOT EXISTS idx_file_changes_snapshot\n ON file_changes(snapshot_id, file_path, action);\n\n CREATE INDEX IF NOT EXISTS idx_file_changes_file_covering\n ON file_changes(file_path, snapshot_id)\n WHERE action != 'delete';\n\n -- Covering indexes for session queries\n CREATE INDEX IF NOT EXISTS idx_sessions_list\n ON sessions(ended_at DESC, id, reason);\n\n CREATE INDEX IF NOT EXISTS idx_session_files_session\n ON session_files(session_id, file_path);\n\n -- Covering index for queued operations\n CREATE INDEX IF NOT EXISTS idx_queued_operations_list\n ON queued_operations(priority ASC, created_at ASC, id, status)\n WHERE status = 'pending';\n\n -- Add writers_lock table for single-writer discipline across processes\n CREATE TABLE IF NOT EXISTS writers_lock (\n id INTEGER PRIMARY KEY CHECK (id = 1),\n writer_id TEXT,\n acquired_at INTEGER,\n expires_at INTEGER\n );\n\n -- Initialize the lock row if it doesn't exist\n INSERT OR IGNORE INTO writers_lock (id, writer_id, acquired_at, expires_at)\n VALUES (1, NULL, 0, 0);\n `);\n\t}\n\n\t/**\n\t * Close the storage broker and database connection\n\t */\n\tasync close(): Promise<void> {\n\t\ttry {\n\t\t\t// Process any remaining operations in the queue before closing\n\t\t\tawait this.processQueue();\n\n\t\t\tif (this.db) {\n\t\t\t\tthis.db.close();\n\t\t\t\tthis.db = null;\n\t\t\t}\n\n\t\t\tif (this.readConnectionPool) {\n\t\t\t\tthis.readConnectionPool.close();\n\t\t\t\tthis.readConnectionPool = null;\n\t\t\t}\n\n\t\t\tthis.initialized = false;\n\t\t} catch (error) {\n\t\t\tthrow new StorageError(\"Failed to close storage broker\", \"STORAGE_BROKER_CLOSE_ERROR\", { cause: error });\n\t\t}\n\t}\n\n\t/**\n\t * Get a read connection from the pool for concurrent read operations\n\t */\n\tprivate async getReadConnection(): Promise<DatabaseInstance> {\n\t\tif (!this.readConnectionPool) {\n\t\t\tthrow new StorageError(\"Read connection pool not initialized\", \"STORAGE_NOT_INITIALIZED\");\n\t\t}\n\t\treturn await this.readConnectionPool.getConnection();\n\t}\n\n\t/**\n\t * Check if better-sqlite3 is available\n\t */\n\tstatic async isAvailable(): Promise<boolean> {\n\t\treturn await isBetterSqlite3Available();\n\t}\n\n\t/**\n\t * Get the error that occurred when loading better-sqlite3, if any\n\t */\n\tstatic getLoadError(): Error | null {\n\t\treturn getBetterSqlite3LoadError();\n\t}\n\n\t/**\n\t * Attempt to acquire a distributed lock for writing\n\t * @param writerId Unique identifier for this writer process\n\t * @param timeoutMs Maximum time to wait for the lock in milliseconds\n\t * @returns True if lock was acquired, false otherwise\n\t */\n\tprivate async acquireLock(writerId: string, timeoutMs = 5000): Promise<boolean> {\n\t\tif (!this.db) {\n\t\t\tthrow new StorageError(\"Database not initialized\", \"STORAGE_NOT_INITIALIZED\");\n\t\t}\n\n\t\tconst startTime = Date.now();\n\t\tconst maxWaitTime = timeoutMs;\n\t\tlet waitTime = 10; // Start with 10ms\n\n\t\twhile (Date.now() - startTime < maxWaitTime) {\n\t\t\ttry {\n\t\t\t\t// Try to acquire the lock using an atomic update\n\t\t\t\tconst result = this.db\n\t\t\t\t\t.prepare(`\n\t\t\t\t\tUPDATE writers_lock\n\t\t\t\t\tSET writer_id = ?, acquired_at = ?, expires_at = ?\n\t\t\t\t\tWHERE (writer_id IS NULL OR expires_at < ?) AND id = 1\n\t\t\t\t`)\n\t\t\t\t\t.run(writerId, Date.now(), Date.now() + 30000, Date.now());\n\n\t\t\t\t// If we updated exactly one row, we got the lock\n\t\t\t\tif (result.changes === 1) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\t// If we didn't get the lock, wait and try again with exponential backoff\n\t\t\t\tawait new Promise((resolve) =>\n\t\t\t\t\tsetTimeout(resolve, Math.min(waitTime, maxWaitTime - (Date.now() - startTime))),\n\t\t\t\t);\n\t\t\t\twaitTime = Math.min(waitTime * 2, 1000); // Max 1 second wait\n\t\t\t} catch (error) {\n\t\t\t\t// Log error but continue trying\n\t\t\t\tconsole.warn(\"Failed to acquire lock:\", error);\n\t\t\t\tawait new Promise((resolve) =>\n\t\t\t\t\tsetTimeout(resolve, Math.min(waitTime, maxWaitTime - (Date.now() - startTime))),\n\t\t\t\t);\n\t\t\t\twaitTime = Math.min(waitTime * 2, 1000);\n\t\t\t}\n\t\t}\n\n\t\t// Timeout reached\n\t\treturn false;\n\t}\n\n\t/**\n\t * Release the distributed lock\n\t * @param writerId Unique identifier for this writer process\n\t */\n\tprivate async releaseLock(writerId: string): Promise<void> {\n\t\tif (!this.db) {\n\t\t\tthrow new StorageError(\"Database not initialized\", \"STORAGE_NOT_INITIALIZED\");\n\t\t}\n\n\t\ttry {\n\t\t\t// Only release if we're the current holder\n\t\t\tthis.db\n\t\t\t\t.prepare(`\n\t\t\t\tUPDATE writers_lock\n\t\t\t\tSET writer_id = NULL, acquired_at = 0, expires_at = 0\n\t\t\t\tWHERE writer_id = ? AND id = 1\n\t\t\t`)\n\t\t\t\t.run(writerId);\n\t\t} catch (error) {\n\t\t\t// Log error but don't throw - we don't want to fail the operation if we can't release the lock\n\t\t\tconsole.warn(\"Failed to release lock:\", error);\n\t\t}\n\t}\n\n\t/**\n\t * Create a snapshot through the queued operation system to ensure single-writer discipline\n\t * @param name The snapshot name\n\t * @param files Map of file paths to content\n\t * @param metadata Optional metadata\n\t * @param parentId Optional parent snapshot ID\n\t * @param id Optional snapshot ID (if not provided, one will be generated)\n\t * @returns Snapshot information\n\t */\n\tasync createSnapshot(\n\t\tname: string,\n\t\tfiles: Map<string, string>,\n\t\tmetadata?: Record<string, unknown>,\n\t\tparentId?: string,\n\t\tid?: string,\n\t): Promise<{\n\t\tid: string;\n\t\tname: string;\n\t\tfileCount: number;\n\t\ttimestamp: number;\n\t}> {\n\t\t// Use the queue system to ensure single-writer discipline\n\t\treturn this.queueOperation(\"createSnapshot\", async () => {\n\t\t\tif (!this.db) {\n\t\t\t\tthrow new StorageError(\"Database not initialized\", \"STORAGE_NOT_INITIALIZED\");\n\t\t\t}\n\n\t\t\t// Use provided ID or generate a new one\n\t\t\tconst snapshotId = id || generateId();\n\t\t\tconst timestamp = Date.now();\n\n\t\t\t// Pre-compress all file content outside the transaction\n\t\t\tconst preCompressedFiles = new Map<\n\t\t\t\tstring,\n\t\t\t\t{ compressed: Buffer; storageType: string; contentSize: number }\n\t\t\t>();\n\n\t\t\t// Process each file for pre-compression\n\t\t\tArray.from(files.entries()).forEach(([filePath, content]) => {\n\t\t\t\tconst contentSize = Buffer.byteLength(content, \"utf-8\");\n\t\t\t\t// For simplicity, we'll store full content for all files\n\t\t\t\tconst compressed = compress(content);\n\t\t\t\tpreCompressedFiles.set(filePath, {\n\t\t\t\t\tcompressed,\n\t\t\t\t\tstorageType: \"full\",\n\t\t\t\t\tcontentSize,\n\t\t\t\t});\n\t\t\t});\n\n\t\t\ttry {\n\t\t\t\t// Begin transaction for atomic operation\n\t\t\t\tconst insert = this.db.transaction(() => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\t// Insert snapshot record with timestamp and full metadata\n\t\t\t\t\t\tif (this.db) {\n\t\t\t\t\t\t\tthis.db\n\t\t\t\t\t\t\t\t.prepare(\n\t\t\t\t\t\t\t\t\t`\n\t\t\t\t\tINSERT INTO snapshots (id, name, timestamp, parent_id, metadata)\n\t\t\t\t\tVALUES (?, ?, ?, ?, ?)\n\t\t\t\t`,\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t.run(\n\t\t\t\t\t\t\t\t\tsnapshotId,\n\t\t\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\t\t\ttimestamp,\n\t\t\t\t\t\t\t\t\tparentId || null,\n\t\t\t\t\t\t\t\t\tJSON.stringify({\n\t\t\t\t\t\t\t\t\t\tfileCount: files.size,\n\t\t\t\t\t\t\t\t\t\tcreatedBy: \"snapback\",\n\t\t\t\t\t\t\t\t\t\t...metadata,\n\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t// Insert file changes\n\t\t\t\t\t\t\tif (this.db) {\n\t\t\t\t\t\t\t\tconst stmt = this.db.prepare(`\n\t\t\t\t\tINSERT INTO file_changes (snapshot_id, file_path, action, diff, storage_type, content_size)\n\t\t\t\t\tVALUES (?, ?, ?, ?, ?, ?)\n\t\t\t\t`);\n\n\t\t\t\t\t\t\t\t// Process each pre-compressed file\n\t\t\t\t\t\t\t\tpreCompressedFiles.forEach((preCompressed, filePath) => {\n\t\t\t\t\t\t\t\t\tconst { compressed, storageType, contentSize } = preCompressed;\n\t\t\t\t\t\t\t\t\tconst action = \"add\"; // For simplicity, all files are \"add\" in this implementation\n\t\t\t\t\t\t\t\t\tstmt.run(snapshotId, filePath, action, compressed, storageType, contentSize);\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} catch (queryError: unknown) {\n\t\t\t\t\t\tconst message = queryError instanceof Error ? queryError.message : String(queryError);\n\t\t\t\t\t\tthrow new StorageError(`Failed to create snapshot: ${message}`, \"STORAGE_QUERY_ERROR\", {\n\t\t\t\t\t\t\tcause: queryError,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tinsert();\n\n\t\t\t\treturn { id: snapshotId, name, fileCount: files.size, timestamp };\n\t\t\t} catch (error) {\n\t\t\t\tif (error instanceof StorageError || error instanceof StorageTransactionError) {\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\t\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\t\tthrow new StorageError(`Failed to create snapshot: ${message}`, \"STORAGE_CREATE_SNAPSHOT_ERROR\", {\n\t\t\t\t\tcause: error,\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t}\n\n\t/**\n\t * Queue an operation for execution\n\t * @param operationName Name of the operation for logging\n\t * @param operation Function to execute\n\t * @param priority Priority of the operation (lower number = higher priority)\n\t * @returns Promise that resolves when the operation completes\n\t */\n\tasync queueOperation<T>(operationName: string, operation: () => Promise<T>, priority = 0): Promise<T> {\n\t\tif (!this.db) {\n\t\t\tthrow new StorageError(\"Database not initialized\", \"STORAGE_NOT_INITIALIZED\");\n\t\t}\n\n\t\treturn new Promise<T>((resolve, reject) => {\n\t\t\tconst id = generateId();\n\t\t\tconst timestamp = Date.now();\n\n\t\t\tconst queuedOp: QueuedOperation<T> = {\n\t\t\t\tid,\n\t\t\t\toperationName,\n\t\t\t\tpriority,\n\t\t\t\toperation, // Simplified - no lock management here\n\t\t\t\tresolve,\n\t\t\t\treject,\n\t\t\t\ttimestamp,\n\t\t\t};\n\n\t\t\t// Persist the operation to the database\n\t\t\ttry {\n\t\t\t\tif (this.db) {\n\t\t\t\t\tconst stmt = this.db.prepare(`\n INSERT INTO queued_operations (id, operation_name, priority, created_at, status)\n VALUES (?, ?, ?, ?, ?)\n `);\n\n\t\t\t\t\tstmt.run(id, operationName, priority, timestamp, \"pending\");\n\t\t\t\t}\n\n\t\t\t\t// Add to in-memory queue and sort by priority\n\t\t\t\tthis.operationQueue.push(queuedOp);\n\t\t\t\tthis.operationQueue.sort((a, b) => {\n\t\t\t\t\t// First sort by priority (lower number = higher priority)\n\t\t\t\t\tif (a.priority !== b.priority) {\n\t\t\t\t\t\treturn a.priority - b.priority;\n\t\t\t\t\t}\n\t\t\t\t\t// Then sort by timestamp (FIFO for same priority)\n\t\t\t\t\treturn a.timestamp - b.timestamp;\n\t\t\t\t});\n\n\t\t\t\t// Start processing if not already processing\n\t\t\t\tif (!this.isProcessingQueue) {\n\t\t\t\t\tthis.processQueue();\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\treject(error);\n\t\t\t}\n\t\t});\n\t}\n\n\t/**\n\t * Process the operation queue with single-writer discipline\n\t */\n\tprivate async processQueue(): Promise<void> {\n\t\tif (this.isProcessingQueue) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.isProcessingQueue = true;\n\n\t\ttry {\n\t\t\t// Check if there are operations in the queue\n\t\t\tif (this.operationQueue.length > 0) {\n\t\t\t\t// Acquire lock before processing the next operation\n\t\t\t\tconst lockAcquired = await this.acquireLock(this.writerId, 10000); // 10 second timeout\n\t\t\t\tif (!lockAcquired) {\n\t\t\t\t\t// If we can't acquire the lock, reschedule processing\n\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\tthis.isProcessingQueue = false;\n\t\t\t\t\t\tif (this.operationQueue.length > 0) {\n\t\t\t\t\t\t\tthis.processQueue();\n\t\t\t\t\t\t}\n\t\t\t\t\t}, 100); // Try again in 100ms\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\ttry {\n\t\t\t\t\t// Sort queue before processing to ensure priority order\n\t\t\t\t\tthis.operationQueue.sort((a, b) => {\n\t\t\t\t\t\t// First sort by priority (lower number = higher priority)\n\t\t\t\t\t\tif (a.priority !== b.priority) {\n\t\t\t\t\t\t\treturn a.priority - b.priority;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// Then sort by timestamp (FIFO for same priority)\n\t\t\t\t\t\treturn a.timestamp - b.timestamp;\n\t\t\t\t\t});\n\n\t\t\t\t\t// Process only ONE operation per lock acquisition to ensure fair sharing\n\t\t\t\t\tif (this.operationQueue.length > 0) {\n\t\t\t\t\t\tconst queuedOp = this.operationQueue.shift();\n\t\t\t\t\t\tif (queuedOp) {\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tconst result = await queuedOp.operation();\n\t\t\t\t\t\t\t\tqueuedOp.resolve(result);\n\t\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\t\tqueuedOp.reject(error);\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} finally {\n\t\t\t\t\t// Always release the lock after processing one operation\n\t\t\t\t\tawait this.releaseLock(this.writerId);\n\t\t\t\t}\n\n\t\t\t\t// Small delay to allow other brokers to acquire the lock\n\t\t\t\tawait new Promise((resolve) => setTimeout(resolve, 1));\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconsole.error(\"Error processing queue:\", error);\n\t\t} finally {\n\t\t\tthis.isProcessingQueue = false;\n\t\t\t// If there are more operations, schedule processing of the next one\n\t\t\tif (this.operationQueue.length > 0) {\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tthis.processQueue();\n\t\t\t\t}, 1); // Schedule next processing on next tick\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Get a snapshot by ID\n\t * @param id The snapshot ID\n\t * @returns Snapshot information or null if not found\n\t */\n\tasync getSnapshot(id: string): Promise<{\n\t\tid: string;\n\t\tname: string;\n\t\tfiles: Map<string, string>;\n\t\ttimestamp: number;\n\t\tmetadata: string;\n\t} | null> {\n\t\tif (!this.db) {\n\t\t\tthrow new StorageError(\"Database not initialized\", \"STORAGE_NOT_INITIALIZED\");\n\t\t}\n\n\t\t// Use read connection for better performance\n\t\tconst db = await this.getReadConnection();\n\n\t\ttry {\n\t\t\tconst row = db\n\t\t\t\t.prepare(`\n\t\t\t\tSELECT id, name, timestamp, metadata\n\t\t\t\tFROM snapshots\n\t\t\t\tWHERE id = ?\n\t\t\t`)\n\t\t\t\t.get(id);\n\n\t\t\tif (!row) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\t// Get file changes\n\t\t\tconst fileRows = db\n\t\t\t\t.prepare(`\n\t\t\t\tSELECT file_path, diff, storage_type\n\t\t\t\tFROM file_changes\n\t\t\t\tWHERE snapshot_id = ?\n\t\t\t`)\n\t\t\t\t.all(id);\n\n\t\t\tconst files = new Map<string, string>();\n\t\t\tfor (const fileRow of fileRows) {\n\t\t\t\ttry {\n\t\t\t\t\tconst typedFileRow = fileRow as { file_path: string; diff: Buffer };\n\t\t\t\t\tconst decompressed = gunzipSync(typedFileRow.diff);\n\t\t\t\t\tconst content = decompressed.toString(\"utf-8\");\n\t\t\t\t\tfiles.set(typedFileRow.file_path, content);\n\t\t\t\t} catch (error) {\n\t\t\t\t\tconst typedFileRow = fileRow as { file_path: string };\n\t\t\t\t\tconsole.warn(`Failed to decompress file ${typedFileRow.file_path}:`, error);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tid: (row as { id: string }).id,\n\t\t\t\tname: (row as { name: string }).name,\n\t\t\t\tfiles,\n\t\t\t\ttimestamp: (row as { timestamp: number }).timestamp,\n\t\t\t\tmetadata: (row as { metadata: string }).metadata,\n\t\t\t};\n\t\t} catch (error) {\n\t\t\tthrow new StorageError(\n\t\t\t\t`Failed to get snapshot: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t\t\"STORAGE_GET_SNAPSHOT_ERROR\",\n\t\t\t\t{ cause: error },\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * List snapshots with optional filters\n\t * @param limit Maximum number of snapshots to return\n\t * @param offset Offset for pagination\n\t * @param sortBy Field to sort by\n\t * @param sortOrder Sort order (ASC or DESC)\n\t * @returns List of snapshots\n\t */\n\tasync listSnapshots(\n\t\tlimit = 50,\n\t\toffset = 0,\n\t\tsortBy = \"timestamp\",\n\t\tsortOrder: \"ASC\" | \"DESC\" = \"DESC\",\n\t): Promise<\n\t\tArray<{\n\t\t\tid: string;\n\t\t\tname: string;\n\t\t\ttimestamp: number;\n\t\t\tmetadata: string;\n\t\t}>\n\t> {\n\t\tif (!this.db) {\n\t\t\tthrow new StorageError(\"Database not initialized\", \"STORAGE_NOT_INITIALIZED\");\n\t\t}\n\n\t\t// Use read connection for better performance\n\t\tconst db = await this.getReadConnection();\n\n\t\t// Create local variables to avoid mutating parameters\n\t\tlet validatedSortBy = sortBy;\n\t\tlet validatedSortOrder = sortOrder;\n\n\t\ttry {\n\t\t\t// Validate sortBy parameter\n\t\t\tconst validSortColumns = [\"timestamp\", \"name\", \"id\"];\n\t\t\tif (!validSortColumns.includes(validatedSortBy)) {\n\t\t\t\tvalidatedSortBy = \"timestamp\";\n\t\t\t}\n\n\t\t\t// Validate sortOrder parameter\n\t\t\tif (validatedSortOrder !== \"ASC\" && validatedSortOrder !== \"DESC\") {\n\t\t\t\tvalidatedSortOrder = \"DESC\";\n\t\t\t}\n\n\t\t\tconst rows = db\n\t\t\t\t.prepare(`\n\t\t\t\tSELECT id, name, timestamp, metadata\n\t\t\t\tFROM snapshots\n\t\t\t\tORDER BY ${validatedSortBy} ${validatedSortOrder}\n\t\t\t\tLIMIT ? OFFSET ?\n\t\t\t`)\n\t\t\t\t.all(limit, offset);\n\n\t\t\treturn rows.map((row) => ({\n\t\t\t\tid: (row as { id: string }).id,\n\t\t\t\tname: (row as { name: string }).name,\n\t\t\t\ttimestamp: (row as { timestamp: number }).timestamp,\n\t\t\t\tmetadata: (row as { metadata: string }).metadata,\n\t\t\t}));\n\t\t} catch (error) {\n\t\t\tthrow new StorageError(\n\t\t\t\t`Failed to list snapshots: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t\t\"STORAGE_LIST_SNAPSHOTS_ERROR\",\n\t\t\t\t{ cause: error },\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Delete a snapshot by ID\n\t * @param id The snapshot ID\n\t */\n\tasync deleteSnapshot(id: string): Promise<void> {\n\t\treturn this.queueOperation(`deleteSnapshot-${id}`, async () => {\n\t\t\tif (!this.db) {\n\t\t\t\tthrow new StorageError(\"Database not initialized\", \"STORAGE_NOT_INITIALIZED\");\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\t// This will cascade delete file_changes due to foreign key constraint\n\t\t\t\tthis.db\n\t\t\t\t\t.prepare(`\n\t\t\t\t\tDELETE FROM snapshots\n\t\t\t\t\tWHERE id = ?\n\t\t\t\t`)\n\t\t\t\t\t.run(id);\n\t\t\t} catch (error) {\n\t\t\t\tthrow new StorageError(\n\t\t\t\t\t`Failed to delete snapshot: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t\t\t\"STORAGE_DELETE_SNAPSHOT_ERROR\",\n\t\t\t\t\t{ cause: error },\n\t\t\t\t);\n\t\t\t}\n\t\t});\n\t}\n}\n","import type { Snapshot, SnapshotFilters } from \"@snapback-oss/contracts\";\nimport type { StorageAdapter } from \"./StorageAdapter\";\nimport { StorageBroker } from \"./StorageBroker\";\n\n/**\n * StorageBrokerAdapter - Adapter that makes StorageBroker compatible with StorageAdapter interface\n *\n * This adapter bridges the StorageBroker (with single-writer discipline) to the StorageAdapter interface\n * used by the rest of the codebase, ensuring all storage operations go through the single-writer broker.\n *\n * Key responsibilities:\n * - Convert StorageAdapter method calls to StorageBroker operations\n * - Maintain compatibility with existing code\n * - Ensure all operations are queued through the broker's single-writer discipline\n */\nexport class StorageBrokerAdapter implements StorageAdapter {\n\tprivate broker: StorageBroker;\n\n\tconstructor(dbPath: string) {\n\t\tthis.broker = new StorageBroker(dbPath);\n\t}\n\n\tasync initialize(): Promise<void> {\n\t\tawait this.broker.initialize();\n\t}\n\n\tasync save(snapshot: Snapshot, contentHash?: string): Promise<void> {\n\t\t// Convert the save operation to a createSnapshot operation\n\t\t// We need to convert the Snapshot format to what createSnapshot expects\n\t\tconst filesMap = new Map<string, string>();\n\t\tif (snapshot.fileContents) {\n\t\t\tfor (const [filePath, content] of Object.entries(snapshot.fileContents)) {\n\t\t\t\tfilesMap.set(filePath, content);\n\t\t\t}\n\t\t}\n\n\t\t// Extract name from metadata or use a default\n\t\tconst name = snapshot.meta?.name || snapshot.meta?.trigger || \"snapshot\";\n\n\t\t// Include contentHash in metadata\n\t\tconst metadata = {\n\t\t\t...snapshot.meta,\n\t\t\tcontentHash,\n\t\t};\n\n\t\t// Call createSnapshot directly since it already handles queuing internally\n\t\t// Pass the snapshot ID to ensure it's used\n\t\tawait this.broker.createSnapshot(name, filesMap, metadata, undefined, snapshot.id);\n\t}\n\n\tasync get(id: string): Promise<Snapshot | null> {\n\t\ttry {\n\t\t\t// For get operations, we can use the broker's getSnapshot method\n\t\t\tconst result = await this.broker.getSnapshot(id);\n\n\t\t\tif (!result) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\t// Convert the result to the Snapshot format\n\t\t\tlet metadata = {};\n\t\t\ttry {\n\t\t\t\tmetadata = JSON.parse(result.metadata);\n\t\t\t} catch (_error) {\n\t\t\t\t// Ignore parsing errors and use empty metadata\n\t\t\t}\n\n\t\t\t// Convert Map back to Record format for compatibility\n\t\t\tconst fileContents: Record<string, string> = {};\n\t\t\tfor (const [filePath, content] of result.files) {\n\t\t\t\tfileContents[filePath] = content;\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tid: result.id,\n\t\t\t\ttimestamp: result.timestamp,\n\t\t\t\tversion: \"1.0\",\n\t\t\t\tmeta: metadata,\n\t\t\t\tfiles: Array.from(result.files.keys()),\n\t\t\t\tfileContents,\n\t\t\t};\n\t\t} catch (error) {\n\t\t\t// Log the error but don't throw - return null to indicate not found\n\t\t\tconsole.error(`Error retrieving snapshot ${id}:`, error);\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tasync list(filters?: SnapshotFilters): Promise<Snapshot[]> {\n\t\ttry {\n\t\t\t// Convert filters to parameters for listSnapshots\n\t\t\tconst limit = filters?.limit || 50;\n\t\t\tconst offset = filters?.offset || 0;\n\n\t\t\t// For now, we'll sort by timestamp DESC as that's the most common use case\n\t\t\tconst snapshots = await this.broker.listSnapshots(limit, offset, \"timestamp\", \"DESC\");\n\n\t\t\t// Convert the results to the Snapshot format\n\t\t\tconst result: Snapshot[] = [];\n\t\t\tfor (const snapshot of snapshots) {\n\t\t\t\tlet metadata = {};\n\t\t\t\ttry {\n\t\t\t\t\tmetadata = JSON.parse(snapshot.metadata);\n\t\t\t\t} catch (_error) {\n\t\t\t\t\t// Ignore parsing errors and use empty metadata\n\t\t\t\t}\n\n\t\t\t\tresult.push({\n\t\t\t\t\tid: snapshot.id,\n\t\t\t\t\ttimestamp: snapshot.timestamp,\n\t\t\t\t\tversion: \"1.0\",\n\t\t\t\t\tmeta: metadata,\n\t\t\t\t\tfiles: [], // We don't load files in list view for performance\n\t\t\t\t\tfileContents: {},\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn result;\n\t\t} catch (error) {\n\t\t\t// Log the error but don't throw - return empty array\n\t\t\tconsole.error(\"Error listing snapshots:\", error);\n\t\t\treturn [];\n\t\t}\n\t}\n\n\tasync delete(id: string): Promise<void> {\n\t\ttry {\n\t\t\tawait this.broker.deleteSnapshot(id);\n\t\t} catch (error) {\n\t\t\t// Log the error but don't throw - delete should be idempotent\n\t\t\tconsole.error(`Error deleting snapshot ${id}:`, error);\n\t\t}\n\t}\n\n\tasync close(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.broker.close();\n\t\t} catch (error) {\n\t\t\t// Log the error but don't throw - we're closing anyway\n\t\t\tconsole.error(\"Error closing storage:\", error);\n\t\t}\n\t}\n}\n","/**\n * Centralized ID Generation\n *\n * RE-EXPORTS FROM @snapback-oss/contracts - Single Source of Truth\n * SDK provides typed wrappers for convenience.\n *\n * @module id-generation\n */\n\nimport { randomBytes } from \"node:crypto\";\nimport {\n\tgenerateId as contractsGenerateId,\n\tgenerateSnapshotId as contractsGenerateSnapshotId,\n} from \"@snapback-oss/contracts\";\n\n// Types (defined locally to avoid circular deps with contracts)\nexport type SessionId = `sess-${string}`;\nexport type SnapshotId = `snap-${string}`;\n\n/**\n * ID prefixes for different entity types\n */\nexport const ID_PREFIX = {\n\tSESSION: \"sess\",\n\tSNAPSHOT: \"snap\", // Short form, aligned with contracts\n\tAUDIT: \"audit\",\n\tCHECKPOINT: \"cp\",\n} as const;\n\nexport type IdPrefix = (typeof ID_PREFIX)[keyof typeof ID_PREFIX];\n\n/**\n * Generate a cryptographically random alphanumeric suffix\n * @internal Used by session/audit/checkpoint IDs\n */\nfunction randomSuffix(length = 6): string {\n\tconst chars = \"abcdefghijklmnopqrstuvwxyz0123456789\";\n\tconst bytes = randomBytes(length);\n\tlet result = \"\";\n\tfor (let i = 0; i < length; i++) {\n\t\tresult += chars[bytes[i] % chars.length];\n\t}\n\treturn result;\n}\n\n/**\n * Generate a session ID\n * Format: sess-<timestamp>-<random>\n */\nexport function generateSessionId(): SessionId {\n\treturn `${ID_PREFIX.SESSION}-${Date.now()}-${randomSuffix()}` as SessionId;\n}\n\n/**\n * Generate a snapshot ID - delegates to @snapback-oss/contracts\n * Format: snapshot-<slug>-<timestamp>-<random> (with description)\n * snapshot-<timestamp>-<random> (without)\n *\n * @param description - Optional human-readable description\n */\nexport function generateSnapshotId(description?: string): SnapshotId {\n\treturn contractsGenerateSnapshotId(description) as SnapshotId;\n}\n\n/**\n * General purpose ID generation - delegates to @snapback-oss/contracts\n */\nexport function generateId(prefix?: string): string {\n\treturn contractsGenerateId(prefix);\n}\n\n/**\n * Generate an audit entry ID with unified format\n *\n * Format: audit-<timestamp>-<random>\n * Example: audit-1733657123456-d4e5f6\n *\n * @returns Audit ID string\n */\nexport function generateAuditId(): string {\n\treturn `${ID_PREFIX.AUDIT}-${Date.now()}-${randomSuffix()}`;\n}\n\n/**\n * Generate a checkpoint ID with unified format\n *\n * Format: cp-<timestamp>-<random>\n * Example: cp-1733657123456-g7h8i9\n *\n * @returns Checkpoint ID string\n */\nexport function generateCheckpointId(): string {\n\treturn `${ID_PREFIX.CHECKPOINT}-${Date.now()}-${randomSuffix()}`;\n}\n\n/**\n * Generate a random alphanumeric ID string\n *\n * @param length - Length of the ID (default: 6)\n * @returns Lowercase alphanumeric string\n */\nexport function randomId(length = 6): string {\n\treturn randomSuffix(length);\n}\n\n/**\n * Parse timestamp from a generated ID\n *\n * Handles all ID formats:\n * - sess-<timestamp>-<random>\n * - audit-<timestamp>-<random>\n * - cp-<timestamp>-<random>\n * - snap-<timestamp>-<random>\n * - snap-<slug>-<timestamp>-<random>\n * - snapshot-<timestamp>-<random> (legacy)\n * - snapshot-<slug>-<timestamp>-<random> (legacy)\n *\n * @param id - ID string to parse\n * @returns Timestamp in milliseconds, or null if invalid format\n */\nexport function parseIdTimestamp(id: string): number | null {\n\t// Validate known prefix (includes legacy \"snapshot\" for backward compatibility)\n\tif (!id.match(/^(?:sess|snap|snapshot|audit|cp)-/)) {\n\t\treturn null;\n\t}\n\n\t// Match 13-digit timestamp before the final random suffix\n\t// Works for both `prefix-<timestamp>-<random>` and `prefix-<slug>-<timestamp>-<random>`\n\tconst match = id.match(/-(\\d{13})-[a-zA-Z0-9_-]+$/);\n\tif (!match) {\n\t\treturn null;\n\t}\n\tconst timestamp = Number.parseInt(match[1], 10);\n\treturn Number.isNaN(timestamp) ? null : timestamp;\n}\n\n/**\n * Extract the prefix from a generated ID\n *\n * @param id - ID string to parse\n * @returns ID prefix or null if invalid format\n */\nexport function parseIdPrefix(id: string): IdPrefix | null {\n\t// Handle legacy \"snapshot\" prefix as \"snap\"\n\tif (id.startsWith(\"snapshot-\")) {\n\t\treturn \"snap\" as IdPrefix;\n\t}\n\tconst match = id.match(/^(sess|snap|audit|cp)-/);\n\treturn match ? (match[1] as IdPrefix) : null;\n}\n\n/**\n * Validate that an ID matches the expected format\n *\n * Handles formats:\n * - sess/audit/cp-<timestamp>-<6 random chars>\n * - snap-<timestamp>-<9 random chars>\n * - snap-<slug>-<timestamp>-<9 random chars>\n * - snapshot-* (legacy format, also valid)\n *\n * @param id - ID string to validate\n * @param expectedPrefix - Expected prefix (optional, validates any if not specified)\n * @returns True if valid, false otherwise\n */\nexport function isValidId(id: string, expectedPrefix?: IdPrefix): boolean {\n\t// Snapshot IDs can have optional slug and use 9-char suffix\n\t// Also handle legacy \"snapshot-\" prefix\n\tconst isSnapshotId = id.startsWith(\"snap-\") || id.startsWith(\"snapshot-\");\n\tif (expectedPrefix === \"snap\" || (!expectedPrefix && isSnapshotId)) {\n\t\treturn /^(?:snap|snapshot)-(?:[a-z0-9]+-)?(\\d{13})-[a-zA-Z0-9_-]{9}$/.test(id);\n\t}\n\n\t// Non-snapshot IDs use 6-char suffix\n\tif (expectedPrefix) {\n\t\tconst regex = new RegExp(`^${expectedPrefix}-\\\\d{13}-[a-z0-9]{6}$`);\n\t\treturn regex.test(id);\n\t}\n\treturn /^(?:sess|audit|cp)-\\d{13}-[a-z0-9]{6}$/.test(id);\n}\n","/**\n * Platform-agnostic path normalization utilities\n *\n * Handles differences between Windows and Unix-style paths,\n * ensuring consistent path comparison across platforms.\n *\n * @module PathNormalizer\n */\n\n/**\n * Normalize path separators to forward slashes\n * Remove trailing slashes (except for Unix root \"/\")\n *\n * @param path - Path to normalize\n * @returns Normalized path with forward slashes and no trailing slash\n *\n * @example\n * ```typescript\n * normalize('C:\\\\Users\\\\test\\\\') // => 'C:/Users/test'\n * normalize('/home/user/project/') // => '/home/user/project'\n * normalize('/') // => '/'\n * ```\n */\nexport function normalize(path: string): string {\n\t// Convert backslashes to forward slashes\n\tlet normalized = path.replace(/\\\\/g, \"/\");\n\t// Collapse multiple consecutive slashes to single slash\n\tnormalized = normalized.replace(/\\/+/g, \"/\");\n\t// Remove trailing slash (but preserve root \"/\")\n\tnormalized = normalized.replace(/\\/+$/, \"\");\n\t// Special case: Don't strip single \"/\" (Unix root)\n\treturn normalized === \"\" && path.startsWith(\"/\") ? \"/\" : normalized;\n}\n\n/**\n * Check if childPath is within parentPath\n *\n * @param childPath - Path to check\n * @param parentPath - Parent directory path\n * @returns true if childPath is within parentPath\n *\n * @example\n * ```typescript\n * isWithin('/home/user/project/src/index.ts', '/home/user/project') // => true\n * isWithin('/external/file.ts', '/home/user/project') // => false\n * isWithin('C:\\\\Users\\\\test\\\\file.ts', 'C:\\\\Users\\\\test') // => true\n * ```\n */\nexport function isWithin(childPath: string, parentPath: string): boolean {\n\tconst normalizedChild = normalize(childPath);\n\tconst normalizedParent = normalize(parentPath);\n\n\treturn normalizedChild.startsWith(`${normalizedParent}/`) || normalizedChild === normalizedParent;\n}\n\n/**\n * Get the depth of a path (number of directory levels)\n *\n * @param path - Path to measure\n * @returns Number of directory levels\n *\n * @example\n * ```typescript\n * getDepth('/') // => 1 (Unix root)\n * getDepth('/home') // => 2\n * getDepth('/home/user/project') // => 4\n * getDepth('C:\\\\Users\\\\test\\\\project\\\\src') // => 5\n * ```\n */\nexport function getDepth(path: string): number {\n\tconst normalized = normalize(path);\n\n\t// Special case: Unix root \"/\" has depth 1\n\tif (normalized === \"/\") {\n\t\treturn 1;\n\t}\n\n\t// Filter out empty strings from split\n\tconst segments = normalized.split(\"/\").filter((segment) => segment.length > 0);\n\n\t// Unix paths start with \"/\" so add 1 for the root\n\t// Windows paths start with drive letter (e.g., \"C:\") which counts as a segment\n\tconst isUnixPath = path.startsWith(\"/\");\n\treturn isUnixPath ? segments.length + 1 : segments.length;\n}\n\n/**\n * Compare paths for equality\n * Case-insensitive on Windows, case-sensitive on Unix\n *\n * @param path1 - First path\n * @param path2 - Second path\n * @returns true if paths are equal\n *\n * @example\n * ```typescript\n * // Unix (case-sensitive)\n * areEqual('/home/User/project', '/home/user/project') // => false\n *\n * // Windows (case-insensitive)\n * areEqual('C:\\\\Users\\\\Test', 'C:\\\\Users\\\\test') // => true\n * ```\n */\nexport function areEqual(path1: string, path2: string): boolean {\n\tconst norm1 = normalize(path1);\n\tconst norm2 = normalize(path2);\n\n\t// Detect platform - Windows paths start with drive letter (e.g., \"C:\")\n\tconst isWindows = /^[a-zA-Z]:/.test(norm1) || /^[a-zA-Z]:/.test(norm2);\n\n\tif (isWindows) {\n\t\treturn norm1.toLowerCase() === norm2.toLowerCase();\n\t}\n\t// Case-sensitive on Unix\n\treturn norm1 === norm2;\n}\n","/**\n * Risk Factor Descriptions and Transformations\n *\n * Centralized mappings for converting risk factor identifiers to human-readable\n * descriptions across all SnapBack platforms (VSCode, CLI, Web, API).\n *\n * This ensures consistent risk communication and simplifies integration for clients.\n */\n\n/**\n * Mapping of risk factor identifiers to detailed descriptions\n * Used to transform raw factor strings into user-friendly explanations\n */\nexport const RISK_FACTOR_DESCRIPTIONS: Record<string, string> = {\n\t\"eval execution\": \"Dynamic code execution detected - eval() allows runtime code execution\",\n\t\"sql injection\": \"SQL injection vulnerability pattern - concatenated user input in queries\",\n\t\"command execution\": \"Dangerous shell command usage - potential OS command injection\",\n\t\"hardcoded secret\": \"Potential secret/credential found in code - API keys, tokens exposed\",\n\t\"auth bypass\": \"Authentication bypass pattern - insufficient access control checks\",\n\t\"path traversal\": \"Directory traversal vulnerability - unrestricted path access\",\n\t\"xss pattern\": \"Cross-site scripting vulnerability - unsanitized user input in DOM\",\n\tdeserialization: \"Unsafe deserialization detected - potential object injection\",\n\tcryptography: \"Weak cryptography usage - deprecated algorithms or insufficient key length\",\n\t\"dependency change\": \"Dependency version change - verify no breaking changes or vulnerabilities\",\n};\n\n/**\n * Transform raw risk factor identifiers into human-readable descriptions\n *\n * This is the canonical method for converting risk factor strings to descriptions\n * across all SnapBack platforms. Use this instead of custom implementations.\n *\n * @param factors - Array of raw risk factor identifiers\n * @returns Array of human-readable risk factor descriptions\n *\n * @example\n * ```typescript\n * import { describeRiskFactors } from '@snapback/sdk';\n *\n * const rawFactors = [\"eval execution\", \"sql injection\"];\n * const descriptions = describeRiskFactors(rawFactors);\n * // Returns: [\n * // \"Dynamic code execution detected...\",\n * // \"SQL injection vulnerability pattern...\"\n * // ]\n * ```\n */\nexport function describeRiskFactors(factors: string[]): string[] {\n\treturn factors.map((factor) => RISK_FACTOR_DESCRIPTIONS[factor.toLowerCase()] || factor);\n}\n\n/**\n * Get description for a single risk factor\n *\n * @param factor - Risk factor identifier\n * @returns Human-readable description, or original factor if not found in mapping\n *\n * @example\n * ```typescript\n * import { describeRiskFactor } from '@snapback/sdk';\n *\n * const description = describeRiskFactor(\"eval execution\");\n * // Returns: \"Dynamic code execution detected - eval() allows runtime code execution\"\n * ```\n */\nexport function describeRiskFactor(factor: string): string {\n\treturn RISK_FACTOR_DESCRIPTIONS[factor.toLowerCase()] || factor;\n}\n\n/**\n * Check if a risk factor is recognized in the standard mapping\n *\n * @param factor - Risk factor identifier\n * @returns True if factor has a description in the standard mapping\n *\n * @example\n * ```typescript\n * import { isKnownRiskFactor } from '@snapback/sdk';\n *\n * isKnownRiskFactor(\"eval execution\"); // true\n * isKnownRiskFactor(\"unknown factor\"); // false\n * ```\n */\nexport function isKnownRiskFactor(factor: string): boolean {\n\treturn factor.toLowerCase() in RISK_FACTOR_DESCRIPTIONS;\n}\n\n/**\n * Get all available risk factor identifiers\n *\n * @returns Array of all standard risk factor identifiers\n *\n * @example\n * ```typescript\n * import { getStandardRiskFactors } from '@snapback/sdk';\n *\n * const factors = getStandardRiskFactors();\n * // Returns: [\"eval execution\", \"sql injection\", \"command execution\", ...]\n * ```\n */\nexport function getStandardRiskFactors(): string[] {\n\treturn Object.keys(RISK_FACTOR_DESCRIPTIONS);\n}\n","/**\n * Dashboard Metrics SDK Client (GREEN Phase Implementation)\n *\n * Provides a type-safe client for consuming dashboard metrics from the API.\n * Acts as a thin wrapper around the ORPC API client, enforcing package boundaries\n * and providing convenient methods for web app consumption.\n *\n * Usage:\n * ```typescript\n * import { createDashboardMetricsClient } from \"@snapback/sdk\";\n * import { orpcClient } from \"@shared/lib/orpc-client\";\n *\n * const client = createDashboardMetricsClient(orpcClient);\n * const result = await client.getDashboardMetrics();\n *\n * if (isDashboardMetrics(result)) {\n * console.log(\"Total checkpoints:\", result.total_checkpoints);\n * } else {\n * console.error(\"Error:\", result.code, result.message);\n * }\n * ```\n */\n\nimport type { DashboardMetricsResponse } from \"@snapback/contracts\";\n\n/**\n * ORPC Client Interface\n * Minimal interface needed by SDK client to work with ORPC API\n */\nexport interface ORPCClient {\n\tdashboard: {\n\t\tgetMetrics: () => Promise<DashboardMetricsResponse>;\n\t};\n}\n\n/**\n * Dashboard Metrics SDK Client Interface\n * Public API for consuming dashboard metrics\n */\nexport interface DashboardMetricsClient {\n\t/**\n\t * Get aggregated dashboard metrics for the authenticated user\n\t *\n\t * Returns discriminated union:\n\t * - Success: { protection_status, total_checkpoints, total_recoveries, ... }\n\t * - Error: { error: true, code: \"UNAUTHORIZED\" | \"NOT_FOUND\" | \"INTERNAL_ERROR\", message }\n\t *\n\t * @returns Promise<DashboardMetricsResponse>\n\t * @throws Error if network request fails\n\t *\n\t * @example\n\t * const result = await client.getDashboardMetrics();\n\t * if (isDashboardMetrics(result)) {\n\t * // Success path - access metrics\n\t * console.log(result.protection_status);\n\t * } else if (isDashboardMetricsError(result)) {\n\t * // Error path - access error details\n\t * console.error(result.code, result.message);\n\t * }\n\t */\n\tgetDashboardMetrics(): Promise<DashboardMetricsResponse>;\n}\n\n/**\n * Create a dashboard metrics SDK client\n *\n * Factory function that creates a client instance from an ORPC client.\n * Enforces package boundaries: SDK clients delegate to ORPC, web apps use SDK clients,\n * preventing direct API imports from web app code.\n *\n * @param orpcClient - ORPC client with dashboard.getMetrics() method\n * @returns DashboardMetricsClient instance\n *\n * @example\n * import { createDashboardMetricsClient } from \"@snapback/sdk\";\n * import { orpcClient } from \"@shared/lib/orpc-client\";\n *\n * const dashboardClient = createDashboardMetricsClient(orpcClient);\n */\nexport function createDashboardMetricsClient(orpcClient: ORPCClient): DashboardMetricsClient {\n\treturn {\n\t\tasync getDashboardMetrics(): Promise<DashboardMetricsResponse> {\n\t\t\t// Delegate to ORPC API client\n\t\t\t// ORPC client handles:\n\t\t\t// - Network communication to /api/rpc endpoint\n\t\t\t// - Response deserialization\n\t\t\t// - Authentication via cookies\n\t\t\t// - Error handling (throws on network/ORPC errors, returns error discriminant for business errors)\n\t\t\treturn orpcClient.dashboard.getMetrics();\n\t\t},\n\t};\n}\n","/**\n * Protection Decision Engine\n *\n * Per arch_remediation.md Task 1.3: This is THE decision point for all protection logic.\n * VSCode/CLI/MCP should call this engine, not implement their own decision logic.\n *\n * The SDK owns:\n * - Whether to snapshot (shouldSnapshot)\n * - Whether save should proceed (shouldProceed)\n * - Risk evaluation and thresholds\n *\n * Consumers (VSCode, CLI, MCP) own:\n * - HOW to execute snapshots\n * - HOW to display UI/notifications\n * - HOW to handle user interactions\n */\n\nimport type { ProtectionLevel } from \"@snapback/contracts\";\nimport { type ProtectionManager, THRESHOLDS } from \"@snapback-oss/sdk\";\n\n/**\n * Context for evaluating protection decisions\n */\nexport interface EvaluationContext {\n\t/** Absolute file path */\n\tfilePath: string;\n\t/** What triggered this evaluation */\n\ttrigger: \"save\" | \"manual\" | \"ai-detected\";\n\t/** Optional: File change metrics */\n\tchangeMetrics?: ChangeMetrics;\n\t/** Optional: AI detection context */\n\taiContext?: AIDetectionContext;\n\t/** Optional: Whether file is in cooldown */\n\tinCooldown?: boolean;\n\t/** Optional: Whether file has temporary allowance */\n\thasTemporaryAllowance?: boolean;\n}\n\n/**\n * Metrics about the file change\n */\nexport interface ChangeMetrics {\n\tlinesAdded: number;\n\tlinesDeleted: number;\n\tcharsAdded: number;\n\tcharsDeleted: number;\n\taffectedFunctions?: number;\n}\n\n/**\n * AI detection context\n */\nexport interface AIDetectionContext {\n\tdetected: boolean;\n\tconfidence: number;\n\tassistantName?: string;\n\tburstPattern?: boolean;\n}\n\n/**\n * Result of protection decision evaluation\n */\nexport interface ProtectionDecision {\n\t/** Whether a snapshot should be created */\n\tshouldSnapshot: boolean;\n\t/** Whether the save operation should proceed */\n\tshouldProceed: boolean;\n\t/** Human-readable reason for the decision */\n\treason: string;\n\t/** Computed risk score (0-10 scale) */\n\triskScore: number;\n\t/** Recommendations for the user */\n\trecommendations: string[];\n\t/** The protection level that was evaluated */\n\tprotectionLevel: ProtectionLevel | null;\n}\n\n/**\n * Interface for risk analyzer (injected dependency)\n */\nexport interface IRiskAnalyzer {\n\tanalyze(context: EvaluationContext): number;\n}\n\n/**\n * Simple default risk analyzer implementation\n */\nexport class DefaultRiskAnalyzer implements IRiskAnalyzer {\n\tanalyze(context: EvaluationContext): number {\n\t\tlet riskScore = 0;\n\n\t\t// AI detection increases risk\n\t\tif (context.aiContext?.detected) {\n\t\t\triskScore += 3.0;\n\t\t\tif (context.aiContext.burstPattern) {\n\t\t\t\triskScore += 2.0;\n\t\t\t}\n\t\t}\n\n\t\t// Large changes increase risk\n\t\tif (context.changeMetrics) {\n\t\t\tconst totalLines = context.changeMetrics.linesAdded + context.changeMetrics.linesDeleted;\n\t\t\tif (totalLines > 100) {\n\t\t\t\triskScore += 2.0;\n\t\t\t} else if (totalLines > 50) {\n\t\t\t\triskScore += 1.0;\n\t\t\t}\n\n\t\t\t// Function changes are higher risk\n\t\t\tif (context.changeMetrics.affectedFunctions && context.changeMetrics.affectedFunctions > 3) {\n\t\t\t\triskScore += 1.5;\n\t\t\t}\n\t\t}\n\n\t\t// Cap at 10\n\t\treturn Math.min(riskScore, 10);\n\t}\n}\n\n/**\n * Protection Decision Engine\n *\n * THE centralized decision point for all protection logic.\n * All consumers (VSCode, CLI, MCP) should delegate to this engine\n * for shouldSnapshot and shouldProceed decisions.\n */\nexport class ProtectionDecisionEngine {\n\tconstructor(\n\t\tprivate protectionManager: ProtectionManager,\n\t\tprivate riskAnalyzer: IRiskAnalyzer = new DefaultRiskAnalyzer(),\n\t) {}\n\n\t/**\n\t * Evaluate protection decision for a file operation.\n\t *\n\t * This is THE decision point. Consumers should:\n\t * 1. Call this method to get the decision\n\t * 2. Execute the decision (create snapshot if shouldSnapshot)\n\t * 3. Proceed or block based on shouldProceed\n\t *\n\t * @param context - The evaluation context\n\t * @returns Protection decision with shouldSnapshot, shouldProceed, and reason\n\t */\n\tevaluate(context: EvaluationContext): ProtectionDecision {\n\t\tconst protectionLevel = this.protectionManager.getLevel(context.filePath);\n\t\tconst riskScore = this.riskAnalyzer.analyze(context);\n\n\t\t// Handle cooldown bypass\n\t\tif (context.inCooldown) {\n\t\t\treturn {\n\t\t\t\tshouldSnapshot: false,\n\t\t\t\tshouldProceed: true,\n\t\t\t\treason: \"cooldown_bypass\",\n\t\t\t\triskScore,\n\t\t\t\trecommendations: [],\n\t\t\t\tprotectionLevel,\n\t\t\t};\n\t\t}\n\n\t\t// Handle temporary allowance\n\t\tif (context.hasTemporaryAllowance) {\n\t\t\t// Still snapshot even with allowance (protection purposes)\n\t\t\treturn {\n\t\t\t\tshouldSnapshot: true,\n\t\t\t\tshouldProceed: true,\n\t\t\t\treason: \"temporary_allowance\",\n\t\t\t\triskScore,\n\t\t\t\trecommendations: [],\n\t\t\t\tprotectionLevel,\n\t\t\t};\n\t\t}\n\n\t\t// CENTRALIZED decision logic\n\t\tconst shouldSnapshot = this.determineShouldSnapshot(protectionLevel, riskScore, context);\n\t\tconst shouldProceed = this.determineShouldProceed(protectionLevel, riskScore);\n\n\t\treturn {\n\t\t\tshouldSnapshot,\n\t\t\tshouldProceed,\n\t\t\treason: this.buildReason(protectionLevel, riskScore, context),\n\t\t\triskScore,\n\t\t\trecommendations: this.buildRecommendations(protectionLevel, riskScore),\n\t\t\tprotectionLevel,\n\t\t};\n\t}\n\n\t/**\n\t * Determine if a snapshot should be created.\n\t * ALL snapshot decision logic lives HERE.\n\t */\n\tprivate determineShouldSnapshot(\n\t\tlevel: ProtectionLevel | null,\n\t\triskScore: number,\n\t\tcontext: EvaluationContext,\n\t): boolean {\n\t\t// Unprotected files don't get snapshotted via this path\n\t\tif (!level) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// AI-detected changes ALWAYS trigger snapshot\n\t\tif (context.trigger === \"ai-detected\") {\n\t\t\treturn true;\n\t\t}\n\n\t\t// Block level always snapshots\n\t\tif (level === \"block\") {\n\t\t\treturn true;\n\t\t}\n\n\t\t// High risk always snapshots\n\t\tif (riskScore >= THRESHOLDS.risk.highThreshold) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// Warn level: snapshot if medium+ risk\n\t\tif (level === \"warn\") {\n\t\t\treturn riskScore >= THRESHOLDS.risk.highThreshold * 0.6; // ~3.0 for medium risk\n\t\t}\n\n\t\t// Watch level: always snapshot (that's what watch means)\n\t\tif (level === \"watch\") {\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\t}\n\n\t/**\n\t * Determine if the save operation should proceed.\n\t */\n\tprivate determineShouldProceed(level: ProtectionLevel | null, riskScore: number): boolean {\n\t\t// Unprotected files always proceed\n\t\tif (!level) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// Block level with critical risk should block\n\t\tif (level === \"block\" && riskScore >= THRESHOLDS.risk.criticalThreshold) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// All other cases proceed\n\t\treturn true;\n\t}\n\n\t/**\n\t * Build a human-readable reason for the decision.\n\t */\n\tprivate buildReason(level: ProtectionLevel | null, riskScore: number, context: EvaluationContext): string {\n\t\tif (!level) {\n\t\t\treturn \"unprotected_file\";\n\t\t}\n\n\t\tif (context.trigger === \"ai-detected\") {\n\t\t\treturn \"ai_detected_changes\";\n\t\t}\n\n\t\tif (riskScore >= THRESHOLDS.risk.criticalThreshold) {\n\t\t\treturn \"critical_risk_level\";\n\t\t}\n\n\t\tif (riskScore >= THRESHOLDS.risk.highThreshold) {\n\t\t\treturn \"high_risk_level\";\n\t\t}\n\n\t\tswitch (level) {\n\t\t\tcase \"block\":\n\t\t\t\treturn \"block_mode_protection\";\n\t\t\tcase \"warn\":\n\t\t\t\treturn \"warn_mode_protection\";\n\t\t\tcase \"watch\":\n\t\t\t\treturn \"watch_mode_protection\";\n\t\t\tdefault:\n\t\t\t\treturn \"standard_protection\";\n\t\t}\n\t}\n\n\t/**\n\t * Build recommendations based on protection level and risk.\n\t */\n\tprivate buildRecommendations(level: ProtectionLevel | null, riskScore: number): string[] {\n\t\tconst recommendations: string[] = [];\n\n\t\tif (riskScore >= THRESHOLDS.risk.highThreshold) {\n\t\t\trecommendations.push(\"Review changes carefully before proceeding\");\n\t\t}\n\n\t\tif (level === \"block\") {\n\t\t\trecommendations.push(\"This file requires explicit confirmation to save\");\n\t\t}\n\n\t\tif (riskScore >= THRESHOLDS.risk.criticalThreshold) {\n\t\t\trecommendations.push(\"Consider breaking this change into smaller commits\");\n\t\t}\n\n\t\treturn recommendations;\n\t}\n}\n","/**\n * Diff calculation utilities for snapshot restoration previews\n */\n\nexport interface FileDiff {\n\tpath: string;\n\toperation: \"create\" | \"modify\" | \"delete\";\n\tlinesAdded: number;\n\tlinesRemoved: number;\n\tpreview: string;\n\tcurrentChecksum?: string;\n\tsnapshotChecksum?: string;\n}\n\nexport interface DiffPreview {\n\ttotalFiles: number;\n\tfilesCreated: number;\n\tfilesModified: number;\n\tfilesDeleted: number;\n\ttotalLinesAdded: number;\n\ttotalLinesRemoved: number;\n\tdiffs: FileDiff[];\n}\n\nexport class DiffCalculator {\n\t/**\n\t * Calculate diff between current file and snapshot content\n\t */\n\tcalculateFileDiff(filePath: string, currentContent: string | null, snapshotContent: string | null): FileDiff {\n\t\t// Determine operation\n\t\tlet operation: \"create\" | \"modify\" | \"delete\";\n\t\tif (currentContent === null && snapshotContent !== null) {\n\t\t\toperation = \"create\";\n\t\t} else if (currentContent !== null && snapshotContent === null) {\n\t\t\toperation = \"delete\";\n\t\t} else {\n\t\t\toperation = \"modify\";\n\t\t}\n\n\t\t// Calculate line counts\n\t\tconst currentLines = currentContent ? currentContent.split(\"\\n\") : [];\n\t\tconst snapshotLines = snapshotContent ? snapshotContent.split(\"\\n\") : [];\n\n\t\tconst { added, removed, preview } = this.computeLineDiff(currentLines, snapshotLines);\n\n\t\t// Calculate checksums\n\t\tconst currentChecksum = currentContent ? this.calculateChecksum(currentContent) : undefined;\n\t\tconst snapshotChecksum = snapshotContent ? this.calculateChecksum(snapshotContent) : undefined;\n\n\t\treturn {\n\t\t\tpath: filePath,\n\t\t\toperation,\n\t\t\tlinesAdded: added,\n\t\t\tlinesRemoved: removed,\n\t\t\tpreview,\n\t\t\tcurrentChecksum,\n\t\t\tsnapshotChecksum,\n\t\t};\n\t}\n\n\t/**\n\t * Compute line-by-line diff with preview\n\t * Uses simple LCS algorithm for readable diffs\n\t */\n\tprivate computeLineDiff(\n\t\tcurrentLines: string[],\n\t\tsnapshotLines: string[],\n\t): { added: number; removed: number; preview: string } {\n\t\tconst lcs = this.longestCommonSubsequence(currentLines, snapshotLines);\n\t\tconst previewLines: string[] = [];\n\t\tlet added = 0;\n\t\tlet removed = 0;\n\n\t\tlet i = 0;\n\t\tlet j = 0;\n\t\tlet previewLineCount = 0;\n\t\tconst maxPreviewLines = 20; // Limit preview to first 20 lines\n\n\t\tfor (let k = 0; k < lcs.length && previewLineCount < maxPreviewLines; k++) {\n\t\t\t// Lines removed from current\n\t\t\twhile (i < currentLines.length && currentLines[i] !== lcs[k]) {\n\t\t\t\tpreviewLines.push(`- ${currentLines[i]}`);\n\t\t\t\tremoved++;\n\t\t\t\ti++;\n\t\t\t\tpreviewLineCount++;\n\t\t\t\tif (previewLineCount >= maxPreviewLines) break;\n\t\t\t}\n\n\t\t\t// Lines added from snapshot\n\t\t\twhile (j < snapshotLines.length && snapshotLines[j] !== lcs[k] && previewLineCount < maxPreviewLines) {\n\t\t\t\tpreviewLines.push(`+ ${snapshotLines[j]}`);\n\t\t\t\tadded++;\n\t\t\t\tj++;\n\t\t\t\tpreviewLineCount++;\n\t\t\t\tif (previewLineCount >= maxPreviewLines) break;\n\t\t\t}\n\n\t\t\t// Common line\n\t\t\tif (previewLineCount < maxPreviewLines) {\n\t\t\t\tpreviewLines.push(` ${lcs[k]}`);\n\t\t\t\tpreviewLineCount++;\n\t\t\t}\n\n\t\t\ti++;\n\t\t\tj++;\n\t\t}\n\n\t\t// Handle remaining lines\n\t\twhile (i < currentLines.length && previewLineCount < maxPreviewLines) {\n\t\t\tpreviewLines.push(`- ${currentLines[i]}`);\n\t\t\tremoved++;\n\t\t\ti++;\n\t\t\tpreviewLineCount++;\n\t\t}\n\n\t\twhile (j < snapshotLines.length && previewLineCount < maxPreviewLines) {\n\t\t\tpreviewLines.push(`+ ${snapshotLines[j]}`);\n\t\t\tadded++;\n\t\t\tj++;\n\t\t\tpreviewLineCount++;\n\t\t}\n\n\t\t// Count any remaining lines not included in preview\n\t\tadded += snapshotLines.length - j;\n\t\tremoved += currentLines.length - i;\n\n\t\tif (previewLineCount >= maxPreviewLines && (i < currentLines.length || j < snapshotLines.length)) {\n\t\t\tpreviewLines.push(\"... (preview truncated)\");\n\t\t}\n\n\t\treturn {\n\t\t\tadded,\n\t\t\tremoved,\n\t\t\tpreview: previewLines.join(\"\\n\"),\n\t\t};\n\t}\n\n\t/**\n\t * Longest Common Subsequence for diff calculation\n\t */\n\tprivate longestCommonSubsequence(arr1: string[], arr2: string[]): string[] {\n\t\tconst m = arr1.length;\n\t\tconst n = arr2.length;\n\t\tconst dp: number[][] = Array.from({ length: m + 1 }, () => Array(n + 1).fill(0));\n\n\t\t// Fill DP table\n\t\tfor (let i = 1; i <= m; i++) {\n\t\t\tfor (let j = 1; j <= n; j++) {\n\t\t\t\tif (arr1[i - 1] === arr2[j - 1]) {\n\t\t\t\t\tdp[i][j] = dp[i - 1][j - 1] + 1;\n\t\t\t\t} else {\n\t\t\t\t\tdp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Backtrack to find LCS\n\t\tconst lcs: string[] = [];\n\t\tlet i = m;\n\t\tlet j = n;\n\n\t\twhile (i > 0 && j > 0) {\n\t\t\tif (arr1[i - 1] === arr2[j - 1]) {\n\t\t\t\tlcs.unshift(arr1[i - 1]);\n\t\t\t\ti--;\n\t\t\t\tj--;\n\t\t\t} else if (dp[i - 1][j] > dp[i][j - 1]) {\n\t\t\t\ti--;\n\t\t\t} else {\n\t\t\t\tj--;\n\t\t\t}\n\t\t}\n\n\t\treturn lcs;\n\t}\n\n\t/**\n\t * Calculate SHA-256 checksum for content\n\t */\n\tcalculateChecksum(content: string): string {\n\t\t// Use Node.js crypto for checksum\n\t\tconst crypto = require(\"node:crypto\");\n\t\treturn crypto.createHash(\"sha256\").update(content).digest(\"hex\");\n\t}\n\n\t/**\n\t * Generate full diff preview for multiple files\n\t */\n\tgenerateDiffPreview(diffs: FileDiff[]): DiffPreview {\n\t\tlet filesCreated = 0;\n\t\tlet filesModified = 0;\n\t\tlet filesDeleted = 0;\n\t\tlet totalLinesAdded = 0;\n\t\tlet totalLinesRemoved = 0;\n\n\t\tfor (const diff of diffs) {\n\t\t\tswitch (diff.operation) {\n\t\t\t\tcase \"create\":\n\t\t\t\t\tfilesCreated++;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"modify\":\n\t\t\t\t\tfilesModified++;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"delete\":\n\t\t\t\t\tfilesDeleted++;\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\ttotalLinesAdded += diff.linesAdded;\n\t\t\ttotalLinesRemoved += diff.linesRemoved;\n\t\t}\n\n\t\treturn {\n\t\t\ttotalFiles: diffs.length,\n\t\t\tfilesCreated,\n\t\t\tfilesModified,\n\t\t\tfilesDeleted,\n\t\t\ttotalLinesAdded,\n\t\t\ttotalLinesRemoved,\n\t\t\tdiffs,\n\t\t};\n\t}\n}\n","/**\n * Token Bucket Implementation\n *\n * Implements the token bucket algorithm for rate limiting:\n * - Fixed capacity: max tokens the bucket can hold\n * - Refill rate: tokens added per second\n * - Consumption: tokens removed when requests are made\n *\n * Follows SnapBack patterns:\n * - Discriminated unions for consumption results\n * - Type guards for safe state access\n * - Validation on construction\n *\n * @module token/TokenBucket\n */\n\nexport interface TokenBucketState {\n\t/** Current number of tokens available */\n\ttokens: number;\n\n\t/** Maximum tokens the bucket can hold */\n\tcapacity: number;\n\n\t/** Tokens added per second */\n\trefillRate: number;\n\n\t/** Timestamp of last refill (milliseconds) */\n\tlastRefill: number;\n}\n\n/**\n * Discriminated union for token consumption results\n * Allows exhaustive pattern matching on consumption outcomes\n */\nexport type ConsumptionResult =\n\t| { allowed: true; tokensRemaining: number; resetAt: Date }\n\t| { allowed: false; tokensRemaining: number; resetAt: Date };\n\nexport interface ConsumptionInfo {\n\t/** Number of tokens consumed */\n\tconsumed: number;\n\n\t/** Number of tokens remaining */\n\tremaining: number;\n\n\t/** Percentage of capacity used (0-100) */\n\tpercentageUsed: number;\n}\n\nexport interface TokenBucketConfig {\n\t/** Maximum tokens the bucket can hold */\n\tcapacity: number;\n\n\t/** Tokens added per second */\n\trefillRate: number;\n}\n\n/**\n * Type guard for checking if consumption was allowed\n */\nexport function isConsumptionAllowed(\n\tresult: ConsumptionResult,\n): result is { allowed: true; tokensRemaining: number; resetAt: Date } {\n\treturn result.allowed === true;\n}\n\n/**\n * Type guard for checking if consumption was denied\n */\nexport function isConsumptionDenied(\n\tresult: ConsumptionResult,\n): result is { allowed: false; tokensRemaining: number; resetAt: Date } {\n\treturn result.allowed === false;\n}\n\n/**\n * TokenBucket class implements the token bucket algorithm\n *\n * @example\n * ```typescript\n * const bucket = createTokenBucket({ capacity: 100, refillRate: 1 });\n *\n * // Try to consume 10 tokens\n * const result = bucket.tryConsume(10);\n * if (result.allowed) {\n * console.log(`Request allowed. ${result.tokensRemaining} tokens left.`);\n * } else {\n * console.log(`Rate limited. Retry at ${result.resetAt}`);\n * }\n * ```\n */\nexport class TokenBucket {\n\tprivate state: TokenBucketState;\n\n\tconstructor(config: TokenBucketConfig) {\n\t\tif (config.capacity <= 0) {\n\t\t\tthrow new Error(\"Capacity must be greater than 0\");\n\t\t}\n\n\t\tif (config.refillRate <= 0) {\n\t\t\tthrow new Error(\"Refill rate must be greater than 0\");\n\t\t}\n\n\t\tthis.state = {\n\t\t\ttokens: config.capacity,\n\t\t\tcapacity: config.capacity,\n\t\t\trefillRate: config.refillRate,\n\t\t\tlastRefill: Date.now(),\n\t\t};\n\t}\n\n\t/**\n\t * Attempt to consume tokens from the bucket\n\t *\n\t * @param amount - Number of tokens to consume\n\t * @returns Result indicating if consumption was allowed\n\t *\n\t * @throws If amount is not positive\n\t */\n\ttryConsume(amount: number): ConsumptionResult {\n\t\tif (amount <= 0) {\n\t\t\tthrow new Error(\"Token amount must be greater than 0\");\n\t\t}\n\n\t\tthis.refill();\n\n\t\tif (this.state.tokens >= amount) {\n\t\t\tthis.state.tokens -= amount;\n\n\t\t\treturn {\n\t\t\t\tallowed: true,\n\t\t\t\ttokensRemaining: this.state.tokens,\n\t\t\t\tresetAt: this.calculateResetTime(),\n\t\t\t};\n\t\t}\n\n\t\treturn {\n\t\t\tallowed: false,\n\t\t\ttokensRemaining: this.state.tokens,\n\t\t\tresetAt: this.calculateResetTime(),\n\t\t};\n\t}\n\n\t/**\n\t * Refill tokens based on time elapsed since last refill\n\t */\n\trefill(): void {\n\t\tconst now = Date.now();\n\t\tconst timePassed = (now - this.state.lastRefill) / 1000; // Convert to seconds\n\t\tconst tokensToAdd = timePassed * this.state.refillRate;\n\n\t\tthis.state.tokens = Math.min(this.state.capacity, this.state.tokens + tokensToAdd);\n\t\tthis.state.lastRefill = now;\n\t}\n\n\t/**\n\t * Get the current state of the bucket\n\t */\n\tgetState(): Readonly<TokenBucketState> {\n\t\tthis.refill();\n\t\treturn { ...this.state };\n\t}\n\n\t/**\n\t * Reset bucket to full capacity\n\t */\n\treset(): void {\n\t\tthis.state.tokens = this.state.capacity;\n\t\tthis.state.lastRefill = Date.now();\n\t}\n\n\t/**\n\t * Get consumption information\n\t */\n\tgetConsumptionInfo(): ConsumptionInfo {\n\t\tthis.refill();\n\n\t\tconst consumed = this.state.capacity - this.state.tokens;\n\t\tconst percentageUsed = (consumed / this.state.capacity) * 100;\n\n\t\treturn {\n\t\t\tconsumed,\n\t\t\tremaining: this.state.tokens,\n\t\t\tpercentageUsed,\n\t\t};\n\t}\n\n\t/**\n\t * Calculate when the bucket will be full again\n\t */\n\tprivate calculateResetTime(): Date {\n\t\tconst tokensNeeded = this.state.capacity - this.state.tokens;\n\t\tconst secondsToReset = tokensNeeded / this.state.refillRate;\n\t\treturn new Date(Date.now() + secondsToReset * 1000);\n\t}\n}\n\n/**\n * Factory function to create a new TokenBucket\n *\n * @param config - Bucket configuration\n * @returns New TokenBucket instance\n *\n * @example\n * ```typescript\n * // Free tier: 100 tokens, refill at 1 token/second\n * const freeBucket = createTokenBucket({ capacity: 100, refillRate: 1 });\n *\n * // Pro tier: 1000 tokens, refill at 10 tokens/second\n * const proBucket = createTokenBucket({ capacity: 1000, refillRate: 10 });\n * ```\n */\nexport function createTokenBucket(config: TokenBucketConfig): TokenBucket {\n\treturn new TokenBucket(config);\n}\n","/**\n * Multi-User Rate Limiter with Plan-Based Tiers\n *\n * Manages separate token buckets per user per plan tier:\n * - Free: 20 tokens (~10/min)\n * - Pro: 200 tokens (~100/min)\n * - Team: 1000 tokens (~500/min)\n * - Enterprise: 5000 tokens (~2000/min)\n *\n * Follows SnapBack patterns:\n * - Result<T, E> error handling pattern\n * - Plan-based configuration from THRESHOLDS\n * - Validation on construction\n *\n * @module token/RateLimiter\n */\n\nimport { isConsumptionAllowed, TokenBucket } from \"./TokenBucket\";\n\nexport interface PlanConfig {\n\t/** Maximum tokens capacity for this plan */\n\tcapacity: number;\n\n\t/** Tokens added per second for this plan */\n\trefillRate: number;\n}\n\n/**\n * Discriminated union for rate limit check results\n * Enforces exhaustive pattern matching on outcomes\n */\nexport type RateLimitResult =\n\t| {\n\t\t\tallowed: true;\n\t\t\tremaining: number;\n\t\t\tlimit: number;\n\t\t\tresetAt: Date;\n\t }\n\t| {\n\t\t\tallowed: false;\n\t\t\tremaining: number;\n\t\t\tlimit: number;\n\t\t\tresetAt: Date;\n\t\t\tretryAfter: number;\n\t };\n\n/**\n * Type guard for allowed rate limit results\n */\nexport function isRateLimitAllowed(\n\tresult: RateLimitResult,\n): result is { allowed: true; remaining: number; limit: number; resetAt: Date } {\n\treturn result.allowed === true;\n}\n\n/**\n * Type guard for denied rate limit results\n */\nexport function isRateLimitDenied(result: RateLimitResult): result is {\n\tallowed: false;\n\tremaining: number;\n\tlimit: number;\n\tresetAt: Date;\n\tretryAfter: number;\n} {\n\treturn result.allowed === false;\n}\n\n/**\n * RateLimiter manages multiple token buckets (one per user per plan)\n *\n * @example\n * ```typescript\n * const plans = {\n * free: { capacity: 20, refillRate: 0.167 },\n * pro: { capacity: 200, refillRate: 1.667 },\n * };\n *\n * const limiter = new RateLimiter(plans);\n *\n * // Check rate limit for user1 on free plan\n * const result = await limiter.checkLimit(\"user1\", \"free\");\n *\n * if (!result.allowed) {\n * console.log(`Too many requests. Retry in ${result.retryAfter} seconds`);\n * }\n * ```\n */\nexport class RateLimiter {\n\tprivate plans: Record<string, PlanConfig>;\n\tprivate buckets: Map<string, TokenBucket> = new Map();\n\n\tconstructor(plans: Record<string, PlanConfig>) {\n\t\t// Validate plans\n\t\tif (!plans || Object.keys(plans).length === 0) {\n\t\t\tthrow new Error(\"At least one plan must be configured\");\n\t\t}\n\n\t\tfor (const [planName, config] of Object.entries(plans)) {\n\t\t\tif (config.capacity <= 0) {\n\t\t\t\tthrow new Error(`Plan \"${planName}\" has invalid capacity: ${config.capacity}`);\n\t\t\t}\n\n\t\t\tif (config.refillRate <= 0) {\n\t\t\t\tthrow new Error(`Plan \"${planName}\" has invalid refill rate: ${config.refillRate}`);\n\t\t\t}\n\t\t}\n\n\t\tthis.plans = plans;\n\t}\n\n\t/**\n\t * Check rate limit for a user and plan tier\n\t *\n\t * @param userId - Unique user identifier\n\t * @param planName - Plan tier name (e.g., \"free\", \"pro\")\n\t * @returns Rate limit result (discriminated union)\n\t *\n\t * @throws If plan doesn't exist\n\t *\n\t * @example\n\t * ```typescript\n\t * const result = await limiter.checkLimit('user1', 'free');\n\t *\n\t * if (isRateLimitAllowed(result)) {\n\t * // TypeScript knows result.remaining exists\n\t * console.log(`${result.remaining} requests remaining`);\n\t * } else {\n\t * // TypeScript knows result.retryAfter exists\n\t * console.log(`Retry in ${result.retryAfter} seconds`);\n\t * }\n\t * ```\n\t */\n\tasync checkLimit(userId: string, planName: string): Promise<RateLimitResult> {\n\t\tconst plan = this.plans[planName];\n\n\t\tif (!plan) {\n\t\t\tthrow new Error(`Unknown plan: ${planName}`);\n\t\t}\n\n\t\t// Get or create bucket for this user+plan combination\n\t\tconst bucketKey = `${userId}:${planName}`;\n\t\tlet bucket = this.buckets.get(bucketKey);\n\n\t\tif (!bucket) {\n\t\t\tbucket = new TokenBucket(plan);\n\t\t\tthis.buckets.set(bucketKey, bucket);\n\t\t}\n\n\t\t// Try to consume one token\n\t\tconst consumeResult = bucket.tryConsume(1);\n\n\t\tif (isConsumptionAllowed(consumeResult)) {\n\t\t\treturn {\n\t\t\t\tallowed: true as const,\n\t\t\t\tremaining: Math.floor(consumeResult.tokensRemaining),\n\t\t\t\tlimit: plan.capacity,\n\t\t\t\tresetAt: consumeResult.resetAt,\n\t\t\t};\n\t\t}\n\n\t\t// Calculate retry time\n\t\tconst now = Date.now();\n\t\tconst resetTime = consumeResult.resetAt.getTime();\n\t\tconst retryAfter = Math.ceil((resetTime - now) / 1000);\n\n\t\treturn {\n\t\t\tallowed: false as const,\n\t\t\tremaining: Math.floor(consumeResult.tokensRemaining),\n\t\t\tlimit: plan.capacity,\n\t\t\tresetAt: consumeResult.resetAt,\n\t\t\tretryAfter: Math.max(1, retryAfter),\n\t\t};\n\t}\n\n\t/**\n\t * Get current state of a user's bucket for a plan\n\t *\n\t * @param userId - User identifier\n\t * @param planName - Plan name\n\t * @returns Current bucket state or undefined if not created yet\n\t */\n\tgetBucketState(userId: string, planName: string): Readonly<any> | undefined {\n\t\tconst bucketKey = `${userId}:${planName}`;\n\t\tconst bucket = this.buckets.get(bucketKey);\n\t\treturn bucket?.getState();\n\t}\n\n\t/**\n\t * Reset a user's bucket for a plan\n\t *\n\t * @param userId - User identifier\n\t * @param planName - Plan name\n\t */\n\tresetBucket(userId: string, planName: string): void {\n\t\tconst bucketKey = `${userId}:${planName}`;\n\t\tconst bucket = this.buckets.get(bucketKey);\n\n\t\tif (bucket) {\n\t\t\tbucket.reset();\n\t\t}\n\t}\n\n\t/**\n\t * Clear all buckets (use cautiously)\n\t */\n\tclearAll(): void {\n\t\tthis.buckets.clear();\n\t}\n\n\t/**\n\t * Get total number of active buckets\n\t */\n\tgetActiveBucketCount(): number {\n\t\treturn this.buckets.size;\n\t}\n}\n","/**\n * Distributed Token Manager with Redis Backend and In-Memory Fallback\n *\n * Manages rate limiting across distributed systems using Redis for state\n * persistence, with automatic fallback to in-memory storage when Redis\n * is unavailable.\n *\n * @module token/DistributedTokenManager\n */\n\nimport { type PlanConfig, RateLimiter } from \"./RateLimiter\";\nimport { TokenBucket } from \"./TokenBucket\";\n\nexport interface RedisClient {\n\tget(key: string): Promise<string | null>;\n\tset(key: string, value: string): Promise<void>;\n\tincr(key: string): Promise<number>;\n\tdecr(key: string): Promise<number>;\n\texpire(key: string, seconds: number): Promise<void>;\n\tttl(key: string): Promise<number>;\n\tdel(key: string): Promise<void>;\n}\n\nexport interface DistributedCheckLimitResult {\n\t/** Whether the request was allowed */\n\tallowed: boolean;\n\n\t/** Number of tokens remaining */\n\tremaining: number;\n\n\t/** Maximum tokens for this plan */\n\tlimit: number;\n\n\t/** When the bucket will be full again */\n\tresetAt: Date;\n\n\t/** \"redis\" | \"fallback\" - which backend was used */\n\treason: \"redis\" | \"fallback\";\n\n\t/** Seconds to wait before retrying (if not allowed) */\n\tretryAfter?: number;\n\n\t/** Any error that occurred */\n\terror?: Error;\n}\n\nexport interface DistributedTokenManagerOptions {\n\t/** Redis client for distributed state */\n\tredisClient: RedisClient;\n\n\t/** Plan tier configurations */\n\tplans: Record<string, PlanConfig>;\n\n\t/** Prefix for Redis keys (default: \"ratelimit:\") */\n\tkeyPrefix?: string;\n\n\t/** TTL for Redis keys in seconds (default: 3600) */\n\tttlSeconds?: number;\n\n\t/** Fall back to in-memory if Redis unavailable (default: true) */\n\tfallbackToInMemory?: boolean;\n}\n\n/**\n * DistributedTokenManager handles rate limiting with Redis backend\n *\n * @example\n * ```typescript\n * const manager = new DistributedTokenManager({\n * redisClient: redis,\n * plans: {\n * free: { capacity: 20, refillRate: 0.167 },\n * pro: { capacity: 200, refillRate: 1.667 },\n * },\n * keyPrefix: \"ratelimit:\",\n * ttlSeconds: 3600,\n * fallbackToInMemory: true,\n * });\n *\n * const result = await manager.checkLimit(\"user1\", \"free\");\n * if (!result.allowed) {\n * console.log(`Rate limited. Retry in ${result.retryAfter} seconds`);\n * }\n * ```\n */\nexport class DistributedTokenManager {\n\tprivate redis: RedisClient;\n\tprivate plans: Record<string, PlanConfig>;\n\tprivate keyPrefix: string;\n\tprivate ttlSeconds: number;\n\tprivate fallbackToInMemory: boolean;\n\tprivate fallbackLimiter: RateLimiter | null = null;\n\n\tconstructor(options: DistributedTokenManagerOptions) {\n\t\tif (!options.redisClient) {\n\t\t\tthrow new Error(\"Redis client is required\");\n\t\t}\n\n\t\tif (!options.plans || Object.keys(options.plans).length === 0) {\n\t\t\tthrow new Error(\"At least one plan must be configured\");\n\t\t}\n\n\t\tthis.redis = options.redisClient;\n\t\tthis.plans = options.plans;\n\t\tthis.keyPrefix = options.keyPrefix || \"ratelimit:\";\n\t\tthis.ttlSeconds = options.ttlSeconds || 3600;\n\t\tthis.fallbackToInMemory = options.fallbackToInMemory !== false;\n\n\t\t// Initialize fallback limiter if enabled\n\t\tif (this.fallbackToInMemory) {\n\t\t\tthis.fallbackLimiter = new RateLimiter(this.plans);\n\t\t}\n\t}\n\n\t/**\n\t * Check rate limit using Redis with fallback to in-memory\n\t *\n\t * @param userId - User identifier\n\t * @param planName - Plan name\n\t * @returns Rate limit result with backend info\n\t */\n\tasync checkLimit(userId: string, planName: string): Promise<DistributedCheckLimitResult> {\n\t\tconst plan = this.plans[planName];\n\n\t\tif (!plan) {\n\t\t\tthrow new Error(`Unknown plan: ${planName}`);\n\t\t}\n\n\t\ttry {\n\t\t\treturn await this.checkLimitViaRedis(userId, planName, plan);\n\t\t} catch (error) {\n\t\t\tif (this.fallbackToInMemory) {\n\t\t\t\treturn await this.checkLimitViaFallback(userId, planName);\n\t\t\t}\n\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\t/**\n\t * Check limit using Redis backend\n\t */\n\tprivate async checkLimitViaRedis(\n\t\tuserId: string,\n\t\tplanName: string,\n\t\tplan: PlanConfig,\n\t): Promise<DistributedCheckLimitResult> {\n\t\tconst key = this.getRedisKey(userId, planName);\n\n\t\t// Get current bucket state from Redis\n\t\tconst bucket = await this.getOrCreateBucket(key, plan);\n\n\t\t// Try to consume token\n\t\tconst consumeResult = bucket.tryConsume(1);\n\n\t\t// Save updated state back to Redis\n\t\ttry {\n\t\t\tawait this.redis.set(key, JSON.stringify(bucket.getState()));\n\t\t\tawait this.redis.expire(key, this.ttlSeconds);\n\t\t} catch (error) {\n\t\t\t// If we can't save, we might need to fall back\n\t\t\tif (this.fallbackToInMemory) {\n\t\t\t\treturn await this.checkLimitViaFallback(userId, planName);\n\t\t\t}\n\n\t\t\tthrow error;\n\t\t}\n\n\t\tif (consumeResult.allowed) {\n\t\t\treturn {\n\t\t\t\tallowed: true,\n\t\t\t\tremaining: Math.floor(consumeResult.tokensRemaining),\n\t\t\t\tlimit: plan.capacity,\n\t\t\t\tresetAt: consumeResult.resetAt,\n\t\t\t\treason: \"redis\",\n\t\t\t};\n\t\t}\n\n\t\t// Calculate retry time\n\t\tconst now = Date.now();\n\t\tconst resetTime = consumeResult.resetAt.getTime();\n\t\tconst retryAfter = Math.ceil((resetTime - now) / 1000);\n\n\t\treturn {\n\t\t\tallowed: false,\n\t\t\tremaining: Math.floor(consumeResult.tokensRemaining),\n\t\t\tlimit: plan.capacity,\n\t\t\tresetAt: consumeResult.resetAt,\n\t\t\treason: \"redis\",\n\t\t\tretryAfter: Math.max(1, retryAfter),\n\t\t};\n\t}\n\n\t/**\n\t * Check limit using in-memory fallback\n\t */\n\tprivate async checkLimitViaFallback(userId: string, planName: string): Promise<DistributedCheckLimitResult> {\n\t\tif (!this.fallbackLimiter) {\n\t\t\tthrow new Error(\"Fallback limiter not initialized\");\n\t\t}\n\n\t\tconst result = await this.fallbackLimiter.checkLimit(userId, planName);\n\n\t\treturn {\n\t\t\t...result,\n\t\t\treason: \"fallback\",\n\t\t};\n\t}\n\n\t/**\n\t * Get or create bucket from Redis\n\t */\n\tprivate async getOrCreateBucket(key: string, plan: PlanConfig): Promise<TokenBucket> {\n\t\tconst bucketData = await this.redis.get(key);\n\n\t\tif (bucketData) {\n\t\t\ttry {\n\t\t\t\tconst state = JSON.parse(bucketData);\n\n\t\t\t\t// Create a new bucket and restore state\n\t\t\t\tconst bucket = new TokenBucket(plan);\n\t\t\t\t// We need to restore the state - create a new bucket with the data\n\t\t\t\tObject.assign((bucket as any).state || {}, state);\n\n\t\t\t\treturn bucket;\n\t\t\t} catch (_error) {\n\t\t\t\t// If parsing fails, create a new bucket\n\t\t\t\treturn new TokenBucket(plan);\n\t\t\t}\n\t\t}\n\n\t\t// Create new bucket\n\t\treturn new TokenBucket(plan);\n\t}\n\n\t/**\n\t * Get Redis key for user + plan\n\t */\n\tprivate getRedisKey(userId: string, planName: string): string {\n\t\treturn `${this.keyPrefix}${userId}:${planName}`;\n\t}\n\n\t/**\n\t * Cleanup expired buckets (optional maintenance operation)\n\t */\n\tasync cleanup(): Promise<void> {\n\t\t// This would require scanning Redis keys, which is not efficient\n\t\t// In production, Redis TTL handles cleanup automatically\n\t}\n}\n"]}