@vreko/cli 3.0.1

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 (98) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +45 -0
  3. package/dist/CeremonyView-LQS7FTMK.js +134 -0
  4. package/dist/CeremonyView-LQS7FTMK.js.map +1 -0
  5. package/dist/InitApp-7K5DTYSW.js +1479 -0
  6. package/dist/InitApp-7K5DTYSW.js.map +1 -0
  7. package/dist/SkippedTestDetector-PJSKSOZR.js +7 -0
  8. package/dist/SkippedTestDetector-PJSKSOZR.js.map +1 -0
  9. package/dist/TuiApp-FX23XQBK.js +8 -0
  10. package/dist/TuiApp-FX23XQBK.js.map +1 -0
  11. package/dist/analysis-ABEO6RTN.js +8 -0
  12. package/dist/analysis-ABEO6RTN.js.map +1 -0
  13. package/dist/auth-XNBEBNPY.js +7669 -0
  14. package/dist/auth-XNBEBNPY.js.map +1 -0
  15. package/dist/ceremony-M7CXVBVA.js +45 -0
  16. package/dist/ceremony-M7CXVBVA.js.map +1 -0
  17. package/dist/chunk-A3QSZJPD.js +3147 -0
  18. package/dist/chunk-A3QSZJPD.js.map +1 -0
  19. package/dist/chunk-ASGZ5B6C.js +3969 -0
  20. package/dist/chunk-ASGZ5B6C.js.map +1 -0
  21. package/dist/chunk-DMXC2JTC.js +58 -0
  22. package/dist/chunk-DMXC2JTC.js.map +1 -0
  23. package/dist/chunk-EEBSK2IH.js +161 -0
  24. package/dist/chunk-EEBSK2IH.js.map +1 -0
  25. package/dist/chunk-EWOJGXRX.js +22 -0
  26. package/dist/chunk-EWOJGXRX.js.map +1 -0
  27. package/dist/chunk-F7GEJLP7.js +2389 -0
  28. package/dist/chunk-F7GEJLP7.js.map +1 -0
  29. package/dist/chunk-GOYL3F4T.js +605 -0
  30. package/dist/chunk-GOYL3F4T.js.map +1 -0
  31. package/dist/chunk-GRMRYWYS.js +17 -0
  32. package/dist/chunk-GRMRYWYS.js.map +1 -0
  33. package/dist/chunk-GSUGROXB.js +1951 -0
  34. package/dist/chunk-GSUGROXB.js.map +1 -0
  35. package/dist/chunk-H7773ONB.js +50 -0
  36. package/dist/chunk-H7773ONB.js.map +1 -0
  37. package/dist/chunk-HFQHU5LC.js +445 -0
  38. package/dist/chunk-HFQHU5LC.js.map +1 -0
  39. package/dist/chunk-IVHUBLJD.js +318 -0
  40. package/dist/chunk-IVHUBLJD.js.map +1 -0
  41. package/dist/chunk-KJWKY4L4.js +14 -0
  42. package/dist/chunk-KJWKY4L4.js.map +1 -0
  43. package/dist/chunk-MJVY2XUN.js +1793 -0
  44. package/dist/chunk-MJVY2XUN.js.map +1 -0
  45. package/dist/chunk-QWZVCJII.js +1797 -0
  46. package/dist/chunk-QWZVCJII.js.map +1 -0
  47. package/dist/chunk-VTSNRV3V.js +3237 -0
  48. package/dist/chunk-VTSNRV3V.js.map +1 -0
  49. package/dist/chunk-W5B4GTXR.js +1466 -0
  50. package/dist/chunk-W5B4GTXR.js.map +1 -0
  51. package/dist/chunk-WZEZLVOW.js +4995 -0
  52. package/dist/chunk-WZEZLVOW.js.map +1 -0
  53. package/dist/chunk-YPTTIXKC.js +199 -0
  54. package/dist/chunk-YPTTIXKC.js.map +1 -0
  55. package/dist/chunk-Z55UGM6X.js +6360 -0
  56. package/dist/chunk-Z55UGM6X.js.map +1 -0
  57. package/dist/chunk-ZIIRQODJ.js +110 -0
  58. package/dist/chunk-ZIIRQODJ.js.map +1 -0
  59. package/dist/chunk-ZSUQ4FMB.js +77 -0
  60. package/dist/chunk-ZSUQ4FMB.js.map +1 -0
  61. package/dist/client-JMTSZS3V.js +10 -0
  62. package/dist/client-JMTSZS3V.js.map +1 -0
  63. package/dist/deprecated-snap.js +19 -0
  64. package/dist/deprecated-snap.js.map +1 -0
  65. package/dist/dist-2KWBZFLA.js +14 -0
  66. package/dist/dist-2KWBZFLA.js.map +1 -0
  67. package/dist/dist-5ZYKNNU3.js +7 -0
  68. package/dist/dist-5ZYKNNU3.js.map +1 -0
  69. package/dist/dist-CP3RFHPI.js +11 -0
  70. package/dist/dist-CP3RFHPI.js.map +1 -0
  71. package/dist/gecko-53ITAGG6.js +56 -0
  72. package/dist/gecko-53ITAGG6.js.map +1 -0
  73. package/dist/guards-QAFC64NO.js +7 -0
  74. package/dist/guards-QAFC64NO.js.map +1 -0
  75. package/dist/index.js +57785 -0
  76. package/dist/index.js.map +1 -0
  77. package/dist/init-command-246JIVXM.js +7 -0
  78. package/dist/init-command-246JIVXM.js.map +1 -0
  79. package/dist/init-core-KAI7LCXZ.js +12 -0
  80. package/dist/init-core-KAI7LCXZ.js.map +1 -0
  81. package/dist/init-scan-RZNYDTUV.js +1919 -0
  82. package/dist/init-scan-RZNYDTUV.js.map +1 -0
  83. package/dist/local-service-adapter-6KNN6WQL.js +8 -0
  84. package/dist/local-service-adapter-6KNN6WQL.js.map +1 -0
  85. package/dist/secure-credentials-JXWAQLS2.js +306 -0
  86. package/dist/secure-credentials-JXWAQLS2.js.map +1 -0
  87. package/dist/tui-TPJPUS2R.js +111 -0
  88. package/dist/tui-TPJPUS2R.js.map +1 -0
  89. package/dist/vreko-dir-O3RLG7PI.js +8 -0
  90. package/dist/vreko-dir-O3RLG7PI.js.map +1 -0
  91. package/package.json +132 -0
  92. package/scripts/check-banned-words.ts +152 -0
  93. package/scripts/hooks/posttooluse-file-notify.sh +108 -0
  94. package/scripts/hooks/pretooluse-fragile-guard.sh +82 -0
  95. package/scripts/post-install-notice.js +24 -0
  96. package/scripts/postinstall.mjs +84 -0
  97. package/scripts/preuninstall.mjs +34 -0
  98. package/scripts/verify-jsx-transform.mjs +55 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../packages/platform/dist/db/adapters/SnapshotStoreDb.js","../../../packages/platform/src/db/schema/vreko/credit-topups.ts","../../../packages/platform/src/db/schema/vreko/credits-ledger.ts","../../../packages/platform/src/db/schema/vreko/device-trials.ts","../../../packages/platform/src/db/schema/vreko/snapshots.ts","../../../packages/platform/src/db/schema/vreko/trials.ts","../../../packages/platform/src/db/schema/vreko/waitlist.ts","../../../packages/platform/dist/db/adapters/TelemetrySinkDbAdapter.js","../../../packages/platform/src/db/schema/postgres.ts","../../../packages/platform/dist/db/queries/organizations.js","../../../packages/platform/dist/db/queries/privacy.js","../../../packages/platform/dist/db/queries/purchases.js","../../../packages/platform/dist/db/queries/users.js","../../../packages/platform/dist/db/queries/workspace-links.js","../../../packages/platform/dist/db/queries/vector-search.js","../../../packages/platform/dist/services/attribution-service.js","../../../packages/config/src/subscription-config.ts","../../../packages/config/dist/config.js","../../../packages/config/src/feature-flags.ts","../../../packages/config/src/schemas.ts","../../../packages/config/src/utils/base-url.ts","../../../packages/config/src/utils/feature-flags.ts","../../../packages/platform/dist/services/entitlements-service.js","../../../packages/platform/dist/services/mcp-service.js","../../../packages/platform/dist/services/saga-orchestrator.js","../../../packages/platform/dist/services/saga-persistence.js","../../../packages/platform/dist/services/sagas/tier-upgrade-saga-impl.js"],"names":["SnapshotStoreDb","db","createSnapshot","snapshot","id","crypto","randomUUID","now","Date","insert","snapshots","values","userId","apiKeyId","name","description","trigger","triggerType","fileCount","totalSizeBytes","riskScore","createdAt","expiresAt","workspaceId","addFilesToSnapshot","snapshotId","files","map","file","filePath","fileHash","fileSizeBytes","changeType","linesChanged","containsSecrets","riskLevel","cloudBackupUrl","length","snapshotFiles","listSnapshots","limit","result","select","from","where","eq","orderBy","desc","row","undefined","fetchSnapshot","fetchSnapshotFiles","topupStatusEnum","creditTopups","text","primaryKey","references","onDelete","organizationId","packSize","integer","notNull","priceCents","stripePaymentIntentId","stripeCheckoutSessionId","stripeCustomerId","ledgerTransactionId","metadata","userIdIdx","uniqueIndex","orgIdIdx","statusIdx","stripePaymentIdx","stripeCheckoutIdx","relations","one","user","fields","organization","creditTransactionTypeEnum","pgEnum","creditJobTypeEnum","creditTransactionStatusEnum","creditsLedger","credits","balanceAfter","transactionType","status","jobType","jobId","estimatedCredits","estimatedCostCents","actualCostCents","tokensUsed","graphNodes","topupId","billingPeriodStart","timestamp","billingPeriodEnd","finalizedAt","table","transactionTypeIdx","createdAtIdx","billingPeriodIdx","deviceTrials","deviceFingerprint","unique","apiCallsUsed","default","apiCallLimit","convertedAt","blockedUntil","deviceFingerprintIdx","on","blockedUntilIdx","apiKeys","idempotencyKey","fileHashes","jsonb","gitBranch","gitCommit","gitDirty","boolean","riskFactors","projectPath","encryptedDataKey","encryptionAlgorithm","defaultNow","pgTable","uuid","snapshotFilePathIdx","index","many","trialStatusEnum","startedAt","endsAt","canceledAt","features","autoExtended","extensionReason","waitlist","githubUsername","queuePosition","referralCode","json","updatedAt","TelemetrySinkDbAdapter","storeEvents","events","event","extractUserId","extractApiKeyId","eventType","eventCategory","categorizeEvent","properties","redactProperties","payload","sessionId","context","platform","client","telemetryEvents","getEvents","filter","results","toTelemetryEvent","e","startTime","endTime","hasRequestId","requestId","telemetryIdempotencyKeys","recordRequestId","responseData","user_id","api_key_id","type","toLowerCase","includes","sensitiveFields","redacted","field","getTime","TOPUP_PACKS","perCredit","savings","completedAt","refundedAt","creditTopupsRelations","getTopupPackDetails","isValidPackSize","size","nanoid","patterns","defaultRandom","installCount","lastSeenAt","userIdx","apiKey","cloudBackupEnabled","encryptionKeyId","apiKeyIdIdx","userCreatedAtIdx","snapshotsRelations","snapshotFilesRelations","trials","email","editor","language","teamSize","waitlistStatusEnum","intent","hubspotContactId","hubspotSyncedAt","emailSent","emailSentAt","invitedAt","acceptedAt","waitlistReferrals","$defaultFn","referredEmail","pointsAwarded","waitlistTasks","taskType","waitlistRelations","referrals","relationName","tasks","auditLogs","waitlistAuditLogs","waitlistReferralsRelations","referrer","referred","waitlistTasksRelations","waitlistEntry","action","waitlistAuditLogsRelations","waitlistId","purchaseTypeEnum","subscriptionStatusEnum","varchar","emailVerified","image","member","combinedSchema","getOrganizations","offset","query","Error","findMany","org","like","extras","membersCount","sql","as","countAllOrganizations","$count","getOrganizationById","findFirst","with","members","invitations","getOrganizationsWithMembers","getInvitationById","invitation","getOrganizationBySlug","slug","getOrganizationMembership","and","getOrganizationWithPurchasesAndMembersCount","purchases","getPendingInvitationByEmail","updateOrganization","updatedOrganization","update","set","generateOrganizationSlug","baseSlug","slugify","lowercase","hasAvailableSlug","i","existing","PRIVACY_SALT","process","env","anonymizeUserId","hash","createHash","digest","slice","anonymizeEmail","local","domain","split","domainHash","maskedLocal","charAt","sanitizeForLogging","obj","logAnonymizedEvent","data","anonymousId","sanitized","token","logger","info","toISOString","error","message","String","exportUserData","userRecord","then","rows","warn","userSessions","userAccounts","userApiKeys","userSubscriptions","Promise","all","session","account","subscriptions","sanitizedUser","sanitizedApiKeys","k","sessions","accounts","exportedAt","deleteUserData","delete","deleteUserApiKeys","rowCount","anonymizeUserData","username","getUserPrivacyPreferences","analyticsConsent","marketingConsent","sharingConsent","shouldRetainData","retentionDays","retentionMs","ageMs","cleanupExpiredData","cutoffDate","lte","purchase","getPurchasesByOrganizationId","getPurchasesByUserId","getPurchaseById","getPurchaseBySubscriptionId","subscriptionId","createPurchase","insertedPurchase","returning","firstResult","updatePurchase","updatedPurchase","deletePurchaseBySubscriptionId","searchUsersSchema","zod","object","string","min","max","optional","number","getUsers","validatedParams","parse","whereClause","countAllUsers","getUserById","getUserByEmail","createUser","role","onboardingComplete","newUser","getAccountById","createUserAccount","providerId","accountId","hashedPassword","password","newAccount","updateUser","updatedUser","workspaceLinks","workspaceIdSchema","z","regex","linkWorkspaceSchema","tier","enum","displayName","date","updateTierSchema","getWorkspaceLinkById","validatedId","link","resolveTierByWorkspaceId","found","stdout","write","staleCutoff","TIER_STALENESS_THRESHOLD_MS","tierRefreshedAt","tierRefreshed","currentTier","subscription","plan","freshTier","mapPlanToTier","catch","_error","linkWorkspace","params","validated","WORKSPACE_LINK_TTL_MS","updateWorkspaceTier","unlinkWorkspace","getWorkspaceLinksByUserId","unlinkAllWorkspacesForUser","searchSimilarPatterns","queryVector","similarityThreshold","patternType","isGlobal","vectorLiteral","join","patternSignature","similarity","embedding","occurrenceCount","successRate","findSimilarPatterns","patternId","excludeSelf","referencePattern","insertPatternWithEmbedding","toolAffinity","fileTypes","updatePatternEmbedding","isPgvectorEnabled","execute","getVectorStats","totalResult","embeddingResult","indexResult","count","indexRow","totalPatterns","patternsWithEmbeddings","indexName","indexname","indexType","indexdef","AttributionServiceImpl","attributions","Map","fingerprintIndex","transferAttribution","request","fingerprint","attribution","transferAttributionInMemory","existingByFingerprint","userAttributions","shouldMerge","shouldMergeAttribution","attributionId","source","campaignId","utmParams","conversionData","success","existingAttribution","existingByUser","newAttribution","getAttribution","get","markConverted","updated","getConversionMetrics","dateRange","getConversionMetricsInMemory","gte","to","metricsBySource","record","metrics","total","conversions","timesToConvert","daysToConvert","push","entries","avgTimeToConvert","reduce","a","b","totalUsers","conversionRate","sort","existingUserId","Math","random","toString","substr","cloudStorageQuotaMb","teamMembers","advancedAnalytics","apiAccess","monthlyCreditsAllowance","config","appName","tagline","organizations","enable","enableBilling","enableUsersToCreateOrganizations","requireOrganization","hideOrganization","forbiddenOrganizationSlugs","users","enableOnboarding","auth","enableSignup","enableMagicLink","enableSocialLogin","enablePasskeys","enablePasswordLogin","enableTwoFactor","redirectAfterSignIn","redirectAfterLogout","sessionCookieMaxAge","mails","storage","bucketNames","avatars","checkpoints","ui","enabledThemes","defaultTheme","saas","enabled","useSidebarLayout","marketing","contactForm","subject","payments","plans","free","isFree","prices","productId","amount","currency","interval","pro","recommended","trialPeriodDays","PRO_TRIAL_DAYS","team","seatBased","ENABLE_MULTI_SESSION","ENABLE_INTELLIGENCE_LAYER","ENABLE_SSO","cooldowns","block","int","watch","IgnorePatternsSchema","array","describe","PrivacySettingsSchema","consent","clipboard","watcher","gitWrapper","lastReminded","NotificationsSettingsSchema","quietHours","start","end","autoCreate","copilot","GuardianPluginsSchema","secretDetection","mockReplacement","phantomDependency","GuardianSettingsSchema","warnThreshold","blockThreshold","protectionLevel","ProtectionLevelSchema","plugins","thresholds","GuardianThresholdsSchema","riskThreshold","MCPSettingsSchema","performanceBudgets","analyze_risk","create_snapshot","cacheTtlDocs","api","baseUrl","url","http","apiUrl","SettingsSchema","defaultProtectionLevel","requireSnapshotMessage","maxSnapshots","aiDetectionEnabled","autoRestoreOnDetection","privacy","notifications","ai","AISettingsSchema","guardian","autoDecision","webBaseUrl","apiBaseUrl","mcp","PolicyOverrideSchema","pattern","ttl","allowOverrides","overrides","ConfigStoreV2Schema","version","protections","literal","ignore","ProtectionRuleSchema","engine","EngineConfigSchema","settings","policies","PoliciesSchema","workspaces","WorkspaceRegistrationSchema","DEFAULT_CONFIG","maxDepth","burstThreshold","rateLimit","notifyThreshold","minFilesForBurst","maxSnapshotsPerMinute","context7","cacheTtlSearch","allowedOrigins","enforceProtectionLevels","ZERO_CONFIG_DEFAULTS","getBaseUrl","NEXT_PUBLIC_SITE_URL","EntitlementsServiceImpl","cache","CACHE_TTL_MS","getEntitlements","isRedisAvailable","cached","getCache","memoryCached","entitlements","createDefaultEntitlements","trial","isPioneerEnabled","FEATURE_PIONEER_PROGRAM","pioneerData","pioneerRow","pioneers","githubStarred","joinedAt","redemption","pioneerRedemptions","totalPoints","pioneerError","getEffectiveTier","usageData","usageLimits","month","creditBalance","calculateCreditBalance","buildEntitlements","setCache","checkFeatureAccess","feature","limits","current","granted","reason","limitInfo","active","pioneer","isFeatureAvailableAtTier","requiredTier","getRequiredTierForFeature","getFeatureLimits","checkTierRequirement","compareTiers","invalidateCache","deleteCache","getTierFeatures","trialInfo","pioneerInfo","pointsToNext","calculatePointsToNext","nextTier","getNextTier","discountPercent","getTierDiscount","benefits","getTierBenefits","maxLimit","getTierLimit","getFeatureUsage","period","effectiveDate","currentPeriodStart","currentPeriodEnd","defaultCredits","included","TIER_CREDIT_ALLOWANCES","topups","overage","softCapReached","monthlyAllowance","getFullYear","getMonth","includedResult","sum","gt","topupResult","consumptionResult","Number","consumption","abs","CREDIT_OVERAGE_SOFT_CAP","tiers","PIONEER_TIER_THRESHOLDS","active_pioneer","contributing_pioneer","founding_pioneer","tierOrder","currentIndex","indexOf","threshold","discounts","userTier","userIndex","requiredIndex","snapshotsUsed","entitlementsService","getDb","MCPService","recordObservation","input","database","mcpObservations","created","severity","lineNumber","toolName","deviceId","observedAt","processed","recordInvocation","mcpToolInvocations","toolVersion","invocationType","requestPayload","responsePayload","errorMessage","inputTokens","outputTokens","durationMs","updateSyncState","updateResult","extensionSyncState","lastSyncAt","syncVersion","deviceType","deviceName","pendingChangesCount","pendingChanges","isOnline","lastHeartbeatAt","queryObservations","conditions","after","markObservationsProcessed","observationIds","processedAt","instance","getMCPService","SagaOrchestratorImpl","persistence","definitions","runningInstances","registerSaga","definition","sagaType","initialContext","sagaId","generateSagaId","steps","step","stepId","stepName","output","compensatedAt","failedAt","retryCount","maxRetries","save","executeAsync","resume","load","getStatus","running","listSagas","listAll","stepDef","stepExec","executeStep","compensate","persistenceInterval","timeoutMs","timeout","executeWithTimeout","retryable","delayMs","sleep","failedStepIndex","randomBytes","promise","race","_resolve","reject","setTimeout","ms","resolve","SagaPersistenceImpl","inMemoryStore","saga","sagas","parseInt","updates","updateData","Array","s","startedAfter","startedBefore","inArray","instances","debug","sagaPersistence","updateSubscriptionStep","priceIdMap","STRIPE_PRO_MONTHLY_PRICE_ID","STRIPE_TEAM_MONTHLY_PRICE_ID","enterprise","STRIPE_ENTERPRISE_MONTHLY_PRICE_ID","newPriceId","toTier","stripeClient","currentSubscription","retrieve","currentPriceId","items","price","previousPriceId","proration_behavior","prorationAmount","priceId","compensateUpdateSubscription","_input","updateUserTierStep","currentEntitlements","previousTier","subscriptionTier","compensateUpdateUserTier","updateUpgradeEntitlementsStep","_context","previousVersion","newEntitlements","addedFeatures","f","compensateUpdateUpgradeEntitlements","_output","sendUpgradeConfirmationStep","emailService","skippedJobId","emailJobId","scheduledAt","emailJobData","recipientEmail","userEmail","template","templateVersion","variant","templateData","fromTier","newFeatures","sendAt","priority","queueEmail","compensateSendUpgradeConfirmation","startsWith","cancelJob","emitTierUpgradedStep","eventBus","eventId","emit","getTierUpgradeSaga","TIER_UPGRADE_SAGA","createTierUpgradeSagaWithDeps","deps","sagaDef","originalSteps","enhanceContext"],"mappings":"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","file":"chunk-ASGZ5B6C.js","sourcesContent":["// ESM imports fixed for Node.js v22+\nimport { desc, eq } from \"drizzle-orm\";\nimport { snapshotFiles, snapshots } from \"../schema/vreko/index.js\";\nexport class SnapshotStoreDb {\n db;\n constructor(db) {\n this.db = db;\n /* intentionally empty */\n }\n /**\n * Create a new snapshot\n */\n async createSnapshot(snapshot) {\n const id = crypto.randomUUID();\n const now = new Date();\n await this.db.insert(snapshots).values({\n id,\n userId: snapshot.userId,\n apiKeyId: snapshot.apiKeyId,\n name: snapshot.name,\n description: snapshot.description,\n trigger: snapshot.triggerType,\n fileCount: snapshot.fileCount,\n totalSizeBytes: snapshot.totalSizeBytes,\n riskScore: snapshot.riskScore,\n createdAt: now,\n expiresAt: snapshot.expiresAt,\n workspaceId: snapshot.workspaceId,\n });\n return id;\n }\n /**\n * Add files to a snapshot\n */\n async addFilesToSnapshot(snapshotId, files) {\n const values = files.map((file) => ({\n id: crypto.randomUUID(),\n snapshotId,\n filePath: file.filePath,\n fileHash: file.fileHash,\n fileSizeBytes: file.fileSizeBytes,\n changeType: file.changeType,\n linesChanged: file.linesChanged,\n containsSecrets: file.containsSecrets,\n riskLevel: file.riskLevel,\n cloudBackupUrl: file.cloudBackupUrl,\n createdAt: new Date(),\n }));\n if (values.length > 0) {\n await this.db.insert(snapshotFiles).values(values);\n }\n }\n /**\n * List snapshots for a user\n */\n async listSnapshots(userId, limit = 50) {\n const result = await this.db\n .select()\n .from(snapshots)\n .where(eq(snapshots.userId, userId))\n .orderBy(desc(snapshots.createdAt))\n .limit(limit);\n return result.map((row) => ({\n id: row.id,\n userId: row.userId,\n apiKeyId: row.apiKeyId,\n workspaceId: row.workspaceId || undefined,\n name: row.name || undefined,\n description: row.description || undefined,\n triggerType: row.trigger,\n fileCount: row.fileCount,\n totalSizeBytes: row.totalSizeBytes,\n riskScore: row.riskScore || undefined,\n createdAt: row.createdAt,\n expiresAt: row.expiresAt || undefined,\n }));\n }\n /**\n * Fetch a snapshot by ID\n */\n async fetchSnapshot(id) {\n const result = await this.db.select().from(snapshots).where(eq(snapshots.id, id)).limit(1);\n if (result.length === 0) {\n return null;\n }\n const row = result[0];\n if (!row) {\n return null;\n }\n return {\n id: row.id,\n userId: row.userId,\n apiKeyId: row.apiKeyId,\n workspaceId: row.workspaceId || undefined,\n name: row.name || undefined,\n description: row.description || undefined,\n triggerType: row.trigger,\n fileCount: row.fileCount,\n totalSizeBytes: row.totalSizeBytes,\n riskScore: row.riskScore || undefined,\n createdAt: row.createdAt,\n expiresAt: row.expiresAt || undefined,\n };\n }\n /**\n * Fetch files for a snapshot\n */\n async fetchSnapshotFiles(snapshotId) {\n const result = await this.db.select().from(snapshotFiles).where(eq(snapshotFiles.snapshotId, snapshotId));\n return result.map((row) => ({\n id: row.id,\n snapshotId: row.snapshotId,\n filePath: row.filePath,\n fileHash: row.fileHash,\n fileSizeBytes: row.fileSizeBytes,\n changeType: row.changeType || undefined,\n linesChanged: row.linesChanged || undefined,\n containsSecrets: row.containsSecrets || undefined,\n riskLevel: row.riskLevel || undefined,\n cloudBackupUrl: row.cloudBackupUrl || undefined,\n createdAt: row.createdAt,\n }));\n }\n}\n","/**\n * Credit Top-Ups Schema\n *\n * Tracks purchased credit packs for Pro and Team tiers.\n * Per pricing_spec_v3.md:\n *\n * | Pack | Price | Per-Credit | Savings |\n * |------|-------|------------|---------|\n * | 50 credits | $5 | $0.10 | - |\n * | 100 credits | $9 | $0.09 | 10% |\n * | 250 credits | $20 | $0.08 | 20% |\n *\n * Top-ups do not expire. They're consumed after the monthly included allowance is depleted.\n * Free tier users cannot purchase top-ups (must upgrade to Pro).\n *\n * @module credit-topups\n */\n\nimport { relations } from \"drizzle-orm\";\nimport { integer, jsonb, pgEnum, pgTable, text, timestamp, uniqueIndex } from \"drizzle-orm/pg-core\";\nimport { nanoid } from \"nanoid\";\nimport { organization, user } from \"../postgres\";\n\n// Top-up status enum\nexport const topupStatusEnum = pgEnum(\"topup_status\", [\n\t\"pending\", // Payment initiated but not completed\n\t\"completed\", // Payment successful, credits added\n\t\"failed\", // Payment failed\n\t\"refunded\", // Payment refunded, credits removed\n\t\"canceled\", // User canceled before payment\n]);\n\n// Top-up pack sizes (per spec)\nexport const TOPUP_PACKS = {\n\t50: { priceCents: 500, perCredit: 0.1, savings: 0 },\n\t100: { priceCents: 900, perCredit: 0.09, savings: 10 },\n\t250: { priceCents: 2000, perCredit: 0.08, savings: 20 },\n} as const;\n\nexport type TopupPackSize = keyof typeof TOPUP_PACKS;\n\n/**\n * Credit Top-Ups Table\n *\n * Tracks all credit pack purchases.\n */\nexport const creditTopups = pgTable(\n\t\"credit_topups\",\n\t{\n\t\tid: text(\"id\")\n\t\t\t.primaryKey()\n\t\t\t.$defaultFn(() => nanoid()),\n\t\tuserId: text(\"user_id\").references(() => user.id, {\n\t\t\tonDelete: \"cascade\",\n\t\t}),\n\t\torganizationId: text(\"organization_id\").references(() => organization.id, {\n\t\t\tonDelete: \"cascade\",\n\t\t}),\n\n\t\t// Pack details\n\t\tpackSize: integer(\"pack_size\").notNull(), // 50, 100, or 250\n\t\tpriceCents: integer(\"price_cents\").notNull(), // 500, 900, or 2000\n\n\t\t// Stripe integration\n\t\tstripePaymentIntentId: text(\"stripe_payment_intent_id\"),\n\t\tstripeCheckoutSessionId: text(\"stripe_checkout_session_id\"),\n\t\tstripeCustomerId: text(\"stripe_customer_id\"),\n\n\t\t// Status tracking\n\t\tstatus: topupStatusEnum(\"status\").notNull().default(\"pending\"),\n\n\t\t// Ledger reference (credits added via ledger)\n\t\tledgerTransactionId: text(\"ledger_transaction_id\"), // Reference to credits_ledger entry\n\n\t\t// Additional metadata\n\t\tmetadata: jsonb(\"metadata\").default({}),\n\n\t\t// Timestamps\n\t\tcreatedAt: timestamp(\"created_at\").defaultNow().notNull(),\n\t\tcompletedAt: timestamp(\"completed_at\"),\n\t\trefundedAt: timestamp(\"refunded_at\"),\n\t},\n\t(table) => ({\n\t\t// Indexes\n\t\tuserIdIdx: uniqueIndex(\"idx_credit_topups_user_id\").on(table.userId),\n\t\torgIdIdx: uniqueIndex(\"idx_credit_topups_org_id\").on(table.organizationId),\n\t\tstatusIdx: uniqueIndex(\"idx_credit_topups_status\").on(table.status),\n\t\tstripePaymentIdx: uniqueIndex(\"idx_credit_topups_stripe_payment\").on(table.stripePaymentIntentId),\n\t\tstripeCheckoutIdx: uniqueIndex(\"idx_credit_topups_stripe_checkout\").on(table.stripeCheckoutSessionId),\n\t}),\n);\n\n/**\n * Relations for credit top-ups\n */\nexport const creditTopupsRelations = relations(creditTopups, ({ one }) => ({\n\tuser: one(user, {\n\t\tfields: [creditTopups.userId],\n\t\treferences: [user.id],\n\t}),\n\torganization: one(organization, {\n\t\tfields: [creditTopups.organizationId],\n\t\treferences: [organization.id],\n\t}),\n}));\n\n// Type exports\nexport type CreditTopup = typeof creditTopups.$inferSelect;\nexport type NewCreditTopup = typeof creditTopups.$inferInsert;\nexport type TopupStatus = (typeof topupStatusEnum.enumValues)[number];\n\n/**\n * Helper function to get pack details\n */\nexport function getTopupPackDetails(packSize: TopupPackSize) {\n\treturn TOPUP_PACKS[packSize];\n}\n\n/**\n * Helper function to validate pack size\n */\nexport function isValidPackSize(size: number): size is TopupPackSize {\n\treturn size in TOPUP_PACKS;\n}\n","/**\n * Credits Ledger Schema\n *\n * Tracks all credit transactions for the credit-based billing system.\n * Per pricing_spec_v3.md: Credits apply only to operations with real server-side compute cost.\n *\n * Transaction types:\n * - monthly_allowance: Monthly credit grant based on tier\n * - top_up: Purchased credit pack\n * - job_consumption: Credits consumed by a job\n * - refund: Credits returned (e.g., job failed)\n * - admin_adjustment: Manual adjustment by admin\n *\n * @module credits-ledger\n */\n\nimport { relations } from \"drizzle-orm\";\nimport { integer, jsonb, pgEnum, pgTable, text, timestamp, uniqueIndex } from \"drizzle-orm/pg-core\";\nimport { nanoid } from \"nanoid\";\nimport { organization, user } from \"../postgres\";\n\n// Transaction type enum\nexport const creditTransactionTypeEnum = pgEnum(\"credit_transaction_type\", [\n\t\"monthly_allowance\",\n\t\"top_up\",\n\t\"job_consumption\",\n\t\"refund\",\n\t\"admin_adjustment\",\n]);\n\n// Job type enum for credit consumption\nexport const creditJobTypeEnum = pgEnum(\"credit_job_type\", [\n\t\"deep_risk_sweep\",\n\t\"full_codebase_scan\",\n\t\"memory_sync\",\n\t\"synthesis\",\n\t\"layer3_personalization\",\n\t\"ai_refactor_plan\",\n\t\"fleet_analysis\",\n\t\"vitals_history\",\n]);\n\n// Transaction status enum\nexport const creditTransactionStatusEnum = pgEnum(\"credit_transaction_status\", [\n\t\"pending\", // Reserved but not yet finalized\n\t\"completed\", // Transaction finalized\n\t\"failed\", // Transaction failed\n\t\"reversed\", // Transaction reversed (refund)\n]);\n\n/**\n * Credits Ledger Table\n *\n * Every credit transaction is recorded here with running balance.\n * This is the source of truth for credit balance calculations.\n */\nexport const creditsLedger = pgTable(\n\t\"credits_ledger\",\n\t{\n\t\tid: text(\"id\")\n\t\t\t.primaryKey()\n\t\t\t.$defaultFn(() => nanoid()),\n\t\tuserId: text(\"user_id\").references(() => user.id, {\n\t\t\tonDelete: \"cascade\",\n\t\t}),\n\t\torganizationId: text(\"organization_id\").references(() => organization.id, {\n\t\t\tonDelete: \"cascade\",\n\t\t}),\n\n\t\t// Credit transaction details\n\t\tcredits: integer(\"credits\").notNull(), // positive = add, negative = consume\n\t\tbalanceAfter: integer(\"balance_after\").notNull(), // Running balance after this transaction\n\n\t\t// Transaction metadata\n\t\ttransactionType: creditTransactionTypeEnum(\"transaction_type\").notNull(),\n\t\tstatus: creditTransactionStatusEnum(\"status\").notNull().default(\"completed\"),\n\n\t\t// Job-specific fields (for job_consumption type)\n\t\tjobType: creditJobTypeEnum(\"job_type\"),\n\t\tjobId: text(\"job_id\"), // Reference to the actual job (e.g., analysis ID)\n\t\testimatedCredits: integer(\"estimated_credits\"), // Original estimate before job ran\n\n\t\t// Cost tracking (for internal analysis, per spec Phase 1)\n\t\testimatedCostCents: integer(\"estimated_cost_cents\"), // Estimated internal cost\n\t\tactualCostCents: integer(\"actual_cost_cents\"), // Actual internal cost\n\t\ttokensUsed: integer(\"tokens_used\"), // LLM tokens if applicable\n\t\tgraphNodes: integer(\"graph_nodes\"), // Graph size if applicable\n\t\tfileCount: integer(\"file_count\"), // File count if applicable\n\n\t\t// Stripe integration (for top-ups)\n\t\tstripePaymentIntentId: text(\"stripe_payment_intent_id\"),\n\t\tstripeCheckoutSessionId: text(\"stripe_checkout_session_id\"),\n\n\t\t// Top-up pack reference\n\t\ttopupId: text(\"topup_id\"), // Reference to credit_topups table\n\n\t\t// Billing period tracking\n\t\tbillingPeriodStart: timestamp(\"billing_period_start\"),\n\t\tbillingPeriodEnd: timestamp(\"billing_period_end\"),\n\n\t\t// Additional metadata\n\t\tmetadata: jsonb(\"metadata\").default({}),\n\n\t\t// Timestamps\n\t\tcreatedAt: timestamp(\"created_at\").defaultNow().notNull(),\n\t\tfinalizedAt: timestamp(\"finalized_at\"),\n\t},\n\t(table) => ({\n\t\t// Indexes for common queries\n\t\tuserIdIdx: uniqueIndex(\"idx_credits_ledger_user_id\").on(table.userId),\n\t\torgIdIdx: uniqueIndex(\"idx_credits_ledger_org_id\").on(table.organizationId),\n\t\ttransactionTypeIdx: uniqueIndex(\"idx_credits_ledger_transaction_type\").on(table.transactionType),\n\t\tcreatedAtIdx: uniqueIndex(\"idx_credits_ledger_created_at\").on(table.createdAt),\n\t\tbillingPeriodIdx: uniqueIndex(\"idx_credits_ledger_billing_period\").on(table.userId, table.billingPeriodStart),\n\t\tstripePaymentIdx: uniqueIndex(\"idx_credits_ledger_stripe_payment\").on(table.stripePaymentIntentId),\n\t}),\n);\n\n/**\n * Relations for credits ledger\n */\nexport const creditsLedgerRelations = relations(creditsLedger, ({ one }) => ({\n\tuser: one(user, {\n\t\tfields: [creditsLedger.userId],\n\t\treferences: [user.id],\n\t}),\n\torganization: one(organization, {\n\t\tfields: [creditsLedger.organizationId],\n\t\treferences: [organization.id],\n\t}),\n}));\n\n// Type exports\nexport type CreditsLedger = typeof creditsLedger.$inferSelect;\nexport type NewCreditsLedger = typeof creditsLedger.$inferInsert;\nexport type CreditTransactionType = (typeof creditTransactionTypeEnum.enumValues)[number];\nexport type CreditJobType = (typeof creditJobTypeEnum.enumValues)[number];\nexport type CreditTransactionStatus = (typeof creditTransactionStatusEnum.enumValues)[number];\n","import { relations } from \"drizzle-orm\";\nimport { integer, pgTable, text, timestamp, uniqueIndex, uuid } from \"drizzle-orm/pg-core\";\nimport { apiKeys, user } from \"../postgres\";\n\n/**\n * Device Trials Table\n *\n * Tracks anonymous VSCode extension trials using device fingerprints.\n * Enables progressive authentication: device → email → payment.\n *\n * Progressive Funnel:\n * 1. Anonymous trial: 50 snapshots (device fingerprint only)\n * 2. Email signup: 1000 snapshots (links device to user)\n * 3. Paid tier: Unlimited snapshots (full account)\n *\n * Anti-abuse: Blocks after 3 reinstalls within 24h with 24h cooldown\n */\nexport const deviceTrials = pgTable(\n\t\"device_trials\",\n\t{\n\t\tid: uuid(\"id\").primaryKey().defaultRandom(),\n\n\t\t// Device Identity (from VSCode machineId)\n\t\tdeviceFingerprint: text(\"device_fingerprint\").notNull().unique(),\n\n\t\t// API Key for this device trial\n\t\tapiKeyId: text(\"api_key_id\")\n\t\t\t.notNull()\n\t\t\t.references(() => apiKeys.id, { onDelete: \"cascade\" }),\n\n\t\t// Usage Tracking\n\t\tsnapshotsUsed: integer(\"snapshots_used\").notNull().default(0),\n\t\tapiCallsUsed: integer(\"api_calls_used\").notNull().default(0),\n\n\t\t// Limits (increase on conversion)\n\t\tsnapshotLimit: integer(\"snapshot_limit\").notNull().default(50),\n\t\tapiCallLimit: integer(\"api_call_limit\").notNull().default(10000),\n\n\t\t// User Conversion (null until email signup)\n\t\tuserId: text(\"user_id\").references(() => user.id, {\n\t\t\tonDelete: \"cascade\",\n\t\t}),\n\t\tconvertedAt: timestamp(\"converted_at\"),\n\n\t\t// Abuse Prevention\n\t\tinstallCount: integer(\"install_count\").notNull().default(1),\n\t\tblockedUntil: timestamp(\"blocked_until\"), // null = not blocked\n\n\t\t// Timestamps\n\t\tlastSeenAt: timestamp(\"last_seen_at\").defaultNow(),\n\t\tcreatedAt: timestamp(\"created_at\").defaultNow().notNull(),\n\t},\n\t(table) => ({\n\t\t// Index for fast fingerprint lookups\n\t\tdeviceFingerprintIdx: uniqueIndex(\"device_trials_fingerprint_idx\").on(table.deviceFingerprint),\n\t\t// Index for finding all devices for a user\n\t\tuserIdx: uniqueIndex(\"device_trials_user_idx\").on(table.userId),\n\t\t// Index for checking blocked devices\n\t\tblockedUntilIdx: uniqueIndex(\"device_trials_blocked_idx\").on(table.blockedUntil),\n\t}),\n);\n\nexport const deviceTrialsRelations = relations(deviceTrials, ({ one }) => ({\n\tuser: one(user, {\n\t\tfields: [deviceTrials.userId],\n\t\treferences: [user.id],\n\t}),\n\tapiKey: one(apiKeys, {\n\t\tfields: [deviceTrials.apiKeyId],\n\t\treferences: [apiKeys.id],\n\t}),\n}));\n","import { relations } from \"drizzle-orm\";\nimport { boolean, index, integer, jsonb, pgTable, text, timestamp, uuid } from \"drizzle-orm/pg-core\";\nimport { apiKeys, user } from \"../postgres\";\n\n/**\n * Snapshots - Privacy-first metadata storage\n *\n * PRIVACY PRINCIPLE: Store only metadata by default.\n * File content storage requires explicit user opt-in via cloudBackup permission.\n */\nexport const snapshots = pgTable(\n\t\"snapshots\",\n\t{\n\t\tid: uuid(\"id\").primaryKey().defaultRandom(),\n\n\t\t// Ownership\n\t\tuserId: text(\"user_id\")\n\t\t\t.notNull()\n\t\t\t.references(() => user.id, { onDelete: \"cascade\" }),\n\t\tapiKeyId: text(\"api_key_id\")\n\t\t\t.notNull()\n\t\t\t.references(() => apiKeys.id, { onDelete: \"cascade\" }),\n\n\t\t// Idempotency key for duplicate prevention\n\t\tidempotencyKey: text(\"idempotency_key\").unique(), // Optional client-provided idempotency key\n\n\t\t// Snapshot metadata (always stored)\n\t\tname: text(\"name\"), // Optional user-provided name\n\t\tdescription: text(\"description\"), // Optional description\n\t\ttrigger: text(\"trigger\").notNull(), // \"manual\", \"auto\", \"pre_command\", \"risk_detection\"\n\n\t\t// File metadata (no actual content by default)\n\t\tfileCount: integer(\"file_count\").notNull().default(0),\n\t\ttotalSizeBytes: integer(\"total_size_bytes\").notNull().default(0),\n\t\tfileHashes: jsonb(\"file_hashes\").$type<string[]>().default([]), // SHA-256 hashes\n\n\t\t// Git context (metadata only)\n\t\tgitBranch: text(\"git_branch\"),\n\t\tgitCommit: text(\"git_commit\"),\n\t\tgitDirty: boolean(\"git_dirty\").default(false),\n\n\t\t// Risk analysis metadata\n\t\triskScore: integer(\"risk_score\"), // 0-100\n\t\triskFactors: jsonb(\"risk_factors\")\n\t\t\t.$type<\n\t\t\t\t{\n\t\t\t\t\ttype: string;\n\t\t\t\t\tseverity: \"low\" | \"medium\" | \"high\";\n\t\t\t\t\tmessage: string;\n\t\t\t\t}[]\n\t\t\t>()\n\t\t\t.default([]),\n\n\t\t// Project context\n\t\tprojectPath: text(\"project_path\"),\n\t\tworkspaceId: text(\"workspace_id\"), // For future team features\n\n\t\t// Cloud backup (only if user opted in)\n\t\tcloudBackupEnabled: boolean(\"cloud_backup_enabled\").default(false),\n\t\tcloudBackupUrl: text(\"cloud_backup_url\"), // S3/storage URL if backed up\n\n\t\t// Encryption fields for server-side KMS encryption\n\t\t// MVP Note: Server-side KMS encryption with Row Level Security (RLS) to isolate rows\n\t\t// Post-MVP: Will add client-side E2EE with user-controlled keys\n\t\tencryptionKeyId: text(\"encryption_key_id\"), // KMS key identifier\n\t\tencryptedDataKey: text(\"encrypted_data_key\"), // Data encryption key encrypted with KMS key\n\t\tencryptionAlgorithm: text(\"encryption_algorithm\").default(\"AES-256-GCM\"), // Encryption algorithm used\n\n\t\t// Timestamps\n\t\tcreatedAt: timestamp(\"created_at\").defaultNow().notNull(),\n\t\texpiresAt: timestamp(\"expires_at\"), // For automatic cleanup\n\n\t\t// Metadata for additional context\n\t\tmetadata: jsonb(\"metadata\")\n\t\t\t.$type<{\n\t\t\t\tclientVersion?: string;\n\t\t\t\tideVersion?: string;\n\t\t\t\tplatform?: string;\n\t\t\t\ttags?: string[];\n\t\t\t}>()\n\t\t\t.default({}),\n\t},\n\t(table) => ({\n\t\t// FK indexes for query performance (3-10x improvement on JOINs)\n\t\tuserIdIdx: index(\"snapshots_user_id_idx\").on(table.userId),\n\t\tapiKeyIdIdx: index(\"snapshots_api_key_id_idx\").on(table.apiKeyId),\n\t\t// Composite index for common query pattern: user's recent snapshots\n\t\tuserCreatedAtIdx: index(\"snapshots_user_created_at_idx\").on(table.userId, table.createdAt),\n\t}),\n);\n\n/**\n * Snapshot Files - Individual file metadata\n * Only stores file paths and hashes, NOT content (unless cloud backup enabled)\n */\nexport const snapshotFiles = pgTable(\n\t\"snapshot_files\",\n\t{\n\t\tid: uuid(\"id\").primaryKey().defaultRandom(),\n\n\t\tsnapshotId: uuid(\"snapshot_id\")\n\t\t\t.notNull()\n\t\t\t.references(() => snapshots.id, { onDelete: \"cascade\" }),\n\n\t\t// File metadata\n\t\tfilePath: text(\"file_path\").notNull(), // Relative path in project\n\t\tfileHash: text(\"file_hash\").notNull(), // SHA-256 hash\n\t\tfileSizeBytes: integer(\"file_size_bytes\").notNull(),\n\n\t\t// Change detection\n\t\tchangeType: text(\"change_type\"), // \"added\", \"modified\", \"deleted\"\n\t\tlinesChanged: integer(\"lines_changed\"),\n\n\t\t// Risk flags\n\t\tcontainsSecrets: boolean(\"contains_secrets\").default(false),\n\t\triskLevel: text(\"risk_level\"), // \"low\", \"medium\", \"high\"\n\n\t\t// Cloud backup (only if snapshot has cloudBackupEnabled)\n\t\tcloudBackupUrl: text(\"cloud_backup_url\"), // Individual file backup URL\n\n\t\tcreatedAt: timestamp(\"created_at\").defaultNow().notNull(),\n\t},\n\t(table) => ({\n\t\t// FK index for query performance on snapshot file lookups\n\t\tsnapshotIdIdx: index(\"snapshot_files_snapshot_id_idx\").on(table.snapshotId),\n\t\t// Composite index for finding files by path within a snapshot\n\t\tsnapshotFilePathIdx: index(\"snapshot_files_snapshot_path_idx\").on(table.snapshotId, table.filePath),\n\t}),\n);\n\n// Relations\nexport const snapshotsRelations = relations(snapshots, ({ one, many }) => ({\n\tuser: one(user, {\n\t\tfields: [snapshots.userId],\n\t\treferences: [user.id],\n\t}),\n\tapiKey: one(apiKeys, {\n\t\tfields: [snapshots.apiKeyId],\n\t\treferences: [apiKeys.id],\n\t}),\n\tfiles: many(snapshotFiles),\n}));\n\nexport const snapshotFilesRelations = relations(snapshotFiles, ({ one }) => ({\n\tsnapshot: one(snapshots, {\n\t\tfields: [snapshotFiles.snapshotId],\n\t\treferences: [snapshots.id],\n\t}),\n}));\n\n// Type exports\nexport type Snapshot = typeof snapshots.$inferSelect;\nexport type NewSnapshot = typeof snapshots.$inferInsert;\nexport type SnapshotFile = typeof snapshotFiles.$inferSelect;\nexport type NewSnapshotFile = typeof snapshotFiles.$inferInsert;\n","/**\n * Trial Schema\n * Tracks user trial periods for Pro features\n */\n\nimport { relations } from \"drizzle-orm\";\nimport { boolean, index, json, pgEnum, pgTable, text, timestamp } from \"drizzle-orm/pg-core\";\nimport { nanoid } from \"nanoid\";\nimport { user } from \"../postgres\";\n\nexport const trialStatusEnum = pgEnum(\"trial_status\", [\"active\", \"expired\", \"converted\", \"canceled\"]);\n\nexport const trials = pgTable(\n\t\"trials\",\n\t{\n\t\tid: text(\"id\")\n\t\t\t.primaryKey()\n\t\t\t.$defaultFn(() => nanoid()),\n\t\tuserId: text(\"user_id\")\n\t\t\t.notNull()\n\t\t\t.unique()\n\t\t\t.references(() => user.id, { onDelete: \"cascade\" }),\n\t\tstatus: trialStatusEnum(\"status\").notNull().default(\"active\"),\n\t\tstartedAt: timestamp(\"started_at\").notNull().defaultNow(),\n\t\tendsAt: timestamp(\"ends_at\").notNull(),\n\t\tconvertedAt: timestamp(\"converted_at\"), // When trial converted to paid subscription\n\t\tcanceledAt: timestamp(\"canceled_at\"),\n\t\tfeatures: json(\"features\")\n\t\t\t.$type<string[]>()\n\t\t\t.default([\"cloud_backup\", \"api_access\", \"advanced_analytics\", \"priority_support\"]),\n\t\tautoExtended: boolean(\"auto_extended\").notNull().default(false), // Whether trial was auto-extended\n\t\textensionReason: text(\"extension_reason\"), // Reason for extension (e.g., 'pioneer_benefit', 'support_request')\n\t\tmetadata: json(\"metadata\").$type<Record<string, unknown>>(),\n\t\tcreatedAt: timestamp(\"created_at\").notNull().defaultNow(),\n\t\tupdatedAt: timestamp(\"updated_at\").notNull().defaultNow(),\n\t},\n\t(table) => [\n\t\tindex(\"trials_user_id_idx\").on(table.userId),\n\t\tindex(\"trials_status_idx\").on(table.status),\n\t\tindex(\"trials_ends_at_idx\").on(table.endsAt),\n\t],\n);\n\nexport const trialsRelations = relations(trials, ({ one }) => ({\n\tuser: one(user, {\n\t\tfields: [trials.userId],\n\t\treferences: [user.id],\n\t}),\n}));\n\nexport type Trial = typeof trials.$inferSelect;\nexport type NewTrial = typeof trials.$inferInsert;\n","import { relations } from \"drizzle-orm\";\nimport { index, integer, json, pgEnum, pgTable, text, timestamp, uniqueIndex } from \"drizzle-orm/pg-core\";\nimport { nanoid } from \"nanoid\";\n\n// Waitlist status enum\nexport const waitlistStatusEnum = pgEnum(\"waitlist_status\", [\"pending\", \"invited\", \"accepted\", \"rejected\", \"hold\"]);\n\n// Main waitlist table\nexport const waitlist = pgTable(\n\t\"waitlist\",\n\t{\n\t\tid: text(\"id\")\n\t\t\t.primaryKey()\n\t\t\t.$defaultFn(() => nanoid()),\n\t\temail: text(\"email\").notNull().unique(),\n\t\tgithubUsername: text(\"github_username\"),\n\t\teditor: text(\"editor\"),\n\t\tlanguage: text(\"language\"),\n\t\tteamSize: text(\"team_size\"),\n\t\tqueuePosition: integer(\"queue_position\").notNull(),\n\t\tstatus: waitlistStatusEnum(\"status\").notNull().default(\"pending\"),\n\t\treferralCode: text(\"referral_code\").notNull().unique(),\n\t\t// Solo or team intent, captured from application form\n\t\tintent: text(\"intent\"),\n\n\t\t// HubSpot integration\n\t\thubspotContactId: text(\"hubspot_contact_id\"),\n\t\thubspotSyncedAt: timestamp(\"hubspot_synced_at\"),\n\n\t\t// Email tracking\n\t\temailSent: timestamp(\"email_sent\"),\n\t\temailSentAt: timestamp(\"email_sent_at\"),\n\n\t\t// Invitation tracking\n\t\tinvitedAt: timestamp(\"invited_at\"),\n\t\tacceptedAt: timestamp(\"accepted_at\"),\n\n\t\t// Metadata\n\t\tmetadata: json(\"metadata\").$type<{\n\t\t\treferrer?: string;\n\t\t\tutmSource?: string;\n\t\t\tutmMedium?: string;\n\t\t\tutmCampaign?: string;\n\t\t\tuserAgent?: string;\n\t\t}>(),\n\n\t\tcreatedAt: timestamp(\"created_at\").notNull().defaultNow(),\n\t\tupdatedAt: timestamp(\"updated_at\").notNull().defaultNow(),\n\t},\n\t(table) => [\n\t\tuniqueIndex(\"waitlist_email_idx\").on(table.email),\n\t\tuniqueIndex(\"waitlist_referral_code_idx\").on(table.referralCode),\n\t\tindex(\"waitlist_status_idx\").on(table.status),\n\t\tindex(\"waitlist_queue_position_idx\").on(table.queuePosition),\n\t],\n);\n\n// Referrals table\nexport const waitlistReferrals = pgTable(\n\t\"waitlist_referrals\",\n\t{\n\t\tid: text(\"id\")\n\t\t\t.primaryKey()\n\t\t\t.$defaultFn(() => nanoid()),\n\t\treferrerId: text(\"referrer_id\")\n\t\t\t.notNull()\n\t\t\t.references(() => waitlist.id, { onDelete: \"cascade\" }),\n\t\treferredEmail: text(\"referred_email\").notNull(),\n\t\treferredId: text(\"referred_id\").references(() => waitlist.id, {\n\t\t\tonDelete: \"set null\",\n\t\t}),\n\t\tpointsAwarded: integer(\"points_awarded\").default(0).notNull(),\n\t\tcreatedAt: timestamp(\"created_at\").notNull().defaultNow(),\n\t},\n\t(table) => [\n\t\tindex(\"waitlist_referrals_referrer_idx\").on(table.referrerId),\n\t\tindex(\"waitlist_referrals_referred_idx\").on(table.referredId),\n\t],\n);\n\n// Queue jump tasks\nexport const waitlistTasks = pgTable(\n\t\"waitlist_tasks\",\n\t{\n\t\tid: text(\"id\")\n\t\t\t.primaryKey()\n\t\t\t.$defaultFn(() => nanoid()),\n\t\twaitlistId: text(\"waitlist_id\")\n\t\t\t.notNull()\n\t\t\t.references(() => waitlist.id, { onDelete: \"cascade\" }),\n\t\ttaskType: text(\"task_type\").notNull(), // 'github', 'demo', 'snapshot'\n\t\tcompleted: timestamp(\"completed\"),\n\t\tpointsEarned: integer(\"points_earned\").notNull(),\n\t\tmetadata: json(\"metadata\").$type<{\n\t\t\tgithubStarred?: boolean;\n\t\t\tdemoWatched?: boolean;\n\t\t\tsnapshotCreated?: boolean;\n\t\t}>(),\n\t\tcreatedAt: timestamp(\"created_at\").notNull().defaultNow(),\n\t},\n\t(table) => [\n\t\tindex(\"waitlist_tasks_waitlist_idx\").on(table.waitlistId),\n\t\tindex(\"waitlist_tasks_type_idx\").on(table.taskType),\n\t],\n);\n\n// Relations\nexport const waitlistRelations = relations(waitlist, ({ many }) => ({\n\treferrals: many(waitlistReferrals, { relationName: \"referrer\" }),\n\treferredBy: many(waitlistReferrals, { relationName: \"referred\" }),\n\ttasks: many(waitlistTasks),\n\tauditLogs: many(waitlistAuditLogs),\n}));\n\nexport const waitlistReferralsRelations = relations(waitlistReferrals, ({ one }) => ({\n\treferrer: one(waitlist, {\n\t\tfields: [waitlistReferrals.referrerId],\n\t\treferences: [waitlist.id],\n\t\trelationName: \"referrer\",\n\t}),\n\treferred: one(waitlist, {\n\t\tfields: [waitlistReferrals.referredId],\n\t\treferences: [waitlist.id],\n\t\trelationName: \"referred\",\n\t}),\n}));\n\nexport const waitlistTasksRelations = relations(waitlistTasks, ({ one }) => ({\n\twaitlistEntry: one(waitlist, {\n\t\tfields: [waitlistTasks.waitlistId],\n\t\treferences: [waitlist.id],\n\t}),\n}));\n\n// Audit logs for waitlist actions\nexport const waitlistAuditLogs = pgTable(\n\t\"waitlist_audit_logs\",\n\t{\n\t\tid: text(\"id\")\n\t\t\t.primaryKey()\n\t\t\t.$defaultFn(() => nanoid()),\n\t\twaitlistId: text(\"waitlist_id\")\n\t\t\t.notNull()\n\t\t\t.references(() => waitlist.id, { onDelete: \"cascade\" }),\n\t\taction: text(\"action\").notNull(), // 'joined', 'invited', 'accepted', 'rejected', 'hold', 'position_updated', 'referral_earned'\n\t\tuserId: text(\"user_id\"), // Better Auth user ID if applicable\n\t\tmetadata: json(\"metadata\").$type<{\n\t\t\toldPosition?: number;\n\t\t\tnewPosition?: number;\n\t\t\tpointsEarned?: number;\n\t\t\tipAddress?: string;\n\t\t\tuserAgent?: string;\n\t\t}>(),\n\t\tcreatedAt: timestamp(\"created_at\").notNull().defaultNow(),\n\t},\n\t(table) => [\n\t\tindex(\"waitlist_audit_logs_waitlist_idx\").on(table.waitlistId),\n\t\tindex(\"waitlist_audit_logs_action_idx\").on(table.action),\n\t\tindex(\"waitlist_audit_logs_created_at_idx\").on(table.createdAt),\n\t],\n);\n\nexport const waitlistAuditLogsRelations = relations(waitlistAuditLogs, ({ one }) => ({\n\twaitlistEntry: one(waitlist, {\n\t\tfields: [waitlistAuditLogs.waitlistId],\n\t\treferences: [waitlist.id],\n\t}),\n}));\n\n// Type exports\nexport type Waitlist = typeof waitlist.$inferSelect;\nexport type NewWaitlist = typeof waitlist.$inferInsert;\nexport type WaitlistReferral = typeof waitlistReferrals.$inferSelect;\nexport type NewWaitlistReferral = typeof waitlistReferrals.$inferInsert;\nexport type WaitlistTask = typeof waitlistTasks.$inferSelect;\nexport type NewWaitlistTask = typeof waitlistTasks.$inferInsert;\nexport type WaitlistAuditLog = typeof waitlistAuditLogs.$inferSelect;\nexport type NewWaitlistAuditLog = typeof waitlistAuditLogs.$inferInsert;\n","// ESM imports fixed for Node.js v22+\nimport { eq } from \"drizzle-orm\";\nimport { telemetryEvents, telemetryIdempotencyKeys } from \"../schema/vreko/telemetry-events.js\";\n/**\n * TelemetrySinkDbAdapter - Database adapter for telemetry ingestion\n *\n * Implements the TelemetrySink port using the telemetry_events and\n * telemetry_idempotency_keys tables for persistent storage.\n *\n * This adapter belongs in @vreko/platform package since it owns:\n * - Drizzle table schemas\n * - Domain types and interfaces\n * - Database layer abstraction\n */\nexport class TelemetrySinkDbAdapter {\n db;\n constructor(db) {\n this.db = db;\n /* intentionally empty */\n }\n /**\n * Store telemetry events with idempotency check\n */\n async storeEvents(events) {\n if (events.length === 0) {\n return;\n }\n // Transform events to database format\n const values = events.map((event) => ({\n id: event.id,\n userId: this.extractUserId(event),\n apiKeyId: this.extractApiKeyId(event),\n eventType: event.eventType,\n eventCategory: this.categorizeEvent(event),\n properties: this.redactProperties(event.payload),\n sessionId: event.context?.sessionId,\n platform: event.context?.client,\n timestamp: new Date(event.timestamp),\n createdAt: new Date(),\n }));\n // Batch insert events\n await this.db.insert(telemetryEvents).values(values);\n }\n /**\n * Retrieve telemetry events with optional filtering\n */\n async getEvents(filter) {\n const results = await this.db.select().from(telemetryEvents);\n // In-memory filtering for all criteria\n let events = results.map((row) => this.toTelemetryEvent(row));\n if (filter?.eventType) {\n events = events.filter((e) => e.eventType === filter.eventType);\n }\n if (filter?.sessionId) {\n events = events.filter((e) => e.context?.sessionId === filter.sessionId);\n }\n if (filter?.startTime !== undefined) {\n events = events.filter((e) => e.timestamp >= filter.startTime);\n }\n if (filter?.endTime !== undefined) {\n events = events.filter((e) => e.timestamp <= filter.endTime);\n }\n return events;\n }\n /**\n * Check if a request ID has been processed (idempotency)\n */\n async hasRequestId(requestId) {\n const result = await this.db\n .select()\n .from(telemetryIdempotencyKeys)\n .where(eq(telemetryIdempotencyKeys.idempotencyKey, requestId))\n .limit(1);\n return result.length > 0;\n }\n /**\n * Record a request ID as processed (idempotency)\n * Caches response data for duplicate request handling (2026 best practice)\n */\n async recordRequestId(requestId, responseData = {}) {\n // Set expiry to 24 hours from now\n const expiresAt = new Date(Date.now() + 24 * 60 * 60 * 1000);\n await this.db.insert(telemetryIdempotencyKeys).values({\n idempotencyKey: requestId,\n responseData,\n createdAt: new Date(),\n expiresAt,\n });\n }\n /**\n * Extract user ID from event context or payload\n */\n extractUserId(event) {\n // Try to extract from payload first, then context\n return event.payload.userId || event.payload.user_id || null;\n }\n /**\n * Extract API key ID from event context or payload\n */\n extractApiKeyId(event) {\n return event.payload.apiKeyId || event.payload.api_key_id || null;\n }\n /**\n * Categorize event based on eventType\n * Maps to eventCategory enum in schema\n */\n categorizeEvent(event) {\n const type = event.eventType.toLowerCase();\n if (type.includes(\"error\")) {\n return \"error\";\n }\n if (type.includes(\"feature\") || type.includes(\"usage\")) {\n return \"feature_usage\";\n }\n if (type.includes(\"lifecycle\") || type.includes(\"session\")) {\n return \"lifecycle\";\n }\n if (type.includes(\"engagement\") || type.includes(\"interaction\")) {\n return \"engagement\";\n }\n return \"system\";\n }\n /**\n * Redact sensitive properties before storage (GDPR compliance 2026)\n * Prevents PII leakage through telemetry data\n */\n redactProperties(properties) {\n const sensitiveFields = [\n \"email\",\n \"password\",\n \"token\",\n \"apiKey\",\n \"api_key\",\n \"secret\",\n \"accessToken\",\n \"access_token\",\n \"refreshToken\",\n \"refresh_token\",\n \"creditCard\",\n \"credit_card\",\n \"ssn\",\n \"socialSecurity\",\n ];\n const redacted = { ...properties };\n for (const field of sensitiveFields) {\n if (field in redacted) {\n redacted[field] = \"[REDACTED]\";\n }\n }\n return redacted;\n }\n /**\n * Transform database row to TelemetryEvent contract type\n */\n toTelemetryEvent(row) {\n return {\n id: row.id,\n eventType: row.eventType,\n payload: row.properties || {},\n timestamp: row.timestamp.getTime(),\n context: row.sessionId || row.requestId\n ? {\n sessionId: (row.sessionId || \"\"),\n requestId: row.requestId || `synthetic-${row.id}`,\n workspaceId: row.workspaceId || undefined,\n client: row.platform || \"unknown\",\n }\n : undefined,\n };\n }\n}\n","import { relations } from \"drizzle-orm\";\nimport {\n\tbigint,\n\tboolean,\n\tindex,\n\tinteger,\n\tjson,\n\tpgEnum,\n\tpgTable,\n\ttext,\n\ttimestamp,\n\tuniqueIndex,\n\tvarchar,\n} from \"drizzle-orm/pg-core\";\nimport { nanoid } from \"nanoid\";\n\n// Enums\nexport const purchaseTypeEnum = pgEnum(\"PurchaseType\", [\"SUBSCRIPTION\", \"ONE_TIME\"]);\n\n// Add new enums for Vreko\nexport const subscriptionStatusEnum = pgEnum(\"subscription_status\", [\n\t\"active\",\n\t\"canceled\",\n\t\"past_due\",\n\t\"trialing\",\n\t\"paused\",\n]);\n\nexport const planTypeEnum = pgEnum(\"plan_type\", [\"free\", \"pro\", \"team\", \"enterprise\"]);\n\n// Tables\nexport const user = pgTable(\"user\", {\n\tid: varchar(\"id\", { length: 255 })\n\t\t.$defaultFn(() => nanoid())\n\t\t.primaryKey(),\n\tname: text(\"name\").notNull(),\n\temail: text(\"email\").notNull().unique(),\n\temailVerified: boolean(\"emailVerified\").notNull().default(false),\n\timage: text(\"image\"),\n\tcreatedAt: timestamp(\"createdAt\").notNull().defaultNow(),\n\tupdatedAt: timestamp(\"updatedAt\").notNull().defaultNow(),\n\tusername: text(\"username\").unique(),\n\tdisplayUsername: text(\"displayUsername\").unique(), // Better Auth username plugin\n\trole: text(\"role\"),\n\tbanned: boolean(\"banned\"),\n\tbanReason: text(\"banReason\"),\n\tbanExpires: timestamp(\"banExpires\"),\n\tonboardingComplete: boolean(\"onboardingComplete\").default(false).notNull(),\n\tpaymentsCustomerId: text(\"paymentsCustomerId\"),\n\tlocale: text(\"locale\"),\n\ttotalSnapshots: integer(\"totalSnapshots\").default(0).notNull(),\n\ttotalRecoveries: integer(\"totalRecoveries\").default(0).notNull(),\n\tsubscriptionTier: planTypeEnum(\"subscription_tier\").default(\"free\"), // Add subscription tier field\n\ttierExpiresAt: timestamp(\"tier_expires_at\", { withTimezone: true }), // Timed admin tier grants\n\ttwoFactorEnabled: boolean(\"twoFactorEnabled\").default(false), // Required by Better Auth twoFactor plugin\n\tdeviceFingerprint: text(\"deviceFingerprint\"), // Added for fraud prevention\n\t// Abuse Defense Phase 1 fields\n\tnormalizedEmail: varchar(\"normalized_email\", { length: 255 }), // For email deduplication\n\tconcurrentDeviceCount: integer(\"concurrent_device_count\").default(0).notNull(), // Active devices\n\tmaxObservedDevices: integer(\"max_observed_devices\").default(0).notNull(), // High watermark\n\t// Pioneer Program\n\tpioneer: boolean(\"pioneer\").default(false),\n\tpioneerCohort: integer(\"pioneer_cohort\"),\n\tpioneerActivatedAt: timestamp(\"pioneer_activated_at\", { withTimezone: true }),\n});\n\nexport const session = pgTable(\n\t\"session\",\n\t{\n\t\tid: varchar(\"id\", { length: 255 })\n\t\t\t.$defaultFn(() => nanoid())\n\t\t\t.primaryKey(),\n\t\texpiresAt: timestamp(\"expiresAt\").notNull(),\n\t\tipAddress: text(\"ipAddress\"),\n\t\tuserAgent: text(\"userAgent\"),\n\t\tuserId: text(\"userId\")\n\t\t\t.notNull()\n\t\t\t.references(() => user.id, { onDelete: \"cascade\" }),\n\t\timpersonatedBy: text(\"impersonatedBy\"),\n\t\tactiveOrganizationId: text(\"activeOrganizationId\"),\n\t\ttoken: text(\"token\").notNull(),\n\t\tcreatedAt: timestamp(\"createdAt\").notNull(),\n\t\tupdatedAt: timestamp(\"updatedAt\").notNull(),\n\t},\n\n\t(table) => [uniqueIndex(\"session_token_idx\").on(table.token)],\n);\n\nexport const account = pgTable(\"account\", {\n\tid: varchar(\"id\", { length: 255 })\n\t\t.$defaultFn(() => nanoid())\n\t\t.primaryKey(),\n\taccountId: text(\"accountId\").notNull(),\n\tproviderId: text(\"providerId\").notNull(),\n\tuserId: text(\"userId\")\n\t\t.notNull()\n\t\t.references(() => user.id, { onDelete: \"cascade\" }),\n\taccessToken: text(\"accessToken\"),\n\trefreshToken: text(\"refreshToken\"),\n\tidToken: text(\"idToken\"),\n\texpiresAt: timestamp(\"expiresAt\"),\n\tpassword: text(\"password\"),\n\taccessTokenExpiresAt: timestamp(\"accessTokenExpiresAt\"),\n\trefreshTokenExpiresAt: timestamp(\"refreshTokenExpiresAt\"),\n\tscope: text(\"scope\"),\n\tcreatedAt: timestamp(\"createdAt\").notNull(),\n\tupdatedAt: timestamp(\"updatedAt\").notNull(),\n});\n\nexport const verification = pgTable(\"verification\", {\n\tid: varchar(\"id\", { length: 255 })\n\t\t.$defaultFn(() => nanoid())\n\t\t.primaryKey(),\n\tidentifier: text(\"identifier\").notNull(),\n\tvalue: text(\"value\").notNull(),\n\texpiresAt: timestamp(\"expiresAt\").notNull(),\n\tcreatedAt: timestamp(\"createdAt\"),\n\tupdatedAt: timestamp(\"updatedAt\"),\n});\n\nexport const passkey = pgTable(\"passkey\", {\n\tid: varchar(\"id\", { length: 255 })\n\t\t.$defaultFn(() => nanoid())\n\t\t.primaryKey(),\n\tname: text(\"name\"),\n\tpublicKey: text(\"publicKey\").notNull(),\n\tuserId: text(\"userId\")\n\t\t.notNull()\n\t\t.references(() => user.id, { onDelete: \"cascade\" }),\n\tcredentialID: text(\"credentialID\").notNull(),\n\tcounter: integer(\"counter\").notNull(),\n\tdeviceType: text(\"deviceType\").notNull(),\n\tbackedUp: boolean(\"backedUp\").notNull(),\n\ttransports: text(\"transports\"),\n\tcreatedAt: timestamp(\"createdAt\"),\n});\n\nexport const twoFactor = pgTable(\"twoFactor\", {\n\tid: varchar(\"id\", { length: 255 })\n\t\t.$defaultFn(() => nanoid())\n\t\t.primaryKey(),\n\tsecret: text(\"secret\").notNull(),\n\tbackupCodes: text(\"backupCodes\").notNull(),\n\tuserId: text(\"userId\")\n\t\t.notNull()\n\t\t.references(() => user.id, { onDelete: \"cascade\" }),\n});\n\n// Better Auth rate limiting table\n// Note: lastRequest uses default string mode for Better Auth compatibility\nexport const rateLimit = pgTable(\"rateLimit\", {\n\tid: varchar(\"id\", { length: 255 })\n\t\t.$defaultFn(() => nanoid())\n\t\t.primaryKey(),\n\tkey: text(\"key\").notNull(),\n\tcount: integer(\"count\").notNull().default(0),\n\tlastRequest: bigint(\"lastRequest\", { mode: \"number\" }).notNull(),\n});\n\n// Better Auth JWKS table (for JWT plugin)\n// Stores JSON Web Key Set for signing JWTs\nexport const jwks = pgTable(\"jwks\", {\n\tid: varchar(\"id\", { length: 255 })\n\t\t.$defaultFn(() => nanoid())\n\t\t.primaryKey(),\n\tpublicKey: text(\"publicKey\").notNull(),\n\tprivateKey: text(\"privateKey\").notNull(),\n\tcreatedAt: timestamp(\"createdAt\").notNull().defaultNow(),\n});\n\nexport const organization = pgTable(\n\t\"organization\",\n\t{\n\t\tid: varchar(\"id\", { length: 255 })\n\t\t\t.$defaultFn(() => nanoid())\n\t\t\t.primaryKey(),\n\t\tname: text(\"name\").notNull(),\n\t\tslug: text(\"slug\"),\n\t\tlogo: text(\"logo\"),\n\t\tcreatedAt: timestamp(\"createdAt\").notNull(),\n\t\tmetadata: text(\"metadata\"),\n\t\tpaymentsCustomerId: text(\"paymentsCustomerId\"),\n\t},\n\n\t(table) => [uniqueIndex(\"organization_slug_idx\").on(table.slug)],\n);\n\nexport const member = pgTable(\n\t\"member\",\n\t{\n\t\tid: varchar(\"id\", { length: 255 })\n\t\t\t.$defaultFn(() => nanoid())\n\t\t\t.primaryKey(),\n\t\torganizationId: text(\"organizationId\")\n\t\t\t.notNull()\n\t\t\t.references(() => organization.id, { onDelete: \"cascade\" }),\n\t\tuserId: text(\"userId\")\n\t\t\t.notNull()\n\t\t\t.references(() => user.id, { onDelete: \"cascade\" }),\n\t\trole: text(\"role\").notNull(),\n\t\tcreatedAt: timestamp(\"createdAt\").notNull(),\n\t},\n\n\t(table) => [uniqueIndex(\"member_user_org_idx\").on(table.userId, table.organizationId)],\n);\n\nexport const invitation = pgTable(\"invitation\", {\n\tid: varchar(\"id\", { length: 255 })\n\t\t.$defaultFn(() => nanoid())\n\t\t.primaryKey(),\n\torganizationId: text(\"organizationId\")\n\t\t.notNull()\n\t\t.references(() => organization.id, { onDelete: \"cascade\" }),\n\temail: text(\"email\").notNull(),\n\trole: text(\"role\"),\n\tstatus: text(\"status\").notNull(),\n\texpiresAt: timestamp(\"expiresAt\").notNull(),\n\tinviterId: text(\"inviterId\")\n\t\t.notNull()\n\t\t.references(() => user.id, { onDelete: \"cascade\" }),\n});\n\nexport const purchase = pgTable(\"purchase\", {\n\tid: varchar(\"id\", { length: 255 })\n\t\t.$defaultFn(() => nanoid())\n\t\t.primaryKey(),\n\torganizationId: text(\"organizationId\").references(() => organization.id, {\n\t\tonDelete: \"cascade\",\n\t}),\n\tuserId: text(\"userId\").references(() => user.id, {\n\t\tonDelete: \"cascade\",\n\t}),\n\ttype: purchaseTypeEnum(\"type\").notNull(),\n\tcustomerId: text(\"customerId\").notNull(),\n\tsubscriptionId: text(\"subscriptionId\").unique(),\n\tproductId: text(\"productId\").notNull(),\n\tstatus: text(\"status\"),\n\tcreatedAt: timestamp(\"createdAt\").defaultNow().notNull(),\n\tupdatedAt: timestamp(\"updatedAt\"),\n});\n\nexport const aiChat = pgTable(\"aiChat\", {\n\tid: varchar(\"id\", { length: 255 })\n\t\t.$defaultFn(() => nanoid())\n\t\t.primaryKey(),\n\torganizationId: text(\"organizationId\").references(() => organization.id, {\n\t\tonDelete: \"cascade\",\n\t}),\n\tuserId: text(\"userId\").references(() => user.id, { onDelete: \"cascade\" }),\n\ttitle: text(\"title\"),\n\tmessages: json(\"messages\").$type<Array<object>>(),\n\tcreatedAt: timestamp(\"createdAt\").defaultNow().notNull(),\n\tupdatedAt: timestamp(\"updatedAt\"),\n});\n\n// Add Vreko specific tables\n// API Keys table - This is the main integration point\nexport const apiKeys = pgTable(\n\t\"api_keys\",\n\t{\n\t\tid: text(\"id\")\n\t\t\t.primaryKey()\n\t\t\t.$defaultFn(() => nanoid()),\n\t\tuserId: text(\"user_id\")\n\t\t\t.notNull()\n\t\t\t.references(() => user.id, { onDelete: \"cascade\" }),\n\t\torganizationId: text(\"organization_id\").references(() => organization.id, {\n\t\t\tonDelete: \"cascade\",\n\t\t}),\n\t\tname: text(\"name\").notNull().default(\"Default Key\"),\n\t\tkey: text(\"key\").unique().notNull(), // Hashed version\n\t\tstart: text(\"start\").notNull(), // First few chars for lookup (Better Auth required)\n\t\tprefix: text(\"prefix\").notNull().default(\"sk_live_\"), // Key prefix (Better Auth required)\n\t\tkeyPreview: text(\"key_preview\").notNull(), // First 8 chars for display\n\t\tpermissions: json(\"permissions\")\n\t\t\t.$type<{\n\t\t\t\tmaxSnapshots?: number;\n\t\t\t\tcloudBackup?: boolean;\n\t\t\t\tadvancedDetection?: boolean;\n\t\t\t\tcustomRules?: boolean;\n\t\t\t\tteamSharing?: boolean;\n\t\t\t}>()\n\t\t\t.default({}),\n\t\t// Better Auth required fields\n\t\tenabled: boolean(\"enabled\").default(true),\n\t\trateLimitEnabled: boolean(\"rate_limit_enabled\").default(false),\n\t\trateLimitTimeWindow: integer(\"rate_limit_time_window\"), // Time window in ms\n\t\trateLimitMax: integer(\"rate_limit_max\"), // Max requests per window\n\t\tremaining: integer(\"remaining\"), // Remaining requests\n\t\trefillInterval: integer(\"refill_interval\"), // Rate limit refill interval in ms\n\t\trefillAmount: integer(\"refill_amount\"), // Rate limit refill amount\n\t\tlastRefillAt: timestamp(\"last_refill_at\"),\n\t\tmetadata: json(\"metadata\").$type<Record<string, unknown>>(), // Better Auth metadata\n\t\t// Vreko specific fields\n\t\tlastUsedAt: timestamp(\"last_used_at\"),\n\t\texpiresAt: timestamp(\"expires_at\"),\n\t\trevokedAt: timestamp(\"revoked_at\"),\n\t\tcreatedAt: timestamp(\"created_at\").defaultNow().notNull(),\n\t\tupdatedAt: timestamp(\"updated_at\").defaultNow().notNull(),\n\t},\n\n\t(table) => {\n\t\treturn {\n\t\t\tuserIdx: index(\"api_keys_user_idx\").on(table.userId),\n\t\t\torgIdx: index(\"api_keys_org_idx\").on(table.organizationId),\n\t\t\tkeyIdx: uniqueIndex(\"api_keys_key_idx\").on(table.key),\n\t\t\tstartIdx: index(\"api_keys_start_idx\").on(table.start), // Index for quick lookup\n\t\t};\n\t},\n);\n\n// Client Tokens table - for VS Code extension and other clients\nexport const clientTokens = pgTable(\n\t\"client_tokens\",\n\t{\n\t\tid: text(\"id\")\n\t\t\t.primaryKey()\n\t\t\t.$defaultFn(() => nanoid()),\n\t\tuserId: text(\"user_id\")\n\t\t\t.notNull()\n\t\t\t.references(() => user.id, { onDelete: \"cascade\" }),\n\t\tname: text(\"name\").notNull(),\n\t\ttoken: text(\"token\").unique().notNull(), // Hashed version\n\t\ttokenPreview: text(\"token_preview\").notNull(), // First 8 chars for display\n\t\tpermissions: json(\"permissions\")\n\t\t\t.$type<{\n\t\t\t\tmaxSnapshots?: number;\n\t\t\t\tcloudBackup?: boolean;\n\t\t\t\tadvancedDetection?: boolean;\n\t\t\t\tcustomRules?: boolean;\n\t\t\t\tteamSharing?: boolean;\n\t\t\t}>()\n\t\t\t.default({}),\n\t\tlastUsedAt: timestamp(\"last_used_at\"),\n\t\texpiresAt: timestamp(\"expires_at\"),\n\t\trevokedAt: timestamp(\"revoked_at\"),\n\t\tcreatedAt: timestamp(\"created_at\").defaultNow().notNull(),\n\t},\n\n\t(table) => {\n\t\treturn {\n\t\t\tuserIdx: index(\"client_tokens_user_idx\").on(table.userId),\n\t\t\ttokenIdx: uniqueIndex(\"client_tokens_token_idx\").on(table.token),\n\t\t};\n\t},\n);\n\n// Usage tracking from the dev tools\nexport const apiUsage = pgTable(\n\t\"api_usage\",\n\t{\n\t\tid: text(\"id\")\n\t\t\t.primaryKey()\n\t\t\t.$defaultFn(() => nanoid()),\n\t\tapiKeyId: text(\"api_key_id\")\n\t\t\t.notNull()\n\t\t\t.references(() => apiKeys.id, { onDelete: \"cascade\" }),\n\t\tendpoint: text(\"endpoint\").notNull(), // 'snapshot', 'recovery', 'status'\n\t\tmethod: text(\"method\").notNull(),\n\t\tstatusCode: integer(\"status_code\"),\n\t\tmetadata: json(\"metadata\").$type<{\n\t\t\tfilesProtected?: number;\n\t\t\tsnapshotId?: string;\n\t\t\taiTool?: string;\n\t\t}>(),\n\t\ttimestamp: timestamp(\"timestamp\").defaultNow().notNull(),\n\t},\n\n\t(table) => {\n\t\treturn {\n\t\t\tkeyIdx: index(\"api_usage_key_idx\").on(table.apiKeyId),\n\t\t\ttimestampIdx: index(\"api_usage_timestamp_idx\").on(table.timestamp),\n\t\t};\n\t},\n);\n\n// VS Code Extension Session Tracking - defined in extension-auth.ts\n// (Removed duplicate - use extension-auth.ts version instead)\n\n// Subscription management\nexport const subscriptions = pgTable(\n\t\"subscriptions\",\n\t{\n\t\tid: text(\"id\")\n\t\t\t.primaryKey()\n\t\t\t.$defaultFn(() => nanoid()),\n\t\tuserId: text(\"user_id\").references(() => user.id, {\n\t\t\tonDelete: \"cascade\",\n\t\t}),\n\t\torganizationId: text(\"organization_id\").references(() => organization.id, {\n\t\t\tonDelete: \"cascade\",\n\t\t}),\n\t\tstripeSubscriptionId: text(\"stripe_subscription_id\").unique(),\n\t\tstripeCustomerId: text(\"stripe_customer_id\"),\n\t\tplan: planTypeEnum(\"plan\").notNull().default(\"free\"),\n\t\tstatus: subscriptionStatusEnum(\"status\").notNull().default(\"active\"),\n\t\tcurrentPeriodStart: timestamp(\"current_period_start\"),\n\t\tcurrentPeriodEnd: timestamp(\"current_period_end\"),\n\t\tcancelAtPeriodEnd: boolean(\"cancel_at_period_end\").default(false),\n\t\ttrialEnd: timestamp(\"trial_end\"),\n\t\tseats: integer(\"seats\").default(1),\n\t\tmetadata: json(\"metadata\"),\n\t\tcreatedAt: timestamp(\"created_at\").defaultNow().notNull(),\n\t\tupdatedAt: timestamp(\"updated_at\").defaultNow().notNull(),\n\t},\n\n\t(table) => {\n\t\treturn {\n\t\t\tuserIdx: uniqueIndex(\"subscriptions_user_idx\").on(table.userId),\n\t\t\torgIdx: uniqueIndex(\"subscriptions_org_idx\").on(table.organizationId),\n\t\t\tstripeIdx: uniqueIndex(\"subscriptions_stripe_idx\").on(table.stripeSubscriptionId),\n\t\t};\n\t},\n);\n\n// Usage limits based on plan\nexport const usageLimits = pgTable(\n\t\"usage_limits\",\n\t{\n\t\tid: text(\"id\")\n\t\t\t.primaryKey()\n\t\t\t.$defaultFn(() => nanoid()),\n\t\tsubscriptionId: text(\"subscription_id\").references(() => subscriptions.id, {\n\t\t\tonDelete: \"cascade\",\n\t\t}),\n\t\tmonth: timestamp(\"month\").notNull(),\n\t\tsnapshotsUsed: integer(\"snapshots_used\").default(0),\n\t\tsnapshotsLimit: integer(\"snapshots_limit\"), // null = unlimited\n\t\tcloudStorageUsedMb: integer(\"cloud_storage_used_mb\").default(0),\n\t\tcloudStorageLimitMb: integer(\"cloud_storage_limit_mb\"),\n\t\tapiCallsUsed: integer(\"api_calls_used\").default(0),\n\t\tapiCallsLimit: integer(\"api_calls_limit\"),\n\n\t\t// Credit system fields (pricing_spec_v3.md)\n\t\tcreditsUsed: integer(\"credits_used\").default(0), // Month-to-date credit consumption\n\t\tcreditsLimit: integer(\"credits_limit\"), // Monthly credit allowance (null = unlimited)\n\t\tcreditsByJobType: json(\"credits_by_job_type\").default({}), // Breakdown by job type\n\t},\n\n\t(table) => {\n\t\treturn {\n\t\t\tsubscriptionMonthUnique: uniqueIndex(\"usage_limits_subscription_month_unique\").on(\n\t\t\t\ttable.subscriptionId,\n\t\t\t\ttable.month,\n\t\t\t),\n\t\t};\n\t},\n);\n\n// Relations\nexport const userRelations = relations(user, ({ many }) => ({\n\tsessions: many(session),\n\taccounts: many(account),\n\tpasskeys: many(passkey),\n\tinvitations: many(invitation),\n\tpurchases: many(purchase),\n\tmemberships: many(member),\n\taiChats: many(aiChat),\n\ttwoFactors: many(twoFactor),\n\tapiKeys: many(apiKeys), // Add relation for API keys\n\tsubscriptions: many(subscriptions), // Add relation for subscriptions\n}));\n\nexport const organizationRelations = relations(organization, ({ many }) => ({\n\tmembers: many(member),\n\tinvitations: many(invitation),\n\tpurchases: many(purchase),\n\taiChats: many(aiChat),\n\tapiKeys: many(apiKeys), // Add relation for API keys\n\tsubscriptions: many(subscriptions), // Add relation for subscriptions\n}));\n\nexport const sessionRelations = relations(session, ({ one }) => ({\n\tuser: one(user, {\n\t\tfields: [session.userId],\n\t\treferences: [user.id],\n\t}),\n}));\n\nexport const accountRelations = relations(account, ({ one }) => ({\n\tuser: one(user, {\n\t\tfields: [account.userId],\n\t\treferences: [user.id],\n\t}),\n}));\n\nexport const passkeyRelations = relations(passkey, ({ one }) => ({\n\tuser: one(user, {\n\t\tfields: [passkey.userId],\n\t\treferences: [user.id],\n\t}),\n}));\n\nexport const invitationRelations = relations(invitation, ({ one }) => ({\n\torganization: one(organization, {\n\t\tfields: [invitation.organizationId],\n\t\treferences: [organization.id],\n\t}),\n\tinviter: one(user, {\n\t\tfields: [invitation.inviterId],\n\t\treferences: [user.id],\n\t}),\n}));\n\nexport const purchaseRelations = relations(purchase, ({ one }) => ({\n\torganization: one(organization, {\n\t\tfields: [purchase.organizationId],\n\t\treferences: [organization.id],\n\t}),\n\tuser: one(user, {\n\t\tfields: [purchase.userId],\n\t\treferences: [user.id],\n\t}),\n}));\n\nexport const aiChatRelations = relations(aiChat, ({ one }) => ({\n\torganization: one(organization, {\n\t\tfields: [aiChat.organizationId],\n\t\treferences: [organization.id],\n\t}),\n\tuser: one(user, {\n\t\tfields: [aiChat.userId],\n\t\treferences: [user.id],\n\t}),\n}));\n\nexport const twoFactorRelations = relations(twoFactor, ({ one }) => ({\n\tuser: one(user, {\n\t\tfields: [twoFactor.userId],\n\t\treferences: [user.id],\n\t}),\n}));\n\n// Add relations for new tables\nexport const apiKeysRelations = relations(apiKeys, ({ one, many }) => ({\n\tuser: one(user, {\n\t\tfields: [apiKeys.userId],\n\t\treferences: [user.id],\n\t}),\n\torganization: one(organization, {\n\t\tfields: [apiKeys.organizationId],\n\t\treferences: [organization.id],\n\t}),\n\tusage: many(apiUsage),\n\t// extensionSessions relation is defined in extension-auth.ts\n}));\n\nexport const clientTokensRelations = relations(clientTokens, ({ one }) => ({\n\tuser: one(user, {\n\t\tfields: [clientTokens.userId],\n\t\treferences: [user.id],\n\t}),\n}));\n\nexport const apiUsageRelations = relations(apiUsage, ({ one }) => ({\n\tapiKey: one(apiKeys, {\n\t\tfields: [apiUsage.apiKeyId],\n\t\treferences: [apiKeys.id],\n\t}),\n}));\n\n// extensionSessionsRelations - defined in extension-auth.ts\n// (Removed duplicate)\n\nexport const subscriptionsRelations = relations(subscriptions, ({ one, many }) => ({\n\tuser: one(user, {\n\t\tfields: [subscriptions.userId],\n\t\treferences: [user.id],\n\t}),\n\torganization: one(organization, {\n\t\tfields: [subscriptions.organizationId],\n\t\treferences: [organization.id],\n\t}),\n\tlimits: many(usageLimits),\n}));\n\nexport const usageLimitsRelations = relations(usageLimits, ({ one }) => ({\n\tsubscription: one(subscriptions, {\n\t\tfields: [usageLimits.subscriptionId],\n\t\treferences: [subscriptions.id],\n\t}),\n}));\n\n// Newsletter Subscribers table\nexport const newsletterSubscribers = pgTable(\n\t\"newsletter_subscribers\",\n\t{\n\t\tid: text(\"id\")\n\t\t\t.primaryKey()\n\t\t\t.$defaultFn(() => nanoid()),\n\t\temail: text(\"email\").notNull().unique(),\n\t\tsource: text(\"source\").default(\"website\"), // website, extension, api, etc.\n\t\thubspotContactId: text(\"hubspot_contact_id\"), // HubSpot contact ID for sync\n\t\thubspotSyncedAt: timestamp(\"hubspot_synced_at\"), // Last sync to HubSpot\n\t\tsubscribedAt: timestamp(\"subscribed_at\").notNull().defaultNow(),\n\t\tunsubscribedAt: timestamp(\"unsubscribed_at\"),\n\t\tmetadata: json(\"metadata\").$type<{\n\t\t\treferrer?: string;\n\t\t\tutmSource?: string;\n\t\t\tutmMedium?: string;\n\t\t\tutmCampaign?: string;\n\t\t\tuserAgent?: string;\n\t\t}>(),\n\t\tcreatedAt: timestamp(\"created_at\").notNull().defaultNow(),\n\t\tupdatedAt: timestamp(\"updated_at\").notNull().defaultNow(),\n\t},\n\n\t(table) => [uniqueIndex(\"newsletter_email_idx\").on(table.email)],\n);\n\nexport const newsletterSubscribersRelations = relations(newsletterSubscribers, () => ({}));\n\nexport * from \"./vreko/credit-topups\";\n// Credit system schema exports (pricing_spec_v3.md)\nexport * from \"./vreko/credits-ledger\";\nexport { deviceTrials } from \"./vreko/device-trials\";\n// Vreko schema imports\nexport * from \"./vreko/snapshots\";\nexport { type NewTrial, type Trial, trialStatusEnum, trials, trialsRelations } from \"./vreko/trials\";\nexport * from \"./vreko/waitlist\";\n\nimport { creditTopups } from \"./vreko/credit-topups\";\nimport { creditsLedger } from \"./vreko/credits-ledger\";\nimport { waitlist, waitlistReferrals, waitlistTasks } from \"./vreko/waitlist\";\n\n// Schema namespace export - all tables as a single object\n// Note: extensionSessions is exported from extension-auth.ts via index.ts\nexport const schema = {\n\tuser,\n\tsession,\n\taccount,\n\tverification,\n\tpasskey,\n\ttwoFactor,\n\trateLimit,\n\tjwks,\n\torganization,\n\tmember,\n\tinvitation,\n\tpurchase,\n\taiChat,\n\tapiKeys,\n\tclientTokens, // Add client tokens to schema\n\tapiUsage,\n\tsubscriptions,\n\tusageLimits,\n\tnewsletterSubscribers,\n\twaitlist,\n\twaitlistReferrals,\n\twaitlistTasks,\n\t// Credit system (pricing_spec_v3.md)\n\tcreditsLedger,\n\tcreditTopups,\n\t// Note: emailDeliveries and emailPreferences are defined below this export\n};\n\n// Database type for Supabase client integration\nexport type Database = {\n\tpublic: {\n\t\tTables: {\n\t\t\tuser: {\n\t\t\t\tRow: typeof user.$inferSelect;\n\t\t\t\tInsert: typeof user.$inferInsert;\n\t\t\t\tUpdate: Partial<typeof user.$inferInsert>;\n\t\t\t};\n\t\t\tsession: {\n\t\t\t\tRow: typeof session.$inferSelect;\n\t\t\t\tInsert: typeof session.$inferInsert;\n\t\t\t\tUpdate: Partial<typeof session.$inferInsert>;\n\t\t\t};\n\t\t\taccount: {\n\t\t\t\tRow: typeof account.$inferSelect;\n\t\t\t\tInsert: typeof account.$inferInsert;\n\t\t\t\tUpdate: Partial<typeof account.$inferInsert>;\n\t\t\t};\n\t\t\tverification: {\n\t\t\t\tRow: typeof verification.$inferSelect;\n\t\t\t\tInsert: typeof verification.$inferInsert;\n\t\t\t\tUpdate: Partial<typeof verification.$inferInsert>;\n\t\t\t};\n\t\t\tpasskey: {\n\t\t\t\tRow: typeof passkey.$inferSelect;\n\t\t\t\tInsert: typeof passkey.$inferInsert;\n\t\t\t\tUpdate: Partial<typeof passkey.$inferInsert>;\n\t\t\t};\n\t\t\ttwoFactor: {\n\t\t\t\tRow: typeof twoFactor.$inferSelect;\n\t\t\t\tInsert: typeof twoFactor.$inferInsert;\n\t\t\t\tUpdate: Partial<typeof twoFactor.$inferInsert>;\n\t\t\t};\n\t\t\torganization: {\n\t\t\t\tRow: typeof organization.$inferSelect;\n\t\t\t\tInsert: typeof organization.$inferInsert;\n\t\t\t\tUpdate: Partial<typeof organization.$inferInsert>;\n\t\t\t};\n\t\t\tmember: {\n\t\t\t\tRow: typeof member.$inferSelect;\n\t\t\t\tInsert: typeof member.$inferInsert;\n\t\t\t\tUpdate: Partial<typeof member.$inferInsert>;\n\t\t\t};\n\t\t\tinvitation: {\n\t\t\t\tRow: typeof invitation.$inferSelect;\n\t\t\t\tInsert: typeof invitation.$inferInsert;\n\t\t\t\tUpdate: Partial<typeof invitation.$inferInsert>;\n\t\t\t};\n\t\t\tpurchase: {\n\t\t\t\tRow: typeof purchase.$inferSelect;\n\t\t\t\tInsert: typeof purchase.$inferInsert;\n\t\t\t\tUpdate: Partial<typeof purchase.$inferInsert>;\n\t\t\t};\n\t\t\taiChat: {\n\t\t\t\tRow: typeof aiChat.$inferSelect;\n\t\t\t\tInsert: typeof aiChat.$inferInsert;\n\t\t\t\tUpdate: Partial<typeof aiChat.$inferInsert>;\n\t\t\t};\n\t\t\tapi_keys: {\n\t\t\t\tRow: typeof apiKeys.$inferSelect;\n\t\t\t\tInsert: typeof apiKeys.$inferInsert;\n\t\t\t\tUpdate: Partial<typeof apiKeys.$inferInsert>;\n\t\t\t};\n\t\t\tapi_usage: {\n\t\t\t\tRow: typeof apiUsage.$inferSelect;\n\t\t\t\tInsert: typeof apiUsage.$inferInsert;\n\t\t\t\tUpdate: Partial<typeof apiUsage.$inferInsert>;\n\t\t\t};\n\n\t\t\tsubscriptions: {\n\t\t\t\tRow: typeof subscriptions.$inferSelect;\n\t\t\t\tInsert: typeof subscriptions.$inferInsert;\n\t\t\t\tUpdate: Partial<typeof subscriptions.$inferInsert>;\n\t\t\t};\n\t\t\tusage_limits: {\n\t\t\t\tRow: typeof usageLimits.$inferSelect;\n\t\t\t\tInsert: typeof usageLimits.$inferInsert;\n\t\t\t\tUpdate: Partial<typeof usageLimits.$inferInsert>;\n\t\t\t};\n\t\t\tnewsletter_subscribers: {\n\t\t\t\tRow: typeof newsletterSubscribers.$inferSelect;\n\t\t\t\tInsert: typeof newsletterSubscribers.$inferInsert;\n\t\t\t\tUpdate: Partial<typeof newsletterSubscribers.$inferInsert>;\n\t\t\t};\n\t\t};\n\t};\n};\n\n// Type exports\nexport type ApiKey = typeof apiKeys.$inferSelect;\nexport type NewApiKey = typeof apiKeys.$inferInsert;\nexport type ClientToken = typeof clientTokens.$inferSelect;\nexport type NewClientToken = typeof clientTokens.$inferInsert;\nexport type Subscription = typeof subscriptions.$inferSelect;\nexport type NewSubscription = typeof subscriptions.$inferInsert;\nexport type NewsletterSubscriber = typeof newsletterSubscribers.$inferSelect;\nexport type NewNewsletterSubscriber = typeof newsletterSubscribers.$inferInsert;\n\n// Agent Suggestions table\nexport const agentSuggestions = pgTable(\n\t\"agent_suggestions\",\n\t{\n\t\tid: text(\"id\")\n\t\t\t.primaryKey()\n\t\t\t.$defaultFn(() => nanoid()),\n\t\tuserId: text(\"user_id\")\n\t\t\t.notNull()\n\t\t\t.references(() => user.id, { onDelete: \"cascade\" }),\n\t\tapiKeyId: text(\"api_key_id\")\n\t\t\t.notNull()\n\t\t\t.references(() => apiKeys.id, { onDelete: \"cascade\" }),\n\t\tsessionId: text(\"session_id\"),\n\t\trequestId: text(\"request_id\").notNull(),\n\t\tsuggestionId: text(\"suggestion_id\").notNull(),\n\t\tsuggestionText: text(\"suggestion_text\").notNull(),\n\t\tsuggestionType: text(\"suggestion_type\"),\n\t\tfilePath: text(\"file_path\"),\n\t\tlineStart: integer(\"line_start\"),\n\t\tlineEnd: integer(\"line_end\"),\n\t\tcharacterStart: integer(\"character_start\"),\n\t\tcharacterEnd: integer(\"character_end\"),\n\t\taccepted: boolean(\"accepted\").default(false),\n\t\tdismissed: boolean(\"dismissed\").default(false),\n\t\ttimestamp: timestamp(\"timestamp\").defaultNow().notNull(),\n\t\tcreatedAt: timestamp(\"created_at\").defaultNow().notNull(),\n\t},\n\t(table) => {\n\t\treturn {\n\t\t\tuserCreatedAtIndex: index(\"agent_suggestions_user_created_at_idx\").on(table.userId, table.createdAt),\n\t\t\tapiKeyCreatedAtIndex: index(\"agent_suggestions_api_key_created_at_idx\").on(table.apiKeyId, table.createdAt),\n\t\t\t// Check constraint is not directly supported in drizzle-orm/pg-core pgTable builder yet in this version or syntax might differ,\n\t\t\t// but we can skip it for now or add it via raw SQL if needed.\n\t\t\t// The original file had a check constraint.\n\t\t};\n\t},\n);\n\nexport type AgentSuggestion = typeof agentSuggestions.$inferSelect;\nexport type NewAgentSuggestion = typeof agentSuggestions.$inferInsert;\n\n// Email System enums\nexport const emailCategoryEnum = pgEnum(\"email_category\", [\n\t\"authentication\",\n\t\"onboarding\",\n\t\"product\",\n\t\"billing\",\n\t\"marketing\",\n]);\n\nexport const emailStatusEnum = pgEnum(\"email_status\", [\n\t\"pending\",\n\t\"sent\",\n\t\"delivered\",\n\t\"opened\",\n\t\"clicked\",\n\t\"bounced\",\n\t\"failed\",\n]);\n\n// Email deliveries table\nexport const emailDeliveries = pgTable(\n\t\"email_deliveries\",\n\t{\n\t\tid: text(\"id\")\n\t\t\t.primaryKey()\n\t\t\t.$defaultFn(() => nanoid()),\n\t\tuserId: text(\"user_id\")\n\t\t\t.notNull()\n\t\t\t.references(() => user.id, { onDelete: \"cascade\" }),\n\t\ttemplateId: text(\"template_id\").notNull(),\n\t\tcategory: emailCategoryEnum(\"category\").notNull(),\n\t\tprovider: text(\"provider\").notNull(), // 'resend' | 'hubspot'\n\n\t\t// Delivery details\n\t\trecipientEmail: text(\"recipient_email\").notNull(),\n\t\tsubject: text(\"subject\").notNull(),\n\t\tstatus: emailStatusEnum(\"status\").notNull().default(\"pending\"),\n\n\t\t// Provider-specific IDs\n\t\tresendEmailId: text(\"resend_email_id\"),\n\t\thubspotEngagementId: text(\"hubspot_engagement_id\"),\n\n\t\t// Timestamps\n\t\tsentAt: timestamp(\"sent_at\"),\n\t\tdeliveredAt: timestamp(\"delivered_at\"),\n\t\topenedAt: timestamp(\"opened_at\"),\n\t\tclickedAt: timestamp(\"clicked_at\"),\n\t\tfailedAt: timestamp(\"failed_at\"),\n\n\t\t// Error tracking\n\t\terrorMessage: text(\"error_message\"),\n\t\tretryCount: integer(\"retry_count\").notNull().default(0),\n\n\t\t// Context\n\t\tmetadata: json(\"metadata\").$type<Record<string, unknown>>(),\n\n\t\tcreatedAt: timestamp(\"created_at\").notNull().defaultNow(),\n\t\tupdatedAt: timestamp(\"updated_at\").notNull().defaultNow(),\n\t},\n\t(table) => [\n\t\tindex(\"email_deliveries_user_id_idx\").on(table.userId),\n\t\tindex(\"email_deliveries_status_idx\").on(table.status),\n\t\tindex(\"email_deliveries_sent_at_idx\").on(table.sentAt),\n\t\tindex(\"email_deliveries_category_idx\").on(table.category),\n\t\tindex(\"email_deliveries_template_id_idx\").on(table.templateId),\n\t],\n);\n\n// Email preferences table\nexport const emailPreferences = pgTable(\n\t\"email_preferences\",\n\t{\n\t\tid: text(\"id\")\n\t\t\t.primaryKey()\n\t\t\t.$defaultFn(() => nanoid()),\n\t\tuserId: text(\"user_id\")\n\t\t\t.notNull()\n\t\t\t.unique()\n\t\t\t.references(() => user.id, { onDelete: \"cascade\" }),\n\n\t\t// Global opt-out\n\t\tunsubscribedAll: boolean(\"unsubscribed_all\").notNull().default(false),\n\t\tunsubscribedAt: timestamp(\"unsubscribed_at\"),\n\t\tunsubscribeSource: text(\"unsubscribe_source\"), // 'resend' | 'hubspot' | 'app'\n\n\t\t// Category-specific preferences\n\t\tenabledCategories: json(\"enabled_categories\").$type<string[]>().default([\"authentication\", \"billing\"]),\n\n\t\t// Digest preferences\n\t\tdigestFrequency: text(\"digest_frequency\").notNull().default(\"weekly\"), // 'daily' | 'weekly' | 'never'\n\t\tdigestDay: integer(\"digest_day\"), // 0-6 for day of week\n\t\tdigestTime: text(\"digest_time\").notNull().default(\"09:00\"), // HH:MM format\n\n\t\t// HubSpot sync\n\t\thubspotContactId: text(\"hubspot_contact_id\"),\n\t\tlastSyncedToHubspot: timestamp(\"last_synced_to_hubspot\"),\n\n\t\tcreatedAt: timestamp(\"created_at\").notNull().defaultNow(),\n\t\tupdatedAt: timestamp(\"updated_at\").notNull().defaultNow(),\n\t},\n\t(table) => [\n\t\tindex(\"email_preferences_user_id_idx\").on(table.userId),\n\t\tindex(\"email_preferences_hubspot_contact_id_idx\").on(table.hubspotContactId),\n\t],\n);\n\nexport type EmailDelivery = typeof emailDeliveries.$inferSelect;\nexport type NewEmailDelivery = typeof emailDeliveries.$inferInsert;\nexport type EmailPreferences = typeof emailPreferences.$inferSelect;\nexport type NewEmailPreferences = typeof emailPreferences.$inferInsert;\n","// ESM imports fixed for Node.js v22+\nimport slugify from \"@sindresorhus/slugify\";\nimport { eq, sql } from \"drizzle-orm\";\nimport { nanoid } from \"nanoid\";\nimport { combinedSchema, db } from \"../client.js\";\nconst { organization, member } = combinedSchema;\nexport async function getOrganizations({ limit, offset, query }) {\n if (!db) {\n throw new Error(\"Database not available\");\n }\n return await db.query.organization.findMany({\n where: query ? (org, { like }) => like(org.name, `%${query}%`) : undefined,\n limit,\n offset,\n extras: {\n membersCount: sql `(SELECT COUNT(*) FROM ${member} WHERE ${member.organizationId} = ${organization.id})`.as(\"membersCount\"),\n },\n });\n}\nexport async function countAllOrganizations() {\n if (!db) {\n throw new Error(\"Database not available\");\n }\n return await db.$count(organization);\n}\nexport async function getOrganizationById(id) {\n if (!db) {\n throw new Error(\"Database not available\");\n }\n return await db.query.organization.findFirst({\n where: (org, { eq }) => eq(org.id, id),\n with: {\n members: true,\n invitations: true,\n },\n });\n}\n// Optimized function to get organizations with members in a single query\nexport async function getOrganizationsWithMembers(userId) {\n if (!db) {\n throw new Error(\"Database not available\");\n }\n // ✅ Single query with JOIN to avoid N+1\n // Fix: Use member table to find organizations for a user\n return await db.query.organization.findMany({\n with: {\n members: {\n where: (member, { eq }) => eq(member.userId, userId),\n with: {\n user: true, // Nested relation\n },\n },\n },\n });\n}\nexport async function getInvitationById(id) {\n if (!db) {\n throw new Error(\"Database not available\");\n }\n return await db.query.invitation.findFirst({\n where: (invitation, { eq }) => eq(invitation.id, id),\n with: {\n organization: true,\n },\n });\n}\nexport async function getOrganizationBySlug(slug) {\n if (!db) {\n throw new Error(\"Database not available\");\n }\n return await db.query.organization.findFirst({\n where: (org, { eq }) => eq(org.slug, slug),\n });\n}\nexport async function getOrganizationMembership(organizationId, userId) {\n if (!db) {\n throw new Error(\"Database not available\");\n }\n return await db.query.member.findFirst({\n where: (member, { and, eq }) => and(eq(member.organizationId, organizationId), eq(member.userId, userId)),\n with: {\n organization: true,\n },\n });\n}\nexport async function getOrganizationWithPurchasesAndMembersCount(organizationId) {\n if (!db) {\n throw new Error(\"Database not available\");\n }\n return await db.query.organization.findFirst({\n where: (org, { eq }) => eq(org.id, organizationId),\n with: {\n purchases: true,\n },\n extras: {\n membersCount: sql `(SELECT COUNT(*) FROM ${member} WHERE ${member.organizationId} = ${organization.id})`.as(\"membersCount\"),\n },\n });\n}\nexport async function getPendingInvitationByEmail(email) {\n if (!db) {\n throw new Error(\"Database not available\");\n }\n return await db.query.invitation.findFirst({\n where: (invitation, { and, eq }) => and(eq(invitation.email, email), eq(invitation.status, \"pending\")),\n });\n}\nexport async function updateOrganization(updatedOrganization) {\n if (!db) {\n throw new Error(\"Database not available\");\n }\n return await db.update(organization).set(updatedOrganization).where(eq(organization.id, updatedOrganization.id));\n}\nexport async function generateOrganizationSlug(name) {\n const baseSlug = slugify(name, {\n lowercase: true,\n });\n let slug = baseSlug;\n let hasAvailableSlug = false;\n for (let i = 0; i < 3; i++) {\n const existing = await getOrganizationBySlug(slug);\n if (!existing) {\n hasAvailableSlug = true;\n break;\n }\n slug = `${baseSlug}-${nanoid(5)}`;\n }\n if (!hasAvailableSlug) {\n throw new Error(\"Could not generate unique slug\");\n }\n return slug;\n}\n","// ESM imports fixed for Node.js v22+\n/**\n * Privacy-First Utilities for OSS/Open-Core\n *\n * Implements GDPR compliance, data minimization, and privacy-by-design principles:\n * - Data anonymization for analytics\n * - User data export (GDPR Right to Portability)\n * - User data deletion (GDPR Right to Erasure)\n * - Privacy-compliant telemetry\n * - Minimal PII in logs\n *\n * All utilities follow the open-source privacy-first commitment.\n */\nimport * as crypto from \"node:crypto\";\nimport { logger } from \"@vreko/infrastructure\";\nimport { eq, lte } from \"drizzle-orm\";\nimport { db } from \"../client.js\";\nimport { account, apiKeys, session, subscriptions, user } from \"../schema/postgres.js\";\n// ============================================================================\n// Constants\n// ============================================================================\nconst PRIVACY_SALT = process.env.PRIVACY_SALT || \"default-salt\";\n// ============================================================================\n// Anonymization Functions\n// ============================================================================\n/**\n * Create one-way hash of user ID for analytics\n * Used to identify returning users without exposing identity\n *\n * Same userId always produces same hash, enabling cohort analysis\n * while maintaining user privacy\n */\nexport function anonymizeUserId(userId) {\n const hash = crypto\n .createHash(\"sha256\")\n .update(userId + PRIVACY_SALT)\n .digest(\"hex\");\n return `anon_${hash.slice(0, 16)}`;\n}\n/**\n * Anonymize email for analytics\n * Hashes domain and creates partial local part\n */\nexport function anonymizeEmail(email) {\n const [local, domain] = email.split(\"@\");\n if (!domain) {\n return anonymizeUserId(email); // Fallback\n }\n // Hash the domain\n const domainHash = crypto\n .createHash(\"sha256\")\n .update(domain + PRIVACY_SALT)\n .digest(\"hex\")\n .slice(0, 8);\n // Mask local part\n const maskedLocal = `${local.charAt(0)}***`;\n return `${maskedLocal}@${domainHash}`;\n}\n/**\n * Remove sensitive fields from object for logging\n * Prevents accidental PII leakage in structured logs\n */\nexport function sanitizeForLogging(obj) {\n const sensitiveFields = [\n \"password\",\n \"email\",\n \"token\",\n \"apiKey\",\n \"key\",\n \"secret\",\n \"refreshToken\",\n \"accessToken\",\n \"salt\",\n \"hash\",\n ];\n // biome-ignore lint/suspicious/noExplicitAny: dynamic field redaction on generic object\n const result = { ...obj };\n for (const field of sensitiveFields) {\n if (field in result) {\n result[field] = \"[REDACTED]\";\n }\n }\n return result;\n}\n// ============================================================================\n// Telemetry Functions\n// ============================================================================\n/**\n * Log anonymized event for analytics\n * NEVER includes userId, email, or other PII\n *\n * Use for all telemetry, feature usage, and behavioral analytics\n */\nexport async function logAnonymizedEvent(event, data, userId) {\n try {\n // Use anonymized user ID if provided\n const anonymousId = userId ? anonymizeUserId(userId) : undefined;\n const sanitized = sanitizeForLogging({\n ...data,\n userId: undefined, // Remove if present\n email: undefined,\n apiKeyId: undefined,\n token: undefined,\n });\n logger.info(`Analytics: ${event}`, {\n event,\n anonymousId,\n ...sanitized,\n timestamp: new Date().toISOString(),\n });\n // In production, send to privacy-compliant analytics platform\n // e.g., Plausible Analytics, Fathom, Simple Analytics\n // (not PostHog, Mixpanel, etc. which track PII by default)\n }\n catch (error) {\n logger.error(\"Failed to log anonymized event\", {\n error: error instanceof Error ? error.message : String(error),\n event,\n });\n }\n}\n// ============================================================================\n// GDPR Compliance Functions\n// ============================================================================\n/**\n * Export user's complete data for GDPR Right to Portability\n * Returns all data associated with the user in portable format\n */\nexport async function exportUserData(userId) {\n try {\n if (!db) {\n logger.error(\"Database not initialized\");\n return null;\n }\n const userRecord = await db\n .select()\n .from(user)\n .where(eq(user.id, userId))\n // biome-ignore lint/suspicious/noExplicitAny: Drizzle select result rows\n .then((rows) => rows[0] || null);\n if (!userRecord) {\n logger.warn(\"User not found for data export\", { userId });\n return null;\n }\n // Get all associated data\n const [userSessions, userAccounts, userApiKeys, userSubscriptions] = await Promise.all([\n db.select().from(session).where(eq(session.userId, userId)),\n db.select().from(account).where(eq(account.userId, userId)),\n db.select().from(apiKeys).where(eq(apiKeys.userId, userId)),\n db.select().from(subscriptions).where(eq(subscriptions.userId, userId)),\n ]);\n // Sanitize sensitive data\n const sanitizedUser = sanitizeForLogging(userRecord);\n // biome-ignore lint/suspicious/noExplicitAny: Drizzle select result mapped through sanitizer\n const sanitizedApiKeys = userApiKeys.map((k) => sanitizeForLogging(k));\n return {\n user: sanitizedUser,\n sessions: userSessions,\n accounts: userAccounts,\n apiKeys: sanitizedApiKeys,\n subscriptions: userSubscriptions,\n exportedAt: new Date().toISOString(),\n };\n }\n catch (error) {\n logger.error(\"Failed to export user data\", {\n error: error instanceof Error ? error.message : String(error),\n userId,\n });\n throw error;\n }\n}\n/**\n * Delete user's data for GDPR Right to Erasure\n * Performs cascade delete through all associated records\n *\n * Uses database CASCADE constraints to ensure referential integrity\n */\nexport async function deleteUserData(userId) {\n try {\n if (!db) {\n logger.error(\"Database not initialized\");\n return false;\n }\n logger.warn(\"Deleting all user data (GDPR Right to Erasure)\", {\n userId,\n });\n // Single delete cascades through all related tables\n // via foreign key constraints\n await db.delete(user).where(eq(user.id, userId));\n logger.info(\"User data deleted successfully\", { userId });\n return true;\n }\n catch (error) {\n logger.error(\"Failed to delete user data\", {\n error: error instanceof Error ? error.message : String(error),\n userId,\n });\n throw error;\n }\n}\n/**\n * Delete user's API keys (Right to Erasure for credentials)\n * More lenient than full data deletion\n */\nexport async function deleteUserApiKeys(userId) {\n try {\n if (!db) {\n logger.error(\"Database not initialized\");\n return 0;\n }\n const result = await db.delete(apiKeys).where(eq(apiKeys.userId, userId));\n logger.info(\"User API keys deleted\", {\n userId,\n });\n return result.rowCount || 0;\n }\n catch (error) {\n logger.error(\"Failed to delete user API keys\", {\n error: error instanceof Error ? error.message : String(error),\n userId,\n });\n throw error;\n }\n}\n/**\n * Anonymize user data instead of full deletion\n * Useful for maintaining historical records while respecting privacy\n */\nexport async function anonymizeUserData(userId) {\n try {\n if (!db) {\n logger.error(\"Database not initialized\");\n return false;\n }\n logger.info(\"Anonymizing user data\", { userId });\n // Replace identifiable info with generic values\n await db\n .update(user)\n .set({\n email: `deleted+${anonymizeUserId(userId)}@vreko.local`,\n name: \"Deleted User\",\n image: null,\n username: null,\n })\n .where(eq(user.id, userId));\n // Delete sessions (forces re-authentication)\n await db.delete(session).where(eq(session.userId, userId));\n // Delete API keys (revokes programmatic access)\n await db.delete(apiKeys).where(eq(apiKeys.userId, userId));\n logger.info(\"User data anonymized successfully\", { userId });\n return true;\n }\n catch (error) {\n logger.error(\"Failed to anonymize user data\", {\n error: error instanceof Error ? error.message : String(error),\n userId,\n });\n throw error;\n }\n}\n// ============================================================================\n// Consent Management\n// ============================================================================\n/**\n * Check user's privacy preferences\n * Used to determine what data can be collected\n */\nexport async function getUserPrivacyPreferences(userId) {\n try {\n if (!db) {\n logger.error(\"Database not initialized\");\n return null;\n }\n const userRecord = await db\n .select()\n .from(user)\n .where(eq(user.id, userId))\n // biome-ignore lint/suspicious/noExplicitAny: Drizzle select result rows\n .then((rows) => rows[0] || null);\n if (!userRecord) {\n return null;\n }\n // Default: opt-in for analytics (privacy-friendly), opt-out for marketing\n return {\n analyticsConsent: true, // Plausible/Fathom type analytics OK\n marketingConsent: false, // No marketing tracking by default\n sharingConsent: false, // No third-party sharing by default\n };\n }\n catch (error) {\n logger.error(\"Failed to get privacy preferences\", {\n error: error instanceof Error ? error.message : String(error),\n userId,\n });\n return null;\n }\n}\n// ============================================================================\n// Data Retention Policies\n// ============================================================================\n/**\n * Check if data retention policy allows keeping a record\n * Implements configurable retention periods\n */\nexport function shouldRetainData(createdAt, retentionDays = 90) {\n const retentionMs = retentionDays * 24 * 60 * 60 * 1000;\n const ageMs = Date.now() - createdAt.getTime();\n return ageMs < retentionMs;\n}\n/**\n * Delete expired data per retention policy\n * Run periodically via scheduled job\n */\nexport async function cleanupExpiredData(retentionDays = 90) {\n try {\n if (!db) {\n logger.error(\"Database not initialized\");\n return;\n }\n const cutoffDate = new Date(Date.now() - retentionDays * 24 * 60 * 60 * 1000);\n // Delete old sessions\n await db.delete(session).where(lte(session.expiresAt, cutoffDate));\n logger.info(\"Data cleanup completed\", {\n retentionDays,\n cutoffDate: cutoffDate.toISOString(),\n });\n }\n catch (error) {\n logger.error(\"Data cleanup failed\", {\n error: error instanceof Error ? error.message : String(error),\n });\n }\n}\n","// ESM imports fixed for Node.js v22+\nimport { eq } from \"drizzle-orm\";\nimport { combinedSchema, db } from \"../client.js\";\nconst { purchase } = combinedSchema;\nexport async function getPurchasesByOrganizationId(organizationId) {\n if (!db) {\n throw new Error(\"Database not available\");\n }\n return db.query.purchase.findMany({\n where: (purchase, { eq }) => eq(purchase.organizationId, organizationId),\n });\n}\nexport async function getPurchasesByUserId(userId) {\n if (!db) {\n throw new Error(\"Database not available\");\n }\n return db.query.purchase.findMany({\n where: (purchase, { eq }) => eq(purchase.userId, userId),\n });\n}\nexport async function getPurchaseById(id) {\n if (!db) {\n throw new Error(\"Database not available\");\n }\n return db.query.purchase.findFirst({\n where: (purchase, { eq }) => eq(purchase.id, id),\n });\n}\nexport async function getPurchaseBySubscriptionId(subscriptionId) {\n if (!db) {\n throw new Error(\"Database not available\");\n }\n return db.query.purchase.findFirst({\n where: (purchase, { eq }) => eq(purchase.subscriptionId, subscriptionId),\n });\n}\nexport async function createPurchase(insertedPurchase) {\n if (!db) {\n throw new Error(\"Database not available\");\n }\n const result = await db.insert(purchase).values(insertedPurchase).returning({ id: purchase.id });\n const firstResult = result[0];\n if (!firstResult) {\n throw new Error(\"Failed to create purchase\");\n }\n const { id } = firstResult;\n return getPurchaseById(id);\n}\nexport async function updatePurchase(updatedPurchase) {\n if (!db) {\n throw new Error(\"Database not available\");\n }\n const result = await db.update(purchase).set(updatedPurchase).returning({ id: purchase.id });\n const firstResult = result[0];\n if (!firstResult) {\n throw new Error(\"Failed to update purchase\");\n }\n const { id } = firstResult;\n return getPurchaseById(id);\n}\nexport async function deletePurchaseBySubscriptionId(subscriptionId) {\n if (!db) {\n throw new Error(\"Database not available\");\n }\n await db.delete(purchase).where(eq(purchase.subscriptionId, subscriptionId));\n}\n","// ESM imports fixed for Node.js v22+\nimport { eq } from \"drizzle-orm\";\nimport { z as zod } from \"zod\";\nimport { combinedSchema, db } from \"../client.js\";\nconst { user, account } = combinedSchema;\n// Add input validation schema\nconst searchUsersSchema = zod.object({\n query: zod.string().min(1).max(100).optional(),\n limit: zod.number().min(1).max(100).default(50),\n offset: zod.number().min(0).default(0),\n});\nexport async function getUsers({ limit, offset, query }) {\n if (!db) {\n throw new Error(\"Database not available\");\n }\n // Validate input parameters\n const validatedParams = searchUsersSchema.parse({ query, limit, offset });\n // Use validated and sanitized query parameter if provided\n const whereClause = query\n ? // biome-ignore lint/suspicious/noExplicitAny: Drizzle query builder callback\n (user, { like, sql }) => like(user.name, sql `${\"%\"}${validatedParams.query}${\"%\"}`)\n : undefined;\n return await db.query.user.findMany({\n where: whereClause,\n limit: validatedParams.limit,\n offset: validatedParams.offset,\n });\n}\nexport async function countAllUsers() {\n if (!db) {\n throw new Error(\"Database not available\");\n }\n return db.$count(user);\n}\nexport async function getUserById(id) {\n if (!db) {\n throw new Error(\"Database not available\");\n }\n return await db.query.user.findFirst({\n // biome-ignore lint/suspicious/noExplicitAny: Drizzle query builder callback\n where: (user, { eq }) => eq(user.id, id),\n });\n}\nexport async function getUserByEmail(email) {\n if (!db) {\n throw new Error(\"Database not available\");\n }\n return await db.query.user.findFirst({\n // biome-ignore lint/suspicious/noExplicitAny: Drizzle query builder callback\n where: (user, { eq }) => eq(user.email, email),\n });\n}\nexport async function createUser({ email, name, role, emailVerified, onboardingComplete, }) {\n if (!db) {\n throw new Error(\"Database not available\");\n }\n const result = await db\n .insert(user)\n .values({\n email,\n name,\n role,\n emailVerified,\n onboardingComplete,\n createdAt: new Date(),\n updatedAt: new Date(),\n })\n .returning({\n id: user.id,\n });\n const firstResult = result[0];\n if (!firstResult) {\n throw new Error(\"Failed to create user\");\n }\n const { id } = firstResult;\n const newUser = await getUserById(id);\n return newUser;\n}\nexport async function getAccountById(id) {\n if (!db) {\n throw new Error(\"Database not available\");\n }\n return await db.query.account.findFirst({\n // biome-ignore lint/suspicious/noExplicitAny: Drizzle query builder callback\n where: (account, { eq }) => eq(account.id, id),\n });\n}\nexport async function createUserAccount({ userId, providerId, accountId, hashedPassword, }) {\n if (!db) {\n throw new Error(\"Database not available\");\n }\n const result = await db\n .insert(account)\n .values({\n userId,\n accountId,\n providerId,\n createdAt: new Date(),\n updatedAt: new Date(),\n password: hashedPassword,\n })\n .returning({\n id: account.id,\n });\n const firstResult = result[0];\n if (!firstResult) {\n throw new Error(\"Failed to create account\");\n }\n const { id } = firstResult;\n const newAccount = await getAccountById(id);\n return newAccount;\n}\nexport async function updateUser(updatedUser) {\n if (!db) {\n throw new Error(\"Database not available\");\n }\n return db.update(user).set(updatedUser).where(eq(user.id, updatedUser.id));\n}\n","// ESM imports fixed for Node.js v22+\n/**\n * Workspace Links Database Queries\n *\n * Query functions for the workspace_links table used in MCP authentication.\n * Workspace IDs link VS Code extension instances to authenticated users,\n * enabling tier resolution without API keys in MCP config.\n *\n * Security Enhancements (P0 - 2025-02):\n * - Tier staleness detection: Refreshes tier from DB if >24h old\n * - Link expiration: Auto-deletes expired links (90 day TTL)\n * - Prevents privilege escalation from stale cached tiers\n *\n * @packageDocumentation\n */\nimport { eq } from \"drizzle-orm\";\nimport { z } from \"zod\";\nimport { combinedSchema, db } from \"../client.js\";\nimport { subscriptions } from \"../schema/postgres.js\";\nimport { TIER_STALENESS_THRESHOLD_MS, WORKSPACE_LINK_TTL_MS } from \"../schema/vreko/workspace-links.js\";\nconst { workspaceLinks } = combinedSchema;\n// Input validation schemas\n// Supports unified 12-char hex format and legacy ws_/wsg_ + 32-char hex formats\nconst workspaceIdSchema = z\n .string()\n .regex(/^([a-f0-9]{12}|ws[g]?_[a-f0-9]{32})$/, \"Invalid workspace ID format: must be 12-char hex (unified) or ws_/wsg_ + 32-char hex (legacy)\");\nconst linkWorkspaceSchema = z.object({\n workspaceId: workspaceIdSchema,\n userId: z.string().min(1),\n tier: z.enum([\"free\", \"pro\", \"enterprise\"]).optional().default(\"free\"),\n displayName: z.string().max(255).optional(),\n expiresAt: z.date().optional(), // P0: Allow custom expiration\n});\nconst updateTierSchema = z.object({\n workspaceId: workspaceIdSchema,\n tier: z.enum([\"free\", \"pro\", \"enterprise\"]),\n});\n/**\n * Get workspace link by workspace ID\n *\n * @param workspaceId - The workspace ID to look up\n * @returns The workspace link if found, null otherwise\n */\nexport async function getWorkspaceLinkById(workspaceId) {\n if (!db) {\n throw new Error(\"Database not available\");\n }\n // Validate workspace ID format\n const validatedId = workspaceIdSchema.parse(workspaceId);\n return await db.query.workspaceLinks.findFirst({\n // biome-ignore lint/suspicious/noExplicitAny: Drizzle query builder callback\n where: (link, { eq }) => eq(link.workspaceId, validatedId),\n });\n}\n/**\n * Resolve tier for a workspace ID\n *\n * Main function used by MCP server to determine user tier from workspace ID.\n * Returns \"free\" if workspace is not linked.\n *\n * P0 Security Enhancements:\n * - Checks link expiration (auto-deletes expired links)\n * - Checks tier staleness (refreshes from DB if >24h old)\n * - Prevents privilege escalation via stale cached tiers\n *\n * @param workspaceId - The workspace ID to resolve\n * @returns Tier resolution result with tier and optional user info\n *\n * @example\n * ```ts\n * const result = await resolveTierByWorkspaceId(\"ws_a1b2c3d4...\");\n * if (result.found) {\n * logger.debug(...);\n * } else {\n * logger.debug(...);\n * }\n * ```\n */\nexport async function resolveTierByWorkspaceId(workspaceId) {\n if (!db) {\n // Database not available - return free tier as fallback\n return { found: false, tier: \"free\" };\n }\n try {\n // Validate workspace ID format\n const validatedId = workspaceIdSchema.parse(workspaceId);\n const link = await db.query.workspaceLinks.findFirst({\n // biome-ignore lint/suspicious/noExplicitAny: Drizzle query builder callback\n where: (link, { eq }) => eq(link.workspaceId, validatedId),\n });\n if (!link) {\n return { found: false, tier: \"free\" };\n }\n // P0 Security: Check link expiration\n if (link.expiresAt && link.expiresAt < new Date()) {\n // Auto-delete expired link\n await db.delete(workspaceLinks).where(eq(workspaceLinks.workspaceId, validatedId));\n process.stdout.write(`[Workspace Links] Deleted expired link: ${validatedId.slice(0, 10)}...`);\n return { found: false, tier: \"free\" };\n }\n // P0 Security: Check tier staleness (refresh if >24h old)\n const staleCutoff = new Date(Date.now() - TIER_STALENESS_THRESHOLD_MS);\n const tierRefreshedAt = link.tierRefreshedAt ?? link.createdAt; // Fallback for migration\n let tierRefreshed = false;\n let currentTier = link.tier;\n if (tierRefreshedAt < staleCutoff) {\n // Tier is stale - fetch fresh from subscriptions table\n const [subscription] = await db\n .select({ plan: subscriptions.plan })\n .from(subscriptions)\n .where(eq(subscriptions.userId, link.userId))\n .limit(1);\n // Map subscription plan to workspace tier\n const freshTier = mapPlanToTier(subscription?.plan);\n // Update tier and tierRefreshedAt atomically\n await db\n .update(workspaceLinks)\n .set({\n tier: freshTier,\n tierRefreshedAt: new Date(),\n lastSeenAt: new Date(),\n })\n .where(eq(workspaceLinks.workspaceId, validatedId));\n currentTier = freshTier;\n tierRefreshed = true;\n process.stdout.write(`[Workspace Links] Refreshed stale tier for ${validatedId.slice(0, 10)}...: ${link.tier} -> ${freshTier}`);\n }\n else {\n // Update last seen timestamp (fire and forget)\n db.update(workspaceLinks)\n .set({ lastSeenAt: new Date() })\n .where(eq(workspaceLinks.workspaceId, validatedId))\n .catch(() => {\n // Ignore update errors - don't block tier resolution\n });\n }\n return {\n found: true,\n tier: currentTier,\n userId: link.userId,\n displayName: link.displayName ?? undefined,\n tierRefreshed,\n };\n }\n catch (_error) {\n // On any error (validation, db), return free tier\n return { found: false, tier: \"free\" };\n }\n}\n/**\n * Map subscription plan to workspace tier\n * Handles the plan_type enum values from subscriptions table\n */\nfunction mapPlanToTier(plan) {\n switch (plan) {\n case \"pro\":\n case \"solo\": // Legacy name\n return \"pro\";\n case \"team\":\n case \"enterprise\":\n return \"enterprise\";\n default:\n return \"free\";\n }\n}\n/**\n * Link a workspace to a user\n *\n * Called after successful OAuth authentication in VS Code extension.\n * Uses upsert semantics - updates tier if workspace already linked.\n *\n * P0 Security: expiresAt defaults to 90 days from now\n *\n * @param params - Link parameters\n * @returns The created/updated workspace link\n *\n * @example\n * ```ts\n * // After OAuth success\n * const link = await linkWorkspace({\n * workspaceId: \"ws_a1b2c3d4...\",\n * userId: \"user_abc123\",\n * tier: \"pro\",\n * displayName: \"My MacBook\"\n * });\n * ```\n */\nexport async function linkWorkspace(params) {\n if (!db) {\n throw new Error(\"Database not available\");\n }\n // Validate input\n const validated = linkWorkspaceSchema.parse(params);\n // P0 Security: Default expiration to 90 days\n const expiresAt = validated.expiresAt ?? new Date(Date.now() + WORKSPACE_LINK_TTL_MS);\n // Check if workspace already linked\n const existing = await getWorkspaceLinkById(validated.workspaceId);\n if (existing) {\n // Update existing link\n await db\n .update(workspaceLinks)\n .set({\n userId: validated.userId,\n tier: validated.tier,\n displayName: validated.displayName,\n lastSeenAt: new Date(),\n tierRefreshedAt: new Date(), // Reset staleness on update\n expiresAt, // Extend expiration on update\n })\n .where(eq(workspaceLinks.workspaceId, validated.workspaceId));\n return await getWorkspaceLinkById(validated.workspaceId);\n }\n // Create new link\n await db.insert(workspaceLinks).values({\n workspaceId: validated.workspaceId,\n userId: validated.userId,\n tier: validated.tier,\n displayName: validated.displayName,\n tierRefreshedAt: new Date(),\n expiresAt,\n });\n return await getWorkspaceLinkById(validated.workspaceId);\n}\n/**\n * Update workspace tier\n *\n * Called when user's subscription changes.\n *\n * @param params - Update parameters\n * @returns True if updated, false if workspace not found\n */\nexport async function updateWorkspaceTier(params) {\n if (!db) {\n throw new Error(\"Database not available\");\n }\n // Validate input\n const validated = updateTierSchema.parse(params);\n const result = await db\n .update(workspaceLinks)\n .set({\n tier: validated.tier,\n lastSeenAt: new Date(),\n })\n .where(eq(workspaceLinks.workspaceId, validated.workspaceId))\n .returning({ workspaceId: workspaceLinks.workspaceId });\n return result.length > 0;\n}\n/**\n * Unlink a workspace\n *\n * Called when user signs out or wants to deauthorize a device.\n *\n * @param workspaceId - The workspace ID to unlink\n * @returns True if deleted, false if not found\n */\nexport async function unlinkWorkspace(workspaceId) {\n if (!db) {\n throw new Error(\"Database not available\");\n }\n // Validate workspace ID format\n const validatedId = workspaceIdSchema.parse(workspaceId);\n const result = await db\n .delete(workspaceLinks)\n .where(eq(workspaceLinks.workspaceId, validatedId))\n .returning({ workspaceId: workspaceLinks.workspaceId });\n return result.length > 0;\n}\n/**\n * Get all workspace links for a user\n *\n * Useful for displaying linked devices in user settings.\n *\n * @param userId - The user ID to look up\n * @returns Array of workspace links for the user\n */\nexport async function getWorkspaceLinksByUserId(userId) {\n if (!db) {\n throw new Error(\"Database not available\");\n }\n return await db.query.workspaceLinks.findMany({\n // biome-ignore lint/suspicious/noExplicitAny: Drizzle query builder callbacks\n where: (link, { eq }) => eq(link.userId, userId),\n orderBy: (link, { desc }) => desc(link.lastSeenAt),\n });\n}\n/**\n * Unlink all workspaces for a user\n *\n * Called when user account is deleted (CASCADE should handle this,\n * but explicit function for manual cleanup).\n *\n * @param userId - The user ID to unlink all workspaces for\n * @returns Number of workspaces unlinked\n */\nexport async function unlinkAllWorkspacesForUser(userId) {\n if (!db) {\n throw new Error(\"Database not available\");\n }\n const result = await db\n .delete(workspaceLinks)\n .where(eq(workspaceLinks.userId, userId))\n .returning({ workspaceId: workspaceLinks.workspaceId });\n return result.length;\n}\n","// ESM imports fixed for Node.js v22+\n/**\n * ============================================================================\n * P0-1: Vector Similarity Search Queries\n * ============================================================================\n * Purpose: Type-safe vector similarity search for patterns table\n * Requires: pgvector extension enabled (Migration 0011)\n * ============================================================================\n */\nimport { sql } from \"drizzle-orm\";\nimport { db } from \"../client.js\";\nimport { patterns } from \"../schema/vreko/patterns.js\";\n/**\n * Search for similar patterns using cosine similarity\n *\n * @param queryVector - 256-dimensional embedding vector\n * @param limit - Maximum results to return (default: 10)\n * @param similarityThreshold - Minimum similarity score (0-1, default: 0.75)\n * @param patternType - Optional filter by pattern type\n * @param isGlobal - Optional filter by global/local patterns\n * @returns Array of similar patterns with similarity scores\n *\n * @example\n * const results = await searchSimilarPatterns(\n * [0.1, 0.2, ...], // 256 dimensions\n * 5,\n * 0.8,\n * 'dangerous'\n * );\n */\nexport async function searchSimilarPatterns(queryVector, limit = 10, similarityThreshold = 0.75, patternType, isGlobal) {\n // Validate vector dimensions\n if (queryVector.length !== 256) {\n throw new Error(`Expected 256-dimensional vector, got ${queryVector.length}`);\n }\n // Convert vector to SQL format\n const vectorLiteral = `[${queryVector.join(\",\")}]`;\n // Build query with optional filters\n let query = db\n .select({\n id: patterns.id,\n patternSignature: patterns.patternSignature,\n patternType: patterns.patternType,\n // Cosine similarity: 1 - distance (higher is more similar)\n similarity: sql `1 - (${patterns.embedding} <=> ${vectorLiteral}::vector)`,\n occurrenceCount: patterns.occurrenceCount,\n successRate: patterns.successRate,\n isGlobal: patterns.isGlobal,\n })\n .from(patterns)\n .where(sql `1 - (${patterns.embedding} <=> ${vectorLiteral}::vector) >= ${similarityThreshold}`);\n // Apply optional filters\n if (patternType) {\n query = query.where(sql `${patterns.patternType} = ${patternType}`);\n }\n if (isGlobal !== undefined) {\n query = query.where(sql `${patterns.isGlobal} = ${isGlobal}`);\n }\n // Order by similarity (closest first) and limit results\n const results = await query.orderBy(sql `${patterns.embedding} <=> ${vectorLiteral}::vector`).limit(limit);\n return results;\n}\n/**\n * Find patterns similar to a given pattern ID\n *\n * @param patternId - ID of the reference pattern\n * @param limit - Maximum results to return (default: 5)\n * @param excludeSelf - Whether to exclude the reference pattern (default: true)\n * @returns Array of similar patterns\n */\nexport async function findSimilarPatterns(patternId, limit = 5, excludeSelf = true) {\n // Get the embedding of the reference pattern\n const referencePattern = await db\n .select({ embedding: patterns.embedding })\n .from(patterns)\n .where(sql `${patterns.id} = ${patternId}`)\n .limit(1);\n if (!referencePattern.length || !referencePattern[0].embedding) {\n throw new Error(`Pattern ${patternId} not found or has no embedding`);\n }\n const queryVector = referencePattern[0].embedding;\n const vectorLiteral = `[${queryVector.join(\",\")}]`;\n // Find similar patterns\n let query = db\n .select({\n id: patterns.id,\n patternSignature: patterns.patternSignature,\n patternType: patterns.patternType,\n similarity: sql `1 - (${patterns.embedding} <=> ${vectorLiteral}::vector)`,\n occurrenceCount: patterns.occurrenceCount,\n successRate: patterns.successRate,\n isGlobal: patterns.isGlobal,\n })\n .from(patterns)\n .where(sql `${patterns.embedding} IS NOT NULL`);\n if (excludeSelf) {\n query = query.where(sql `${patterns.id} != ${patternId}`);\n }\n const results = await query.orderBy(sql `${patterns.embedding} <=> ${vectorLiteral}::vector`).limit(limit);\n return results;\n}\n/**\n * Insert a new pattern with embedding\n *\n * @param patternSignature - Unique pattern signature (AST hash)\n * @param embedding - 256-dimensional vector embedding\n * @param patternType - Pattern classification\n * @param userId - Optional user ID (null for global patterns)\n * @param toolAffinity - Optional tool affinity array\n * @param fileTypes - Optional file type array\n * @returns The created pattern ID\n */\nexport async function insertPatternWithEmbedding(patternSignature, embedding, patternType, userId, toolAffinity, fileTypes) {\n // Validate vector dimensions\n if (embedding.length !== 256) {\n throw new Error(`Expected 256-dimensional vector, got ${embedding.length}`);\n }\n const result = await db\n .insert(patterns)\n .values({\n patternSignature,\n embedding,\n patternType,\n userId,\n toolAffinity: toolAffinity ?? [],\n fileTypes: fileTypes ?? [],\n isGlobal: !userId,\n })\n .returning({ id: patterns.id });\n return result[0].id;\n}\n/**\n * Update pattern embedding\n *\n * @param patternId - Pattern ID to update\n * @param embedding - New 256-dimensional vector embedding\n */\nexport async function updatePatternEmbedding(patternId, embedding) {\n // Validate vector dimensions\n if (embedding.length !== 256) {\n throw new Error(`Expected 256-dimensional vector, got ${embedding.length}`);\n }\n await db.update(patterns).set({ embedding }).where(sql `${patterns.id} = ${patternId}`);\n}\n/**\n * Test if pgvector extension is available\n *\n * @returns true if pgvector is enabled\n */\nexport async function isPgvectorEnabled() {\n try {\n const result = await db.execute(sql `\n\t\t\tSELECT 1 FROM pg_extension WHERE extname = 'vector'\n\t\t`);\n return result.rows.length > 0;\n }\n catch {\n return false;\n }\n}\n/**\n * Get vector search statistics\n *\n * @returns Statistics about the patterns table and vector index\n */\nexport async function getVectorStats() {\n const [totalResult, embeddingResult, indexResult] = await Promise.all([\n db.select({ count: sql `count(*)` }).from(patterns),\n db.select({ count: sql `count(*)` }).from(patterns).where(sql `${patterns.embedding} IS NOT NULL`),\n db.execute(sql `\n\t\t\tSELECT indexname, indexdef\n\t\t\tFROM pg_indexes\n\t\t\tWHERE tablename = 'patterns'\n\t\t\tAND indexdef LIKE '%hnsw%'\n\t\t`),\n ]);\n const indexRow = indexResult.rows[0];\n return {\n totalPatterns: totalResult[0]?.count ?? 0,\n patternsWithEmbeddings: embeddingResult[0]?.count ?? 0,\n indexName: indexRow?.indexname ?? null,\n indexType: indexRow?.indexdef?.includes(\"hnsw\") ? \"hnsw\" : null,\n };\n}\n","// ESM imports fixed for Node.js v22+\n/**\n * Attribution Service Implementation (Gap 4 - High Priority)\n *\n * Handles marketing attribution transfer from web to platform,\n * deduplication, and conversion tracking with database persistence.\n *\n * @module attribution-service\n */\nimport { shouldMergeAttribution } from \"@vreko/contracts\";\nimport { and, eq, gte, lte } from \"drizzle-orm\";\nimport { db } from \"../db/client.js\";\nimport { userAttributions } from \"../db/schema/vreko/user-attributions.js\";\n/**\n * Attribution Service implementation\n */\nexport class AttributionServiceImpl {\n // In-memory storage (stub - will be replaced with database)\n attributions = new Map();\n fingerprintIndex = new Map(); // fingerprint -> userId\n /**\n * Transfer attribution from web to platform\n */\n async transferAttribution(request) {\n const { userId, fingerprint, attribution } = request;\n if (!db) {\n // Graceful degradation: use in-memory storage\n return this.transferAttributionInMemory(request);\n }\n try {\n // Check if this fingerprint already has attribution\n const [existingByFingerprint] = await db\n .select()\n .from(userAttributions)\n .where(eq(userAttributions.fingerprint, fingerprint))\n .limit(1);\n if (existingByFingerprint) {\n // Check if we should merge or ignore\n const shouldMerge = shouldMergeAttribution({\n attributionId: existingByFingerprint.id,\n source: existingByFingerprint.source,\n createdAt: existingByFingerprint.createdAt.toISOString(),\n campaignId: existingByFingerprint.campaignId || undefined,\n }, attribution);\n if (shouldMerge) {\n // Update existing attribution with new data\n await db\n .update(userAttributions)\n .set({\n utmParams: {\n ...existingByFingerprint.utmParams,\n ...attribution.utmParams,\n },\n conversionData: {\n ...existingByFingerprint.conversionData,\n ...attribution.conversionData,\n },\n })\n .where(eq(userAttributions.id, existingByFingerprint.id));\n process.stdout.write(`[Attribution] Merged attribution for user ${userId} (fingerprint: ${fingerprint})`);\n return {\n success: true,\n attributionId: existingByFingerprint.id,\n action: \"merged\",\n existingAttribution: {\n attributionId: existingByFingerprint.id,\n source: existingByFingerprint.source,\n createdAt: existingByFingerprint.createdAt.toISOString(),\n campaignId: existingByFingerprint.campaignId || undefined,\n },\n message: \"Attribution updated with new touch point\",\n };\n }\n // Ignore if same fingerprint but different campaign\n process.stdout.write(`[Attribution] Ignored duplicate attribution for user ${userId}`);\n return {\n success: true,\n attributionId: existingByFingerprint.id,\n action: \"ignored\",\n existingAttribution: {\n attributionId: existingByFingerprint.id,\n source: existingByFingerprint.source,\n createdAt: existingByFingerprint.createdAt.toISOString(),\n campaignId: existingByFingerprint.campaignId || undefined,\n },\n message: \"Attribution already exists for this fingerprint\",\n };\n }\n // Check if user already has attribution (race condition protection)\n const [existingByUser] = await db\n .select()\n .from(userAttributions)\n .where(eq(userAttributions.userId, userId))\n .limit(1);\n if (existingByUser) {\n // User already has attribution, return existing\n return {\n success: true,\n attributionId: existingByUser.id,\n action: \"ignored\",\n existingAttribution: {\n attributionId: existingByUser.id,\n source: existingByUser.source,\n createdAt: existingByUser.createdAt.toISOString(),\n campaignId: existingByUser.campaignId || undefined,\n },\n message: \"User already has attribution\",\n };\n }\n // Create new attribution record\n const [newAttribution] = await db\n .insert(userAttributions)\n .values({\n userId,\n source: attribution.source,\n campaignId: attribution.campaignId,\n fingerprint,\n conversionData: attribution.conversionData,\n utmParams: attribution.utmParams,\n referralCode: attribution.referralCode,\n createdAt: new Date(),\n })\n .returning();\n if (!newAttribution) {\n throw new Error(\"Failed to create attribution record\");\n }\n process.stdout.write(`[Attribution] Created new attribution for user ${userId} - Source: ${attribution.source}`);\n return {\n success: true,\n attributionId: newAttribution.id,\n action: \"created\",\n message: \"Attribution recorded successfully\",\n };\n }\n catch (_error) {\n // Fall back to in-memory\n return this.transferAttributionInMemory(request);\n }\n }\n /**\n * Get attribution for a user\n */\n async getAttribution(userId) {\n if (!db) {\n return this.attributions.get(userId) || null;\n }\n try {\n const [attribution] = await db\n .select()\n .from(userAttributions)\n .where(eq(userAttributions.userId, userId))\n .limit(1);\n if (!attribution) {\n return null;\n }\n return {\n id: attribution.id,\n userId: attribution.userId,\n source: attribution.source,\n campaignId: attribution.campaignId || undefined,\n fingerprint: attribution.fingerprint,\n conversionData: attribution.conversionData,\n utmParams: attribution.utmParams,\n createdAt: attribution.createdAt,\n referralCode: attribution.referralCode || undefined,\n convertedAt: attribution.convertedAt || undefined,\n };\n }\n catch (_error) {\n return this.attributions.get(userId) || null;\n }\n }\n /**\n * Mark user as converted (purchased subscription)\n */\n async markConverted(userId) {\n if (!db) {\n const attribution = this.attributions.get(userId);\n if (!attribution) {\n return false;\n }\n attribution.convertedAt = new Date();\n process.stdout.write(`[Attribution] Marked user ${userId} as converted - Source: ${attribution.source}`);\n return true;\n }\n try {\n const result = await db\n .update(userAttributions)\n .set({ convertedAt: new Date() })\n .where(eq(userAttributions.userId, userId))\n .returning();\n const updated = result[0];\n if (!updated) {\n return false;\n }\n process.stdout.write(`[Attribution] Marked user ${userId} as converted - Source: ${updated.source}`);\n return true;\n }\n catch (_error) {\n return false;\n }\n }\n /**\n * Get conversion metrics by source\n */\n async getConversionMetrics(dateRange) {\n if (!db) {\n // Fallback to in-memory calculation\n return this.getConversionMetricsInMemory(dateRange);\n }\n try {\n // Build query with date range filter\n let query = db.select().from(userAttributions);\n if (dateRange) {\n query = query.where(and(gte(userAttributions.createdAt, dateRange.from), lte(userAttributions.createdAt, dateRange.to)));\n }\n const attributions = await query;\n // Group by source and calculate metrics\n const metricsBySource = new Map();\n for (const record of attributions) {\n const metrics = metricsBySource.get(record.source) || {\n total: 0,\n conversions: 0,\n timesToConvert: [],\n };\n metrics.total++;\n if (record.convertedAt) {\n metrics.conversions++;\n const daysToConvert = (record.convertedAt.getTime() - record.createdAt.getTime()) / (1000 * 60 * 60 * 24);\n metrics.timesToConvert.push(daysToConvert);\n }\n metricsBySource.set(record.source, metrics);\n }\n // Convert to ConversionMetrics array\n const results = [];\n for (const [source, data] of metricsBySource.entries()) {\n const avgTimeToConvert = data.timesToConvert.length > 0\n ? data.timesToConvert.reduce((a, b) => a + b, 0) / data.timesToConvert.length\n : undefined;\n results.push({\n source: source,\n totalUsers: data.total,\n conversions: data.conversions,\n conversionRate: data.conversions / data.total,\n avgTimeToConvert,\n });\n }\n return results.sort((a, b) => b.totalUsers - a.totalUsers);\n }\n catch (_error) {\n // Fall back to in-memory\n return this.getConversionMetricsInMemory(dateRange);\n }\n }\n /**\n * Fallback: Transfer attribution in-memory\n */\n transferAttributionInMemory(request) {\n const { userId, fingerprint, attribution } = request;\n // Check if this fingerprint already has attribution\n const existingUserId = this.fingerprintIndex.get(fingerprint);\n if (existingUserId) {\n const existing = this.attributions.get(existingUserId);\n if (existing) {\n // Check if we should merge or ignore\n const shouldMerge = shouldMergeAttribution({\n attributionId: existing.id,\n source: existing.source,\n createdAt: existing.createdAt.toISOString(),\n campaignId: existing.campaignId,\n }, attribution);\n if (shouldMerge) {\n existing.utmParams = {\n ...existing.utmParams,\n ...attribution.utmParams,\n };\n existing.conversionData = {\n ...existing.conversionData,\n ...attribution.conversionData,\n };\n return {\n success: true,\n attributionId: existing.id,\n action: \"merged\",\n existingAttribution: {\n attributionId: existing.id,\n source: existing.source,\n createdAt: existing.createdAt.toISOString(),\n campaignId: existing.campaignId,\n },\n message: \"Attribution updated with new touch point\",\n };\n }\n return {\n success: true,\n attributionId: existing.id,\n action: \"ignored\",\n existingAttribution: {\n attributionId: existing.id,\n source: existing.source,\n createdAt: existing.createdAt.toISOString(),\n campaignId: existing.campaignId,\n },\n message: \"Attribution already exists for this fingerprint\",\n };\n }\n }\n // Create new attribution record\n const attributionId = `attr_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n const record = {\n id: attributionId,\n userId,\n source: attribution.source,\n campaignId: attribution.campaignId,\n fingerprint,\n conversionData: attribution.conversionData,\n utmParams: attribution.utmParams,\n createdAt: new Date(),\n referralCode: attribution.referralCode,\n };\n this.attributions.set(userId, record);\n this.fingerprintIndex.set(fingerprint, userId);\n return {\n success: true,\n attributionId,\n action: \"created\",\n message: \"Attribution recorded successfully\",\n };\n }\n /**\n * Fallback: Get conversion metrics in-memory\n */\n getConversionMetricsInMemory(dateRange) {\n const metricsBySource = new Map();\n for (const record of this.attributions.values()) {\n if (dateRange) {\n if (record.createdAt < dateRange.from || record.createdAt > dateRange.to) {\n continue;\n }\n }\n const metrics = metricsBySource.get(record.source) || {\n total: 0,\n conversions: 0,\n timesToConvert: [],\n };\n metrics.total++;\n if (record.convertedAt) {\n metrics.conversions++;\n const daysToConvert = (record.convertedAt.getTime() - record.createdAt.getTime()) / (1000 * 60 * 60 * 24);\n metrics.timesToConvert.push(daysToConvert);\n }\n metricsBySource.set(record.source, metrics);\n }\n // Convert to ConversionMetrics array\n const results = [];\n for (const [source, data] of metricsBySource.entries()) {\n const avgTimeToConvert = data.timesToConvert.length > 0\n ? data.timesToConvert.reduce((a, b) => a + b, 0) / data.timesToConvert.length\n : undefined;\n results.push({\n source: source,\n totalUsers: data.total,\n conversions: data.conversions,\n conversionRate: data.conversions / data.total,\n avgTimeToConvert,\n });\n }\n return results.sort((a, b) => b.totalUsers - a.totalUsers);\n }\n}\n/**\n * Singleton instance\n */\nexport const attributionService = new AttributionServiceImpl();\n","/**\n * Trial duration for the Pro plan (days).\n * Single source of truth - referenced by payments, marketing copy, and email templates.\n */\nexport const PRO_TRIAL_DAYS = 14;\n\n/**\n * Monthly credit allowances per tier.\n * Per pricing.md v3.2.0:\n * - Free: 25 compute/month\n * - Pro: 200 compute/month\n * - Team: 200 compute/seat/month (pooled)\n * - Enterprise: Custom\n */\nexport const TIER_CREDIT_ALLOWANCES = {\n\tfree: 25,\n\tpro: 200,\n\tteam: 200, // Per seat, pooled\n\tenterprise: 0, // Custom pricing\n} as const;\n\n/**\n * Soft cap for overages during early access.\n * Per pricing_spec_v3.md Phase 1: Track overages up to -100 credits.\n */\nexport const CREDIT_OVERAGE_SOFT_CAP = -100;\n\nexport const PLAN_PERMISSIONS = {\n\tfree: {\n\t\tcloudBackup: false,\n\t\tmaxSnapshots: 50,\n\t\tcloudStorageQuotaMb: 0,\n\t\tteamMembers: 1,\n\t\tadvancedAnalytics: false,\n\t\tapiAccess: false,\n\t\tmonthlyCreditsAllowance: TIER_CREDIT_ALLOWANCES.free,\n\t\tcanPurchaseTopups: false, // Free tier cannot purchase top-ups\n\t},\n\tpro: {\n\t\tcloudBackup: true,\n\t\tmaxSnapshots: -1, // unlimited\n\t\tcloudStorageQuotaMb: 5120, // 5GB\n\t\tteamMembers: 1,\n\t\tadvancedAnalytics: true,\n\t\tapiAccess: true,\n\t\tmonthlyCreditsAllowance: TIER_CREDIT_ALLOWANCES.pro,\n\t\tcanPurchaseTopups: true, // Pro tier can purchase top-ups\n\t},\n\tteam: {\n\t\tcloudBackup: true,\n\t\tmaxSnapshots: 2000,\n\t\tcloudStorageQuotaMb: 25600, // 25GB\n\t\tteamMembers: 10,\n\t\tadvancedAnalytics: true,\n\t\tapiAccess: true,\n\t\tteamSharing: true,\n\t\tmonthlyCreditsAllowance: TIER_CREDIT_ALLOWANCES.team,\n\t\tcanPurchaseTopups: true, // Team tier can purchase top-ups\n\t},\n\tenterprise: {\n\t\tcloudBackup: true,\n\t\tmaxSnapshots: -1, // unlimited\n\t\tcloudStorageQuotaMb: 102400, // 100GB\n\t\tteamMembers: -1, // unlimited\n\t\tadvancedAnalytics: true,\n\t\tapiAccess: true,\n\t\tteamSharing: true,\n\t\tprioritySupport: true,\n\t\tcustomRules: true,\n\t\tmonthlyCreditsAllowance: TIER_CREDIT_ALLOWANCES.enterprise,\n\t\tcanPurchaseTopups: false, // Enterprise has custom pricing\n\t},\n} as const;\n\nexport type PlanTier = keyof typeof PLAN_PERMISSIONS;\n","// ESM imports fixed for Node.js v22+\nimport { PRO_TRIAL_DAYS } from \"./subscription-config.js\";\nexport const config = {\n appName: \"Vreko\",\n tagline: \"AI-Native DevOps\",\n description: \"Protection for your code.\",\n organizations: {\n enable: true,\n enableBilling: true,\n enableUsersToCreateOrganizations: true,\n requireOrganization: false,\n hideOrganization: false,\n forbiddenOrganizationSlugs: [\"admin\", \"root\", \"api\", \"app\"],\n },\n users: {\n enableBilling: true,\n enableOnboarding: true,\n },\n auth: {\n enableSignup: true,\n enableMagicLink: true,\n enableSocialLogin: true,\n enablePasskeys: false,\n enablePasswordLogin: true,\n enableTwoFactor: false,\n redirectAfterSignIn: \"/app\",\n redirectAfterLogout: \"/\",\n sessionCookieMaxAge: 60 * 60 * 24 * 30,\n },\n mails: {\n from: \"no-reply@vreko.dev\",\n },\n storage: {\n bucketNames: {\n avatars: \"vreko-avatars\",\n checkpoints: \"vreko-checkpoints\",\n snapshots: \"vreko-snapshots\",\n },\n },\n ui: {\n enabledThemes: [\"light\", \"dark\"],\n defaultTheme: \"dark\",\n saas: {\n enabled: true,\n useSidebarLayout: true,\n },\n marketing: {\n enabled: true,\n },\n },\n contactForm: {\n enabled: true,\n to: \"support@vreko.dev\",\n subject: \"Contact from Vreko\",\n },\n payments: {\n plans: {\n free: {\n name: \"Free\",\n description: \"Essential protection for individuals.\",\n features: [\"Unlimited local checkpoints\", \"Basic AI detection\", \"Community support\"],\n isFree: true,\n prices: [\n {\n productId: \"price_free\",\n amount: 0,\n currency: \"USD\",\n type: \"recurring\",\n interval: \"month\",\n },\n ],\n },\n pro: {\n name: \"Pro\",\n description: \"Advanced protection for professional developers.\",\n features: [\"Cloud backup & sync\", \"Advanced AI analysis\", \"Priority support\", \"Unlimited history\"],\n recommended: true,\n prices: [\n {\n productId: \"price_pro_monthly\",\n amount: 2000,\n currency: \"USD\",\n type: \"recurring\",\n interval: \"month\",\n trialPeriodDays: PRO_TRIAL_DAYS,\n },\n {\n productId: \"price_pro_yearly\",\n amount: 20000,\n currency: \"USD\",\n type: \"recurring\",\n interval: \"year\",\n trialPeriodDays: PRO_TRIAL_DAYS,\n },\n ],\n },\n team: {\n name: \"Team\",\n description: \"Collaborative security for teams.\",\n features: [\"Everything in Pro\", \"Team dashboard\", \"Centralized policy management\", \"Audit logs\"],\n prices: [\n {\n productId: \"price_team_monthly\",\n amount: 4900,\n currency: \"USD\",\n type: \"recurring\",\n interval: \"month\",\n seatBased: true,\n },\n ],\n },\n },\n },\n};\n","/**\n * Feature Flags\n *\n * Controls availability of features that are implemented but not ready for production.\n * Set environment variables to enable features when ready.\n */\n\n/**\n * Extension Authentication\n * Enables VS Code extension auth endpoints (link token, exchange, refresh)\n * @default false\n */\nexport const ENABLE_EXTENSION_AUTH = process.env.ENABLE_EXTENSION_AUTH === \"true\";\n\n/**\n * API Key Authentication\n * Enables API key creation and Bearer token auth\n * Requires: argon2 or alternative hashing library resolved\n * @default false\n */\nexport const ENABLE_API_KEYS = process.env.ENABLE_API_KEYS === \"true\";\n\n/**\n * Rate Limiting\n * Enables rate limit middleware for auth endpoints\n * @default false (disabled until type declarations fixed)\n */\nexport const ENABLE_RATE_LIMITING = process.env.ENABLE_RATE_LIMITING === \"true\";\n\n/**\n * Intelligence Layer (Master Toggle)\n * Enables all intelligence layer features: trust calibration, pattern library, prediction engine\n * @default false - LAUNCH BLOCKING DECISION REQUIRED: Should this be true for Pioneer?\n * The core value prop - pattern learning, trust calibration, the entire compounding story -\n * requires these flags. If left false, Pioneer users won't experience the core value proposition.\n * FLAGGED FOR DEV SPRINT DECISION\n */\nexport const ENABLE_INTELLIGENCE_LAYER = process.env.ENABLE_INTELLIGENCE_LAYER === \"true\";\n\n/**\n * Trust Calibration Engine\n * Enables momentum-based EWMA trust scoring for AI tools\n * Requires: ENABLE_INTELLIGENCE_LAYER = true\n * @default false - LAUNCH BLOCKING DECISION REQUIRED: Should this be true for Pioneer?\n * FLAGGED FOR DEV SPRINT DECISION\n */\nexport const ENABLE_TRUST_CALIBRATION = process.env.ENABLE_TRUST_CALIBRATION === \"true\";\n\n/**\n * Pattern Library\n * Enables pgvector-powered pattern matching and similarity search\n * Requires: ENABLE_INTELLIGENCE_LAYER = true, pgvector extension in database\n * @default false - LAUNCH BLOCKING DECISION REQUIRED: Should this be true for Pioneer?\n * FLAGGED FOR DEV SPRINT DECISION\n */\nexport const ENABLE_PATTERN_LIBRARY = process.env.ENABLE_PATTERN_LIBRARY === \"true\";\n\n/**\n * Prediction Engine\n * Enables tiered risk prediction (cache → heuristics → ML)\n * Requires: ENABLE_INTELLIGENCE_LAYER = true, ENABLE_PATTERN_LIBRARY = true\n * @default false\n */\nexport const ENABLE_PREDICTION_ENGINE = process.env.ENABLE_PREDICTION_ENGINE === \"true\";\n\n/**\n * GitHub Integration\n * Enables GitHub App webhooks for ground truth AI contribution detection\n * Requires: GitHub App configured, webhook endpoint deployed\n * @default false\n */\nexport const ENABLE_GITHUB_INTEGRATION = process.env.ENABLE_GITHUB_INTEGRATION === \"true\";\n\n// =============================================================================\n// Enterprise Auth Feature Flags\n// =============================================================================\n\n/**\n * Enterprise SSO\n * Enables SAML/OIDC single sign-on for enterprise organizations\n * Requires: @better-auth/sso plugin, SSO configuration in database\n * @default false\n */\nexport const ENABLE_SSO = process.env.ENABLE_SSO === \"true\";\n\n/**\n * Captcha Protection\n * Enables Cloudflare Turnstile or reCAPTCHA for bot protection\n * Protects: sign-up, sign-in, password-reset endpoints\n * @default false\n */\nexport const ENABLE_CAPTCHA = process.env.ENABLE_CAPTCHA === \"true\";\n\n/**\n * Multi-Session Management\n * Enables device/session management with configurable session limits\n * Enterprise feature: 10 sessions max, auto-revoke oldest\n * @default false\n */\nexport const ENABLE_MULTI_SESSION = process.env.ENABLE_MULTI_SESSION === \"true\";\n\n/**\n * Enhanced 2FA Configuration\n * Enables SHA256 TOTP, longer backup codes, and device trust\n * NIST SP 800-63B compliant settings\n * @default false\n */\nexport const ENABLE_ENHANCED_2FA = process.env.ENABLE_ENHANCED_2FA === \"true\";\n\n/**\n * Feature flag configuration object\n */\nexport const featureFlags = {\n\textensionAuth: ENABLE_EXTENSION_AUTH,\n\tapiKeys: ENABLE_API_KEYS,\n\trateLimiting: ENABLE_RATE_LIMITING,\n\n\t// Intelligence Layer\n\tintelligenceLayer: ENABLE_INTELLIGENCE_LAYER,\n\ttrustCalibration: ENABLE_TRUST_CALIBRATION,\n\tpatternLibrary: ENABLE_PATTERN_LIBRARY,\n\tpredictionEngine: ENABLE_PREDICTION_ENGINE,\n\tgithubIntegration: ENABLE_GITHUB_INTEGRATION,\n\n\t// Enterprise Auth\n\tsso: ENABLE_SSO,\n\tcaptcha: ENABLE_CAPTCHA,\n\tmultiSession: ENABLE_MULTI_SESSION,\n\tenhanced2FA: ENABLE_ENHANCED_2FA,\n} as const;\n\nexport type FeatureFlags = typeof featureFlags;\n","/**\n * ConfigStore v2 - Unified Zod Schemas\n *\n * Single source of truth for all configuration across:\n * - VS Code Extension\n * - CLI\n * - MCP Server\n *\n * Type-safe with runtime validation. Zero-config defaults included.\n */\n\nimport { WorkspaceRegistrationSchema } from \"@vreko/contracts/context\";\nimport { z } from \"zod\";\n\n/**\n * Protection levels (canonical)\n */\nexport const ProtectionLevelSchema = z.enum([\"watch\", \"warn\", \"block\"]);\nexport type ProtectionLevel = z.infer<typeof ProtectionLevelSchema>;\n\n/**\n * Single protection rule\n */\nexport const ProtectionRuleSchema = z.object({\n\tpattern: z.string().describe(\"Glob pattern (e.g., '*.env*', 'package.json')\"),\n\tlevel: ProtectionLevelSchema,\n\treason: z.string().optional().describe(\"Why this pattern is protected\"),\n\tprecedence: z.number().int().min(0).max(1000).default(0),\n});\nexport type ProtectionRule = z.infer<typeof ProtectionRuleSchema>;\n\n/**\n * Engine configuration\n */\nexport const EngineConfigSchema = z.object({\n\tmaxDepth: z.number().int().min(0).max(10).default(2).describe(\"Max dependency tree depth for analysis\"),\n\tburstThreshold: z\n\t\t.number()\n\t\t.int()\n\t\t.min(1)\n\t\t.max(100)\n\t\t.default(30)\n\t\t.describe(\"Min simultaneous file changes to trigger burst detection\"),\n\tcooldowns: z\n\t\t.object({\n\t\t\tblock: z.number().int().min(0).default(60000),\n\t\t\twarn: z.number().int().min(0).default(30000),\n\t\t\twatch: z.number().int().min(0).default(0),\n\t\t})\n\t\t.default({ block: 60000, warn: 30000, watch: 0 })\n\t\t.describe(\"Cooldown durations (ms) between alerts per level\"),\n});\nexport type EngineConfig = z.infer<typeof EngineConfigSchema>;\n\n/**\n * Ignore patterns\n */\nexport const IgnorePatternsSchema = z\n\t.array(z.string())\n\t.default([])\n\t.describe(\"Glob patterns to exclude from protection (e.g., node_modules, .git)\");\n\n/**\n * Privacy and consent settings for VS Code Extension\n */\nexport const PrivacySettingsSchema = z\n\t.object({\n\t\tconsent: z.boolean().default(false).describe(\"User has given privacy consent\"),\n\t\tclipboard: z.boolean().default(false).describe(\"Allow clipboard monitoring\"),\n\t\twatcher: z.boolean().default(false).describe(\"Allow file watcher\"),\n\t\tgitWrapper: z.boolean().default(false).describe(\"Allow git wrapper integration\"),\n\t\tlastReminded: z.string().optional().describe(\"ISO timestamp of last consent reminder\"),\n\t})\n\t.default({});\nexport type PrivacySettings = z.infer<typeof PrivacySettingsSchema>;\n\n/**\n * Notification settings\n */\nexport const NotificationsSettingsSchema = z\n\t.object({\n\t\tenabled: z.boolean().default(true),\n\t\tquietHours: z\n\t\t\t.object({\n\t\t\t\tstart: z.string().default(\"22:00\"),\n\t\t\t\tend: z.string().default(\"08:00\"),\n\t\t\t})\n\t\t\t.default({ start: \"22:00\", end: \"08:00\" }),\n\t\trateLimit: z.number().int().min(1).default(5).describe(\"Max notifications per minute\"),\n\t})\n\t.default({});\nexport type NotificationsSettings = z.infer<typeof NotificationsSettingsSchema>;\n\n/**\n * Snapshot settings\n */\nexport const SnapshotSettingsSchema = z\n\t.object({\n\t\tenabled: z.boolean().default(true),\n\t\tautoCreate: z.boolean().default(true),\n\t\tretentionDays: z.number().int().min(1).default(30),\n\t})\n\t.default({});\nexport type SnapshotSettings = z.infer<typeof SnapshotSettingsSchema>;\n\n/**\n * AI features settings\n */\nexport const AISettingsSchema = z\n\t.object({\n\t\tenabled: z.boolean().default(true),\n\t\tcontext: z.boolean().default(true).describe(\"Include code context in AI analysis\"),\n\t\tcopilot: z.boolean().default(true).describe(\"Integrate with GitHub Copilot\"),\n\t})\n\t.default({});\nexport type AISettings = z.infer<typeof AISettingsSchema>;\n\n/**\n * Guardian plugin settings\n */\nexport const GuardianPluginsSchema = z\n\t.object({\n\t\tsecretDetection: z.boolean().default(true),\n\t\tmockReplacement: z.boolean().default(true),\n\t\tphantomDependency: z.boolean().default(true),\n\t})\n\t.default({});\n\nexport const GuardianThresholdsSchema = z\n\t.object({\n\t\twarn: z.number().int().min(0).default(6),\n\t\tblock: z.number().int().min(0).default(8),\n\t})\n\t.default({ warn: 6, block: 8 });\n\nexport const GuardianSettingsSchema = z\n\t.object({\n\t\tenabled: z.boolean().default(true),\n\t\twarnThreshold: z.number().int().min(0).max(100).default(5),\n\t\tblockThreshold: z.number().int().min(0).max(100).default(8),\n\t\tprotectionLevel: ProtectionLevelSchema.default(\"warn\"),\n\t\tplugins: GuardianPluginsSchema,\n\t\tthresholds: GuardianThresholdsSchema,\n\t})\n\t.default({});\nexport type GuardianSettings = z.infer<typeof GuardianSettingsSchema>;\n\n/**\n * Auto-decision engine settings\n */\nexport const AutoDecisionSettingsSchema = z\n\t.object({\n\t\triskThreshold: z\n\t\t\t.number()\n\t\t\t.int()\n\t\t\t.min(0)\n\t\t\t.max(100)\n\t\t\t.default(60)\n\t\t\t.describe(\"Risk score threshold (0-100) for automatic snapshot creation\"),\n\t\tnotifyThreshold: z\n\t\t\t.number()\n\t\t\t.int()\n\t\t\t.min(0)\n\t\t\t.max(100)\n\t\t\t.default(40)\n\t\t\t.describe(\"Risk score threshold (0-100) for user notifications\"),\n\t\tminFilesForBurst: z\n\t\t\t.number()\n\t\t\t.int()\n\t\t\t.min(1)\n\t\t\t.default(3)\n\t\t\t.describe(\"Minimum files changed simultaneously to trigger burst detection\"),\n\t\tmaxSnapshotsPerMinute: z\n\t\t\t.number()\n\t\t\t.int()\n\t\t\t.min(1)\n\t\t\t.default(4)\n\t\t\t.describe(\"Maximum snapshots allowed per minute (rate limiting)\"),\n\t})\n\t.default({});\nexport type AutoDecisionSettings = z.infer<typeof AutoDecisionSettingsSchema>;\n\n/**\n * MCP Server configuration\n */\nexport const MCPSettingsSchema = z\n\t.object({\n\t\tperformanceBudgets: z\n\t\t\t.record(z.number().int().min(0))\n\t\t\t.default({ analyze_risk: 200, create_snapshot: 500 })\n\t\t\t.describe(\"Performance budgets (ms) for MCP operations\"),\n\t\tcontext7: z\n\t\t\t.object({\n\t\t\t\tapiKey: z.string().optional(),\n\t\t\t\tapiUrl: z.string().url().default(\"https://context7.com/api\"),\n\t\t\t\tcacheTtlSearch: z.number().int().min(0).default(3600),\n\t\t\t\tcacheTtlDocs: z.number().int().min(0).default(86400),\n\t\t\t})\n\t\t\t.default({}),\n\t\tapi: z\n\t\t\t.object({\n\t\t\t\tapiKey: z.string().optional(),\n\t\t\t\tbaseUrl: z.string().url().default(\"https://api.vreko.dev\"),\n\t\t\t})\n\t\t\t.default({}),\n\t\thttp: z\n\t\t\t.object({\n\t\t\t\tallowedOrigins: z.array(z.string()).default([\"*\"]),\n\t\t\t\tapiUrl: z.string().url().default(\"http://api:8080\"),\n\t\t\t})\n\t\t\t.default({}),\n\t})\n\t.default({});\nexport type MCPSettings = z.infer<typeof MCPSettingsSchema>;\n\n/**\n * Unified settings for AI detection and behavior\n */\nexport const SettingsSchema = z\n\t.object({\n\t\tdefaultProtectionLevel: ProtectionLevelSchema.default(\"watch\"),\n\t\trequireSnapshotMessage: z.boolean().default(true),\n\t\tmaxSnapshots: z.number().int().min(1).default(100),\n\t\taiDetectionEnabled: z.boolean().default(true),\n\t\tautoRestoreOnDetection: z.boolean().default(false),\n\t\tprivacy: PrivacySettingsSchema,\n\t\tnotifications: NotificationsSettingsSchema,\n\t\tsnapshots: SnapshotSettingsSchema,\n\t\tai: AISettingsSchema,\n\t\tguardian: GuardianSettingsSchema,\n\t\tautoDecision: AutoDecisionSettingsSchema,\n\t\twebBaseUrl: z.string().url().default(\"https://console.vreko.dev\"),\n\t\tapiBaseUrl: z.string().url().optional(),\n\t\tmcp: MCPSettingsSchema,\n\t})\n\t.default({});\nexport type Settings = z.infer<typeof SettingsSchema>;\n\n/**\n * Policy overrides (temporary protection changes)\n */\nexport const PolicyOverrideSchema = z.object({\n\tpattern: z.string(),\n\tlevel: ProtectionLevelSchema,\n\tttl: z.number().optional().describe(\"Expiration timestamp (ms since epoch)\"),\n});\n\nexport const PoliciesSchema = z\n\t.object({\n\t\tenforceProtectionLevels: z.boolean().default(false),\n\t\tallowOverrides: z.boolean().default(true),\n\t\toverrides: z.array(PolicyOverrideSchema).default([]),\n\t})\n\t.default({});\nexport type Policies = z.infer<typeof PoliciesSchema>;\n\n/**\n * Main configuration schema - compatible across all systems\n */\nexport const ConfigStoreV2Schema = z.object({\n\tversion: z.literal(2).default(2),\n\tprotections: z.array(ProtectionRuleSchema).default([]),\n\tignore: IgnorePatternsSchema,\n\tengine: EngineConfigSchema.default({}),\n\tsettings: SettingsSchema,\n\tpolicies: PoliciesSchema,\n\tmcp: MCPSettingsSchema.optional(),\n\t// Phase 2: Workspace registry (SB-CTX-001)\n\tworkspaces: z.array(WorkspaceRegistrationSchema).default([]),\n});\n\nexport type ConfigStoreV2 = z.infer<typeof ConfigStoreV2Schema>;\n\n/**\n * Default empty config (fully populated with schema defaults)\n */\nexport const DEFAULT_CONFIG: ConfigStoreV2 = {\n\tversion: 2,\n\tprotections: [],\n\tignore: [],\n\tworkspaces: [],\n\tengine: {\n\t\tmaxDepth: 2,\n\t\tburstThreshold: 30,\n\t\tcooldowns: { block: 60000, warn: 30000, watch: 0 },\n\t},\n\tsettings: {\n\t\tdefaultProtectionLevel: \"watch\",\n\t\trequireSnapshotMessage: true,\n\t\tmaxSnapshots: 100,\n\t\taiDetectionEnabled: true,\n\t\tautoRestoreOnDetection: false,\n\t\tprivacy: {\n\t\t\tconsent: false,\n\t\t\tclipboard: false,\n\t\t\twatcher: false,\n\t\t\tgitWrapper: false,\n\t\t},\n\t\tnotifications: {\n\t\t\tenabled: true,\n\t\t\tquietHours: { start: \"22:00\", end: \"08:00\" },\n\t\t\trateLimit: 5,\n\t\t},\n\t\tsnapshots: {\n\t\t\tenabled: true,\n\t\t\tautoCreate: true,\n\t\t\tretentionDays: 30,\n\t\t},\n\t\tai: {\n\t\t\tenabled: true,\n\t\t\tcontext: true,\n\t\t\tcopilot: true,\n\t\t},\n\t\tguardian: {\n\t\t\tenabled: true,\n\t\t\twarnThreshold: 5,\n\t\t\tblockThreshold: 8,\n\t\t\tprotectionLevel: \"warn\",\n\t\t\tplugins: {\n\t\t\t\tsecretDetection: true,\n\t\t\t\tmockReplacement: true,\n\t\t\t\tphantomDependency: true,\n\t\t\t},\n\t\t\tthresholds: {\n\t\t\t\twarn: 6,\n\t\t\t\tblock: 8,\n\t\t\t},\n\t\t},\n\t\tautoDecision: {\n\t\t\triskThreshold: 60,\n\t\t\tnotifyThreshold: 40,\n\t\t\tminFilesForBurst: 3,\n\t\t\tmaxSnapshotsPerMinute: 4,\n\t\t},\n\t\twebBaseUrl: \"https://console.vreko.dev\",\n\t\tmcp: {\n\t\t\tperformanceBudgets: { analyze_risk: 200, create_snapshot: 500 },\n\t\t\tcontext7: { apiUrl: \"https://context7.com/api\", cacheTtlSearch: 3600, cacheTtlDocs: 86400 },\n\t\t\tapi: { baseUrl: \"https://api.vreko.dev\" },\n\t\t\thttp: { allowedOrigins: [\"*\"], apiUrl: \"http://api:8080\" },\n\t\t},\n\t},\n\tpolicies: {\n\t\tenforceProtectionLevels: false,\n\t\tallowOverrides: true,\n\t\toverrides: [],\n\t},\n};\n\n/**\n * Zero-config defaults for common patterns\n */\nexport const ZERO_CONFIG_DEFAULTS: ConfigStoreV2 = {\n\t...DEFAULT_CONFIG,\n\tprotections: [\n\t\t{\n\t\t\tpattern: \"*.env*\",\n\t\t\tlevel: \"block\",\n\t\t\treason: \"Environment files contain sensitive credentials\",\n\t\t\tprecedence: 100,\n\t\t},\n\t\t{\n\t\t\tpattern: \".env.local\",\n\t\t\tlevel: \"block\",\n\t\t\treason: \"Local environment overrides\",\n\t\t\tprecedence: 100,\n\t\t},\n\t\t{\n\t\t\tpattern: \"**/*.secret*\",\n\t\t\tlevel: \"block\",\n\t\t\treason: \"Secret files must be protected\",\n\t\t\tprecedence: 100,\n\t\t},\n\t\t{\n\t\t\tpattern: \"**/credentials*\",\n\t\t\tlevel: \"block\",\n\t\t\treason: \"Credential files must be protected\",\n\t\t\tprecedence: 100,\n\t\t},\n\t\t{\n\t\t\tpattern: \"package*.json\",\n\t\t\tlevel: \"warn\",\n\t\t\treason: \"Package files affect dependencies\",\n\t\t\tprecedence: 50,\n\t\t},\n\t\t{\n\t\t\tpattern: \"**/migrations/*\",\n\t\t\tlevel: \"block\",\n\t\t\treason: \"Database migrations are irreversible\",\n\t\t\tprecedence: 100,\n\t\t},\n\t\t{\n\t\t\tpattern: \".env\",\n\t\t\tlevel: \"block\",\n\t\t\treason: \"Environment file\",\n\t\t\tprecedence: 100,\n\t\t},\n\t\t{\n\t\t\tpattern: \".git/**\",\n\t\t\tlevel: \"watch\",\n\t\t\treason: \"Git metadata\",\n\t\t\tprecedence: 10,\n\t\t},\n\t],\n\tignore: [\"node_modules/**\", \".git/**\", \"dist/**\", \"build/**\", \"*.log\"],\n};\n\n/**\n * Validate config against schema\n */\nexport function validateConfig(\n\tdata: unknown,\n): { valid: true; data: ConfigStoreV2 } | { valid: false; errors: string[] } {\n\ttry {\n\t\tconst parsed = ConfigStoreV2Schema.parse(data);\n\t\treturn { valid: true, data: parsed };\n\t} catch (err) {\n\t\tif (err instanceof z.ZodError) {\n\t\t\tconst errors = err.errors.map((e) => `${e.path.join(\".\")}: ${e.message}`);\n\t\t\treturn { valid: false, errors };\n\t\t}\n\t\treturn { valid: false, errors: [\"Unknown validation error\"] };\n\t}\n}\n\n/**\n * Parse and validate config from JSON string\n */\nexport function parseConfig(\n\tjsonString: string,\n): { valid: true; data: ConfigStoreV2 } | { valid: false; errors: string[] } {\n\ttry {\n\t\tconst data = JSON.parse(jsonString);\n\t\treturn validateConfig(data);\n\t} catch (err) {\n\t\treturn { valid: false, errors: [err instanceof Error ? err.message : \"Failed to parse JSON\"] };\n\t}\n}\n\n/**\n * Validate that a JSON string is well-formed and can be parsed back.\n * Catches malformed output before writing to disk.\n *\n * @param jsonString - The JSON string to validate\n * @returns { valid: true } or { valid: false; errors: string[] }\n */\nexport function validateJsonOutput(jsonString: string): { valid: true } | { valid: false; errors: string[] } {\n\tconst errors: string[] = [];\n\n\t// Check for suspicious caret character (possible typo)\n\tif (/\\^/.test(jsonString)) {\n\t\terrors.push(\"Suspicious caret (^) character found - possible typo\");\n\t}\n\n\t// Check for control characters (codes 0-8, 11, 12, 14-31) without regex control chars\n\tconst hasControlChars = Array.from(jsonString).some((ch) => {\n\t\tconst code = ch.charCodeAt(0);\n\t\treturn (code >= 0 && code <= 8) || code === 11 || code === 12 || (code >= 14 && code <= 31);\n\t});\n\tif (hasControlChars) {\n\t\terrors.push(\"Control characters found in output\");\n\t}\n\n\t// Try to parse the JSON to ensure it's valid\n\ttry {\n\t\tJSON.parse(jsonString);\n\t} catch (err) {\n\t\terrors.push(`Invalid JSON: ${err instanceof Error ? err.message : \"Parse error\"}`);\n\t}\n\n\tif (errors.length > 0) {\n\t\treturn { valid: false, errors };\n\t}\n\n\treturn { valid: true };\n}\n\n/**\n * Safely stringify config to JSON with validation.\n * Validates the output string before returning.\n *\n * @param config - Config to stringify\n * @param space - Number of spaces for indentation (default: 2)\n * @returns { success: true; json: string } or { success: false; errors: string[] }\n */\nexport function safeStringifyConfig(\n\tconfig: unknown,\n\tspace = 2,\n): { success: true; json: string } | { success: false; errors: string[] } {\n\ttry {\n\t\tconst jsonString = JSON.stringify(config, null, space);\n\n\t\t// Validate the output\n\t\tconst validation = validateJsonOutput(jsonString);\n\t\tif (!validation.valid) {\n\t\t\treturn { success: false, errors: validation.errors };\n\t\t}\n\n\t\treturn { success: true, json: jsonString };\n\t} catch (err) {\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\terrors: [`Failed to stringify: ${err instanceof Error ? err.message : \"Unknown error\"}`],\n\t\t};\n\t}\n}\n","export function getBaseUrl() {\n\tif (process.env.NEXT_PUBLIC_SITE_URL) {\n\t\treturn process.env.NEXT_PUBLIC_SITE_URL;\n\t}\n\tif (process.env.NEXT_PUBLIC_VERCEL_URL) {\n\t\treturn `https://${process.env.NEXT_PUBLIC_VERCEL_URL}`;\n\t}\n\treturn `http://localhost:${process.env.PORT ?? 3000}`;\n}\n","import { createLogger, LogLevel } from \"@vreko/contracts\";\nimport { PostHog } from \"posthog-node\";\n\n// =============================================================================\n// Feature Flag Name Constants\n// PostHog feature flag keys - use VREKO_* for new flags; SNAPBACK_* are kept\n// as deprecated fallbacks for the 90-day migration window.\n// Consumer usage pattern:\n// const enabled = await isFeatureEnabled(VREKO_ENABLE_LEARNING, userId)\n// ?? await isFeatureEnabled(SNAPBACK_ENABLE_LEARNING, userId); // fallback\n// =============================================================================\n\nexport const VREKO_ENABLE_LEARNING = \"vreko-enable-learning\";\n/** @deprecated Use VREKO_ENABLE_LEARNING instead */\nexport const SNAPBACK_ENABLE_LEARNING = \"snapback-enable-learning\";\n\nexport const VREKO_ENABLE_INTELLIGENCE = \"vreko-enable-intelligence\";\n/** @deprecated Use VREKO_ENABLE_INTELLIGENCE instead */\nexport const SNAPBACK_ENABLE_INTELLIGENCE = \"snapback-enable-intelligence\";\n\nexport const VREKO_ENABLE_MCP = \"vreko-enable-mcp\";\n/** @deprecated Use VREKO_ENABLE_MCP instead */\nexport const SNAPBACK_ENABLE_MCP = \"snapback-enable-mcp\";\n\nexport const VREKO_ENABLE_PIONEER_FEATURES = \"vreko-enable-pioneer-features\";\n/** @deprecated Use VREKO_ENABLE_PIONEER_FEATURES instead */\nexport const SNAPBACK_ENABLE_PIONEER_FEATURES = \"snapback-enable-pioneer-features\";\n\nexport const VREKO_ENABLE_BETA_UI = \"vreko-enable-beta-ui\";\n/** @deprecated Use VREKO_ENABLE_BETA_UI instead */\nexport const SNAPBACK_ENABLE_BETA_UI = \"snapback-enable-beta-ui\";\n\nconst logger = createLogger({ name: \"feature-flags\", level: LogLevel.INFO });\n\n// Initialize PostHog for feature flags\nconst posthog = new PostHog(process.env.POSTHOG_API_KEY || \"default_key\", {\n\thost: process.env.POSTHOG_HOST || \"https://app.posthog.com\",\n});\n\n// Check if a feature flag is enabled for a user\nexport async function isFeatureEnabled(\n\tflag: string,\n\tuserId: string,\n\tproperties: Record<string, unknown> = {},\n): Promise<boolean> {\n\ttry {\n\t\tconst result = await posthog.isFeatureEnabled(flag, userId, properties);\n\t\treturn result ?? false;\n\t} catch (error) {\n\t\t// If there's an error checking feature flags, we'll be conservative and disable the feature\n\t\tlogger.error(\"Error checking feature flag:\", { error });\n\t\treturn false;\n\t}\n}\n\n// Get the value of a feature flag for a user\nexport async function getFeatureFlag(\n\tflag: string,\n\tuserId: string,\n\tproperties: Record<string, unknown> = {},\n): Promise<string | boolean | number | undefined> {\n\ttry {\n\t\tconst result = await posthog.getFeatureFlag(flag, userId, properties);\n\t\treturn result ?? undefined;\n\t} catch (error) {\n\t\t// If there's an error getting feature flag value, return undefined\n\t\tlogger.error(\"Error getting feature flag value:\", { error });\n\t\treturn undefined;\n\t}\n}\n\n// Track feature flag usage\nexport async function trackFeatureFlag(\n\tflag: string,\n\tuserId: string,\n\tproperties: Record<string, unknown> = {},\n): Promise<void> {\n\ttry {\n\t\tposthog.capture({\n\t\t\tdistinctId: userId,\n\t\t\tevent: \"feature_flag_evaluated\",\n\t\t\tproperties: {\n\t\t\t\tfeature_flag: flag,\n\t\t\t\t...properties,\n\t\t\t},\n\t\t});\n\t} catch (error) {\n\t\t// If there's an error tracking, we'll log it but not fail\n\t\tlogger.error(\"Error tracking feature flag:\", { error });\n\t}\n}\n\n// Gracefully shutdown PostHog\nexport async function shutdownFeatureFlags(): Promise<void> {\n\ttry {\n\t\tawait posthog.shutdownAsync();\n\t} catch (error) {\n\t\tlogger.error(\"Error shutting down PostHog:\", { error });\n\t}\n}\n","// ESM imports fixed for Node.js v22+\n/**\n * Entitlements Service Implementation (Gap 1 - Critical Priority)\n *\n * Provides entitlements resolution with caching, feature access checks,\n * and tier validation. This implementation uses Drizzle ORM for database\n * queries and Redis for caching.\n *\n * @module entitlements-service\n */\nimport { CREDIT_OVERAGE_SOFT_CAP, TIER_CREDIT_ALLOWANCES } from \"@vreko/config\";\nimport { getEffectiveTier, getTierFeatures, getTierLimit, isFeatureAvailableAtTier } from \"@vreko/contracts\";\nimport { logger } from \"@vreko/infrastructure\";\nimport { and, desc, eq, gt, lte, sum } from \"drizzle-orm\";\nimport { deleteCache, getCache, isRedisAvailable, setCache } from \"../cache/redis-client.js\";\nimport { db } from \"../db/client.js\";\nimport { subscriptions, trials, usageLimits } from \"../db/schema/postgres.js\";\nimport { creditsLedger } from \"../db/schema/vreko/credits-ledger.js\";\nimport { pioneerRedemptions, pioneers } from \"../db/schema/vreko/pioneers.js\";\n/**\n * Stub implementation of EntitlementsService\n */\nexport class EntitlementsServiceImpl {\n cache = new Map();\n CACHE_TTL_MS = 60_000; // 60 seconds\n /**\n * Fetch complete entitlement set for a user\n * Queries database for subscription, trial, and Pioneer status with Redis caching\n */\n async getEntitlements(userId) {\n // Check Redis cache first (if available)\n if (isRedisAvailable()) {\n const cached = await getCache(`entitlements:${userId}`);\n if (cached) {\n return cached;\n }\n }\n // Fallback to in-memory cache\n const memoryCached = this.cache.get(userId);\n if (memoryCached && Date.now() - memoryCached.timestamp < this.CACHE_TTL_MS) {\n return memoryCached.entitlements;\n }\n if (!db) {\n // Graceful degradation: return default entitlements if DB unavailable\n const entitlements = this.createDefaultEntitlements(userId);\n return entitlements;\n }\n try {\n // Query user's subscription\n const [subscription] = await db\n .select()\n .from(subscriptions)\n .where(eq(subscriptions.userId, userId))\n .limit(1);\n // Query trial status\n const [trial] = await db\n .select()\n .from(trials)\n .where(and(eq(trials.userId, userId), eq(trials.status, \"active\")))\n .limit(1);\n // Query Pioneer profile if feature flag is enabled\n // Controlled by FEATURE_PIONEER_PROGRAM env var (default: true)\n const isPioneerEnabled = process.env.FEATURE_PIONEER_PROGRAM !== \"false\";\n let pioneerData = null;\n if (isPioneerEnabled) {\n try {\n const [pioneerRow] = await db\n .select({\n id: pioneers.id,\n githubStarred: pioneers.githubStarred,\n joinedAt: pioneers.joinedAt,\n })\n .from(pioneers)\n .where(eq(pioneers.userId, userId))\n .limit(1);\n if (pioneerRow) {\n // Tier is derived from redemption existence (simplified post-CANON.md)\n const [redemption] = await db\n .select({ id: pioneerRedemptions.id })\n .from(pioneerRedemptions)\n .where(eq(pioneerRedemptions.userId, userId))\n .limit(1);\n pioneerData = {\n tier: redemption ? \"founding_pioneer\" : \"pioneer\",\n totalPoints: 0, // Points system removed per CANON.md\n };\n }\n }\n catch (pioneerError) {\n // Non-fatal: log and continue without pioneer data\n // (AP-3: every catch must log)\n logger.warn(\"[entitlements] Pioneer query failed, continuing without pioneer data\", {\n userId,\n error: pioneerError instanceof Error ? pioneerError.message : String(pioneerError),\n });\n }\n }\n // Determine tier based on subscription (respects VREKO_BYPASS_TIER_RESTRICTIONS)\n const tier = getEffectiveTier(subscription?.plan || \"free\");\n // ENT-001: Query actual usage limits from database\n // Get the most recent usage record for current billing period\n const [usageData] = subscription\n ? await db\n .select()\n .from(usageLimits)\n .where(eq(usageLimits.subscriptionId, subscription.id))\n .orderBy(desc(usageLimits.month))\n .limit(1)\n : [null];\n // Calculate credit balance from ledger (pricing_spec_v3.md)\n const creditBalance = await this.calculateCreditBalance(userId, tier, subscription);\n // Build entitlements with real usage data\n const entitlements = this.buildEntitlements(userId, tier, trial || null, pioneerData, subscription || null, usageData || null, creditBalance);\n // Cache in Redis (60 seconds TTL)\n if (isRedisAvailable()) {\n await setCache(`entitlements:${userId}`, entitlements, 60);\n }\n // Cache in memory as backup\n this.cache.set(userId, {\n entitlements,\n timestamp: Date.now(),\n });\n return entitlements;\n }\n catch (_error) {\n // Return default entitlements on error\n return this.createDefaultEntitlements(userId);\n }\n }\n /**\n * Check if user has access to a specific feature\n */\n async checkFeatureAccess(userId, feature) {\n const entitlements = await this.getEntitlements(userId);\n // Check if feature is in user's feature list\n if (entitlements.features.includes(feature)) {\n // Check usage limits\n const limit = entitlements.limits.get(feature);\n if (limit && limit.max !== null && limit.current >= limit.max) {\n return {\n granted: false,\n reason: \"usage_limit_reached\",\n limitInfo: limit,\n };\n }\n return { granted: true };\n }\n // Check if trial provides access\n if (entitlements.trial?.active && entitlements.trial.features.includes(feature)) {\n return { granted: true };\n }\n // Check Pioneer tier benefits (Guardian = lifetime Pro)\n if (entitlements.pioneer?.tier === \"founding_pioneer\") {\n // Guardian tier grants lifetime Pro access\n if (isFeatureAvailableAtTier(feature, \"pro\")) {\n return { granted: true };\n }\n }\n // Determine required tier for feature\n const requiredTier = this.getRequiredTierForFeature(feature);\n return {\n granted: false,\n reason: \"feature_not_in_plan\",\n requiredTier,\n };\n }\n /**\n * Get usage limits for a specific feature\n */\n async getFeatureLimits(userId, feature) {\n const entitlements = await this.getEntitlements(userId);\n return entitlements.limits.get(feature) || null;\n }\n /**\n * Check if user meets minimum tier requirement\n */\n async checkTierRequirement(userId, requiredTier) {\n const entitlements = await this.getEntitlements(userId);\n return this.compareTiers(entitlements.tier, requiredTier) >= 0;\n }\n /**\n * Invalidate cached entitlements for a user (both Redis and memory)\n */\n async invalidateCache(userId) {\n this.cache.delete(userId);\n // Invalidate Redis cache\n if (isRedisAvailable()) {\n await deleteCache(`entitlements:${userId}`);\n }\n }\n /**\n * Build entitlements from database query results\n */\n buildEntitlements(userId, tier, trial, pioneer, subscription, usageData, creditBalance) {\n const features = getTierFeatures(tier);\n // Add trial features if active\n const trialInfo = trial\n ? {\n active: true,\n endsAt: trial.endsAt,\n features: trial.features || [],\n }\n : null;\n // Add Pioneer info if enrolled\n const pioneerInfo = pioneer\n ? {\n tier: pioneer.tier,\n totalPoints: pioneer.totalPoints,\n pointsToNext: this.calculatePointsToNext(pioneer.tier, pioneer.totalPoints),\n nextTier: this.getNextTier(pioneer.tier),\n discountPercent: this.getTierDiscount(pioneer.tier),\n benefits: this.getTierBenefits(pioneer.tier),\n }\n : null;\n // Create limits map with real usage data (ENT-001)\n const limits = new Map();\n for (const feature of features) {\n const maxLimit = getTierLimit(tier, feature);\n if (maxLimit !== null) {\n // Map feature to usage data from database\n const current = this.getFeatureUsage(feature, usageData);\n limits.set(feature, {\n feature,\n current,\n max: maxLimit,\n period: \"monthly\",\n });\n }\n }\n // Determine effective date and expiry\n const effectiveDate = subscription?.currentPeriodStart || new Date();\n const expiresAt = subscription?.currentPeriodEnd || null;\n return {\n userId,\n tier,\n features,\n limits,\n trial: trialInfo,\n pioneer: pioneerInfo,\n credits: creditBalance,\n effectiveDate,\n expiresAt,\n version: 1,\n reason: \"subscription\",\n };\n }\n /**\n * Create default entitlements for a user (graceful degradation fallback)\n * Used when database is unavailable - returns free tier with no usage data\n */\n createDefaultEntitlements(userId) {\n const tier = \"free\"; // Default to free tier\n const features = getTierFeatures(tier);\n // Create limits map with zero usage (safe defaults)\n const limits = new Map();\n for (const feature of features) {\n const maxLimit = getTierLimit(tier, feature);\n if (maxLimit !== null) {\n limits.set(feature, {\n feature,\n current: 0, // Safe default when DB unavailable\n max: maxLimit,\n period: \"monthly\",\n });\n }\n }\n // Default credit balance for free tier\n const defaultCredits = {\n included: TIER_CREDIT_ALLOWANCES.free,\n topups: 0,\n total: TIER_CREDIT_ALLOWANCES.free,\n overage: 0,\n softCapReached: false,\n monthlyAllowance: TIER_CREDIT_ALLOWANCES.free,\n };\n return {\n userId,\n tier,\n features,\n limits,\n trial: null, // Trials unavailable in fallback mode\n pioneer: null, // Pioneer status unavailable in fallback mode\n credits: defaultCredits,\n effectiveDate: new Date(),\n expiresAt: null,\n version: 1,\n reason: \"subscription\",\n };\n }\n /**\n * Calculate credit balance from the credits ledger (pricing_spec_v3.md)\n * Per spec: Balance = included credits + top-up credits - consumption\n */\n async calculateCreditBalance(userId, tier, subscription) {\n const monthlyAllowance = TIER_CREDIT_ALLOWANCES[tier] || 0;\n // Get current billing period\n const now = new Date();\n const billingPeriodStart = subscription?.currentPeriodStart || new Date(now.getFullYear(), now.getMonth(), 1);\n const billingPeriodEnd = subscription?.currentPeriodEnd || new Date(now.getFullYear(), now.getMonth() + 1, 0);\n try {\n // Calculate included credits (monthly allowance granted this period)\n const [includedResult] = await db\n .select({ total: sum(creditsLedger.credits) })\n .from(creditsLedger)\n .where(and(eq(creditsLedger.userId, userId), eq(creditsLedger.transactionType, \"monthly_allowance\"), gt(creditsLedger.createdAt, billingPeriodStart), lte(creditsLedger.createdAt, billingPeriodEnd)));\n // Calculate top-up credits (all time, they don't expire)\n const [topupResult] = await db\n .select({ total: sum(creditsLedger.credits) })\n .from(creditsLedger)\n .where(and(eq(creditsLedger.userId, userId), eq(creditsLedger.transactionType, \"top_up\")));\n // Calculate consumption (all time, negative values)\n const [consumptionResult] = await db\n .select({ total: sum(creditsLedger.credits) })\n .from(creditsLedger)\n .where(and(eq(creditsLedger.userId, userId), eq(creditsLedger.transactionType, \"job_consumption\")));\n const included = Number(includedResult?.total || 0);\n const topups = Number(topupResult?.total || 0);\n const consumption = Number(consumptionResult?.total || 0);\n // Calculate balance: included + topups + consumption (consumption is negative)\n const total = included + topups + consumption;\n const overage = total < 0 ? Math.abs(total) : 0;\n const softCapReached = total <= CREDIT_OVERAGE_SOFT_CAP;\n return {\n included: Math.max(0, included + consumption),\n topups,\n total,\n overage,\n softCapReached,\n monthlyAllowance,\n };\n }\n catch (_error) {\n // Return default balance on error\n return {\n included: monthlyAllowance,\n topups: 0,\n total: monthlyAllowance,\n overage: 0,\n softCapReached: false,\n monthlyAllowance,\n };\n }\n }\n /**\n * Determine required tier for a feature\n */\n getRequiredTierForFeature(feature) {\n const tiers = [\"free\", \"pro\", \"team\", \"enterprise\"];\n for (const tier of tiers) {\n if (isFeatureAvailableAtTier(feature, tier)) {\n return tier;\n }\n }\n return \"enterprise\"; // Default to highest tier\n }\n /**\n * Calculate points needed to reach next tier\n */\n calculatePointsToNext(currentTier, totalPoints) {\n const PIONEER_TIER_THRESHOLDS = {\n pioneer: 0,\n active_pioneer: 1,\n contributing_pioneer: 2,\n founding_pioneer: 3,\n };\n const tierOrder = [\"pioneer\", \"active_pioneer\", \"contributing_pioneer\", \"founding_pioneer\"];\n const currentIndex = tierOrder.indexOf(currentTier);\n if (currentIndex === -1 || currentIndex === tierOrder.length - 1) {\n return 0; // Already at max tier\n }\n const nextTier = tierOrder[currentIndex + 1];\n if (!nextTier) {\n return 0;\n }\n const threshold = PIONEER_TIER_THRESHOLDS[nextTier];\n return threshold !== undefined ? threshold - totalPoints : 0;\n }\n /**\n * Get next Pioneer tier\n */\n getNextTier(currentTier) {\n const tierOrder = [\"pioneer\", \"active_pioneer\", \"contributing_pioneer\", \"founding_pioneer\"];\n const currentIndex = tierOrder.indexOf(currentTier);\n if (currentIndex === -1 || currentIndex === tierOrder.length - 1) {\n return null;\n }\n return tierOrder[currentIndex + 1] ?? null;\n }\n /**\n * Get discount percentage for Pioneer tier\n */\n getTierDiscount(tier) {\n const discounts = {\n pioneer: 0,\n active_pioneer: 50,\n contributing_pioneer: 75,\n founding_pioneer: 100,\n };\n return discounts[tier] || 0;\n }\n /**\n * Get benefits for Pioneer tier\n */\n getTierBenefits(tier) {\n const benefits = {\n pioneer: [\"Pioneer badge\", \"Community access\"],\n active_pioneer: [\"Pioneer badge\", \"Community access\", \"50% discount on Pro plan\"],\n contributing_pioneer: [\"Pioneer badge\", \"Community access\", \"75% discount on Pro plan\", \"Priority support\"],\n founding_pioneer: [\n \"Pioneer badge\",\n \"Community access\",\n \"Lifetime Pro access\",\n \"Priority support\",\n \"Founding member recognition\",\n ],\n };\n return benefits[tier] || [];\n }\n /**\n * Compare two tiers (returns -1, 0, or 1)\n */\n compareTiers(userTier, requiredTier) {\n const tierOrder = [\"free\", \"pro\", \"team\", \"enterprise\"];\n const userIndex = tierOrder.indexOf(userTier);\n const requiredIndex = tierOrder.indexOf(requiredTier);\n return userIndex - requiredIndex;\n }\n /**\n * Map feature to actual usage from usage_limits table (ENT-001)\n * Maps feature names to database columns for usage tracking\n */\n getFeatureUsage(feature, usageData) {\n if (!usageData) {\n return 0;\n }\n // Map features to usage_limits table columns\n // This mapping aligns with the schema in packages/platform/src/db/schema/postgres.ts\n switch (feature) {\n case \"cloud_backup\":\n return usageData.snapshotsUsed || 0;\n case \"api_access\":\n return usageData.apiCallsUsed || 0;\n // Features without usage tracking (binary access)\n case \"advanced_analytics\":\n case \"unlimited_workspaces\":\n case \"cli_full_features\":\n case \"team_dashboard\":\n case \"multi_workspace\":\n case \"sso_authentication\":\n case \"audit_logs\":\n case \"priority_support\":\n case \"custom_retention\":\n return 0; // No usage tracking for these features\n default:\n return 0;\n }\n }\n}\n/**\n * Singleton instance of EntitlementsService\n * Used for cache coherence across webhook handlers and API routes\n */\nexport const entitlementsService = new EntitlementsServiceImpl();\n","// ESM imports fixed for Node.js v22+\n/**\n * MCP Service Layer\n *\n * Handles persistent storage of MCP observations and tool invocations.\n * Provides idempotency, batching, and conflict resolution.\n *\n * @module platform/services\n */\nimport { and, eq, gte, sql } from \"drizzle-orm\";\nimport { db } from \"../db/client.js\";\nimport { extensionSyncState, mcpObservations, mcpToolInvocations } from \"../db/schema/vreko/mcp.js\";\n// ============================================================================\n// Database Access Helper\n// ============================================================================\nfunction getDb() {\n if (!db) {\n throw new Error(\"Database not initialized. Check DATABASE_URL environment variable.\");\n }\n return db;\n}\n// ============================================================================\n// MCP Service\n// ============================================================================\nexport class MCPService {\n /**\n * Record an observation from the MCP bridge\n * Uses idempotency key to prevent duplicates\n */\n async recordObservation(input) {\n const database = getDb();\n // Check idempotency if key provided\n if (input.idempotencyKey) {\n const existing = await database\n .select({ id: mcpObservations.id })\n .from(mcpObservations)\n .where(eq(mcpObservations.idempotencyKey, input.idempotencyKey))\n .limit(1);\n if (existing.length > 0) {\n return { id: existing[0].id, created: false };\n }\n }\n // Insert new observation\n const data = {\n workspaceId: input.workspaceId,\n userId: input.userId,\n type: input.type,\n severity: input.severity,\n message: input.message,\n context: input.context ?? {},\n filePath: input.filePath,\n lineNumber: input.lineNumber,\n source: input.source ?? \"extension\",\n toolName: input.toolName,\n idempotencyKey: input.idempotencyKey,\n deviceId: input.deviceId,\n observedAt: input.observedAt ?? new Date(),\n processed: false,\n };\n const result = await database.insert(mcpObservations).values(data).returning({ id: mcpObservations.id });\n return { id: result[0].id, created: true };\n }\n /**\n * Record a tool invocation\n * Uses idempotency key to prevent duplicates\n */\n async recordInvocation(input) {\n const database = getDb();\n // Check idempotency if key provided\n if (input.idempotencyKey) {\n const existing = await database\n .select({ id: mcpToolInvocations.id })\n .from(mcpToolInvocations)\n .where(eq(mcpToolInvocations.idempotencyKey, input.idempotencyKey))\n .limit(1);\n if (existing.length > 0) {\n return { id: existing[0].id, created: false };\n }\n }\n // Insert new invocation\n const data = {\n workspaceId: input.workspaceId,\n userId: input.userId,\n toolName: input.toolName,\n toolVersion: input.toolVersion,\n invocationType: input.invocationType,\n requestPayload: input.requestPayload,\n responsePayload: input.responsePayload,\n status: input.status ?? \"pending\",\n errorMessage: input.errorMessage,\n inputTokens: input.inputTokens ?? 0,\n outputTokens: input.outputTokens ?? 0,\n idempotencyKey: input.idempotencyKey,\n source: input.source ?? \"extension\",\n sessionId: input.sessionId,\n durationMs: input.durationMs,\n };\n const result = await database.insert(mcpToolInvocations).values(data).returning({ id: mcpToolInvocations.id });\n return { id: result[0].id, created: true };\n }\n /**\n * Update sync state for a device\n * Creates or updates the sync state record\n */\n async updateSyncState(input) {\n const database = getDb();\n // Try to update existing record\n const updateResult = await database\n .update(extensionSyncState)\n .set({\n lastSyncAt: input.lastSyncAt ?? new Date(),\n syncVersion: input.syncVersion ?? sql `${extensionSyncState.syncVersion} + 1`,\n deviceType: input.deviceType,\n deviceName: input.deviceName,\n pendingChangesCount: input.pendingChangesCount ?? 0,\n pendingChanges: input.pendingChanges ?? [],\n isOnline: input.isOnline ?? true,\n lastHeartbeatAt: new Date(),\n updatedAt: new Date(),\n })\n .where(and(eq(extensionSyncState.userId, input.userId), eq(extensionSyncState.workspaceId, input.workspaceId), eq(extensionSyncState.deviceId, input.deviceId)))\n .returning({ id: extensionSyncState.id });\n if (updateResult.length > 0) {\n return { id: updateResult[0].id, created: false };\n }\n // Create new record\n const data = {\n userId: input.userId,\n workspaceId: input.workspaceId,\n deviceId: input.deviceId,\n deviceType: input.deviceType,\n deviceName: input.deviceName,\n lastSyncAt: input.lastSyncAt ?? new Date(),\n syncVersion: input.syncVersion ?? 1,\n pendingChangesCount: input.pendingChangesCount ?? 0,\n pendingChanges: input.pendingChanges ?? [],\n isOnline: input.isOnline ?? true,\n lastHeartbeatAt: new Date(),\n };\n const result = await database.insert(extensionSyncState).values(data).returning({ id: extensionSyncState.id });\n return { id: result[0].id, created: true };\n }\n /**\n * Query observations with filters\n */\n async queryObservations(input) {\n const database = getDb();\n // Build where conditions dynamically\n const conditions = [eq(mcpObservations.workspaceId, input.workspaceId)];\n if (input.userId) {\n conditions.push(eq(mcpObservations.userId, input.userId));\n }\n if (input.processed !== undefined) {\n conditions.push(eq(mcpObservations.processed, input.processed));\n }\n if (input.after) {\n conditions.push(gte(mcpObservations.createdAt, input.after));\n }\n const results = await database\n .select()\n .from(mcpObservations)\n .where(and(...conditions))\n .orderBy(sql `${mcpObservations.createdAt} DESC`)\n .limit(input.limit ?? 100);\n return results;\n }\n /**\n * Mark observations as processed\n */\n async markObservationsProcessed(observationIds) {\n if (observationIds.length === 0) {\n return 0;\n }\n const database = getDb();\n const result = await database\n .update(mcpObservations)\n .set({\n processed: true,\n processedAt: new Date(),\n updatedAt: new Date(),\n })\n .where(sql `${mcpObservations.id} IN (${observationIds.join(\",\")})`);\n return result.rowCount ?? 0;\n }\n}\n// ============================================================================\n// Singleton Instance\n// ============================================================================\nlet instance = null;\nexport function getMCPService() {\n if (!instance) {\n instance = new MCPService();\n }\n return instance;\n}\n","import { randomBytes } from \"node:crypto\";\n/**\n * Saga Orchestrator Implementation\n *\n * Implements saga pattern for multi-step workflows with:\n * - Step-by-step execution with compensation on failure\n * - Persistence for recovery after crashes\n * - Retry logic for transient failures\n * - Event emission for monitoring\n *\n * Architecture:\n * - Orchestration-based (centralized coordinator)\n * - Forward recovery with compensation\n * - Persistent state for crash recovery\n * - Timeout handling per step\n */\nexport class SagaOrchestratorImpl {\n persistence;\n definitions = new Map();\n runningInstances = new Map();\n constructor(persistence) {\n this.persistence = persistence;\n /* intentionally empty */\n }\n /**\n * Register a saga definition\n */\n registerSaga(definition) {\n this.definitions.set(definition.sagaType, definition);\n process.stdout.write(`[SagaOrchestrator] Registered saga type: ${definition.sagaType}`);\n }\n /**\n * Start a new saga instance\n */\n async start(sagaType, initialContext) {\n const definition = this.definitions.get(sagaType);\n if (!definition) {\n throw new Error(`Saga type not registered: ${sagaType}`);\n }\n // Create saga instance\n const sagaId = this.generateSagaId();\n const instance = {\n sagaId,\n sagaType,\n status: \"pending\",\n context: initialContext,\n steps: definition.steps.map((step) => ({\n stepId: step.stepId,\n stepName: step.stepName,\n status: \"pending\",\n input: {},\n output: null,\n error: null,\n startedAt: null,\n completedAt: null,\n compensatedAt: null,\n })),\n startedAt: new Date(),\n completedAt: null,\n failedAt: null,\n error: null,\n retryCount: 0,\n maxRetries: definition.maxRetries || 3,\n };\n // Persist initial state\n await this.persistence.save(instance);\n // Store in memory\n this.runningInstances.set(sagaId, instance);\n // Start execution asynchronously\n this.executeAsync(sagaId, definition);\n return instance;\n }\n /**\n * Resume a saga from persisted state\n */\n async resume(sagaId) {\n // Load from persistence\n const instance = await this.persistence.load(sagaId);\n if (!instance) {\n throw new Error(`Saga not found: ${sagaId}`);\n }\n // Get definition\n const definition = this.definitions.get(instance.sagaType);\n if (!definition) {\n throw new Error(`Saga type not registered: ${instance.sagaType}`);\n }\n // Store in memory\n this.runningInstances.set(sagaId, instance);\n // Resume execution\n this.executeAsync(sagaId, definition);\n return instance;\n }\n /**\n * Get saga status\n */\n async getStatus(sagaId) {\n // Check in-memory first\n const running = this.runningInstances.get(sagaId);\n if (running) {\n return running;\n }\n // Load from persistence\n return this.persistence.load(sagaId);\n }\n /**\n * List all sagas\n */\n async listSagas(filter) {\n return this.persistence.listAll(filter);\n }\n /**\n * Execute saga steps asynchronously\n */\n async executeAsync(sagaId, definition) {\n const instance = this.runningInstances.get(sagaId);\n if (!instance) {\n return;\n }\n try {\n // Update status to running\n instance.status = \"running\";\n await this.persistence.update(sagaId, { status: \"running\" });\n // Execute steps in order\n for (let i = 0; i < definition.steps.length; i++) {\n const stepDef = definition.steps[i];\n const stepExec = instance.steps[i];\n if (!stepDef || !stepExec) {\n throw new Error(`Step definition or execution not found at index ${i}`);\n }\n // Skip if already completed\n if (stepExec.status === \"completed\") {\n continue;\n }\n // Execute step\n const success = await this.executeStep(instance, stepDef, stepExec);\n if (!success) {\n // Step failed - start compensation\n await this.compensate(instance, definition, i);\n return;\n }\n // Persist progress\n if (definition.persistenceInterval) {\n await this.persistence.update(sagaId, { steps: instance.steps });\n }\n }\n // All steps completed\n instance.status = \"completed\";\n instance.completedAt = new Date();\n await this.persistence.update(sagaId, {\n status: \"completed\",\n completedAt: instance.completedAt,\n });\n process.stdout.write(`[SagaOrchestrator] Saga completed: ${sagaId}`);\n }\n catch (error) {\n instance.status = \"failed\";\n instance.failedAt = new Date();\n instance.error = error instanceof Error ? error.message : String(error);\n await this.persistence.update(sagaId, {\n status: \"failed\",\n failedAt: instance.failedAt,\n error: instance.error,\n });\n }\n finally {\n // Remove from running instances\n this.runningInstances.delete(sagaId);\n }\n }\n /**\n * Execute a single saga step\n */\n async executeStep(instance, stepDef, stepExec) {\n stepExec.status = \"running\";\n stepExec.startedAt = new Date();\n try {\n // Execute with timeout\n const timeoutMs = stepDef.timeout || 30000;\n const result = await this.executeWithTimeout(stepDef.execute(stepExec.input, instance.context), timeoutMs);\n // Store output\n stepExec.output = result;\n stepExec.status = \"completed\";\n stepExec.completedAt = new Date();\n process.stdout.write(`[SagaOrchestrator] Step completed: ${stepDef.stepId}`);\n return true;\n }\n catch (error) {\n // Handle step failure\n stepExec.error = error instanceof Error ? error.message : String(error);\n stepExec.status = \"failed\";\n // Retry if retryable and retries remaining\n if (stepDef.retryable && instance.retryCount < instance.maxRetries) {\n instance.retryCount++;\n process.stdout.write(`[SagaOrchestrator] Retrying step ${stepDef.stepId} (${instance.retryCount}/${instance.maxRetries})`);\n // Reset step status for retry\n stepExec.status = \"pending\";\n stepExec.error = null;\n // Wait before retry (exponential backoff)\n const delayMs = Math.min(1000 * 2 ** instance.retryCount, 30000);\n await this.sleep(delayMs);\n // Retry\n return this.executeStep(instance, stepDef, stepExec);\n }\n return false;\n }\n }\n /**\n * Compensate (rollback) completed steps\n */\n async compensate(instance, definition, failedStepIndex) {\n instance.status = \"compensating\";\n await this.persistence.update(instance.sagaId, { status: \"compensating\" });\n process.stdout.write(`[SagaOrchestrator] Starting compensation for saga: ${instance.sagaId}`);\n // Compensate completed steps in reverse order\n for (let i = failedStepIndex - 1; i >= 0; i--) {\n const stepDef = definition.steps[i];\n const stepExec = instance.steps[i];\n if (!stepDef || !stepExec) {\n continue;\n }\n // Skip if not completed\n if (stepExec.status !== \"completed\") {\n continue;\n }\n // Skip if no compensation function\n if (!stepDef.compensate) {\n process.stdout.write(`[SagaOrchestrator] No compensation for step: ${stepDef.stepId}`);\n continue;\n }\n try {\n await stepDef.compensate(stepExec.input, stepExec.output, instance.context);\n stepExec.status = \"compensated\";\n stepExec.compensatedAt = new Date();\n process.stdout.write(`[SagaOrchestrator] Compensated step: ${stepDef.stepId}`);\n }\n catch (_error) {\n // Continue compensating other steps even if one fails\n }\n }\n instance.status = \"compensated\";\n instance.failedAt = new Date();\n await this.persistence.update(instance.sagaId, {\n status: \"compensated\",\n failedAt: instance.failedAt,\n steps: instance.steps,\n });\n process.stdout.write(`[SagaOrchestrator] Compensation completed for saga: ${instance.sagaId}`);\n }\n // Helper methods\n generateSagaId() {\n return `saga_${randomBytes(16).toString(\"hex\")}`;\n }\n async executeWithTimeout(promise, timeoutMs) {\n return Promise.race([\n promise,\n new Promise((_resolve, reject) => setTimeout(() => reject(new Error(\"Step execution timeout\")), timeoutMs)),\n ]);\n }\n sleep(ms) {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n}\n","// ESM imports fixed for Node.js v22+\nimport { logger } from \"@vreko/infrastructure\";\nimport { and, desc, eq, gte, inArray, lte } from \"drizzle-orm\";\nimport { db } from \"../db/client.js\";\nimport { sagas } from \"../db/schema/vreko/sagas.js\";\n/**\n * Saga Persistence Implementation with Drizzle ORM\n *\n * Provides database-backed persistence for saga state tracking with:\n * - Atomic save/update operations\n * - Query filtering for monitoring\n * - JSON storage for flexible context and step data\n * - Graceful fallback to in-memory when DB unavailable\n */\nexport class SagaPersistenceImpl {\n // In-memory fallback storage\n inMemoryStore = new Map();\n /**\n * Save a new saga instance to database\n */\n async save(saga) {\n if (!db) {\n // Fallback to in-memory storage\n this.inMemoryStore.set(saga.sagaId, saga);\n process.stdout.write(`[SagaPersistence] Saved saga ${saga.sagaId} to in-memory store (DB unavailable)`);\n return;\n }\n try {\n await db.insert(sagas).values({\n sagaId: saga.sagaId,\n sagaType: saga.sagaType,\n status: saga.status,\n context: saga.context,\n steps: saga.steps.map((step) => ({\n stepId: step.stepId,\n stepName: step.stepName,\n status: step.status,\n input: step.input,\n output: step.output,\n error: step.error,\n startedAt: step.startedAt?.toISOString() || null,\n completedAt: step.completedAt?.toISOString() || null,\n compensatedAt: step.compensatedAt?.toISOString() || null,\n })),\n error: saga.error,\n retryCount: String(saga.retryCount),\n maxRetries: String(saga.maxRetries),\n startedAt: saga.startedAt,\n completedAt: saga.completedAt,\n failedAt: saga.failedAt,\n });\n process.stdout.write(`[SagaPersistence] Saved saga ${saga.sagaId} to database`);\n }\n catch (_error) {\n // Fallback to in-memory\n this.inMemoryStore.set(saga.sagaId, saga);\n }\n }\n /**\n * Load a saga instance from database\n */\n async load(sagaId) {\n if (!db) {\n // Fallback to in-memory storage\n const saga = this.inMemoryStore.get(sagaId);\n if (saga) {\n process.stdout.write(`[SagaPersistence] Loaded saga ${sagaId} from in-memory store (DB unavailable)`);\n }\n return saga || null;\n }\n try {\n const [row] = await db.select().from(sagas).where(eq(sagas.sagaId, sagaId)).limit(1);\n if (!row) {\n // Try in-memory fallback\n return this.inMemoryStore.get(sagaId) || null;\n }\n const instance = {\n sagaId: row.sagaId,\n sagaType: row.sagaType,\n status: row.status,\n context: row.context,\n steps: row.steps.map((step) => ({\n stepId: step.stepId,\n stepName: step.stepName,\n status: step.status,\n input: step.input,\n output: step.output,\n error: step.error,\n startedAt: step.startedAt ? new Date(step.startedAt) : null,\n completedAt: step.completedAt ? new Date(step.completedAt) : null,\n compensatedAt: step.compensatedAt ? new Date(step.compensatedAt) : null,\n })),\n startedAt: row.startedAt,\n completedAt: row.completedAt,\n failedAt: row.failedAt,\n error: row.error,\n retryCount: Number.parseInt(row.retryCount, 10),\n maxRetries: Number.parseInt(row.maxRetries, 10),\n };\n process.stdout.write(`[SagaPersistence] Loaded saga ${sagaId} from database`);\n return instance;\n }\n catch (_error) {\n // Try in-memory fallback\n return this.inMemoryStore.get(sagaId) || null;\n }\n }\n /**\n * Update saga instance fields\n */\n async update(sagaId, updates) {\n if (!db) {\n // Fallback to in-memory storage\n const existing = this.inMemoryStore.get(sagaId);\n if (existing) {\n this.inMemoryStore.set(sagaId, { ...existing, ...updates });\n process.stdout.write(`[SagaPersistence] Updated saga ${sagaId} in in-memory store (DB unavailable)`);\n }\n return;\n }\n try {\n // biome-ignore lint/suspicious/noExplicitAny: dynamic update object built from Partial<SagaInstance>\n const updateData = {};\n if (updates.status) {\n updateData.status = updates.status;\n }\n if (updates.error !== undefined) {\n updateData.error = updates.error;\n }\n if (updates.completedAt !== undefined) {\n updateData.completedAt = updates.completedAt;\n }\n if (updates.failedAt !== undefined) {\n updateData.failedAt = updates.failedAt;\n }\n if (updates.retryCount !== undefined) {\n updateData.retryCount = String(updates.retryCount);\n }\n if (updates.context) {\n updateData.context = updates.context;\n }\n if (updates.steps) {\n updateData.steps = updates.steps.map((step) => ({\n stepId: step.stepId,\n stepName: step.stepName,\n status: step.status,\n input: step.input,\n output: step.output,\n error: step.error,\n startedAt: step.startedAt?.toISOString() || null,\n completedAt: step.completedAt?.toISOString() || null,\n compensatedAt: step.compensatedAt?.toISOString() || null,\n }));\n }\n // Always update timestamp\n updateData.updatedAt = new Date();\n await db.update(sagas).set(updateData).where(eq(sagas.sagaId, sagaId));\n process.stdout.write(`[SagaPersistence] Updated saga ${sagaId} in database`);\n }\n catch (_error) {\n // Fallback to in-memory\n const existing = this.inMemoryStore.get(sagaId);\n if (existing) {\n this.inMemoryStore.set(sagaId, { ...existing, ...updates });\n }\n }\n }\n /**\n * List all sagas with optional filtering\n */\n async listAll(filter) {\n if (!db) {\n // Fallback to in-memory storage\n let results = Array.from(this.inMemoryStore.values());\n // Apply filters\n if (filter?.sagaType) {\n results = results.filter((s) => s.sagaType === filter.sagaType);\n }\n if (filter?.status) {\n results = results.filter((s) => filter.status?.includes(s.status));\n }\n if (filter?.startedAfter) {\n const startedAfter = filter.startedAfter;\n results = results.filter((s) => s.startedAt >= startedAfter);\n }\n if (filter?.startedBefore) {\n const startedBefore = filter.startedBefore;\n results = results.filter((s) => s.startedAt <= startedBefore);\n }\n if (filter?.limit) {\n results = results.slice(0, filter.limit);\n }\n process.stdout.write(`[SagaPersistence] Listed ${results.length} sagas from in-memory store (DB unavailable)`);\n return results;\n }\n try {\n // Build query conditions\n const conditions = [];\n if (filter?.sagaType) {\n conditions.push(eq(sagas.sagaType, filter.sagaType));\n }\n if (filter?.status && filter.status.length > 0) {\n conditions.push(inArray(sagas.status, filter.status));\n }\n if (filter?.startedAfter) {\n conditions.push(gte(sagas.startedAt, filter.startedAfter));\n }\n if (filter?.startedBefore) {\n conditions.push(lte(sagas.startedAt, filter.startedBefore));\n }\n // Build query\n let query = db.select().from(sagas);\n if (conditions.length > 0) {\n query = query.where(and(...conditions));\n }\n // Order by most recent first\n query = query.orderBy(desc(sagas.startedAt));\n // Apply limit\n if (filter?.limit) {\n query = query.limit(filter.limit);\n }\n const rows = await query;\n const instances = rows.map((row) => ({\n sagaId: row.sagaId,\n sagaType: row.sagaType,\n status: row.status,\n context: row.context,\n steps: row.steps.map((step) => ({\n stepId: step.stepId,\n stepName: step.stepName,\n status: step.status,\n input: step.input,\n output: step.output,\n error: step.error,\n startedAt: step.startedAt ? new Date(step.startedAt) : null,\n completedAt: step.completedAt ? new Date(step.completedAt) : null,\n compensatedAt: step.compensatedAt ? new Date(step.compensatedAt) : null,\n })),\n startedAt: row.startedAt,\n completedAt: row.completedAt,\n failedAt: row.failedAt,\n error: row.error,\n retryCount: Number.parseInt(row.retryCount, 10),\n maxRetries: Number.parseInt(row.maxRetries, 10),\n }));\n process.stdout.write(`[SagaPersistence] Listed ${instances.length} sagas from database`);\n return instances;\n }\n catch (_error) {\n // Fallback to in-memory\n return Array.from(this.inMemoryStore.values());\n }\n }\n /**\n * Delete a saga instance from storage\n */\n async delete(sagaId) {\n if (!db) {\n // Fallback to in-memory storage\n this.inMemoryStore.delete(sagaId);\n logger.debug(`[SagaPersistence] Deleted saga ${sagaId} from in-memory store (DB unavailable)`);\n return;\n }\n try {\n await db.delete(sagas).where(eq(sagas.sagaId, sagaId));\n this.inMemoryStore.delete(sagaId); // Also remove from cache\n logger.debug(`[SagaPersistence] Deleted saga ${sagaId} from database`);\n }\n catch (_error) {\n // Still remove from in-memory\n this.inMemoryStore.delete(sagaId);\n }\n }\n}\n/**\n * Singleton instance for dependency injection\n */\nexport const sagaPersistence = new SagaPersistenceImpl();\n","// ESM imports fixed for Node.js v22+\nimport { TIER_UPGRADE_SAGA } from \"@vreko/contracts\";\nimport { eq } from \"drizzle-orm\";\nimport { nanoid } from \"nanoid\";\nimport { db } from \"../../db/client.js\";\nimport { subscriptions, user } from \"../../db/schema/postgres.js\";\nimport { entitlementsService } from \"../entitlements-service.js\";\n/**\n * Tier Upgrade Saga Implementation with actual service integrations\n *\n * Wires the tier upgrade saga with:\n * - Payment provider integration (Stripe/Paddle)\n * - Database operations for user tier updates\n * - Entitlements service for feature grants\n * - Email queue service for notifications\n */\n/** Valid tier values */\nconst VALID_TIERS = [\"free\", \"pro\", \"team\", \"enterprise\"];\n/**\n * Type guard to validate tier values\n * @param value - Value to check\n * @returns True if value is a valid tier\n */\nfunction isValidTier(value) {\n return typeof value === \"string\" && VALID_TIERS.includes(value);\n}\n/**\n * Validate and cast tier with error context\n * @param value - Tier value to validate\n * @param context - Error context for debugging\n * @throws Error if tier is invalid\n */\nfunction _assertValidTier(value, context) {\n if (!isValidTier(value)) {\n throw new Error(`Invalid tier \"${value}\" in ${context}. Valid tiers: ${VALID_TIERS.join(\", \")}`);\n }\n}\n/**\n * Step 1: Update subscription in payment provider\n */\nasync function updateSubscriptionStep(input, context) {\n // Map tier to Stripe price ID\n const priceIdMap = {\n pro: process.env.STRIPE_PRO_MONTHLY_PRICE_ID,\n team: process.env.STRIPE_TEAM_MONTHLY_PRICE_ID,\n enterprise: process.env.STRIPE_ENTERPRISE_MONTHLY_PRICE_ID,\n };\n const newPriceId = priceIdMap[input.toTier];\n if (!newPriceId) {\n throw new Error(`No price ID configured for tier: ${input.toTier}`);\n }\n if (!input.subscriptionId) {\n throw new Error(\"Subscription ID is required for tier upgrade\");\n }\n // Get Stripe client from context (injected by saga executor)\n const stripeClient = context.stripeClient;\n if (!stripeClient) {\n throw new Error(\"Stripe client not available in context\");\n }\n // Retrieve current subscription to get current price ID\n const currentSubscription = await stripeClient.subscriptions.retrieve(input.subscriptionId);\n const currentPriceId = currentSubscription.items.data[0]?.price?.id;\n // Store previous price ID for compensation\n context.previousPriceId = currentPriceId;\n // Update subscription with new price\n const _updatedSubscription = await stripeClient.subscriptions.update(input.subscriptionId, {\n items: [\n {\n id: currentSubscription.items.data[0].id,\n price: newPriceId,\n },\n ],\n proration_behavior: \"create_prorations\", // Create prorations for immediate upgrade\n });\n const effectiveDate = new Date();\n const prorationAmount = null; // Stripe calculates this automatically\n process.stdout.write(`[TierUpgradeSaga] Updated subscription ${input.subscriptionId} to ${input.toTier} tier (price: ${newPriceId})`);\n return {\n subscriptionId: input.subscriptionId,\n priceId: newPriceId,\n effectiveDate,\n prorationAmount,\n };\n}\n/**\n * Compensation: Revert subscription change\n */\nasync function compensateUpdateSubscription(_input, output, context) {\n if (!output?.subscriptionId || !context.previousPriceId) {\n return;\n }\n try {\n const stripeClient = context.stripeClient;\n if (!stripeClient) {\n return;\n }\n const currentSubscription = await stripeClient.subscriptions.retrieve(output.subscriptionId);\n // Revert to previous price without additional prorations\n await stripeClient.subscriptions.update(output.subscriptionId, {\n items: [\n {\n id: currentSubscription.items.data[0].id,\n price: context.previousPriceId,\n },\n ],\n proration_behavior: \"none\", // No additional prorations on revert\n });\n process.stdout.write(`[TierUpgradeSaga] Compensated: Reverted subscription ${output.subscriptionId} to price ${context.previousPriceId}`);\n }\n catch {\n /* intentionally empty */\n }\n}\n/**\n * Step 2: Update user tier in database\n */\nasync function updateUserTierStep(input, context) {\n if (!db) {\n throw new Error(\"Database not available\");\n }\n // Get current tier from entitlements for tracking\n const currentEntitlements = await entitlementsService.getEntitlements(input.userId);\n const previousTier = currentEntitlements.tier;\n // Store previous tier for compensation\n context.previousTier = previousTier;\n // Update user.subscriptionTier\n await db.update(user).set({ subscriptionTier: input.toTier }).where(eq(user.id, input.userId));\n // Update subscriptions.plan (find subscription by userId)\n await db.update(subscriptions).set({ plan: input.toTier }).where(eq(subscriptions.userId, input.userId));\n process.stdout.write(`[TierUpgradeSaga] Updated user ${input.userId} tier from ${previousTier} to ${input.toTier}`);\n return {\n previousTier,\n updatedAt: new Date(),\n };\n}\n/**\n * Compensation: Revert user tier\n */\nasync function compensateUpdateUserTier(input, output, context) {\n if (!output?.previousTier || !db) {\n return;\n }\n try {\n const previousTier = context.previousTier;\n // Revert user.subscriptionTier\n await db\n .update(user)\n .set({ subscriptionTier: previousTier })\n .where(eq(user.id, input.userId));\n // Revert subscriptions.plan\n await db\n .update(subscriptions)\n .set({ plan: previousTier })\n .where(eq(subscriptions.userId, input.userId));\n process.stdout.write(`[TierUpgradeSaga] Compensated: Reverted user ${input.userId} tier to ${previousTier}`);\n }\n catch {\n /* intentionally empty */\n }\n}\n/**\n * Step 3: Update entitlements with new tier features\n */\nasync function updateUpgradeEntitlementsStep(input, _context) {\n // Get current entitlements for versioning\n const currentEntitlements = await entitlementsService.getEntitlements(input.userId);\n const previousVersion = 1; // Simple versioning\n // Invalidate cache to force refresh\n await entitlementsService.invalidateCache(input.userId);\n // Get fresh entitlements with new tier\n const newEntitlements = await entitlementsService.getEntitlements(input.userId);\n // Calculate added features\n const addedFeatures = newEntitlements.features.filter((f) => !currentEntitlements.features.includes(f));\n process.stdout.write(`[TierUpgradeSaga] Updated entitlements for user ${input.userId}: +${addedFeatures.length} features`);\n return {\n entitlements: newEntitlements,\n previousVersion,\n addedFeatures,\n };\n}\n/**\n * Compensation: Revert entitlements\n */\nasync function compensateUpdateUpgradeEntitlements(input, _output, _context) {\n try {\n // Invalidate cache to force re-calculation\n await entitlementsService.invalidateCache(input.userId);\n process.stdout.write(`[TierUpgradeSaga] Compensated: Invalidated entitlements for user ${input.userId}`);\n }\n catch {\n /* intentionally empty */\n }\n}\n/**\n * Step 4: Send upgrade confirmation email\n */\nasync function sendUpgradeConfirmationStep(input, context) {\n const emailService = context.emailService;\n // Graceful degradation if email service unavailable\n if (!emailService) {\n const skippedJobId = `skipped_${nanoid()}`;\n return {\n emailJobId: skippedJobId,\n scheduledAt: new Date(),\n };\n }\n // Build email job data\n const emailJobData = {\n id: nanoid(),\n userId: input.userId,\n recipientEmail: input.userEmail,\n template: \"tier_upgraded\",\n templateVersion: 1,\n variant: null,\n templateData: {\n fromTier: input.fromTier,\n toTier: input.toTier,\n newFeatures: input.newFeatures,\n effectiveDate: input.effectiveDate.toISOString(),\n },\n sendAt: new Date(),\n priority: \"medium\",\n };\n // Queue email\n const emailJobId = await emailService.queueEmail(emailJobData);\n const scheduledAt = new Date();\n process.stdout.write(`[TierUpgradeSaga] Scheduled upgrade confirmation email ${emailJobId} for user ${input.userId}`);\n return {\n emailJobId,\n scheduledAt,\n };\n}\n/**\n * Compensation: Cancel confirmation email\n */\nasync function compensateSendUpgradeConfirmation(_input, output, context) {\n if (!output?.emailJobId) {\n return;\n }\n // Skip if email was skipped due to unavailable service\n if (output.emailJobId.startsWith(\"skipped_\")) {\n process.stdout.write(\"[TierUpgradeSaga] Compensated: Email was skipped, no cancellation needed\");\n return;\n }\n const emailService = context.emailService;\n if (!emailService) {\n return;\n }\n try {\n await emailService.cancelJob(output.emailJobId);\n process.stdout.write(`[TierUpgradeSaga] Compensated: Cancelled email job ${output.emailJobId}`);\n }\n catch {\n /* intentionally empty */\n }\n}\n/**\n * Step 5: Emit tier upgraded event\n */\nasync function emitTierUpgradedStep(input, context) {\n const eventBus = context.eventBus;\n const eventId = `event_${nanoid()}`;\n const timestamp = new Date();\n // Get sagaId from context (injected by orchestrator)\n const sagaId = context.sagaId ?? `saga_${nanoid()}`;\n // Emit event if EventBus is available\n if (eventBus) {\n eventBus.emit(\"tier:upgraded\", {\n userId: input.userId,\n fromTier: input.fromTier,\n toTier: input.toTier,\n subscriptionId: input.subscriptionId,\n effectiveDate: input.effectiveDate,\n sagaId,\n });\n process.stdout.write(`[TierUpgradeSaga] Emitted tier_upgraded event ${eventId}: ${input.fromTier} → ${input.toTier}`);\n }\n else {\n // intentionally empty\n }\n return {\n eventId,\n timestamp,\n };\n}\n/**\n * Get wired tier upgrade saga definition\n */\nexport function getTierUpgradeSaga() {\n return {\n ...TIER_UPGRADE_SAGA,\n steps: [\n {\n stepId: \"update_subscription\",\n stepName: \"Update Subscription in Payment Provider\",\n execute: updateSubscriptionStep,\n compensate: compensateUpdateSubscription,\n retryable: true,\n timeout: 30000,\n },\n {\n stepId: \"update_user_tier\",\n stepName: \"Update User Tier in Database\",\n execute: updateUserTierStep,\n compensate: compensateUpdateUserTier,\n retryable: true,\n timeout: 5000,\n },\n {\n stepId: \"update_entitlements\",\n stepName: \"Update Entitlements with New Tier Features\",\n execute: updateUpgradeEntitlementsStep,\n compensate: compensateUpdateUpgradeEntitlements,\n retryable: true,\n timeout: 5000,\n },\n {\n stepId: \"send_confirmation\",\n stepName: \"Send Upgrade Confirmation Email\",\n execute: sendUpgradeConfirmationStep,\n compensate: compensateSendUpgradeConfirmation,\n retryable: true,\n timeout: 10000,\n },\n {\n stepId: \"emit_event\",\n stepName: \"Emit Tier Upgraded Event\",\n execute: emitTierUpgradedStep,\n // No compensation needed for events (idempotent)\n retryable: false,\n timeout: 3000,\n },\n ],\n };\n}\n/**\n * Create tier upgrade saga with injected dependencies\n * Wraps both execute and compensate functions with enhanced context\n */\nexport function createTierUpgradeSagaWithDeps(deps) {\n const sagaDef = getTierUpgradeSaga();\n // Create context enhancer to inject dependencies into BOTH execute and compensate\n const originalSteps = sagaDef.steps;\n return {\n ...sagaDef,\n steps: originalSteps.map((step) => {\n const enhanceContext = (context) => ({\n ...context,\n emailService: deps.emailService,\n eventBus: deps.eventBus,\n });\n return {\n ...step,\n execute: async (input, context) => {\n return step.execute(input, enhanceContext(context));\n },\n // Also wrap compensate to ensure dependencies are available during rollback\n compensate: step.compensate\n ? async (input, output, context) => {\n return step.compensate?.(input, output, enhanceContext(context));\n }\n : undefined,\n };\n }),\n };\n}\n"]}