@bonginkan/maria 4.4.6 → 4.4.7

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/services/intelligent-model-selector/SecretManagerIntegration.ts","../src/services/media-orchestrator/image-post.ts","../src/services/routing/model-routing.ts","../src/middleware/rate-limit.ts","../src/services/media-orchestrator/types.ts","../src/services/media-orchestrator/Storage.ts","../src/providers/google/gemini-media.ts","../src/services/subscription/subscription-store.ts","../src/services/subscription/stripe-webhook-service.ts","../src/server/express-server.ts"],"names":["SecretManagerServiceClient","path","getAuth","crypto","fs","fsp","modelName","createHmac","timingSafeEqual","express","helmet","cors","compression","compressionFilter","SecretManagerIntegration","providerFromModel","startedMs","videoBytes","outExt","traceId","promptHash","manifest","baseDir","saved","idemKey","hasFtyp","isWebm","duration","header","headerStr","deadline","res","sanitizeKey","determineRouting"],"mappings":"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","file":"server-express.cjs","sourcesContent":["/**\n * Secret Manager Integration for IMS\n * Securely retrieves API keys from Google Secret Manager\n */\n\nimport { SecretManagerServiceClient } from '@google-cloud/secret-manager';\n\nexport interface SecretConfig {\n projectId: string;\n secrets: {\n googleAI?: string;\n openAI?: string;\n anthropic?: string;\n groq?: string;\n // Optional configuration (non-key) items\n defaultModel?: string;\n defaultProvider?: string;\n lmstudioApiBase?: string;\n ollamaApiUrl?: string;\n vllmApiUrl?: string;\n };\n}\n\nexport class SecretManagerIntegration {\n private client: SecretManagerServiceClient | null = null;\n private cache: Map<string, string> = new Map();\n private cacheExpiry: Map<string, number> = new Map();\n private readonly CACHE_TTL = 3600000; // 1 hour\n private readonly useGsm: boolean;\n private readonly MAX_RETRIES = 3;\n private readonly BASE_DELAY_MS = 200;\n \n constructor(private config: SecretConfig) {\n this.useGsm = this.shouldUseGsm();\n }\n\n /** Determine whether GSM should be used in this environment */\n private shouldUseGsm(): boolean {\n if (process.env.MARIA_DISABLE_GSM === 'true') return false;\n if (process.env.GOOGLE_APPLICATION_CREDENTIALS) return true;\n if (process.env.GOOGLE_CLOUD_PROJECT || process.env.GCLOUD_PROJECT) return true;\n if (process.env.CLOUD_RUN_SERVICE || process.env.K_SERVICE) return true;\n if (process.env.GCE_METADATA_HOST) return true;\n return false; // default: end-user machines don't require GSM\n }\n\n /** Lazily create Secret Manager client only when permitted */\n private ensureClient(): SecretManagerServiceClient | null {\n if (!this.useGsm) return null;\n if (this.client) return this.client;\n try {\n this.client = new SecretManagerServiceClient();\n } catch {\n this.client = null;\n }\n return this.client;\n }\n \n /**\n * Get API key from Secret Manager with caching\n */\n async getApiKey(provider: 'google' | 'openai' | 'anthropic' | 'groq'): Promise<string | undefined> {\n const secretName = this.getSecretName(provider);\n if (!secretName) {\n return undefined;\n }\n \n // Short-circuit when GSM is disabled/unavailable\n const client = this.ensureClient();\n if (!client) {\n return this.getFallbackFromEnv(provider);\n }\n\n // Valid cache first\n const valid = this.getCachedSecret(secretName);\n if (valid) return valid;\n\n // Try fetch with backoff\n const res = await this.accessWithBackoff(secretName).catch(() => undefined);\n if (res) {\n this.cacheSecret(secretName, res);\n return res;\n }\n\n // Stale-while-revalidate: if we ever cached a value, return it\n const stale = this.cache.get(secretName);\n if (stale) return stale;\n\n // Fallback to env var\n return this.getFallbackFromEnv(provider);\n }\n \n /**\n * Get all API keys\n */\n async getAllApiKeys(): Promise<{\n googleApiKey?: string;\n openaiApiKey?: string;\n anthropicApiKey?: string;\n groqApiKey?: string;\n }> {\n const [googleApiKey, openaiApiKey, anthropicApiKey, groqApiKey] = await Promise.all([\n this.getApiKey('google'),\n this.getApiKey('openai'),\n this.getApiKey('anthropic'),\n this.getApiKey('groq')\n ]);\n \n return {\n googleApiKey,\n openaiApiKey,\n anthropicApiKey,\n groqApiKey\n };\n }\n\n /** Fetch optional configuration values (not API keys) */\n async getOptionalConfig(): Promise<{\n defaultModel?: string;\n defaultProvider?: string;\n lmstudioApiBase?: string;\n ollamaApiUrl?: string;\n vllmApiUrl?: string;\n }> {\n const client = this.ensureClient();\n const read = async (name?: string): Promise<string | undefined> => {\n if (!name) return undefined;\n if (!client) return undefined;\n try {\n const resName = `projects/${this.config.projectId}/secrets/${name}/versions/latest`;\n const [version] = await client.accessSecretVersion({ name: resName });\n const payload = version.payload?.data;\n return payload?.toString();\n } catch {\n return undefined;\n }\n };\n\n const [defaultModel, defaultProvider, lmstudioApiBase, ollamaApiUrl, vllmApiUrl] = await Promise.all([\n read(this.config.secrets.defaultModel || 'default-model'),\n read(this.config.secrets.defaultProvider || 'default-provider'),\n read(this.config.secrets.lmstudioApiBase || 'lmstudio-api-base'),\n read(this.config.secrets.ollamaApiUrl || 'ollama-api-url'),\n read(this.config.secrets.vllmApiUrl || 'vllm-api-url'),\n ]);\n\n return { defaultModel, defaultProvider, lmstudioApiBase, ollamaApiUrl, vllmApiUrl };\n }\n \n /**\n * Verify that required secrets exist\n */\n async verifySecrets(): Promise<{\n available: string[];\n missing: string[];\n }> {\n // If GSM is disabled/unavailable, don't block CLI: report nothing\n const client = this.ensureClient();\n if (!client) {\n return { available: [], missing: [] };\n }\n\n const available: string[] = [];\n const missing: string[] = [];\n \n const providers: Array<'google' | 'openai' | 'anthropic' | 'groq'> = \n ['google', 'openai', 'anthropic', 'groq'];\n \n for (const provider of providers) {\n const secretName = this.getSecretName(provider);\n if (!secretName) continue;\n \n try {\n const name = `projects/${this.config.projectId}/secrets/${secretName}`;\n await client.getSecret({ name });\n available.push(provider);\n } catch (error) {\n missing.push(provider);\n }\n }\n \n return { available, missing };\n }\n \n /**\n * Create or update a secret\n */\n async createOrUpdateSecret(\n provider: 'google' | 'openai' | 'anthropic' | 'groq',\n apiKey: string\n ): Promise<boolean> {\n const secretName = this.getSecretName(provider);\n if (!secretName) {\n return false;\n }\n \n const client = this.ensureClient();\n if (!client) {\n // No GSM available locally\n return false;\n }\n\n const secretId = `projects/${this.config.projectId}/secrets/${secretName}`;\n \n try {\n // Check if secret exists\n let secretExists = false;\n try {\n await client.getSecret({ name: secretId });\n secretExists = true;\n } catch {\n secretExists = false;\n }\n \n if (!secretExists) {\n // Create the secret\n await client.createSecret({\n parent: `projects/${this.config.projectId}`,\n secretId: secretName,\n secret: {\n replication: {\n automatic: {}\n },\n labels: {\n service: 'ims',\n provider: provider\n }\n }\n });\n }\n \n // Add the secret version\n await client.addSecretVersion({\n parent: secretId,\n payload: {\n data: Buffer.from(apiKey, 'utf8')\n }\n });\n \n // Clear cache for this secret\n this.cache.delete(secretName);\n this.cacheExpiry.delete(secretName);\n \n return true;\n } catch (error) {\n // Silently handle create/update errors\n // console.error(`Failed to create/update secret ${secretName}:`, error);\n return false;\n }\n }\n \n /**\n * Get secret name for provider\n */\n private getSecretName(provider: 'google' | 'openai' | 'anthropic' | 'groq'): string | undefined {\n switch (provider) {\n case 'google':\n return this.config.secrets.googleAI || 'google-ai-api-key';\n case 'openai':\n return this.config.secrets.openAI || 'openai-api-key';\n case 'anthropic':\n return this.config.secrets.anthropic || 'anthropic-api-key';\n case 'groq':\n return this.config.secrets.groq || 'groq-api-key';\n default:\n return undefined;\n }\n }\n \n /**\n * Get cached secret if valid\n */\n private getCachedSecret(secretName: string): string | undefined {\n const expiry = this.cacheExpiry.get(secretName);\n if (!expiry || Date.now() > expiry) {\n // Cache expired\n this.cache.delete(secretName);\n this.cacheExpiry.delete(secretName);\n return undefined;\n }\n \n return this.cache.get(secretName);\n }\n\n /** Access a secret with retry + exponential backoff */\n private async accessWithBackoff(secretName: string): Promise<string | undefined> {\n const client = this.ensureClient();\n if (!client) return undefined;\n const name = `projects/${this.config.projectId}/secrets/${secretName}/versions/latest`;\n for (let attempt = 0; attempt < this.MAX_RETRIES; attempt++) {\n try {\n const [version] = await client.accessSecretVersion({ name });\n const payload = version.payload?.data;\n if (!payload) return undefined;\n return payload.toString();\n } catch (e) {\n if (attempt === this.MAX_RETRIES - 1) break;\n const delay = this.BASE_DELAY_MS * Math.pow(2, attempt);\n await new Promise((r) => setTimeout(r, delay));\n }\n }\n return undefined;\n }\n \n /**\n * Cache a secret\n */\n private cacheSecret(secretName: string, value: string): void {\n this.cache.set(secretName, value);\n this.cacheExpiry.set(secretName, Date.now() + this.CACHE_TTL);\n }\n \n /**\n * Get fallback from environment variable\n */\n private getFallbackFromEnv(provider: 'google' | 'openai' | 'anthropic' | 'groq'): string | undefined {\n switch (provider) {\n case 'google':\n return process.env.GOOGLE_AI_API_KEY;\n case 'openai':\n return process.env.OPENAI_API_KEY;\n case 'anthropic':\n return process.env.ANTHROPIC_API_KEY;\n case 'groq':\n return process.env.GROQ_API_KEY;\n default:\n return undefined;\n }\n }\n \n /**\n * Clear cache\n */\n clearCache(): void {\n this.cache.clear();\n this.cacheExpiry.clear();\n }\n}\n","// Optional sharp-based post-processing (sRGB/EXIF/format)\n// Dynamic import guarded by MARIA_SHARP to avoid hard dependency\n\nexport async function processImageOptional(\n bytes: Buffer,\n format: 'png'|'webp'|'jpg',\n keepExif?: boolean,\n targetSize?: { width: number; height: number },\n): Promise<Buffer> {\n try {\n // dynamic import (no env gate): try sharp, fall back silently if unavailable\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const sharp = (await import('sharp')).default;\n let img = sharp(bytes).toColourspace('srgb');\n if (targetSize && Number.isFinite(targetSize.width) && Number.isFinite(targetSize.height)) {\n const width = Math.max(1, Math.floor(targetSize.width));\n const height = Math.max(1, Math.floor(targetSize.height));\n img = img.resize(width, height, { fit: 'cover' });\n }\n if (keepExif) img = img.withMetadata();\n const qEnv = Number(process.env.MARIA_SHARP_QUALITY || '80');\n const quality = Number.isFinite(qEnv) ? Math.max(1, Math.min(100, Math.floor(qEnv))) : 80;\n const alphaMode = String(process.env.MARIA_SHARP_ALPHA || '').toLowerCase();\n if (format === 'jpg' && alphaMode !== 'preserve') {\n img = img.flatten({ background: { r: 255, g: 255, b: 255 } });\n }\n switch (format) {\n case 'png': return await img.png().toBuffer();\n case 'webp': return await img.webp({ quality }).toBuffer();\n case 'jpg': return await img.jpeg({ mozjpeg: true, quality }).toBuffer();\n }\n return bytes;\n } catch {\n return bytes;\n }\n}\n","export type Provider = 'google' | 'openai';\n\nexport interface RoutingInput {\n requestedModel?: string;\n requestedProvider?: Provider | string;\n taskType?: string;\n isProOrAbove?: boolean;\n hasGeminiKey: boolean;\n hasOpenAIKey: boolean;\n}\n\nexport interface RoutingDecision {\n provider?: Provider;\n model?: string;\n error?: 'missing_key' | 'unknown_model' | 'no_provider_available';\n message?: string;\n}\n\nexport function providerFromModel(model?: string): Provider | undefined {\n const m = (model || '').toLowerCase();\n if (!m) return undefined;\n if (m.startsWith('gemini') || m.startsWith('veo')) return 'google';\n if (m.startsWith('gpt') || m.startsWith('sora')) return 'openai';\n return undefined;\n}\n\nexport function determineRouting(input: RoutingInput): RoutingDecision {\n const requestedProvider = normalizeProvider(input.requestedProvider);\n const requestedModel = input.requestedModel?.trim();\n const isPro = !!input.isProOrAbove;\n\n // 1) Explicit model wins; infer provider from model family\n if (requestedModel && requestedModel.length > 0) {\n const p = providerFromModel(requestedModel);\n if (!p) return { error: 'unknown_model', message: `Unknown model family for '${requestedModel}'` };\n if (p === 'google' && !input.hasGeminiKey) return { error: 'missing_key', message: `Requested model '${requestedModel}' requires Google API key` };\n if (p === 'openai' && !input.hasOpenAIKey) return { error: 'missing_key', message: `Requested model '${requestedModel}' requires OpenAI API key` };\n return { provider: p, model: requestedModel };\n }\n\n // 2) Explicit provider next; choose sensible default model for that provider\n if (requestedProvider) {\n if (requestedProvider === 'google') {\n if (!input.hasGeminiKey) return { error: 'missing_key', message: 'Google API key is not configured' };\n return { provider: 'google', model: 'gemini-2.5-flash' };\n }\n if (requestedProvider === 'openai') {\n if (!input.hasOpenAIKey) return { error: 'missing_key', message: 'OpenAI API key is not configured' };\n return { provider: 'openai', model: isPro ? 'gpt-5' : 'gpt-5-mini' };\n }\n }\n\n // 3) Task-type special cases\n if ((input.taskType || '').toLowerCase() === 'research') {\n // Research requires Google grounding; do not auto-switch\n if (!input.hasGeminiKey) return { error: 'missing_key', message: 'Google API key is required for research task' };\n return { provider: 'google', model: 'gemini-2.5-flash' };\n }\n\n // 4) Plan-based defaults\n if (isPro && input.hasOpenAIKey) {\n return { provider: 'openai', model: 'gpt-5' };\n }\n if (input.hasGeminiKey) {\n return { provider: 'google', model: 'gemini-2.5-flash' };\n }\n if (input.hasOpenAIKey) {\n return { provider: 'openai', model: 'gpt-5-mini' };\n }\n\n return { error: 'no_provider_available', message: 'No valid provider API key configured' };\n}\n\nfunction normalizeProvider(p?: string): Provider | undefined {\n const s = (p || '').toLowerCase().trim();\n if (s === 'google' || s === 'openai') return s;\n return undefined;\n}\n\n\n","/**\n * Production-ready Rate Limit Middleware\n * Fixes: First-call false positive, Infinity/Invalid Date errors\n */\n\nimport type { Request, Response, NextFunction } from 'express';\nimport { getAuth } from 'firebase-admin/auth';\n\n// In-memory store (TODO: Replace with Redis for multi-instance)\nconst rateLimitStore = new Map<string, { lastAt: number }>();\n\n// Rate limit configurations per endpoint and plan\ninterface RateLimitConfig {\n windowMs: number;\n requests: number;\n}\n\nconst RATE_LIMITS: Record<string, RateLimitConfig> = {\n '/image:FREE': { windowMs: 3000, requests: 1 }, // 1 req per 3s\n '/video:FREE': { windowMs: 15000, requests: 1 }, // 1 req per 15s\n '/code:FREE': { windowMs: 1000, requests: 1 }, // 1 req per 1s\n '/chat:FREE': { windowMs: 500, requests: 1 }, // 2 req per sec\n \n '/image:STARTER': { windowMs: 1000, requests: 1 }, // 1 req per 1s\n '/video:STARTER': { windowMs: 5000, requests: 1 }, // 1 req per 5s\n '/code:STARTER': { windowMs: 500, requests: 1 }, // 2 req per sec\n \n '/image:PRO': { windowMs: 100, requests: 1 }, // 10 req per sec\n '/video:PRO': { windowMs: 1000, requests: 1 }, // 1 req per sec\n '/code:PRO': { windowMs: 100, requests: 1 }, // 10 req per sec\n \n 'default': { windowMs: 1000, requests: 1 } // Fallback\n};\n\n/**\n * Get rate limit config for specific endpoint and plan\n */\nfunction getRateLimitConfig(endpoint: string, plan: string): RateLimitConfig {\n const key = `${endpoint}:${plan.toUpperCase()}`;\n return RATE_LIMITS[key] || RATE_LIMITS.default;\n}\n\n/**\n * Extract endpoint category from request path\n */\nfunction getEndpointCategory(path: string): string {\n if (path.includes('/image')) return '/image';\n if (path.includes('/video')) return '/video';\n if (path.includes('/code')) return '/code';\n if (path.includes('/chat')) return '/chat';\n return 'default';\n}\n\n/**\n * Main rate limit middleware\n */\nexport async function rateLimitMiddleware(\n req: Request,\n res: Response,\n next: NextFunction\n): Promise<void> {\n try {\n // 1. Identify user (from JWT or API key)\n const authHeader = req.headers.authorization;\n const bearer = authHeader?.split(' ')[1];\n \n let userId = 'anonymous';\n let userPlan = 'FREE';\n \n if (bearer) {\n try {\n const decodedToken = await getAuth().verifyIdToken(bearer);\n userId = decodedToken.uid;\n // Resolve plan from Firestore (fallback to FREE)\n userPlan = await getFirestorePlan(userId);\n } catch {\n // Invalid token, treat as anonymous\n }\n } else if (req.headers['x-api-key']) {\n userId = `apikey:${req.headers['x-api-key']}`;\n // TODO: Resolve plan from API key\n }\n \n // 2. Determine endpoint category\n const endpoint = getEndpointCategory(req.path);\n \n // 3. Get rate limit config\n const config = getRateLimitConfig(endpoint, userPlan);\n \n // 4. Build unique key for this user-endpoint combination\n const rateLimitKey = `${userId}:${endpoint}`;\n \n // 5. Check rate limit\n const now = Date.now();\n const userRecord = rateLimitStore.get(rateLimitKey);\n \n // First request - always allow\n if (!userRecord || typeof userRecord.lastAt !== 'number') {\n rateLimitStore.set(rateLimitKey, { lastAt: now });\n next();\n return;\n }\n \n // Calculate time elapsed since last request\n const elapsedMs = now - userRecord.lastAt;\n const remainingMs = Math.max(0, config.windowMs - elapsedMs);\n \n // If window hasn't passed, reject\n if (remainingMs > 0) {\n // Ensure clean, bounded values for response\n const retryAfterSeconds = Math.max(1, Math.ceil(remainingMs / 1000));\n const resetAt = new Date(now + remainingMs);\n\n // Standard rate-limit headers for client backoff\n try {\n res.setHeader('Retry-After', String(retryAfterSeconds));\n res.setHeader('X-RateLimit-Reset', String(resetAt.getTime()));\n res.setHeader('RateLimit-Reset', String(resetAt.getTime()));\n } catch {}\n\n res.status(429).json({\n error: 'rate_limit_exceeded',\n message: `Rate limit exceeded for ${endpoint} endpoint`,\n details: {\n endpoint,\n plan: userPlan,\n limit: `${config.requests} request per ${config.windowMs / 1000} seconds`,\n retryAfterSeconds,\n resetAt: resetAt.toISOString()\n },\n hint: userPlan === 'FREE' \n ? `Free plan limit: ${config.requests} request per ${config.windowMs / 1000}s. Upgrade at https://maria-code.ai/manage`\n : `Please wait ${retryAfterSeconds} seconds before retrying.`\n });\n return;\n }\n \n // Window has passed - allow and update timestamp\n rateLimitStore.set(rateLimitKey, { lastAt: now });\n next();\n return;\n \n } catch (error) {\n // Fail open - don't block users on rate limiter errors\n console.error('[RateLimit] Error in middleware:', error);\n next();\n return;\n }\n}\n\n/**\n * Clear rate limit for specific user (e.g., after upgrade)\n */\nexport function clearUserRateLimit(userId: string): void {\n const keysToDelete: string[] = [];\n \n rateLimitStore.forEach((_, key) => {\n if (key.startsWith(`${userId}:`)) {\n keysToDelete.push(key);\n }\n });\n \n keysToDelete.forEach(key => rateLimitStore.delete(key));\n}\n\n/**\n * Periodic cleanup of old entries (prevent memory leak)\n */\nexport function startRateLimitCleanup(): void {\n setInterval(() => {\n const now = Date.now();\n const maxAge = 60 * 60 * 1000; // 1 hour\n \n rateLimitStore.forEach((value, key) => {\n if (now - value.lastAt > maxAge) {\n rateLimitStore.delete(key);\n }\n });\n }, 10 * 60 * 1000); // Run every 10 minutes\n}\nasync function getFirestorePlan(uid: string): Promise<string> {\n try {\n const admin = await import('firebase-admin');\n if (!(admin as any).apps?.length) { try { (admin as any).initializeApp(); } catch {} }\n const { getFirestore } = await import('firebase-admin/firestore');\n const db = getFirestore();\n const doc = await db.doc(`projects/default/users/${uid}`).get();\n const plan = (doc.exists && (doc.data() as any)?.plan) || 'FREE';\n return String(plan).toUpperCase();\n } catch {\n return 'FREE';\n }\n}\n","// Media orchestrator types and helpers (named exports only)\n\nimport * as crypto from 'node:crypto';\n\nexport type MediaKind = 'image' | 'video';\n\nexport type PixelSize = [number, number];\nexport type Seconds = number;\n\nexport type ImageFormat = 'png' | 'webp' | 'jpg';\nexport type VideoFormat = 'mp4' | 'webm';\n\nexport interface BaseParams {\n prompt: string;\n model: string;\n seed?: number;\n trace?: string;\n}\n\nexport interface ImageParams extends BaseParams {\n size: PixelSize;\n format: ImageFormat;\n count: number;\n}\n\nexport interface VideoParams extends BaseParams {\n duration: Seconds;\n fps: number;\n size: PixelSize;\n format: VideoFormat;\n}\n\nexport type NormalizedParams = ImageParams | VideoParams;\n\nexport interface ProviderCaps {\n provider: 'google';\n model: string;\n kind: MediaKind;\n // Image caps\n maxImageSize?: PixelSize;\n supportedImageFormats?: ImageFormat[];\n maxBatch?: number;\n // Video caps\n maxVideoSize?: PixelSize;\n maxDuration?: Seconds;\n maxFps?: number;\n supportedVideoFormats?: VideoFormat[];\n // SLA\n maxRps?: number;\n timeoutMs?: number;\n}\n\nexport const PROVIDER_MATRIX: ProviderCaps[] = [\n {\n provider: 'google',\n model: 'gemini-2.5-flash-image-preview',\n kind: 'image',\n maxImageSize: [2048, 2048],\n supportedImageFormats: ['png', 'webp', 'jpg'],\n maxBatch: 8,\n maxRps: 4,\n timeoutMs: 60_000,\n },\n {\n provider: 'google',\n model: 'veo3',\n kind: 'video',\n maxVideoSize: [1920, 1080],\n maxDuration: 30,\n maxFps: 30,\n supportedVideoFormats: ['mp4', 'webm'],\n maxRps: 2,\n timeoutMs: 120_000,\n },\n];\n\nexport interface ManifestV1 {\n manifestVersion: 1;\n kind: MediaKind;\n request: {\n promptHash: string;\n seed?: number;\n params: Record<string, unknown>;\n model: string;\n provider: 'google' | 'openai';\n };\n artifacts: Array<{\n file: string;\n hash: string;\n size?: PixelSize;\n frames?: number;\n }>;\n metrics: {\n durationMs: number;\n retries: number;\n fallbacks: number;\n };\n trace?: string;\n createdAt: string;\n}\n\nexport function hashPrompt(prompt: string): string {\n const h = crypto.createHash('sha256').update(prompt, 'utf8').digest('hex');\n return `sha256:${h}`;\n}\n\nexport function hashBytes(buf: Buffer): string {\n const h = crypto.createHash('sha256').update(buf).digest('hex');\n return `sha256:${h}`;\n}\n\nexport function datePath(d: Date = new Date()): string {\n const y = d.getUTCFullYear();\n const m = String(d.getUTCMonth() + 1).padStart(2, '0');\n const day = String(d.getUTCDate()).padStart(2, '0');\n return `${y}/${m}/${day}`;\n}\n\nexport function hashPrefix(hash: string, n: number = 6): string {\n return hash.replace(/^sha256:/, '').slice(0, n);\n}\n\n","// Atomic artifact storage for media orchestrator\n// Named exports only\n\nimport * as fs from 'node:fs';\nimport * as fsp from 'node:fs/promises';\nimport * as path from 'node:path';\nimport { datePath, hashBytes, hashPrefix, type ManifestV1 } from './types';\n\nexport interface SaveContext {\n root: string;\n kind: 'image' | 'video';\n baseDir?: string; // default based on kind\n trace?: string;\n flat?: boolean; // when true, save directly under baseDir/root without date/hash segments\n skipManifest?: boolean; // when true, do not write manifest.json\n}\n\nexport interface SaveItem {\n bytes: Buffer;\n ext: string; // '.webp' | '.png' | '.mp4' etc\n logicalName?: string; // optional label e.g., 'frame-0001'\n}\n\nexport interface SaveResult {\n files: string[]; // relative to root\n manifestPath: string; // relative to root (empty when skipManifest)\n}\n\nfunction ensureDirSync(p: string): void {\n fs.mkdirSync(p, { recursive: true });\n}\n\nfunction safeJoin(root: string, ...segs: string[]): { full: string; rel: string } {\n const full = path.resolve(root, ...segs);\n const rel = path.relative(root, full);\n if (rel.startsWith('..') || path.isAbsolute(rel)) {\n throw new Error(`path escapes root: ${segs.join('/')}`);\n }\n return { full, rel };\n}\n\nfunction stageDir(root: string, trace: string): string {\n return path.join(root, `.stage/${trace}`);\n}\n\nasync function existsSameHash(destFull: string): Promise<boolean> {\n try {\n await fsp.access(destFull);\n return true;\n } catch {\n return false;\n }\n}\n\nconst WINDOWS_RESERVED = new Set(['con','prn','aux','nul','com1','lpt1']);\nfunction validateWinPathEdge(fullPath: string) {\n if (process.platform === 'win32') {\n if (fullPath.length > 240) throw new Error('path too long for Windows');\n const base = fullPath.split(/[/\\\\]/).pop()?.toLowerCase() || '';\n if (WINDOWS_RESERVED.has(base.split('.')[0])) throw new Error('reserved filename on Windows');\n }\n}\n\nasync function hasCaseInsensitiveCollision(dirFull: string, targetFile: string): Promise<boolean> {\n try {\n const list = await fsp.readdir(dirFull);\n const set = new Set(list.map((n) => n.toLowerCase()));\n return set.has(targetFile.toLowerCase()) && !list.includes(targetFile);\n } catch {\n return false;\n }\n}\n\nasync function atomicRename(stage: string, dest: string): Promise<void> {\n try {\n await fsp.rename(stage, dest);\n try {\n const fd = await fsp.open(dest, 'r');\n try { await fd.sync(); } finally { await fd.close(); }\n } catch {}\n } catch (e: any) {\n if (e && e.code === 'EXDEV') {\n await fsp.copyFile(stage, dest);\n const fd = await fsp.open(dest, 'r');\n try {\n await fd.sync();\n } finally {\n await fd.close();\n }\n await fsp.unlink(stage);\n } else {\n throw e;\n }\n }\n}\n\nexport async function saveArtifacts(\n ctx: SaveContext,\n items: SaveItem[],\n manifest: Omit<ManifestV1, 'createdAt' | 'manifestVersion'> & { createdAt?: string },\n): Promise<SaveResult> {\n const root = ctx.root;\n // default to project root when not specified\n const base = typeof ctx.baseDir === 'string' ? ctx.baseDir : '';\n\n const trace = ctx.trace || Math.random().toString(36).slice(2, 10).toUpperCase();\n const stage = stageDir(root, trace);\n ensureDirSync(stage);\n\n try {\n const dateSeg = datePath(new Date());\n const reqHash = (manifest.request && (manifest.request as any).promptHash) || 'sha256:unknown';\n const slug = hashPrefix(reqHash, 6);\n const outDirSeg = ctx.flat ? (base || '') : `${base ? base + '/' : ''}${dateSeg}/${slug}`;\n const outDir = safeJoin(root, outDirSeg).full;\n ensureDirSync(outDir);\n\n const saved: string[] = [];\n for (let i = 0; i < items.length; i++) {\n const it = items[i];\n const contentHash = hashBytes(it.bytes).replace(/^sha256:/, '');\n const ext = it.ext.startsWith('.') ? it.ext : `.${it.ext}`;\n // Prefer logicalName if provided to preserve ordering (e.g., frames)\n const baseName = it.logicalName ? `${it.logicalName}` : `${contentHash}`;\n const fname = `${baseName}${ext}`;\n const relPath = outDirSeg ? `${outDirSeg}/${fname}` : `${fname}`;\n const dest = safeJoin(root, relPath);\n validateWinPathEdge(dest.full);\n if (await hasCaseInsensitiveCollision(path.dirname(dest.full), path.basename(dest.full))) {\n throw new Error('case-insensitive filename collision');\n }\n const stg = path.join(stage, `${fname}.part`);\n\n // Diagnostic logging – size and signature\n try {\n const sig = it.bytes.slice(0, 8).toString('hex');\n const looksJson = it.bytes.length >= 1 && it.bytes[0] === 0x7b /* '{' */;\n console.log(`[store] writing ${dest.rel} (${it.bytes.length} bytes, sig=${sig}${looksJson ? ', WARN:json-like' : ''})`);\n } catch {}\n\n if (await existsSameHash(dest.full)) {\n // duplicate; reference existing\n saved.push(dest.rel);\n continue;\n }\n\n await fsp.writeFile(stg, it.bytes);\n await atomicRename(stg, dest.full);\n const relPosix = dest.rel.replace(/\\\\/g, '/');\n saved.push(relPosix);\n }\n\n if (!ctx.skipManifest) {\n const manifestObj: ManifestV1 = {\n manifestVersion: 1,\n ...(manifest as any),\n createdAt: manifest.createdAt || new Date().toISOString(),\n artifacts: (manifest.artifacts && manifest.artifacts.length > 0)\n ? manifest.artifacts\n : saved.map((file) => ({ file, hash: `sha256:${path.basename(file).split('.')[0]}` })),\n };\n\n const manifestPathRel = `${outDirSeg ? outDirSeg + '/' : ''}manifest.json`;\n const manifestStage = path.join(stage, 'manifest.json.part');\n const manifestFull = safeJoin(root, manifestPathRel).full;\n\n await fsp.writeFile(manifestStage, JSON.stringify(manifestObj, null, 2), 'utf8');\n try { console.log(`[store] manifest -> ${manifestPathRel}`); } catch {}\n await atomicRename(manifestStage, manifestFull);\n\n await fsp.rm(stage, { recursive: true, force: true });\n return { files: saved, manifestPath: manifestPathRel.replace(/\\\\/g, '/') };\n } else {\n await fsp.rm(stage, { recursive: true, force: true });\n return { files: saved, manifestPath: '' };\n }\n } catch (e) {\n await fsp.rm(stage, { recursive: true, force: true });\n throw e;\n }\n}\n","// Real Gemini provider using @google/genai — no mock fallback\nimport type { MediaProvider, ImageRequestCommon, VideoRequestCommon, ImageResult, VideoFramesResult } from '../ProviderTypes';\n\nexport class GeminiMediaProvider implements MediaProvider {\n private ai: any;\n private primaryModel: string;\n\n constructor(opts?: { model?: string }) {\n const apiKey = process.env.GOOGLE_API_KEY || process.env.GEMINI_API_KEY;\n if (!apiKey) {\n const hasGoogle = Boolean(process.env.GOOGLE_API_KEY);\n const hasGemini = Boolean(process.env.GEMINI_API_KEY);\n throw new Error(\n `GeminiMediaProvider: missing API key (GOOGLE_API_KEY=${hasGoogle ? 'set' : 'unset'}, GEMINI_API_KEY=${hasGemini ? 'set' : 'unset'})`\n );\n }\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const { GoogleGenAI } = require('@google/genai');\n this.ai = new GoogleGenAI({ apiKey });\n this.primaryModel = opts?.model || process.env.MARIA_IMAGE_MODEL || 'gemini-2.5-flash-image-preview';\n }\n\n async generateImage(req: ImageRequestCommon): Promise<ImageResult> {\n const modelName = this.primaryModel;\n const promptPreview = String(req.prompt ?? '').replace(/\\s+/g, ' ').slice(0, 200);\n const targetMime = (() => {\n const fmt = (req.format || 'png').toLowerCase();\n if (fmt === 'jpg') return 'image/jpeg';\n if (fmt === 'jpeg') return 'image/jpeg';\n if (fmt === 'png') return 'image/png';\n if (fmt === 'webp') return 'image/webp';\n return 'image/png';\n })();\n let resp: any;\n try {\n resp = await this.ai.models.generateContent({\n model: modelName,\n contents: [{ role: 'user', parts: [{ text: String(req.prompt) }]}],\n generationConfig: {\n responseModalities: ['IMAGE'],\n responseMimeType: targetMime,\n },\n });\n } catch (err: any) {\n const errMsg = err?.message || String(err);\n throw new Error(\n `GeminiMediaProvider.generateImage request failed: model=${modelName}; prompt=\"${promptPreview}\"; error=${errMsg}`\n );\n }\n const feedback = resp?.response?.promptFeedback;\n const blockReason = feedback?.blockReason || feedback?.block_reason;\n if (blockReason) {\n const modelName = this.primaryModel;\n const reason = String(blockReason);\n throw new Error(`GeminiMediaProvider.policy_violation: model=${modelName}; reason=${reason}`);\n }\n const parts = resp?.response?.candidates?.[0]?.content?.parts || [];\n for (const p of parts) {\n const data = (p?.inlineData?.data) || (p?.inline_data?.data);\n const mime = (p?.inlineData?.mimeType) || (p?.inline_data?.mime_type) || (p?.inline_data?.mimeType) || (p?.inlineData?.mime_type);\n if (data) {\n const buf = Buffer.from(String(data), 'base64');\n if (buf.length > 0) return { bytes: buf, mime: typeof mime === 'string' ? mime : targetMime };\n }\n }\n // Fallback path: try Imagen models if Gemini preview returned no inline data\n try {\n const imagenModel = process.env.MARIA_IMAGE_FALLBACK_MODEL || 'imagen-4.0-generate-001';\n const r2 = await this.ai.models.generateImages({\n model: imagenModel,\n prompt: String(req.prompt),\n });\n const img0 = r2?.generatedImages?.[0]?.image;\n const bytesB64 = img0?.imageBytes || img0?.bytesBase64Encoded;\n if (bytesB64) {\n const buf = Buffer.from(String(bytesB64), 'base64');\n if (buf.length > 0) return { bytes: buf, mime: targetMime };\n }\n } catch {}\n\n const candidatesLen = resp?.response?.candidates?.length ?? 0;\n const finish = resp?.response?.candidates?.[0]?.finishReason || resp?.response?.promptFeedback?.blockReason || 'unknown';\n const firstPartKeys = parts[0] ? Object.keys(parts[0]).join(',') : 'n/a';\n throw new Error(\n `GeminiMediaProvider.generateImage: no inline image returned; model=${modelName}; prompt=\"${promptPreview}\"; candidates=${candidatesLen}; parts=${parts.length}; firstPartKeys=${firstPartKeys}; finish=${finish}`\n );\n }\n\n async generateVideoFrames(req: VideoRequestCommon): Promise<VideoFramesResult> {\n // Not supported in local provider. Use server Veo 3 path.\n const fps = typeof req?.fps === 'number' ? req.fps : 'n/a';\n const duration = typeof req?.duration === 'number' ? req.duration : 'n/a';\n throw new Error(\n `GeminiMediaProvider.generateVideoFrames is not supported locally. Use server /api/v1/video (veo-3.1-generate-preview). requested_fps=${fps}; requested_duration=${duration}`\n );\n }\n}\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\n\nexport type SubscriptionPlanId = 'free' | 'starter' | 'pro' | 'ultra';\n\nexport interface SubscriptionEventRecord {\n id: string;\n type: string;\n status: 'received' | 'processed' | 'failed' | 'skipped';\n receivedAt: string;\n stripeCreatedAt?: string;\n processedAt?: string;\n error?: string;\n}\n\nexport interface CustomerRecord {\n id: string;\n uid?: string;\n email?: string;\n metadata?: Record<string, string>;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface SubscriptionRecord {\n id: string;\n customerId: string;\n uid?: string;\n status: string;\n planId: SubscriptionPlanId;\n pendingPlanId?: SubscriptionPlanId | null;\n pendingPlanEffectiveAt?: string | null;\n cancelAt?: string | null;\n cancelAtPeriodEnd?: boolean;\n canceledAt?: string | null;\n currentPeriodStart: string;\n currentPeriodEnd: string;\n trialEnd?: string | null;\n latestInvoiceId?: string;\n latestInvoiceStatus?: 'succeeded' | 'failed' | 'pending';\n latestInvoiceAmount?: number;\n metadata?: Record<string, string>;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface InvoiceRecord {\n id: string;\n subscriptionId?: string;\n customerId?: string;\n amountPaid: number;\n currency: string;\n status: 'succeeded' | 'failed';\n paidAt: string;\n createdAt: string;\n periodStart?: string;\n periodEnd?: string;\n hostedInvoiceUrl?: string;\n}\n\nexport interface EntitlementRecord {\n uid: string;\n planId: SubscriptionPlanId;\n features: string[];\n updatedAt: string;\n}\n\nexport interface UsageRecord {\n uid: string;\n planId: SubscriptionPlanId;\n periodId: string;\n limits: QuotaSnapshot;\n used: QuotaSnapshot;\n remaining: QuotaSnapshot;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface QuotaSnapshot {\n requests: number;\n tokens: number;\n code: number;\n attachment: number;\n}\n\ninterface SubscriptionState {\n events: Record<string, SubscriptionEventRecord>;\n customers: Record<string, CustomerRecord>;\n subscriptions: Record<string, SubscriptionRecord>;\n invoices: Record<string, InvoiceRecord>;\n entitlements: Record<string, EntitlementRecord>;\n usage: Record<string, UsageRecord>;\n}\n\nconst DEFAULT_STATE: SubscriptionState = {\n events: {},\n customers: {},\n subscriptions: {},\n invoices: {},\n entitlements: {},\n usage: {}\n};\n\nexport class SubscriptionStore {\n private readonly filePath: string;\n private state: SubscriptionState | null = null;\n private loadPromise: Promise<void> | null = null;\n private queue: Promise<void> = Promise.resolve();\n\n constructor(filePath?: string) {\n this.filePath = filePath ?? path.resolve(process.cwd(), 'data', 'subscription-state.json');\n }\n\n private async ensureLoaded(): Promise<void> {\n if (this.state) {\n return;\n }\n if (!this.loadPromise) {\n this.loadPromise = this.loadStateFromDisk();\n }\n await this.loadPromise;\n }\n\n private async loadStateFromDisk(): Promise<void> {\n try {\n const raw = await fs.readFile(this.filePath, 'utf8');\n const parsed = JSON.parse(raw) as SubscriptionState;\n this.state = {\n events: parsed.events ?? {},\n customers: parsed.customers ?? {},\n subscriptions: parsed.subscriptions ?? {},\n invoices: parsed.invoices ?? {},\n entitlements: parsed.entitlements ?? {},\n usage: parsed.usage ?? {}\n };\n } catch (error: any) {\n if (error?.code === 'ENOENT') {\n this.state = { ...DEFAULT_STATE };\n await this.persist();\n return;\n }\n throw error;\n }\n }\n\n private async persist(): Promise<void> {\n if (!this.state) {\n return;\n }\n const directory = path.dirname(this.filePath);\n await fs.mkdir(directory, { recursive: true });\n const payload = JSON.stringify(this.state, null, 2);\n await fs.writeFile(this.filePath, payload, 'utf8');\n }\n\n private runExclusive<T>(task: () => Promise<T>): Promise<T> {\n const result = this.queue.then(task);\n this.queue = result.then(() => undefined).catch(() => undefined);\n return result;\n }\n\n async markEventReceived(event: { id: string; type: string; created?: number }): Promise<'new' | 'duplicate' | 'pending'> {\n return this.runExclusive(async () => {\n await this.ensureLoaded();\n const now = new Date().toISOString();\n const state = this.state!;\n const existing = state.events[event.id];\n\n if (!existing) {\n state.events[event.id] = {\n id: event.id,\n type: event.type,\n status: 'received',\n receivedAt: now,\n stripeCreatedAt: event.created ? new Date(event.created * 1000).toISOString() : undefined\n };\n await this.persist();\n return 'new';\n }\n\n if (existing.status === 'processed') {\n return 'duplicate';\n }\n\n state.events[event.id] = {\n ...existing,\n type: event.type,\n status: existing.status === 'failed' ? 'received' : existing.status,\n receivedAt: existing.receivedAt ?? now\n };\n await this.persist();\n return 'pending';\n });\n }\n\n async markEventProcessed(eventId: string): Promise<void> {\n await this.runExclusive(async () => {\n await this.ensureLoaded();\n const state = this.state!;\n const existing = state.events[eventId];\n if (!existing) {\n return;\n }\n state.events[eventId] = {\n ...existing,\n status: 'processed',\n processedAt: new Date().toISOString(),\n error: undefined\n };\n await this.persist();\n });\n }\n\n async markEventFailed(eventId: string, error: unknown): Promise<void> {\n await this.runExclusive(async () => {\n await this.ensureLoaded();\n const state = this.state!;\n const existing = state.events[eventId];\n if (!existing) {\n return;\n }\n state.events[eventId] = {\n ...existing,\n status: 'failed',\n error: error instanceof Error ? error.message : String(error)\n };\n await this.persist();\n });\n }\n\n async upsertCustomer(record: Omit<CustomerRecord, 'createdAt' | 'updatedAt'> & Partial<Pick<CustomerRecord, 'createdAt' | 'updatedAt'>>): Promise<CustomerRecord> {\n return this.runExclusive(async () => {\n await this.ensureLoaded();\n const now = new Date().toISOString();\n const state = this.state!;\n const existing = state.customers[record.id];\n const createdAt = existing?.createdAt ?? record.createdAt ?? now;\n\n const nextRecord: CustomerRecord = {\n id: record.id,\n uid: record.uid ?? existing?.uid,\n email: record.email ?? existing?.email,\n metadata: {\n ...(existing?.metadata ?? {}),\n ...(record.metadata ?? {})\n },\n createdAt,\n updatedAt: record.updatedAt ?? now\n };\n\n state.customers[record.id] = nextRecord;\n await this.persist();\n return nextRecord;\n });\n }\n\n async getCustomer(customerId: string): Promise<CustomerRecord | undefined> {\n await this.ensureLoaded();\n const state = this.state!;\n const record = state.customers[customerId];\n return record ? { ...record, metadata: record.metadata ? { ...record.metadata } : undefined } : undefined;\n }\n\n async upsertSubscription(record: Omit<SubscriptionRecord, 'createdAt' | 'updatedAt'> & Partial<Pick<SubscriptionRecord, 'createdAt' | 'updatedAt'>>): Promise<SubscriptionRecord> {\n return this.runExclusive(async () => {\n await this.ensureLoaded();\n const now = new Date().toISOString();\n const state = this.state!;\n const existing = state.subscriptions[record.id];\n const createdAt = existing?.createdAt ?? record.createdAt ?? now;\n\n const nextRecord: SubscriptionRecord = {\n id: record.id,\n customerId: record.customerId,\n uid: record.uid ?? existing?.uid,\n status: record.status,\n planId: record.planId,\n pendingPlanId: record.pendingPlanId !== undefined\n ? record.pendingPlanId\n : existing?.pendingPlanId ?? null,\n pendingPlanEffectiveAt: record.pendingPlanEffectiveAt !== undefined\n ? record.pendingPlanEffectiveAt\n : existing?.pendingPlanEffectiveAt ?? null,\n cancelAt: record.cancelAt ?? null,\n cancelAtPeriodEnd: record.cancelAtPeriodEnd ?? false,\n canceledAt: record.canceledAt ?? null,\n currentPeriodStart: record.currentPeriodStart,\n currentPeriodEnd: record.currentPeriodEnd,\n trialEnd: record.trialEnd ?? null,\n latestInvoiceId: record.latestInvoiceId ?? existing?.latestInvoiceId,\n latestInvoiceStatus: record.latestInvoiceStatus ?? existing?.latestInvoiceStatus,\n latestInvoiceAmount: record.latestInvoiceAmount ?? existing?.latestInvoiceAmount,\n metadata: {\n ...(existing?.metadata ?? {}),\n ...(record.metadata ?? {})\n },\n createdAt,\n updatedAt: record.updatedAt ?? now\n };\n\n state.subscriptions[record.id] = nextRecord;\n await this.persist();\n return nextRecord;\n });\n }\n\n async getSubscription(subscriptionId: string): Promise<SubscriptionRecord | undefined> {\n await this.ensureLoaded();\n const state = this.state!;\n const record = state.subscriptions[subscriptionId];\n if (!record) {\n return undefined;\n }\n return {\n ...record,\n metadata: record.metadata ? { ...record.metadata } : undefined\n };\n }\n\n async findSubscriptionByCustomer(customerId: string): Promise<SubscriptionRecord | undefined> {\n await this.ensureLoaded();\n const state = this.state!;\n return Object.values(state.subscriptions).find((sub) => sub.customerId === customerId);\n }\n\n async recordInvoice(record: InvoiceRecord): Promise<InvoiceRecord> {\n return this.runExclusive(async () => {\n await this.ensureLoaded();\n const state = this.state!;\n state.invoices[record.id] = { ...record };\n await this.persist();\n return state.invoices[record.id];\n });\n }\n\n async setEntitlements(uid: string, planId: SubscriptionPlanId, features: string[]): Promise<EntitlementRecord> {\n return this.runExclusive(async () => {\n await this.ensureLoaded();\n const now = new Date().toISOString();\n const state = this.state!;\n const record: EntitlementRecord = {\n uid,\n planId,\n features: [...features],\n updatedAt: now\n };\n state.entitlements[uid] = record;\n await this.persist();\n return record;\n });\n }\n\n async setUsage(params: {\n uid: string;\n planId: SubscriptionPlanId;\n periodId: string;\n limits: QuotaSnapshot;\n }): Promise<UsageRecord> {\n return this.runExclusive(async () => {\n await this.ensureLoaded();\n const now = new Date().toISOString();\n const state = this.state!;\n const key = `${params.uid}:${params.periodId}`;\n const existing = state.usage[key];\n const used: QuotaSnapshot = existing?.used ?? {\n requests: 0,\n tokens: 0,\n code: 0,\n attachment: 0\n };\n const remaining: QuotaSnapshot = {\n requests: Math.max(0, params.limits.requests - used.requests),\n tokens: Math.max(0, params.limits.tokens - used.tokens),\n code: Math.max(0, params.limits.code - used.code),\n attachment: Math.max(0, params.limits.attachment - used.attachment)\n };\n\n const record: UsageRecord = {\n uid: params.uid,\n planId: params.planId,\n periodId: params.periodId,\n limits: { ...params.limits },\n used,\n remaining,\n createdAt: existing?.createdAt ?? now,\n updatedAt: now\n };\n\n state.usage[key] = record;\n await this.persist();\n return record;\n });\n }\n\n async getUsage(uid: string, periodId: string): Promise<UsageRecord | undefined> {\n await this.ensureLoaded();\n const key = `${uid}:${periodId}`;\n const record = this.state!.usage[key];\n if (!record) {\n return undefined;\n }\n return {\n ...record,\n limits: { ...record.limits },\n used: { ...record.used },\n remaining: { ...record.remaining }\n };\n }\n\n async getEntitlements(uid: string): Promise<EntitlementRecord | undefined> {\n await this.ensureLoaded();\n const record = this.state!.entitlements[uid];\n if (!record) {\n return undefined;\n }\n return {\n ...record,\n features: [...record.features]\n };\n }\n\n async snapshot(): Promise<SubscriptionState> {\n await this.ensureLoaded();\n const state = this.state!;\n return JSON.parse(JSON.stringify(state)) as SubscriptionState;\n }\n}\n\nexport default SubscriptionStore;\n","import { createHmac, timingSafeEqual } from 'node:crypto';\nimport SubscriptionStore, {\n CustomerRecord,\n QuotaSnapshot,\n SubscriptionPlanId\n} from './subscription-store.js';\n\nexport type StripeEventType =\n | 'checkout.session.completed'\n | 'customer.subscription.created'\n | 'customer.subscription.updated'\n | 'customer.subscription.deleted'\n | 'invoice.payment_succeeded'\n | 'invoice.payment_failed';\n\ninterface StripeEvent<T = unknown> {\n id: string;\n type: StripeEventType | string;\n created: number;\n data: {\n object: T;\n };\n livemode?: boolean;\n}\n\ninterface StripeSubscriptionItem {\n price?: {\n id?: string;\n nickname?: string | null;\n product?: string | { id?: string } | null;\n metadata?: Record<string, string | undefined>;\n };\n plan?: {\n product?: string | { id?: string } | null;\n metadata?: Record<string, string | undefined>;\n } | null;\n metadata?: Record<string, string | undefined>;\n}\n\ninterface StripeSubscription {\n id: string;\n status: string;\n customer: string | { id?: string; email?: string | null };\n items?: {\n data?: StripeSubscriptionItem[];\n };\n metadata?: Record<string, string | undefined>;\n cancel_at?: number | null;\n cancel_at_period_end?: boolean;\n canceled_at?: number | null;\n current_period_start: number;\n current_period_end: number;\n trial_end?: number | null;\n latest_invoice?: string | { id?: string } | null;\n}\n\ninterface StripeInvoiceLine {\n period?: {\n start?: number;\n end?: number;\n };\n plan?: {\n id?: string;\n metadata?: Record<string, string | undefined>;\n } | null;\n price?: {\n id?: string;\n product?: string | { id?: string } | null;\n metadata?: Record<string, string | undefined>;\n } | null;\n metadata?: Record<string, string | undefined>;\n}\n\ninterface StripeInvoice {\n id: string;\n status?: 'draft' | 'open' | 'paid' | 'uncollectible' | 'void';\n amount_paid?: number;\n currency?: string;\n customer?: string | { id?: string } | null;\n subscription?: string | { id?: string } | null;\n hosted_invoice_url?: string | null;\n created?: number;\n paid?: boolean;\n lines?: {\n data?: StripeInvoiceLine[];\n };\n period_start?: number;\n period_end?: number;\n}\n\ninterface StripeCheckoutSession {\n id: string;\n customer?: string | { id?: string } | null;\n customer_email?: string | null;\n metadata?: Record<string, string | undefined>;\n client_reference_id?: string | null;\n subscription?: string | null;\n mode?: string;\n}\n\ninterface StripeWebhookServiceOptions {\n secret: string;\n store?: SubscriptionStore;\n toleranceSeconds?: number;\n priceIdMap?: Record<string, SubscriptionPlanId>;\n productIdMap?: Record<string, SubscriptionPlanId>;\n}\n\nconst PLAN_PRIORITY: Record<SubscriptionPlanId, number> = {\n free: 0,\n starter: 1,\n pro: 2,\n ultra: 3\n};\n\nconst PLAN_CONFIG: Record<SubscriptionPlanId, { entitlements: string[]; quota: QuotaSnapshot }> = {\n free: {\n entitlements: [\n 'core.cli.basic',\n 'ai.chat.basic',\n 'usage.metrics.basic'\n ],\n quota: {\n requests: 100,\n tokens: 50000,\n code: 30,\n attachment: 10\n }\n },\n starter: {\n entitlements: [\n 'core.cli.basic',\n 'ai.chat.basic',\n 'ai.chat.priority',\n 'usage.metrics.expanded',\n 'workspace.multi-device'\n ],\n quota: {\n requests: 500,\n tokens: 250000,\n code: 200,\n attachment: 50\n }\n },\n pro: {\n entitlements: [\n 'core.cli.basic',\n 'ai.chat.priority',\n 'ai.code.advanced',\n 'orchestrator.code',\n 'usage.metrics.expanded',\n 'workspace.multi-device',\n 'api.webhooks'\n ],\n quota: {\n requests: 2000,\n tokens: 1000000,\n code: 1000,\n attachment: 200\n }\n },\n ultra: {\n entitlements: [\n 'core.cli.basic',\n 'ai.chat.priority',\n 'ai.code.advanced',\n 'orchestrator.code',\n 'orchestrator.media',\n 'monitoring.analytics',\n 'api.webhooks',\n 'support.priority'\n ],\n quota: {\n requests: 10000,\n tokens: 5000000,\n code: 5000,\n attachment: 1000\n }\n }\n};\n\nconst PLAN_ALIAS_MAP: Record<string, SubscriptionPlanId> = {\n starterannual: 'starter',\n 'starter-annual': 'starter',\n 'starter_yearly': 'starter',\n 'starter-yearly': 'starter',\n starteryearly: 'starter',\n proannual: 'pro',\n 'pro-annual': 'pro',\n 'pro_yearly': 'pro',\n 'pro-yearly': 'pro',\n proyearly: 'pro',\n ultraannual: 'ultra',\n 'ultra-annual': 'ultra',\n 'ultra_yearly': 'ultra',\n 'ultra-yearly': 'ultra',\n ultrayearly: 'ultra'\n};\n\nfunction sanitizeKey(value: string): string {\n return value.trim().toLowerCase().replace(/[^a-z0-9-]/g, '');\n}\n\nfunction toIso(timestamp?: number | null): string | null {\n if (!timestamp) {\n return null;\n }\n return new Date(timestamp * 1000).toISOString();\n}\n\nfunction formatPeriodId(date: Date | number): string {\n const instance = typeof date === 'number' ? new Date(date) : date;\n const year = instance.getUTCFullYear();\n const month = String(instance.getUTCMonth() + 1).padStart(2, '0');\n return `${year}${month}`;\n}\n\nfunction extractId(value: string | { id?: string } | null | undefined): string | undefined {\n if (!value) {\n return undefined;\n }\n if (typeof value === 'string') {\n return value;\n }\n return value.id ?? undefined;\n}\n\nfunction extractMetadataPlan(metadata?: Record<string, string | undefined>): string | undefined {\n if (!metadata) {\n return undefined;\n }\n const keys = ['planId', 'plan_id', 'plan', 'plan-id', 'plan_name'];\n for (const key of keys) {\n const value = metadata[key];\n if (value && value.trim()) {\n return value.trim();\n }\n }\n return undefined;\n}\n\nfunction extractUidFromMetadata(metadata?: Record<string, string | undefined>): string | undefined {\n if (!metadata) {\n return undefined;\n }\n const keys = ['uid', 'userId', 'user_id', 'customer_uid'];\n for (const key of keys) {\n const value = metadata[key];\n if (value && value.trim()) {\n return value.trim();\n }\n }\n return undefined;\n}\n\nexport class StripeWebhookService {\n private readonly secret: string;\n private readonly toleranceSeconds: number;\n private readonly store: SubscriptionStore;\n private readonly pricePlanMap: Map<string, SubscriptionPlanId> = new Map();\n private readonly productPlanMap: Map<string, SubscriptionPlanId> = new Map();\n\n constructor(options: StripeWebhookServiceOptions) {\n if (!options.secret) {\n throw new Error('Stripe webhook secret must be provided');\n }\n this.secret = options.secret;\n this.toleranceSeconds = options.toleranceSeconds ?? 300;\n this.store = options.store ?? new SubscriptionStore();\n this.registerEnvPlanMappings();\n\n if (options.priceIdMap) {\n for (const [id, plan] of Object.entries(options.priceIdMap)) {\n this.pricePlanMap.set(sanitizeKey(id), plan);\n }\n }\n\n if (options.productIdMap) {\n for (const [id, plan] of Object.entries(options.productIdMap)) {\n this.productPlanMap.set(sanitizeKey(id), plan);\n }\n }\n }\n\n verifySignature(rawBody: Buffer, signatureHeader: string | string[] | undefined): void {\n if (!signatureHeader) {\n throw new Error('Stripe signature header is missing');\n }\n const header = Array.isArray(signatureHeader) ? signatureHeader.join(',') : signatureHeader;\n const { timestamp, signatures } = this.parseSignatureHeader(header);\n if (!timestamp || signatures.length === 0) {\n throw new Error('Stripe signature header is invalid');\n }\n\n const timestampSeconds = Number(timestamp);\n if (!Number.isFinite(timestampSeconds)) {\n throw new Error('Stripe signature timestamp is invalid');\n }\n\n const nowSeconds = Math.floor(Date.now() / 1000);\n if (Math.abs(nowSeconds - timestampSeconds) > this.toleranceSeconds) {\n throw new Error('Stripe signature timestamp outside of tolerance window');\n }\n\n const signedPayload = `${timestamp}.${rawBody.toString('utf8')}`;\n const expected = createHmac('sha256', this.secret).update(signedPayload).digest('hex');\n const expectedBuffer = Buffer.from(expected, 'hex');\n\n const isValid = signatures.some((signature) => {\n const signatureBuffer = Buffer.from(signature, 'hex');\n if (signatureBuffer.length !== expectedBuffer.length) {\n return false;\n }\n return timingSafeEqual(signatureBuffer, expectedBuffer);\n });\n\n if (!isValid) {\n throw new Error('Stripe signature verification failed');\n }\n }\n\n parseEvent<T = unknown>(rawBody: Buffer): StripeEvent<T> {\n try {\n const parsed = JSON.parse(rawBody.toString('utf8')) as StripeEvent<T>;\n if (!parsed || typeof parsed !== 'object' || !parsed.id || !parsed.type) {\n throw new Error('Invalid event payload');\n }\n return parsed;\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n throw new Error(`Failed to parse Stripe event payload: ${message}`);\n }\n }\n\n async processEvent(event: StripeEvent): Promise<void> {\n const receipt = await this.store.markEventReceived({\n id: event.id,\n type: event.type,\n created: event.created\n });\n\n if (receipt === 'duplicate') {\n return;\n }\n\n try {\n switch (event.type) {\n case 'checkout.session.completed':\n await this.handleCheckoutSession(event as StripeEvent<StripeCheckoutSession>);\n break;\n case 'customer.subscription.created':\n await this.handleSubscriptionCreated(event as StripeEvent<StripeSubscription>);\n break;\n case 'customer.subscription.updated':\n await this.handleSubscriptionUpdated(event as StripeEvent<StripeSubscription>);\n break;\n case 'customer.subscription.deleted':\n await this.handleSubscriptionDeleted(event as StripeEvent<StripeSubscription>);\n break;\n case 'invoice.payment_succeeded':\n await this.handleInvoicePayment(event as StripeEvent<StripeInvoice>, true);\n break;\n case 'invoice.payment_failed':\n await this.handleInvoicePayment(event as StripeEvent<StripeInvoice>, false);\n break;\n default:\n // Mark unhandled events as processed to avoid replays\n console.info(`Unhandled Stripe event type: ${event.type}`);\n }\n await this.store.markEventProcessed(event.id);\n } catch (error) {\n await this.store.markEventFailed(event.id, error);\n throw error;\n }\n }\n\n private parseSignatureHeader(signatureHeader: string): { timestamp?: string; signatures: string[] } {\n const parts = signatureHeader.split(',');\n let timestamp: string | undefined;\n const signatures: string[] = [];\n\n for (const part of parts) {\n const [key, value] = part.trim().split('=');\n if (key === 't') {\n timestamp = value;\n } else if (key.startsWith('v')) {\n signatures.push(value);\n }\n }\n\n return { timestamp, signatures };\n }\n\n private registerEnvPlanMappings(): void {\n const mapping: Array<[string | undefined, SubscriptionPlanId]> = [\n [process.env.STRIPE_PRICE_STARTER, 'starter'],\n [process.env.STRIPE_PRICE_STARTER_ANNUAL, 'starter'],\n [process.env.STRIPE_PRICE_PRO, 'pro'],\n [process.env.STRIPE_PRICE_PRO_ANNUAL, 'pro'],\n [process.env.STRIPE_PRICE_ULTRA, 'ultra'],\n [process.env.STRIPE_PRICE_ULTRA_ANNUAL, 'ultra']\n ];\n\n mapping.forEach(([id, plan]) => {\n if (id && id.trim()) {\n this.pricePlanMap.set(sanitizeKey(id), plan);\n }\n });\n\n const productMapping: Array<[string | undefined, SubscriptionPlanId]> = [\n [process.env.STRIPE_PRODUCT_STARTER, 'starter'],\n [process.env.STRIPE_PRODUCT_PRO, 'pro'],\n [process.env.STRIPE_PRODUCT_ULTRA, 'ultra']\n ];\n\n productMapping.forEach(([id, plan]) => {\n if (id && id.trim()) {\n this.productPlanMap.set(sanitizeKey(id), plan);\n }\n });\n }\n\n private normalizePlanId(planId: string | undefined | null): SubscriptionPlanId {\n if (!planId) {\n return 'free';\n }\n const key = sanitizeKey(planId);\n if (PLAN_CONFIG[key as SubscriptionPlanId]) {\n return key as SubscriptionPlanId;\n }\n const alias = PLAN_ALIAS_MAP[key];\n if (alias) {\n return alias;\n }\n return 'free';\n }\n\n private resolvePlanFromSubscription(subscription: StripeSubscription): SubscriptionPlanId {\n const metadataPlan = extractMetadataPlan(subscription.metadata);\n if (metadataPlan) {\n return this.normalizePlanId(metadataPlan);\n }\n\n const items = subscription.items?.data ?? [];\n for (const item of items) {\n const itemMetadataPlan = extractMetadataPlan(item.metadata);\n if (itemMetadataPlan) {\n return this.normalizePlanId(itemMetadataPlan);\n }\n const priceMetadataPlan = extractMetadataPlan(item.price?.metadata);\n if (priceMetadataPlan) {\n return this.normalizePlanId(priceMetadataPlan);\n }\n const planMetadataPlan = extractMetadataPlan(item.plan?.metadata);\n if (planMetadataPlan) {\n return this.normalizePlanId(planMetadataPlan);\n }\n\n const priceId = item.price?.id;\n if (priceId) {\n const mapped = this.pricePlanMap.get(sanitizeKey(priceId));\n if (mapped) {\n return mapped;\n }\n }\n\n const productId = extractId(item.price?.product ?? item.plan?.product ?? null);\n if (productId) {\n const mapped = this.productPlanMap.get(sanitizeKey(productId));\n if (mapped) {\n return mapped;\n }\n }\n\n const nickname = item.price?.nickname;\n if (nickname) {\n const candidate = this.normalizePlanId(nickname);\n if (candidate !== 'free') {\n return candidate;\n }\n }\n }\n\n return 'free';\n }\n\n private getPlanConfig(planId: SubscriptionPlanId) {\n return PLAN_CONFIG[planId] ?? PLAN_CONFIG.free;\n }\n\n private async applyPlanEntitlements(uid: string, planId: SubscriptionPlanId, subscription: StripeSubscription | null, overridePeriod?: { start?: number; end?: number }): Promise<void> {\n const config = this.getPlanConfig(planId);\n await this.store.setEntitlements(uid, planId, config.entitlements);\n\n const periodStart = overridePeriod?.start ?? subscription?.current_period_start;\n const periodEnd = overridePeriod?.end ?? subscription?.current_period_end;\n const periodId = periodStart ? formatPeriodId(new Date(periodStart * 1000)) : formatPeriodId(Date.now());\n\n await this.store.setUsage({\n uid,\n planId,\n periodId,\n limits: config.quota\n });\n }\n\n private comparePlanPriority(a: SubscriptionPlanId, b: SubscriptionPlanId): number {\n return PLAN_PRIORITY[a] - PLAN_PRIORITY[b];\n }\n\n private async resolveUid(customerId: string | undefined, ...metadataSources: Array<Record<string, string | undefined> | undefined>): Promise<string | undefined> {\n for (const metadata of metadataSources) {\n const uidFromMetadata = extractUidFromMetadata(metadata);\n if (uidFromMetadata) {\n return uidFromMetadata;\n }\n }\n if (customerId) {\n const customer = await this.store.getCustomer(customerId);\n return customer?.uid;\n }\n return undefined;\n }\n\n private async handleCheckoutSession(event: StripeEvent<StripeCheckoutSession>): Promise<void> {\n const session = event.data.object;\n const customerId = extractId(session.customer ?? null);\n const uid = await this.resolveUid(customerId, session.metadata);\n\n if (!customerId) {\n console.warn('checkout.session.completed received without customer id', { sessionId: session.id });\n return;\n }\n\n const metadata: Record<string, string> = {};\n if (session.metadata) {\n for (const [key, value] of Object.entries(session.metadata)) {\n if (typeof value === 'string') {\n metadata[key] = value;\n }\n }\n }\n\n await this.store.upsertCustomer({\n id: customerId,\n uid,\n email: session.customer_email ?? undefined,\n metadata: {\n ...metadata,\n lastCheckoutSessionId: session.id,\n lastCheckoutMode: session.mode ?? undefined\n }\n });\n }\n\n private async handleSubscriptionCreated(event: StripeEvent<StripeSubscription>): Promise<void> {\n const subscription = event.data.object;\n const customerId = extractId(subscription.customer);\n if (!customerId) {\n throw new Error(`Subscription ${subscription.id} missing customer id`);\n }\n\n const planId = this.resolvePlanFromSubscription(subscription);\n const uid = await this.resolveUid(customerId, subscription.metadata);\n\n const customerRecord: CustomerRecord = {\n id: customerId,\n uid,\n email: typeof subscription.customer === 'object' ? subscription.customer.email ?? undefined : undefined,\n metadata: subscription.metadata && Object.keys(subscription.metadata).length > 0 ? { ...subscription.metadata } : undefined,\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString()\n };\n\n await this.store.upsertCustomer(customerRecord);\n\n await this.store.upsertSubscription({\n id: subscription.id,\n customerId,\n uid,\n status: subscription.status,\n planId,\n pendingPlanId: null,\n pendingPlanEffectiveAt: null,\n cancelAt: toIso(subscription.cancel_at),\n cancelAtPeriodEnd: subscription.cancel_at_period_end ?? false,\n canceledAt: toIso(subscription.canceled_at),\n currentPeriodStart: toIso(subscription.current_period_start) ?? new Date().toISOString(),\n currentPeriodEnd: toIso(subscription.current_period_end) ?? new Date().toISOString(),\n trialEnd: toIso(subscription.trial_end),\n metadata: subscription.metadata && Object.keys(subscription.metadata).length > 0 ? { ...subscription.metadata } : undefined\n });\n\n if (uid) {\n await this.applyPlanEntitlements(uid, planId, subscription);\n }\n }\n\n private async handleSubscriptionUpdated(event: StripeEvent<StripeSubscription>): Promise<void> {\n const subscription = event.data.object;\n const customerId = extractId(subscription.customer);\n if (!customerId) {\n throw new Error(`Subscription ${subscription.id} missing customer id`);\n }\n\n const existing = await this.store.getSubscription(subscription.id);\n const resolvedPlan = this.resolvePlanFromSubscription(subscription);\n const uid = await this.resolveUid(customerId, subscription.metadata, existing?.metadata);\n const planChange = existing ? this.comparePlanPriority(resolvedPlan, existing.planId) : 0;\n\n let effectivePlan = resolvedPlan;\n let pendingPlan: SubscriptionPlanId | null = existing?.pendingPlanId ?? null;\n let pendingEffectiveAt: string | null = existing?.pendingPlanEffectiveAt ?? null;\n\n if (existing) {\n if (planChange < 0) {\n // Downgrade scheduled: keep current plan active until invoice confirms\n effectivePlan = existing.planId;\n pendingPlan = resolvedPlan;\n pendingEffectiveAt = toIso(subscription.current_period_end) ?? toIso(subscription.cancel_at) ?? existing.currentPeriodEnd;\n } else {\n pendingPlan = null;\n pendingEffectiveAt = null;\n if (planChange > 0 && uid) {\n // Upgrade: apply entitlements immediately\n await this.applyPlanEntitlements(uid, resolvedPlan, subscription);\n }\n }\n } else if (uid) {\n await this.applyPlanEntitlements(uid, resolvedPlan, subscription);\n }\n\n await this.store.upsertSubscription({\n id: subscription.id,\n customerId,\n uid,\n status: subscription.status,\n planId: effectivePlan,\n pendingPlanId: pendingPlan,\n pendingPlanEffectiveAt: pendingEffectiveAt,\n cancelAt: toIso(subscription.cancel_at),\n cancelAtPeriodEnd: subscription.cancel_at_period_end ?? false,\n canceledAt: toIso(subscription.canceled_at),\n currentPeriodStart: toIso(subscription.current_period_start) ?? existing?.currentPeriodStart ?? new Date().toISOString(),\n currentPeriodEnd: toIso(subscription.current_period_end) ?? existing?.currentPeriodEnd ?? new Date().toISOString(),\n trialEnd: toIso(subscription.trial_end),\n metadata: subscription.metadata && Object.keys(subscription.metadata).length > 0 ? { ...subscription.metadata } : undefined\n });\n\n if (uid) {\n await this.store.upsertCustomer({\n id: customerId,\n uid,\n metadata: subscription.metadata && Object.keys(subscription.metadata).length > 0 ? { ...subscription.metadata } : undefined\n });\n }\n }\n\n private async handleSubscriptionDeleted(event: StripeEvent<StripeSubscription>): Promise<void> {\n const subscription = event.data.object;\n const customerId = extractId(subscription.customer);\n const existing = await this.store.getSubscription(subscription.id);\n const uid = await this.resolveUid(customerId, subscription.metadata, existing?.metadata);\n\n await this.store.upsertSubscription({\n id: subscription.id,\n customerId: customerId ?? existing?.customerId ?? 'unknown',\n uid: uid ?? existing?.uid,\n status: 'canceled',\n planId: 'free',\n pendingPlanId: null,\n pendingPlanEffectiveAt: null,\n cancelAt: toIso(subscription.cancel_at),\n cancelAtPeriodEnd: subscription.cancel_at_period_end ?? false,\n canceledAt: toIso(subscription.canceled_at) ?? new Date().toISOString(),\n currentPeriodStart: toIso(subscription.current_period_start) ?? existing?.currentPeriodStart ?? new Date().toISOString(),\n currentPeriodEnd: toIso(subscription.current_period_end) ?? existing?.currentPeriodEnd ?? new Date().toISOString(),\n trialEnd: toIso(subscription.trial_end),\n metadata: subscription.metadata && Object.keys(subscription.metadata).length > 0 ? { ...subscription.metadata } : undefined\n });\n\n if (uid) {\n await this.applyPlanEntitlements(uid, 'free', subscription);\n }\n }\n\n private async handleInvoicePayment(event: StripeEvent<StripeInvoice>, succeeded: boolean): Promise<void> {\n const invoice = event.data.object;\n const subscriptionId = extractId(invoice.subscription ?? null);\n if (!subscriptionId) {\n console.warn('Invoice received without subscription id', { invoiceId: invoice.id });\n return;\n }\n\n const subscription = await this.store.getSubscription(subscriptionId);\n if (!subscription) {\n console.warn('Invoice received for unknown subscription', { invoiceId: invoice.id, subscriptionId });\n return;\n }\n\n const customerId = extractId(invoice.customer ?? subscription.customerId);\n\n await this.store.recordInvoice({\n id: invoice.id,\n subscriptionId,\n customerId,\n amountPaid: (invoice.amount_paid ?? 0) / 100,\n currency: invoice.currency ?? 'usd',\n status: succeeded ? 'succeeded' : 'failed',\n paidAt: invoice.created ? new Date(invoice.created * 1000).toISOString() : new Date().toISOString(),\n createdAt: new Date().toISOString(),\n periodStart: toIso(invoice.lines?.data?.[0]?.period?.start ?? invoice.period_start ?? null),\n periodEnd: toIso(invoice.lines?.data?.[0]?.period?.end ?? invoice.period_end ?? null),\n hostedInvoiceUrl: invoice.hosted_invoice_url ?? undefined\n });\n\n if (!succeeded) {\n await this.store.upsertSubscription({\n id: subscription.id,\n customerId: subscription.customerId,\n uid: subscription.uid,\n status: subscription.status,\n planId: subscription.planId,\n pendingPlanId: subscription.pendingPlanId ?? null,\n pendingPlanEffectiveAt: subscription.pendingPlanEffectiveAt ?? null,\n cancelAt: subscription.cancelAt ?? null,\n cancelAtPeriodEnd: subscription.cancelAtPeriodEnd ?? false,\n canceledAt: subscription.canceledAt ?? null,\n currentPeriodStart: subscription.currentPeriodStart,\n currentPeriodEnd: subscription.currentPeriodEnd,\n trialEnd: subscription.trialEnd ?? null,\n latestInvoiceId: invoice.id,\n latestInvoiceStatus: 'failed',\n latestInvoiceAmount: (invoice.amount_paid ?? 0) / 100\n });\n return;\n }\n\n const fallbackPeriodStart = subscription.currentPeriodStart ? Date.parse(subscription.currentPeriodStart) / 1000 : undefined;\n const fallbackPeriodEnd = subscription.currentPeriodEnd ? Date.parse(subscription.currentPeriodEnd) / 1000 : undefined;\n\n const periodStart = invoice.lines?.data?.[0]?.period?.start\n ?? invoice.period_start\n ?? fallbackPeriodStart;\n const periodEnd = invoice.lines?.data?.[0]?.period?.end\n ?? invoice.period_end\n ?? fallbackPeriodEnd;\n\n let nextPlanId = subscription.planId;\n let pendingPlanId = subscription.pendingPlanId ?? null;\n let pendingEffectiveAt = subscription.pendingPlanEffectiveAt ?? null;\n\n if (subscription.pendingPlanId) {\n nextPlanId = subscription.pendingPlanId;\n pendingPlanId = null;\n pendingEffectiveAt = null;\n if (subscription.uid) {\n await this.applyPlanEntitlements(subscription.uid, nextPlanId, null, { start: periodStart, end: periodEnd });\n }\n } else if (subscription.uid) {\n await this.applyPlanEntitlements(subscription.uid, subscription.planId, null, { start: periodStart, end: periodEnd });\n }\n\n await this.store.upsertSubscription({\n id: subscription.id,\n customerId: subscription.customerId,\n uid: subscription.uid,\n status: subscription.status,\n planId: nextPlanId,\n pendingPlanId,\n pendingPlanEffectiveAt: pendingEffectiveAt,\n cancelAt: subscription.cancelAt ?? null,\n cancelAtPeriodEnd: subscription.cancelAtPeriodEnd ?? false,\n canceledAt: subscription.canceledAt ?? null,\n currentPeriodStart: periodStart ? toIso(periodStart) ?? subscription.currentPeriodStart : subscription.currentPeriodStart,\n currentPeriodEnd: periodEnd ? toIso(periodEnd) ?? subscription.currentPeriodEnd : subscription.currentPeriodEnd,\n trialEnd: subscription.trialEnd ?? null,\n latestInvoiceId: invoice.id,\n latestInvoiceStatus: 'succeeded',\n latestInvoiceAmount: (invoice.amount_paid ?? 0) / 100\n });\n }\n}\n\nexport default StripeWebhookService;\n","/**\n * Express Server for MARIA CODE API\n * With Rate Limiting and API Endpoints\n */\n\nimport express, { Request, Response, NextFunction } from 'express';\nimport cors from 'cors';\nimport helmet from 'helmet';\nimport compression, { filter as compressionFilter } from 'compression';\nimport { rateLimitMiddleware, startRateLimitCleanup } from '../middleware/rate-limit';\nimport { saveArtifacts } from '../services/media-orchestrator/Storage';\nimport { GeminiMediaProvider } from '../providers/google/gemini-media';\nimport { hasFfmpeg, muxFramesToMp4 } from '../services/media-orchestrator/ffmpeg';\nimport { hashPrompt, type ManifestV1 } from '../services/media-orchestrator/types';\nimport path from 'node:path';\nimport fs from 'node:fs/promises';\nimport freePlan from '../config/plans/free-plan.json';\nimport IMSFacade from '../services/intelligent-model-selector/IMSFacade';\nimport SubscriptionStore from '../services/subscription/subscription-store';\nimport StripeWebhookService from '../services/subscription/stripe-webhook-service';\n\n// Simple in-memory job registry (ephemeral). For production, persist to DB.\ntype JobStatus = 'queued' | 'running' | 'completed' | 'failed';\ntype JobKind = 'image' | 'video';\ninterface JobInfo {\n id: string;\n status: JobStatus;\n kind: JobKind;\n manifestPath?: string;\n error?: string;\n createdAt: string;\n updatedAt: string;\n uid?: string;\n}\nconst jobIndex: Map<string, JobInfo> = new Map();\n\nconst app: express.Express = express();\nconst port = process.env.PORT || 8080;\n\nconst subscriptionStore = new SubscriptionStore();\nconst stripeWebhookSecret = process.env.STRIPE_WEBHOOK_SECRET;\nlet stripeWebhookService: StripeWebhookService | null = null;\n\nif (stripeWebhookSecret) {\n try {\n stripeWebhookService = new StripeWebhookService({\n secret: stripeWebhookSecret,\n store: subscriptionStore\n });\n } catch (error) {\n stripeWebhookService = null;\n console.error('Failed to initialize Stripe webhook service:', error);\n }\n} else {\n console.warn('STRIPE_WEBHOOK_SECRET is not configured; Stripe webhook endpoint will be disabled.');\n}\n\n// Security middleware\napp.use(helmet());\napp.use(cors());\n// Disable compression for media files to avoid any chance of corrupting binary transfers\napp.use(compression({\n filter: (req, res) => {\n if (/\\.(mp4|webm|mov)$/i.test(req.url)) return false;\n return compressionFilter(req, res);\n }\n}));\napp.use('/api/stripe/webhook', express.raw({ type: 'application/json' }));\n// Increase body limit to comfortably accept base64 attachments (images, PDFs)\napp.use(express.json({ limit: '50mb' }));\napp.use(express.urlencoded({ extended: true }));\n\n// Serve artifacts statically (read-only). In production, protect via CDN or auth middleware.\ntry {\n const artifactsDir = path.resolve(process.cwd(), 'artifacts');\n app.use('/artifacts', express.static(artifactsDir, { fallthrough: true, extensions: ['json','png','jpg','webp','mp4','webm','mov'] }));\n} catch {}\n\n// Request logging\napp.use((req: Request, res: Response, next: NextFunction) => {\n console.log(`[${new Date().toISOString()}] ${req.method} ${req.path}`);\n next();\n});\n\n// Health check (no rate limit)\napp.get('/health', (req: Request, res: Response) => {\n res.status(200).send('OK');\n});\n\napp.get('/api/status', (req: Request, res: Response) => {\n res.json({\n status: 'healthy',\n version: '4.3.9',\n uptime: process.uptime(),\n memory: process.memoryUsage(),\n platform: process.platform,\n node: process.version,\n timestamp: new Date().toISOString()\n });\n});\n\n// Root endpoint\napp.get('/', (req: Request, res: Response) => {\n res.json({\n name: 'MARIA CODE API',\n version: '4.4.6',\n status: 'running',\n environment: process.env.NODE_ENV || 'development',\n endpoints: {\n health: '/health',\n status: '/api/status',\n ai: '/api/ai',\n image: '/api/v1/image',\n video: '/api/v1/video',\n code: '/api/v1/code',\n chat: '/api/v1/chat'\n },\n timestamp: new Date().toISOString()\n });\n});\n\napp.post('/api/stripe/webhook', async (req: Request, res: Response) => {\n if (!stripeWebhookService) {\n return res.status(503).json({ error: 'Stripe webhook processing is not configured' });\n }\n\n const signature = req.headers['stripe-signature'];\n const rawBody = Buffer.isBuffer(req.body)\n ? req.body\n : Buffer.from(typeof req.body === 'string' ? req.body : JSON.stringify(req.body ?? {}), 'utf8');\n\n try {\n stripeWebhookService.verifySignature(rawBody, signature);\n } catch (error) {\n console.error('Stripe webhook signature verification failed:', error);\n return res.status(400).json({ error: 'Invalid Stripe signature' });\n }\n\n let event;\n try {\n event = stripeWebhookService.parseEvent(rawBody);\n } catch (error) {\n console.error('Stripe webhook payload parsing failed:', error);\n return res.status(400).json({ error: 'Invalid Stripe payload' });\n }\n\n stripeWebhookService.processEvent(event).catch((error) => {\n console.error('Stripe webhook processing error:', error);\n });\n\n return res.sendStatus(200);\n});\n\n// ---- Error classification helpers (provider/auth/policy) ----\nfunction classifyMediaError(err: unknown): { status: number; code: string; message: string; hint?: string } {\n const raw = (err as any);\n const msg: string = String(raw?.message || raw || 'unknown error');\n const lower = msg.toLowerCase();\n // Auth / key issues\n if (lower.includes('missing api key') || lower.includes('api key') && lower.includes('missing')) {\n return { status: 503, code: 'provider_unavailable', message: 'Provider API key is not configured', hint: 'Set GOOGLE_API_KEY or GEMINI_API_KEY on the server' };\n }\n if (lower.includes('invalid api key') || lower.includes('permission denied') || lower.includes('unauthorized')) {\n return { status: 502, code: 'provider_auth_failed', message: 'Provider authentication failed', hint: 'Verify your Google AI Studio API key' };\n }\n // Policy / moderation blocks from Gemini\n if (lower.includes('blockreason') || lower.includes('safety') || lower.includes('blocked') || lower.includes('policy')) {\n return { status: 422, code: 'policy_violation', message: 'Request was blocked by provider policy', hint: 'Modify the prompt to comply with safety policies' };\n }\n // No content returned (model refusal or empty)\n if (lower.includes('no inline image returned') || lower.includes('no video returned') || lower.includes('refus')) {\n return { status: 422, code: 'content_refused', message: 'Model refused or returned no content', hint: 'Try rephrasing the prompt' };\n }\n // Timeouts / rate limits\n if (lower.includes('timeout')) {\n return { status: 504, code: 'timeout', message: 'Generation timed out', hint: 'Please retry later' };\n }\n if (lower.includes('rate limit') || lower.includes('429')) {\n return { status: 429, code: 'rate_limited', message: 'Rate limit exceeded', hint: 'Slow down requests or try again shortly' };\n }\n // Fallback\n return { status: 500, code: 'internal_error', message: 'Failed to generate media' };\n}\n\n// Helper: verify Firebase ID token if firebase-admin is available; otherwise decode payload best-effort\nasync function decodeFirebaseToken(token: string): Promise<any | null> {\n try {\n // Dynamic import to avoid hard dep at build time\n const admin: any = await import('firebase-admin').catch(() => null);\n if (admin) {\n if (!admin.apps || admin.apps.length === 0) {\n try { admin.initializeApp(); } catch { /* ignore double init */ }\n }\n const decoded = await admin.auth().verifyIdToken(token, true);\n return decoded;\n }\n } catch {\n // ignore and fallback to unsafe decode\n }\n try {\n const parts = token.split('.');\n if (parts.length !== 3) return null;\n const payload = JSON.parse(Buffer.from(parts[1], 'base64').toString('utf8'));\n return payload;\n } catch {\n return null;\n }\n}\n\n// ---- Plan/Usage helpers (Firestore) ----\nfunction getCurrentPeriodId(): string {\n const now = new Date();\n return `${now.getUTCFullYear()}${String(now.getUTCMonth() + 1).padStart(2, '0')}`;\n}\n\nfunction nextMonthResetISO(): string {\n const d = new Date();\n d.setUTCMonth(d.getUTCMonth() + 1, 1);\n d.setUTCHours(0, 0, 0, 0);\n return d.toISOString();\n}\n\nconst PLAN_LIMITS: Record<string, { req: number; tokens: number; code: number; attachment: number }> = {\n free: { req: 300, tokens: 50000, code: 40, attachment: 5 },\n starter: { req: 1400, tokens: 1000000, code: 300, attachment: 50 },\n 'starter-annual': { req: 1400, tokens: 1000000, code: 300, attachment: 50 },\n pro: { req: 5000, tokens: 3500000, code: 1200, attachment: 200 },\n 'pro-annual': { req: 5000, tokens: 3500000, code: 1200, attachment: 200 },\n ultra: { req: 10000, tokens: 5000000, code: 5000, attachment: 500 },\n 'ultra-annual': { req: 10000, tokens: 5000000, code: 5000, attachment: 500 },\n enterprise: { req: -1, tokens: -1, code: -1, attachment: -1 },\n};\n\nfunction planName(planId: string): string {\n const names: Record<string, string> = {\n free: 'Free', starter: 'Starter', 'starter-annual': 'Starter (Annual)',\n pro: 'Pro', 'pro-annual': 'Pro (Annual)', ultra: 'Ultra', 'ultra-annual': 'Ultra (Annual)', enterprise: 'Enterprise'\n };\n return names[planId] || 'Free';\n}\n\nasync function getUserPlanAndLimits(uid: string): Promise<{ planId: string; limits: { req: number; tokens: number; code: number; attachment: number } }> {\n const db = await getFirestoreSafe();\n const fallback = { planId: 'free', limits: PLAN_LIMITS.free };\n if (!db) return fallback;\n try {\n const snap = await db.collection('user_subscriptions').doc(uid).get();\n const pid = (snap.exists && (snap.data() as any)?.planId) ? String((snap.data() as any).planId) : 'free';\n return { planId: pid, limits: PLAN_LIMITS[pid] || PLAN_LIMITS.free };\n } catch {\n return fallback;\n }\n}\n\nasync function ensureUsageDoc(uid: string): Promise<{ ref: any; data: any; planId: string; limits: { req: number; tokens: number; code: number; attachment: number } }> {\n const db = await getFirestoreSafe();\n if (!db) return { ref: null, data: null, planId: 'free', limits: PLAN_LIMITS.free };\n const periodId = getCurrentPeriodId();\n const { planId: pid, limits } = await getUserPlanAndLimits(uid);\n const ref = db.collection('users').doc(uid).collection('usage').doc(periodId);\n const snap = await ref.get();\n if (!snap.exists) {\n const nowISO = new Date().toISOString();\n const init = {\n periodId,\n createdAt: nowISO,\n updatedAt: nowISO,\n resetAt: nextMonthResetISO(),\n limits,\n remain: limits,\n used: { req: 0, tokens: 0, code: 0, attachment: 0 },\n };\n await ref.set(init, { merge: true });\n return { ref, data: init, planId: pid, limits };\n }\n return { ref, data: snap.data(), planId: pid, limits };\n}\n\nasync function applyConsumption(uid: string, consumption: Record<string, number>, idemKey?: string): Promise<any> {\n const db = await getFirestoreSafe();\n if (!db) return null;\n const { ref, data, planId: pid, limits } = await ensureUsageDoc(uid);\n const nowISO = new Date().toISOString();\n // Optional idempotency per-period\n if (idemKey) {\n const idemRef = ref.collection('consumptions').doc(idemKey);\n const idemSnap = await idemRef.get();\n if (!idemSnap.exists) await idemRef.set({ createdAt: nowISO, consumption });\n else return data; // already applied\n }\n const toNum = (v: unknown) => (typeof v === 'number' && isFinite(v) ? v : 0);\n const incReq = toNum(consumption.requests) + toNum((consumption as any).req);\n const incTokens = toNum((consumption as any).tokens);\n const incCode = toNum((consumption as any).code) + toNum((consumption as any).image) + toNum((consumption as any).video);\n const incAttachment = toNum((consumption as any).attachment);\n const used = data?.used || { req: 0, tokens: 0, code: 0, attachment: 0 };\n const newUsed = {\n req: Math.max(0, used.req + incReq),\n tokens: Math.max(0, used.tokens + incTokens),\n code: Math.max(0, used.code + incCode),\n attachment: Math.max(0, used.attachment + incAttachment),\n };\n const remain = {\n req: limits.req < 0 ? -1 : Math.max(0, limits.req - newUsed.req),\n tokens: limits.tokens < 0 ? -1 : Math.max(0, limits.tokens - newUsed.tokens),\n code: limits.code < 0 ? -1 : Math.max(0, limits.code - newUsed.code),\n attachment: limits.attachment < 0 ? -1 : Math.max(0, limits.attachment - newUsed.attachment),\n };\n await ref.set({ used: newUsed, remain, updatedAt: nowISO }, { merge: true });\n return { ...(data || {}), used: newUsed, remain, limits, periodId: getCurrentPeriodId(), updatedAt: nowISO };\n}\n\n/**\n * Auth: Get current user profile\n * Mirrors expected CLI contract at GET /api/user/profile\n */\napp.get('/api/user/profile', async (req: Request, res: Response) => {\n try {\n const authHeader = req.headers.authorization || '';\n if (!authHeader.startsWith('Bearer ')) {\n return res.status(401).json({ error: 'unauthorized' });\n }\n\n const idToken = authHeader.substring('Bearer '.length).trim();\n\n const decoded = await decodeFirebaseToken(idToken);\n if (!decoded) {\n return res.status(401).json({ error: 'invalid_token' });\n }\n\n // Extract identity\n const uid = decoded.uid || decoded.sub || 'unknown';\n const email = decoded.email || '';\n const displayName = decoded.name || decoded.displayName || (email ? String(email).split('@')[0] : 'User');\n let provider = decoded.firebase?.sign_in_provider as string | undefined;\n if (!provider && decoded.firebase?.identities) {\n const ids = decoded.firebase.identities as Record<string, unknown>;\n if (Array.isArray(ids['github.com']) && ids['github.com'].length > 0) provider = 'github';\n else if (Array.isArray(ids['google.com']) && ids['google.com'].length > 0) provider = 'google';\n }\n\n const { planId: pid, limits } = await getUserPlanAndLimits(uid);\n const periodRef = await ensureUsageDoc(uid);\n const currentUsedReq = Number(periodRef?.data?.used?.req || 0);\n const response = {\n id: uid,\n email,\n name: displayName,\n provider: provider || 'unknown',\n plan: String(pid).toUpperCase(),\n usage: {\n requests: currentUsedReq,\n requestLimit: limits.req < 0 ? Number.MAX_SAFE_INTEGER : limits.req,\n tokens: Number(periodRef?.data?.used?.tokens || 0),\n tokenLimit: limits.tokens < 0 ? Number.MAX_SAFE_INTEGER : limits.tokens,\n resetDate: periodRef?.data?.resetAt || nextMonthResetISO()\n },\n models: ['gpt-5', 'gemini-2.5-pro']\n };\n\n return res.status(200).json(response);\n } catch (error) {\n console.error('[User Profile] Error:', error);\n return res.status(500).json({ error: 'PROFILE_FETCH_FAILED' });\n }\n});\n\n/**\n * Minimal AI Proxy Endpoint\n * - Accepts { prompt, model?, provider? }\n * - Uses Secret Manager (ADC) to fetch API keys\n * - Currently supports provider: 'openai' (default)\n */\napp.post('/api/ai', rateLimitMiddleware, async (_req: Request, res: Response) => {\n return res.status(410).json({\n error: 'gone',\n message: 'This endpoint is deprecated. Please use /v1/ai-proxy.'\n });\n});\n\n/**\n * Research Endpoint with Gemini Grounding and Web Scraping\n * Body: { query?: string; url?: string; topK?: number }\n * Returns: { success, data: { summary, sources: [{ url, title? }] } }\n */\napp.post('/api/v1/research', rateLimitMiddleware, async (req: Request, res: Response) => {\n try {\n await loadProviderKeys();\n\n const auth = req.headers.authorization;\n if (!auth || !auth.startsWith('Bearer ')) {\n return res.status(401).json({ error: 'unauthorized', message: 'Login required' });\n }\n\n const body = (req.body || {}) as { query?: string; url?: string; topK?: number };\n const query = typeof body.query === 'string' ? body.query.trim() : '';\n const url = typeof body.url === 'string' ? body.url.trim() : '';\n const topK = Number.isFinite(body.topK) ? Math.max(1, Math.min(5, Math.floor(body.topK as number))) : 5;\n\n if (!query && !url) {\n return res.status(400).json({ error: 'bad_request', message: 'query or url required' });\n }\n\n // Helper: basic HTML -> text extraction (no external deps)\n const extractText = (html: string): string => {\n try {\n const withoutScripts = html.replace(/<script[\\s\\S]*?<\\/script>/gi, ' ').replace(/<style[\\s\\S]*?<\\/style>/gi, ' ');\n const noTags = withoutScripts.replace(/<[^>]+>/g, ' ');\n const unescaped = noTags\n .replace(/&nbsp;/g, ' ')\n .replace(/&amp;/g, '&')\n .replace(/&lt;/g, '<')\n .replace(/&gt;/g, '>')\n .replace(/&quot;/g, '\"')\n .replace(/&#39;/g, \"'\");\n return unescaped.replace(/\\s+/g, ' ').trim();\n } catch {\n return html;\n }\n };\n\n // Helper: fetch URL to text (with timeout)\n const fetchText = async (targetUrl: string): Promise<{ url: string; title?: string; text: string } | null> => {\n try {\n const ctrl = new AbortController();\n const to = setTimeout(() => ctrl.abort(), 20000);\n const r = await fetch(targetUrl, { method: 'GET', signal: ctrl.signal } as any);\n clearTimeout(to);\n if (!r.ok) return null;\n const html = await r.text();\n const titleMatch = /<title>([\\s\\S]*?)<\\/title>/i.exec(html);\n return { url: targetUrl, title: titleMatch ? titleMatch[1].trim() : undefined, text: extractText(html).slice(0, 120_000) };\n } catch {\n return null;\n }\n };\n\n // Resolve candidate sources\n let sources: Array<{ url: string; title?: string }> = [];\n let seedSummary = '';\n\n if (url) {\n sources = [{ url }];\n } else {\n // Use Gemini with grounding to get top web results\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const { GoogleGenAI } = require('@google/genai');\n const apiKey = process.env.GOOGLE_API_KEY || process.env.GEMINI_API_KEY;\n if (!apiKey) {\n return res.status(503).json({ error: 'provider_unavailable', message: 'Provider API key is not configured' });\n }\n const ai = new GoogleGenAI({ apiKey });\n const groundingTool = { googleSearch: {} };\n const config = { tools: [groundingTool] } as any;\n const modelName = process.env.MARIA_RESEARCH_MODEL || 'gemini-2.5-flash';\n const response: any = await ai.models.generateContent({ model: modelName, contents: String(query), config });\n const textOut: string = String((response?.text) || (response?.response?.candidates?.[0]?.content?.parts?.[0]?.text || ''));\n seedSummary = textOut;\n const chunks: any[] = (response?.response?.candidates?.[0]?.groundingMetadata?.groundingChunks || []) as any[];\n const urls = chunks\n .map((c: any) => ({ url: String(c?.web?.uri || '').trim(), title: String(c?.web?.title || '').trim() }))\n .filter((c: any) => c.url && /^https?:\\/\\//i.test(c.url));\n // De-duplicate by URL\n const seen = new Set<string>();\n const deduped: Array<{ url: string; title?: string }> = [];\n for (const c of urls) { if (!seen.has(c.url)) { seen.add(c.url); deduped.push(c); } }\n sources = deduped.slice(0, topK);\n }\n\n // Scrape top sources (or the single URL)\n const scraped: Array<{ url: string; title?: string; text: string }> = [];\n for (const s of sources) {\n const got = await fetchText(s.url);\n if (got) scraped.push({ url: got.url, title: got.title || s.title, text: got.text });\n }\n\n // Summarize scraped content in English plaintext\n const summarize = async (inputText: string): Promise<string> => {\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const { GoogleGenAI } = require('@google/genai');\n const apiKey = process.env.GOOGLE_API_KEY || process.env.GEMINI_API_KEY;\n if (!apiKey) return '';\n const ai = new GoogleGenAI({ apiKey });\n const modelName = process.env.MARIA_RESEARCH_MODEL || 'gemini-2.5-flash';\n const prompt = `Summarize the following web research into concise English plaintext.\\n- Focus on verifiable facts and key takeaways.\\n- Keep it under 12 sentences.\\n- Do not include markdown, just plain text.\\n\\nCONTENT BEGIN\\n${inputText}\\nCONTENT END`;\n const resp: any = await ai.models.generateContent({ model: modelName, contents: prompt });\n return String(resp?.text || resp?.response?.candidates?.[0]?.content?.parts?.[0]?.text || '').trim();\n };\n\n const combined = [seedSummary, ...scraped.map(s => `${s.title ? `${s.title}\\n` : ''}${s.text}`)]\n .filter(Boolean)\n .join('\\n\\n')\n .slice(0, 180_000);\n\n const summary = (await summarize(combined)) || (scraped[0]?.text?.slice(0, 600) || seedSummary || '');\n\n // Record usage minimally\n try {\n const idToken = auth.substring('Bearer '.length).trim();\n const decoded = await decodeFirebaseToken(idToken).catch(() => null as any);\n const uid = decoded?.uid || decoded?.sub || 'current';\n const idemKey = (req.headers['idempotency-key'] as string | undefined) || undefined;\n await applyConsumption(uid, { requests: 1 }, idemKey);\n } catch {}\n\n return res.json({ success: true, data: { summary, sources } });\n } catch (error) {\n console.error('[Research API] Error:', error);\n const mapped = classifyMediaError(error);\n return res.status(mapped.status).json({ error: mapped.code, message: mapped.message, hint: mapped.hint });\n }\n});\n\n/**\n * Auth: Revoke tokens\n * Expected by CLI at POST /api/auth/revoke\n */\napp.post('/api/auth/revoke', async (req: Request, res: Response) => {\n try {\n const authHeader = req.headers.authorization || '';\n if (!authHeader.startsWith('Bearer ')) {\n return res.status(401).json({ error: 'unauthorized' });\n }\n\n // Accept both fields used by CLI\n const { refresh_token, all_devices } = req.body || {};\n // TODO: Integrate with real session store/token revocation\n return res.status(200).json({ success: true, allDevices: Boolean(all_devices) });\n } catch (error) {\n console.error('[Auth Revoke] Error:', error);\n return res.status(500).json({ error: 'REVOCATION_FAILED' });\n }\n});\n\n// ===========================================\n// API ENDPOINTS WITH RATE LIMITING\n// ===========================================\n\n// ---- Secret Manager integration (lazy, cached) ----\nlet _keysCache: { openaiApiKey?: string; googleApiKey?: string } | null = null;\nasync function loadProviderKeys(): Promise<{ openaiApiKey?: string; googleApiKey?: string }> {\n if (_keysCache) return _keysCache;\n try {\n const { SecretManagerIntegration } = await import('../services/intelligent-model-selector/SecretManagerIntegration');\n const sm = new SecretManagerIntegration({\n projectId: process.env.GOOGLE_CLOUD_PROJECT || process.env.GCLOUD_PROJECT || 'maria-code-470602',\n secrets: {\n openAI: 'openai-api-key',\n googleAI: 'google-ai-api-key',\n },\n });\n const keys = await sm.getAllApiKeys().catch(() => ({} as any));\n _keysCache = {\n openaiApiKey: keys.openaiApiKey,\n googleApiKey: keys.googleApiKey,\n };\n if (_keysCache.googleApiKey && !process.env.GEMINI_API_KEY && !process.env.GOOGLE_API_KEY) {\n process.env.GEMINI_API_KEY = _keysCache.googleApiKey;\n }\n if (_keysCache.openaiApiKey && !process.env.OPENAI_API_KEY) {\n process.env.OPENAI_API_KEY = _keysCache.openaiApiKey;\n }\n } catch {\n _keysCache = {\n openaiApiKey: process.env.OPENAI_API_KEY,\n googleApiKey: process.env.GEMINI_API_KEY || process.env.GOOGLE_API_KEY,\n };\n }\n return _keysCache;\n}\n\n/**\n * Image Generation Endpoint\n */\napp.post('/api/v1/image', rateLimitMiddleware, async (req: Request, res: Response) => {\n try {\n await loadProviderKeys();\n const auth = req.headers.authorization;\n if (!auth || !auth.startsWith('Bearer ')) return res.status(401).json({ error: 'unauthorized', message: 'Login required', hint: 'Sign in and retry' });\n const idToken = auth.substring('Bearer '.length).trim();\n const decoded = await decodeFirebaseToken(idToken).catch(() => null as any);\n if (!decoded) return res.status(401).json({ error: 'unauthorized', message: 'Invalid login session', hint: 'Re-login to continue' });\n const uid = decoded?.uid || decoded?.sub || 'current';\n const { prompt, model, size = '1024x1024', format: formatRaw = 'png', count = 1, seed } = req.body || {};\n const fmt0 = String(formatRaw || 'png').toLowerCase();\n const format = (fmt0 === 'jpeg') ? 'jpg' : (['png','jpg','webp'].includes(fmt0) ? (fmt0 as 'png'|'jpg'|'webp') : 'png');\n if (!prompt) return res.status(400).json({ error: 'bad_request', message: 'prompt required' });\n const m = /^(\\d{2,4})x(\\d{2,4})$/.exec(String(size));\n if (!m) return res.status(400).json({ error: 'bad_request', message: 'size must be WxH' });\n const w = +m[1], h = +m[2];\n\n const provider = new GeminiMediaProvider();\n const started = Date.now();\n const buffers: Buffer[] = [];\n for (let i = 0; i < Math.max(1, Math.min(8, Number(count || 1))); i++) {\n const r = await provider.generateImage({ prompt, width: w, height: h, format, seed: (seed ?? 0) + i });\n // Align output to requested size/format using optional post-processing\n const processed = await (await import('../services/media-orchestrator/image-post')).processImageOptional(\n r.bytes,\n (String(format) as 'png'|'webp'|'jpg'),\n false,\n { width: w, height: h }\n );\n buffers.push(processed);\n }\n const promptHash = hashPrompt(prompt);\n const manifest: Omit<ManifestV1, 'manifestVersion'|'createdAt'> = {\n kind: 'image',\n request: { promptHash, seed, params: { size: [w,h], format, count }, model: model || 'gemini-2.5-flash-image-preview', provider: 'google' },\n artifacts: [],\n metrics: { durationMs: Date.now() - started, retries: 0, fallbacks: 0 },\n trace: Math.random().toString(36).slice(2,8).toUpperCase(),\n };\n const saved = await saveArtifacts({ root: process.cwd(), kind: 'image' }, buffers.map(b => ({ bytes: b, ext: `.${format}` })), manifest);\n jobIndex.set(String(manifest.trace), {\n id: String(manifest.trace),\n status: 'completed',\n kind: 'image',\n manifestPath: saved.manifestPath,\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n uid,\n });\n // Record usage: 1 request, image count mapped into command bucket\n const idemKey = (req.headers['idempotency-key'] as string | undefined) || undefined;\n await applyConsumption(uid, { requests: 1, image: Math.max(1, buffers.length) }, idemKey);\n // Inline small payloads for direct client save\n const filesInline = buffers.map((b, idx) => ({\n file: saved.files[idx] || '',\n mime: format === 'jpg' ? 'image/jpeg' : `image/${format}`,\n bytesBase64: b.toString('base64'),\n }));\n const publicUrl = saved.manifestPath.startsWith('/') ? saved.manifestPath : `/${saved.manifestPath}`;\n return res.json({ success: true, data: { url: publicUrl, files: saved.files, filesInline, jobId: manifest.trace } });\n } catch (error) {\n console.error('[Image API] Error:', error);\n const mapped = classifyMediaError(error);\n return res.status(mapped.status).json({ error: mapped.code, message: mapped.message, hint: mapped.hint });\n }\n});\n\n/**\n * Video Generation Endpoint\n */\napp.post('/api/v1/video', rateLimitMiddleware, async (req: Request, res: Response) => {\n try {\n await loadProviderKeys();\n const auth = req.headers.authorization;\n if (!auth || !auth.startsWith('Bearer ')) return res.status(401).json({ error: 'unauthorized', message: 'Login required', hint: 'Sign in and retry' });\n const { prompt, duration = 8, fps = 24, res: resStr = '1280x720', aspect: aspectStr, format = 'mp4', model, seed, provider: reqProvider } = req.body || {};\n if (!prompt) return res.status(400).json({ error: 'bad_request', message: 'prompt required' });\n // Accept WxH (legacy) or 720|1080 with optional aspect 16:9|9:16\n let w: number, h: number;\n const aspect = (typeof aspectStr === 'string' && (aspectStr === '16:9' || aspectStr === '9:16')) ? aspectStr : undefined;\n const sv = String(resStr).toLowerCase().replace(/p$/, '');\n const m = /^(\\d{2,4})x(\\d{2,4})$/.exec(String(resStr));\n if (m) {\n w = +m[1]; h = +m[2];\n } else if (sv === '720') {\n if (aspect === '9:16') { w = 720; h = 1280; } else { w = 1280; h = 720; }\n } else if (sv === '1080') {\n if (aspect === '9:16') { w = 1080; h = 1920; } else { w = 1920; h = 1080; }\n } else {\n return res.status(400).json({ error: 'bad_request', message: 'res must be WxH or 720|1080' });\n }\n // Determine plan and provider defaults\n const vidToken = auth.substring('Bearer '.length).trim();\n const vidDecoded = await decodeFirebaseToken(vidToken).catch(() => null as any);\n const vidUid = vidDecoded?.uid || vidDecoded?.sub || 'current';\n let isProOrAbove = false;\n try {\n const { planId: _pid } = await getUserPlanAndLimits(vidUid);\n const p = String(_pid || 'free').toLowerCase();\n isProOrAbove = ['pro','pro-annual','ultra','ultra-annual','enterprise'].includes(p);\n } catch {}\n const requestedProvider = typeof reqProvider === 'string' ? reqProvider.toLowerCase() : undefined;\n const requestedModel = typeof model === 'string' ? String(model).trim().toLowerCase() : undefined;\n const providerFromModel: 'openai' | 'google' | undefined = (() => {\n if (!requestedModel) return undefined;\n if (requestedModel.startsWith('sora')) return 'openai';\n if (requestedModel.startsWith('veo') || requestedModel.startsWith('gemini')) return 'google';\n return undefined;\n })();\n const openaiKey = process.env.OPENAI_API_KEY;\n // Decide provider with precedence: explicit model -> explicit provider -> plan default\n const goOpenAI = (providerFromModel === 'openai')\n || (requestedProvider === 'openai')\n || (!providerFromModel && !requestedProvider && (isProOrAbove && !!openaiKey));\n\n // Prefer OpenAI Sora when selected, fallback to Veo\n if (goOpenAI && openaiKey) {\n const OpenAI = (await import('openai')).default;\n const client = new OpenAI({ apiKey: openaiKey });\n const soraModel = (requestedModel && requestedModel.startsWith('sora')) ? requestedModel : 'sora-2';\n // Sora 2 currently accepts only \"4\", \"8\", \"12\" as strings for seconds\n const secondsStr: string = (() => {\n const d = Number(duration) || 8;\n if (d <= 4) return '4';\n if (d <= 8) return '8';\n return '12';\n })();\n const size = `${w}x${h}`;\n const startedMs = Date.now();\n // Create job and poll\n let job: any;\n try {\n job = await (client as any).videos.create({ model: soraModel, prompt: String(prompt), seconds: secondsStr, size });\n } catch (e) {\n try { console.warn('[Video API][Sora] videos.create failed:', (e as any)?.message || String(e)); } catch {}\n throw e;\n }\n let safetyDeadline = Date.now() + 720_000;\n while (job && (job.status === 'queued' || job.status === 'in_progress')) {\n if (Date.now() > safetyDeadline) return res.status(504).json({ error: 'timeout', message: 'video generation timed out' });\n await new Promise(r => setTimeout(r, 8000));\n job = await (client as any).videos.retrieve(job.id);\n }\n if (!job || job.status !== 'completed') {\n return res.status(500).json({ error: 'internal_error', message: `video generation failed: ${job?.status || 'unknown'}` });\n }\n // Download content\n // Retry-safe download with exponential backoff for transient 5xx / network\n const downloadWithBackoff = async (): Promise<Buffer> => {\n let delay = 2000;\n for (let i = 0; i < 6; i++) {\n try {\n const content = await (client as any).videos.downloadContent(job.id);\n const ab = await (content as any).arrayBuffer();\n return Buffer.from(ab);\n } catch (e) {\n if (i === 5) throw e;\n await new Promise(r => setTimeout(r, delay));\n delay = Math.min(15000, Math.floor(delay * 1.8));\n }\n }\n throw new Error('download failed after retries');\n };\n const videoBytes = await downloadWithBackoff();\n const outExt = '.mp4';\n const traceId = Math.random().toString(36).slice(2,8).toUpperCase();\n const promptHash = hashPrompt(prompt);\n const manifest: Omit<ManifestV1, 'manifestVersion'|'createdAt'> = {\n kind: 'video',\n request: { promptHash, seed, params: { size: [w,h], fps: Number(fps) || 24, duration: Number(secondsStr), format: 'mp4' }, model: soraModel, provider: 'openai' as const },\n artifacts: [],\n metrics: { durationMs: Date.now() - startedMs, retries: 0, fallbacks: 0 },\n trace: traceId,\n };\n const baseDir = path.join('artifacts', 'media', 'videos', traceId);\n const saved = await saveArtifacts({ root: process.cwd(), kind: 'video', baseDir, flat: true, trace: traceId }, [{ bytes: videoBytes, ext: outExt, logicalName: 'video' }], manifest);\n const idemKey = (req.headers['idempotency-key'] as string | undefined) || undefined;\n await applyConsumption(vidUid, { requests: 1, video: 1 }, idemKey);\n jobIndex.set(String(manifest.trace), { id: String(manifest.trace), status: 'completed', kind: 'video', manifestPath: saved.manifestPath, createdAt: new Date().toISOString(), updatedAt: new Date().toISOString(), uid: vidUid });\n const publicUrl = saved.manifestPath.startsWith('/') ? saved.manifestPath : `/${saved.manifestPath}`;\n return res.json({ success: true, data: { url: publicUrl || (saved.files[0] ? `/${saved.files[0]}` : undefined), files: saved.files, jobId: manifest.trace, applied: { durationSeconds: Number(secondsStr), frameRate: Number(fps) || 24 } } });\n }\n\n // Fallback: Use Google GenAI Veo 3 for video generation\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const { GoogleGenAI } = require('@google/genai');\n const apiKey = process.env.GOOGLE_API_KEY || process.env.GEMINI_API_KEY;\n if (!apiKey) return res.status(503).json({ error: 'provider_unavailable', message: 'Provider API key is not configured', hint: 'Set GOOGLE_API_KEY or GEMINI_API_KEY on the server' });\n const ai = new GoogleGenAI({ apiKey });\n const veoModel = (model && String(model).trim()) || process.env.MARIA_VIDEO_MODEL || 'veo-3.1-generate-preview';\n // Map size to aspect ratio per Veo 3.1 spec\n const aspectRatio = w >= h ? '16:9' : '9:16';\n\n const startedMs = Date.now();\n // Veo 3.1: 1080p fixed 8s; 720p allows 4/6/8\n const requestedDuration = Number(duration);\n const maxEdge = Math.max(w, h);\n const is1080 = maxEdge >= 1920;\n const effectiveDuration = (() => {\n if (is1080) return 8;\n const d = Number.isFinite(requestedDuration) ? Math.floor(requestedDuration) : 8;\n if (d <= 4) return 4;\n if (d <= 6) return 6;\n return 8;\n })();\n // Frame rate sanity (clamp 1..60, default 24)\n const requestedFps = Number(fps);\n const effectiveFps = Number.isFinite(requestedFps) ? Math.min(60, Math.max(1, Math.floor(requestedFps))) : 24;\n\n // Map requested size to discrete provider resolution (not passed, just for internal logic)\n const resolution = Math.max(w, h) >= 1920 ? '1080p' : '720p';\n let operation = await ai.models.generateVideos({\n model: veoModel,\n prompt: String(prompt),\n // Pass aspect + resolution + duration/fps explicitly -> resolution is not supported in veo3\n config: { aspectRatio, /* resolution: resolution, */ durationSeconds: effectiveDuration, frameRate: effectiveFps }\n });\n\n // Poll until done (official guidance ~ up to 6 minutes; use a safe cap)\n const deadline = Date.now() + 900_000; // extend to 15 minutes for large jobs\n while (!(operation as any)?.done) {\n if (Date.now() > deadline) {\n return res.status(504).json({ error: 'timeout', message: 'video generation timed out' });\n }\n await new Promise(r => setTimeout(r, 12000));\n operation = await ai.operations.getVideosOperation({ operation });\n }\n // Give the file service a short settle time before first download attempt\n await new Promise(r => setTimeout(r, 2500));\n\n const videoRef = (operation as any)?.response?.generatedVideos?.[0]?.video;\n const videoMime: string | undefined = (videoRef && (videoRef.mimeType || videoRef.mime_type)) ? String(videoRef.mimeType || videoRef.mime_type) : undefined;\n if (!videoRef) {\n return res.status(500).json({ error: 'internal_error', message: 'no video returned by provider' });\n }\n\n const traceId = Math.random().toString(36).slice(2,8).toUpperCase();\n const tmpDir = path.join(process.cwd(), '.stage', traceId);\n await fs.mkdir(tmpDir, { recursive: true });\n const tmpOut = path.join(tmpDir, 'video.bin');\n\n // Robust download with SDK first, then manual fetch fallback\n const dlApiKey = process.env.GOOGLE_API_KEY || process.env.GEMINI_API_KEY || '';\n\n const isLikelyValidVideo = async (buf: Buffer): Promise<boolean> => {\n if (!buf || buf.length < 16) return false;\n const head = buf.subarray(0, Math.min(256, buf.length));\n const headStr = head.toString('latin1');\n const hasFtyp = headStr.indexOf('ftyp') >= 0 || head.includes(Buffer.from('ftyp', 'ascii'));\n const isWebm = head[0] === 0x1A && head[1] === 0x45 && head[2] === 0xDF && head[3] === 0xA3;\n const looksHtml = headStr.includes('<!doctype') || headStr.includes('<html') || headStr.includes('<?xml');\n return (hasFtyp || isWebm) && !looksHtml;\n };\n\n const readUint32BE = (buf: Buffer, off: number): number => ((buf[off] << 24) | (buf[off+1] << 16) | (buf[off+2] << 8) | buf[off+3]) >>> 0;\n const readUint64BE = (buf: Buffer, off: number): number => {\n const hi = readUint32BE(buf, off);\n const lo = readUint32BE(buf, off + 4);\n // clamp to Number max safe\n return hi * 2 ** 32 + lo;\n };\n const tryParseMp4DurationSec = (buf: Buffer): number | null => {\n try {\n // Scan for 'mvhd' atom (Movie Header Box)\n for (let i = 0; i + 8 < buf.length; ) {\n const size = readUint32BE(buf, i);\n const type = buf.subarray(i + 4, i + 8).toString('latin1');\n if (!size || size < 8) break;\n if (type === 'moov') {\n // dive inside moov\n const end = Math.min(buf.length, i + size);\n let j = i + 8;\n while (j + 8 < end) {\n const sz = readUint32BE(buf, j);\n const tp = buf.subarray(j + 4, j + 8).toString('latin1');\n if (!sz || sz < 8) break;\n if (tp === 'mvhd') {\n const ver = buf[j + 8];\n if (ver === 1) {\n const timescale = readUint32BE(buf, j + 28);\n const duration = readUint64BE(buf, j + 32);\n if (timescale > 0) return duration / timescale;\n } else {\n const timescale = readUint32BE(buf, j + 20);\n const duration = readUint32BE(buf, j + 24);\n if (timescale > 0) return duration / timescale;\n }\n break;\n }\n j += sz;\n }\n break;\n }\n i += size;\n }\n } catch {}\n return null;\n };\n\n const hasAtom = (buf: Buffer, atom: string): boolean => {\n const tgt = Buffer.from(atom, 'latin1');\n return buf.indexOf(tgt) !== -1;\n };\n\n const validateVideoBytes = (buf: Buffer): { kind: 'mp4'|'mov'|'webm'|'unknown'; ok: boolean; durationSec: number | null; reason?: string } => {\n if (!buf || buf.length < 1024) return { kind: 'unknown', ok: false, durationSec: null, reason: 'too_small' };\n const header = buf.subarray(0, 256);\n const headerStr = header.toString('latin1');\n const hasFtyp = headerStr.indexOf('ftyp') >= 0 || header.includes(Buffer.from('ftyp', 'ascii'));\n const isWebm = header[0] === 0x1A && header[1] === 0x45 && header[2] === 0xDF && header[3] === 0xA3;\n if (isWebm) {\n // Accept WebM when header matches and size appears reasonable\n return { kind: 'webm', ok: buf.length > 200_000, durationSec: null };\n }\n if (hasFtyp) {\n const majorBrand = header.subarray(8, 12).toString('latin1').toLowerCase();\n const kind: 'mp4'|'mov' = majorBrand.startsWith('qt') ? 'mov' : 'mp4';\n // Require 'moov' atom present and duration near requested\n const hasMoov = hasAtom(buf, 'moov');\n const dur = tryParseMp4DurationSec(buf);\n const nearTarget = typeof dur === 'number' ? (dur + 0.75 /*slack*/ >= effectiveDuration) : false;\n const ok = hasMoov && nearTarget;\n return { kind, ok, durationSec: dur, reason: ok ? undefined : (!hasMoov ? 'missing_moov' : 'short_duration') };\n }\n return { kind: 'unknown', ok: false, durationSec: null, reason: 'unknown_header' };\n };\n\n const ensureFileMaterialized = async (p: string, waitMs = 45000): Promise<void> => {\n const deadline = Date.now() + waitMs;\n let lastSize = -1;\n let stableCount = 0;\n // eslint-disable-next-line no-constant-condition\n while (true) {\n try {\n const st = await fs.stat(p);\n if (st && st.size > 0) {\n if (st.size === lastSize) {\n stableCount++;\n if (stableCount >= 5) return; // ~1s stability at 200ms interval\n } else {\n stableCount = 0;\n lastSize = st.size;\n }\n }\n } catch {}\n if (Date.now() > deadline) throw new Error(`video file not fully materialized: ${p}`);\n await new Promise(r => setTimeout(r, 200));\n }\n };\n\n const trySdkDownloadOnce = async (): Promise<Buffer | null> => {\n try {\n await ai.files.download({ file: videoRef, downloadPath: tmpOut });\n await ensureFileMaterialized(tmpOut, 45000);\n const bytes = await fs.readFile(tmpOut);\n if (await isLikelyValidVideo(bytes)) return bytes;\n } catch {}\n return null;\n };\n\n // Manual fetch fallback using direct URI when SDK path fails\n const tryManualDownload = async (): Promise<Buffer | null> => {\n try {\n const fileObj: any = videoRef as any;\n const direct = fileObj?.uri || fileObj?.url || fileObj?.downloadUri || fileObj?.downloadUrl || '';\n if (!direct || typeof direct !== 'string') return null;\n const res = await fetch(direct, {\n method: 'GET',\n headers: dlApiKey ? { 'x-goog-api-key': dlApiKey } as any : undefined,\n redirect: 'follow',\n } as any);\n if (!res.ok) return null;\n const lenHeader = res.headers?.get?.('content-length');\n const expectedLen = lenHeader ? Number(lenHeader) : undefined;\n const ab = await res.arrayBuffer();\n const buf = Buffer.from(ab);\n if (typeof expectedLen === 'number' && Number.isFinite(expectedLen) && expectedLen > 0 && buf.length !== expectedLen) {\n // size mismatch -> treat as invalid\n return null;\n }\n await fs.writeFile(tmpOut, buf);\n if (await isLikelyValidVideo(buf)) return buf;\n } catch {}\n return null;\n };\n\n // Robust acquire loop: prefer SDK, fallback to manual, validate duration/moov\n let videoBytes: Buffer | null = null;\n const maxAttempts = 15; // tolerate slower file availability\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n let bytes: Buffer | null = await trySdkDownloadOnce();\n if (!bytes) bytes = await tryManualDownload();\n if (bytes && await isLikelyValidVideo(bytes)) {\n const v = validateVideoBytes(bytes);\n if (v.ok) { videoBytes = bytes; break; }\n }\n // backoff then retry\n await new Promise(r => setTimeout(r, Math.min(12000, 1800 * attempt)));\n }\n if (!videoBytes) throw new Error('failed to obtain fully materialized video');\n // Detect container & decide extension\n const header = videoBytes.subarray(0, 256);\n const headerStr = header.toString('latin1');\n let outExt = '.mp4';\n let outMime = 'video/mp4';\n // MP4 typically contains 'ftyp' at bytes 4-7\n // Detect 'ftyp' anywhere in the first 256 bytes to determine MP4\n const hasFtyp = headerStr.indexOf('ftyp') >= 0 || header.includes(Buffer.from('ftyp', 'ascii'));\n // WebM/Matroska starts with 0x1A 0x45 0xDF 0xA3\n const isWebm = header[0] === 0x1A && header[1] === 0x45 && header[2] === 0xDF && header[3] === 0xA3;\n if (videoMime && /webm/i.test(videoMime)) { outExt = '.webm'; outMime = 'video/webm'; }\n else if (videoMime && /quicktime/i.test(videoMime)) { outExt = '.mov'; outMime = 'video/quicktime'; }\n else if (isWebm) { outExt = '.webm'; outMime = 'video/webm'; }\n else if (hasFtyp) {\n // Inspect major brand to distinguish MOV vs MP4\n const majorBrand = header.subarray(8, 12).toString('latin1');\n if ((majorBrand || '').toLowerCase().startsWith('qt')) { outExt = '.mov'; outMime = 'video/quicktime'; }\n else { outExt = '.mp4'; outMime = 'video/mp4'; }\n }\n await fs.rm(tmpDir, { recursive: true, force: true });\n\n const promptHash = hashPrompt(prompt);\n const manifest: Omit<ManifestV1, 'manifestVersion'|'createdAt'> = {\n kind: 'video',\n request: { promptHash, seed, params: { size: [w,h], fps: effectiveFps, duration: effectiveDuration, format: outExt.replace('.', '') }, model: veoModel, provider: 'google' as const },\n artifacts: [],\n metrics: { durationMs: Date.now() - startedMs, retries: 0, fallbacks: 0 },\n trace: traceId,\n };\n\n // Save shallow path: artifacts/media/videos/{traceId}/<file>\n const baseDir = path.join('artifacts', 'media', 'videos', traceId);\n const saved = await saveArtifacts({ root: process.cwd(), kind: 'video', baseDir, flat: true }, [{ bytes: videoBytes, ext: outExt }], manifest);\n const idemKey = (req.headers['idempotency-key'] as string | undefined) || undefined;\n const idToken = auth.substring('Bearer '.length).trim();\n const decoded = await decodeFirebaseToken(idToken).catch(() => null as any);\n const uid = decoded?.uid || decoded?.sub || 'current';\n await applyConsumption(uid, { requests: 1, video: 1 }, idemKey);\n jobIndex.set(String(manifest.trace), {\n id: String(manifest.trace),\n status: 'completed',\n kind: 'video',\n manifestPath: saved.manifestPath,\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n uid,\n });\n return res.json({ success: true, data: { url: saved.manifestPath || (saved.files[0] ? `/${saved.files[0]}` : undefined), files: saved.files, jobId: manifest.trace, applied: { durationSeconds: effectiveDuration, frameRate: effectiveFps } } });\n } catch (error) {\n console.error('[Video API] Error:', error);\n const mapped = classifyMediaError(error);\n return res.status(mapped.status).json({ error: mapped.code, message: mapped.message, hint: mapped.hint });\n }\n});\n\n/**\n * Job Status Endpoint\n * GET /api/v1/jobs/:id -> { id, status, kind, manifestPath, manifest? }\n */\napp.get('/api/v1/jobs/:id', async (req: Request, res: Response) => {\n try {\n const auth = req.headers.authorization;\n if (!auth || !auth.startsWith('Bearer ')) return res.status(401).json({ error: 'unauthorized' });\n const idToken = auth.substring('Bearer '.length).trim();\n const decoded = await decodeFirebaseToken(idToken).catch(() => null as any);\n const uid = decoded?.uid || decoded?.sub || 'current';\n const id = String(req.params.id || '').trim();\n if (!id) return res.status(400).json({ error: 'bad_request', message: 'id required' });\n const info = jobIndex.get(id);\n if (!info || (info.uid && info.uid !== uid)) return res.status(404).json({ error: 'not_found', message: 'job not found' });\n\n let manifest: any | undefined;\n if (info.manifestPath) {\n try {\n const full = path.resolve(process.cwd(), info.manifestPath);\n const txt = await fs.readFile(full, 'utf8');\n manifest = JSON.parse(txt);\n } catch {\n // ignore\n }\n }\n\n return res.json({\n id: info.id,\n status: info.status,\n kind: info.kind,\n manifestPath: info.manifestPath,\n manifest,\n createdAt: info.createdAt,\n updatedAt: info.updatedAt,\n });\n } catch (error) {\n console.error('[Jobs API] Error:', error);\n return res.status(500).json({ error: 'internal_error', message: 'failed to fetch job' });\n }\n});\n\n/**\n * Code Generation Endpoint\n */\napp.post('/api/v1/code', rateLimitMiddleware, async (req: Request, res: Response) => {\n try {\n const auth = req.headers.authorization;\n if (!auth || !auth.startsWith('Bearer ')) return res.status(401).json({ error: 'unauthorized' });\n const idToken = auth.substring('Bearer '.length).trim();\n const decoded = await decodeFirebaseToken(idToken).catch(() => null as any);\n if (!decoded) return res.status(401).json({ error: 'unauthorized' });\n const uid = decoded?.uid || decoded?.sub;\n // Determine plan (Pro+ uses GPT-5 as default; others use GPT-5-mini)\n let isProOrAbove = false;\n try {\n const { planId: _pid } = await getUserPlanAndLimits(uid);\n const p = String(_pid || 'free').toLowerCase();\n isProOrAbove = ['pro','pro-annual','ultra','ultra-annual','enterprise'].includes(p);\n } catch {}\n\n const { prompt, language = 'typescript', model = 'gpt-4' } = req.body;\n \n if (!prompt) {\n return res.status(400).json({\n error: 'bad_request',\n message: 'Prompt is required'\n });\n }\n \n // TODO: Implement actual code generation logic\n // Record usage: count as one request and one code command\n const idemKey = (req.headers['idempotency-key'] as string | undefined) || undefined;\n await applyConsumption(uid, { requests: 1, code: 1 }, idemKey);\n\n return res.json({\n success: true,\n data: {\n code: `// Generated code for: ${prompt}\\nfunction example() {\\n return \"Generated by MARIA CODE\";\\n}`,\n language,\n model,\n prompt,\n createdAt: new Date().toISOString()\n }\n });\n } catch (error) {\n console.error('[Code API] Error:', error);\n return res.status(500).json({\n error: 'internal_error',\n message: 'Failed to generate code'\n });\n }\n});\n\n/**\n * Chat Endpoint\n */\napp.post('/api/v1/chat', rateLimitMiddleware, async (req: Request, res: Response) => {\n try {\n const auth = req.headers.authorization;\n if (!auth || !auth.startsWith('Bearer ')) return res.status(401).json({ error: 'unauthorized' });\n const idToken = auth.substring('Bearer '.length).trim();\n const decoded = await decodeFirebaseToken(idToken).catch(() => null as any);\n if (!decoded) return res.status(401).json({ error: 'unauthorized' });\n const uid = decoded?.uid || decoded?.sub;\n\n const { message, model = 'gemini-2.5-flash', messages } = req.body || {};\n // Accept both single message and array of messages (OpenAI-like)\n let effectiveMessage: string | undefined = undefined;\n if (typeof message === 'string' && message.trim()) {\n effectiveMessage = String(message).trim();\n } else if (Array.isArray(messages)) {\n try {\n // Prefer last user message content; fallback to join all\n const lastUser = [...messages].reverse().find((m: any) => (m?.role || '').toLowerCase() === 'user');\n effectiveMessage = (lastUser?.content && String(lastUser.content)) || messages.map((m: any) => String(m?.content || '')).filter(Boolean).join('\\n');\n } catch {}\n }\n if (!effectiveMessage) {\n return res.status(400).json({ error: 'bad_request', message: 'message or messages is required' });\n }\n \n // TODO: Implement actual chat logic (proxy to provider)\n // Record usage: 1 request. If token usage is known, include tokens\n const idemKey = (req.headers['idempotency-key'] as string | undefined) || undefined;\n await applyConsumption(uid, { requests: 1 }, idemKey);\n\n return res.json({\n success: true,\n data: {\n response: `Echo: ${effectiveMessage}`,\n model,\n createdAt: new Date().toISOString()\n }\n });\n } catch (error) {\n console.error('[Chat API] Error:', error);\n return res.status(500).json({\n error: 'internal_error',\n message: 'Failed to process chat'\n });\n }\n});\n\n// AI proxy for /code using OpenAI GPT (server-side OPENAI_API_KEY)\napp.post('/v1/ai-proxy', rateLimitMiddleware, async (req: Request, res: Response) => {\n try {\n const auth = req.headers.authorization;\n if (!auth || !auth.startsWith('Bearer ')) return res.status(401).json({ error: 'unauthorized' });\n const { prompt, taskType, research, messages, provider: reqProvider, model: reqModel } = req.body || {};\n // Derive effective prompt\n let effectivePrompt: string | undefined = undefined;\n if (typeof prompt === 'string' && prompt.trim()) {\n effectivePrompt = String(prompt).trim();\n } else if (Array.isArray(messages)) {\n try {\n const lastUser = [...messages].reverse().find((m: any) => (m?.role || '').toLowerCase() === 'user');\n effectivePrompt = (lastUser?.content && String(lastUser.content)) || messages.map((m: any) => String(m?.content || '')).filter(Boolean).join('\\n');\n } catch {}\n }\n if (!effectivePrompt && !(taskType === 'research' && research?.query)) return res.status(400).json({ error: 'bad_request', message: 'prompt or messages or research.query required' });\n const idToken = auth.substring('Bearer '.length).trim();\n const decoded = await decodeFirebaseToken(idToken).catch(() => null as any);\n if (!decoded) return res.status(401).json({ error: 'unauthorized' });\n const uid = decoded?.uid || decoded?.sub;\n const idemKey = (req.headers['idempotency-key'] as string | undefined) || undefined;\n if (process.env.MARIA_TELEMETRY === '1') {\n try {\n const attCount = Array.isArray((req.body?.metadata || {}).attachments) ? ((req.body.metadata.attachments as any[]) || []).filter(Boolean).length : 0;\n console.log(JSON.stringify({ ev: 'ai_proxy_request', taskType: taskType || 'unknown', promptLen: String(effectivePrompt || research?.query || '').length, requestedProvider: reqProvider || null, requestedModel: reqModel || null, attachments: attCount }));\n } catch {}\n }\n // Helper: sanitize API keys (trim, strip quotes/Bearer prefix)\n const sanitizeKey = (v?: string | null): string | undefined => {\n if (!v) return undefined;\n let k = String(v).trim();\n if (!k) return undefined;\n // Remove surrounding quotes often present in env\n if ((k.startsWith('\"') && k.endsWith('\"')) || (k.startsWith(\"'\") && k.endsWith(\"'\"))) {\n k = k.slice(1, -1);\n }\n // Strip accidental Bearer prefix\n if (/^Bearer\\s+/i.test(k)) k = k.replace(/^Bearer\\s+/i, '');\n // Reject placeholders\n if (/your_.*key|example|placeholder/i.test(k)) return undefined;\n // Disallow whitespace/newlines in header values\n if (/\\s/.test(k)) k = k.replace(/\\s+/g, '');\n return k || undefined;\n };\n\n // Prefer Gemini when valid key provided; fallback to OpenAI only when its key is valid\n const keys = await (async () => {\n try { return await (global as any).___maria_keys ?? await (async () => { const k = await (await import('../services/intelligent-model-selector/SecretManagerIntegration')).SecretManagerIntegration; const sm = new k({ projectId: process.env.GOOGLE_CLOUD_PROJECT || process.env.GCLOUD_PROJECT || 'maria-code-470602', secrets: { openAI: 'openai-api-key', googleAI: 'google-ai-api-key' } }); const all = await sm.getAllApiKeys().catch(() => ({} as any)); (global as any).___maria_keys = all; return all; })(); } catch { return {}; } })();\n const gemKey = sanitizeKey((keys as any)?.googleApiKey || process.env.GEMINI_API_KEY || process.env.GOOGLE_API_KEY);\n const requestedProvider = typeof reqProvider === 'string' ? reqProvider.toLowerCase() : undefined;\n const requestedModel = typeof reqModel === 'string' ? String(reqModel).trim() : undefined;\n // Determine plan (Pro+ prefers OpenAI by default)\n let isProOrAbove = false;\n try {\n const { planId: _pid } = await getUserPlanAndLimits(uid);\n const p = String(_pid || 'free').toLowerCase();\n isProOrAbove = ['pro','pro-annual','ultra','ultra-annual','enterprise'].includes(p);\n } catch {}\n\n // Local-first path: Enterprise local-only, or LOCAL_MODE=1 when no explicit non-local provider\n let isEnterprise = false;\n try {\n const { planId: _pid } = await getUserPlanAndLimits(uid);\n isEnterprise = String(_pid || 'free').toLowerCase() === 'enterprise';\n } catch {}\n\n // Enterprise: do not allow server-side local CLI/HTTP spawning; rely on client-local short-circuit\n if (isEnterprise && requestedProvider && !['lmstudio','ollama'].includes(requestedProvider)) {\n return res.status(403).json({ error: 'enterprise_local_only', message: 'Enterprise plan requires local LLM only' });\n }\n\n // SSOT routing policy\n const { determineRouting } = await import('../services/routing/model-routing');\n const decision = determineRouting({\n requestedModel,\n requestedProvider,\n taskType,\n isProOrAbove,\n hasGeminiKey: !!gemKey,\n hasOpenAIKey: !!((keys as any)?.openaiApiKey || process.env.OPENAI_API_KEY),\n } as any);\n\n if (decision.error) {\n const map: any = { missing_key: 503, unknown_model: 400, no_provider_available: 503 };\n const status = map[decision.error] || 400;\n return res.status(status).json({ error: decision.error, message: decision.message });\n }\n const effectiveProvider = decision.provider as 'google' | 'openai';\n const effectiveModel = decision.model as string | undefined;\n\n if (effectiveProvider === 'google') {\n try {\n const { GoogleGenerativeAI } = await import('@google/generative-ai');\n const ai = new GoogleGenerativeAI(gemKey as string);\n const modelName = effectiveModel || 'gemini-2.5-flash';\n const model = ai.getGenerativeModel({ model: modelName });\n let content = '';\n\n if (taskType === 'research' && research?.query) {\n // Use Gemini grounding via googleSearch tool\n const tool = { googleSearch: {} } as any;\n const r: any = await (ai as any).models.generateContent({ model: modelName, contents: String(research.query), config: { tools: [tool] } });\n content = String((r?.text?.()) || r?.text || r?.response?.candidates?.[0]?.content?.parts?.[0]?.text || '');\n } else {\n // Standard prompt path with optional attachments\n const attachments = Array.isArray((req.body?.metadata || {}).attachments)\n ? ((req.body.metadata.attachments as any[]) || []).filter(Boolean)\n : [];\n const parts: any[] = [{ text: String(effectivePrompt || '') }];\n for (const a of attachments) {\n try {\n const b64 = String(a.data_base64 || '');\n const mime = String(a.mime || 'application/octet-stream');\n if (!b64) continue;\n // Gemini inlineData 最大サイズの安全域として ~10MB 未満を推奨\n if (Buffer.byteLength(b64, 'base64') > 10 * 1024 * 1024) continue;\n parts.push({ inlineData: { data: b64, mimeType: mime } });\n } catch {}\n }\n const resp = await model.generateContent({ contents: [{ role: 'user', parts }] });\n content = resp?.response?.text?.() || resp?.response?.candidates?.[0]?.content?.parts?.[0]?.text || '';\n }\n if (process.env.MARIA_TELEMETRY === '1') {\n try { console.log(JSON.stringify({ ev: 'ai_proxy_route', vendor: 'google', model: modelName, empty: !content })); } catch {}\n }\n // Usage: 1 request; tokens unknown for Gemini SDK. Count code when taskType suggests code/evaluation\n const consumption: Record<string, number> = { requests: 1 };\n if (taskType === 'code' || taskType === 'evaluation') consumption.code = 1;\n try { await applyConsumption(uid, consumption, idemKey); } catch {}\n return res.json({ data: { content, routedModel: { vendor: 'google', family: 'gemini', name: modelName, reason: taskType || 'code' } } });\n } catch (e) {\n const msg = (e as any)?.message || 'Google provider request failed';\n if (process.env.MARIA_TELEMETRY === '1') {\n try { console.log(JSON.stringify({ ev: 'ai_proxy_google_error', message: (e as any)?.message || String(e) })); } catch {}\n }\n return res.status(502).json({ error: 'provider_error', message: String(msg) });\n }\n }\n\n if (effectiveProvider === 'openai') {\n const openaiKey = sanitizeKey((keys as any)?.openaiApiKey || process.env.OPENAI_API_KEY);\n if (!openaiKey) {\n if (process.env.MARIA_TELEMETRY === '1') {\n try { console.log(JSON.stringify({ ev: 'ai_proxy_no_keys' })); } catch {}\n }\n return res.status(503).json({ error: 'provider_unavailable', message: 'No valid OpenAI API key' });\n }\n const OpenAI = (await import('openai')).default;\n const client = new OpenAI({ apiKey: openaiKey });\n let model = effectiveModel || (isProOrAbove ? 'gpt-5' : 'gpt-5-mini');\n let content = '';\n let totalTokens = 0;\n const attachments = Array.isArray((req.body?.metadata || {}).attachments)\n ? ((req.body.metadata.attachments as any[]) || []).filter(Boolean)\n : [];\n try {\n if (attachments.length > 0) {\n // Create a vector store and upload text-like attachments for file search\n const vs = await client.vectorStores.create({ name: `ai-proxy-${uid}-${Date.now()}` } as any);\n for (const a of attachments) {\n try {\n const b64 = String(a.data_base64 || '');\n if (!b64) continue;\n const buffer = Buffer.from(b64, 'base64');\n const filename = a.name || 'attachment.txt';\n const toFile = (OpenAI as any).toFile;\n const fileInput = toFile ? await toFile(buffer, filename) : buffer as any;\n const file = await client.files.create({ file: fileInput, purpose: 'assistants' } as any);\n await (client as any).vectorStores.files.create((vs as any).id, { file_id: (file as any).id });\n } catch {}\n }\n const r = await client.responses.create({\n model,\n input: String(effectivePrompt || ''),\n tools: [{ type: 'file_search', vector_store_ids: [(vs as any).id] }] as any,\n } as any);\n content = (r as any)?.output_text || (r as any)?.content?.[0]?.text || '';\n const u: any = (r as any)?.usage;\n if (u) {\n const inTok = Number(u.input_tokens || u.inputTokens || 0);\n const outTok = Number(u.output_tokens || u.outputTokens || 0);\n totalTokens = Number(u.total_tokens || u.totalTokens || (inTok + outTok) || 0);\n }\n } else {\n const r = await client.responses.create({\n model,\n input: [\n { role: 'system', content: 'You output only code blocks when asked for code.' },\n { role: 'user', content: effectivePrompt || '' },\n ] as any,\n } as any);\n content = (r as any)?.output_text || (r as any)?.content?.[0]?.text || '';\n const u: any = (r as any)?.usage;\n if (u) {\n const inTok = Number(u.input_tokens || u.inputTokens || 0);\n const outTok = Number(u.output_tokens || u.outputTokens || 0);\n totalTokens = Number(u.total_tokens || u.totalTokens || (inTok + outTok) || 0);\n }\n }\n } catch (_e) {\n try { console.warn('[AI Proxy][OpenAI] responses.create failed:', (_e as any)?.message || String(_e)); } catch {}\n model = 'gpt-5-mini';\n try {\n const r2 = await client.chat.completions.create({\n model,\n messages: [\n { role: 'system', content: 'You output only code blocks when asked for code.' },\n { role: 'user', content: effectivePrompt || '' },\n ],\n });\n content = r2.choices?.[0]?.message?.content || '';\n const u2: any = (r2 as any)?.usage;\n if (u2) totalTokens = Number(u2.total_tokens || 0);\n } catch (e2) {\n try { console.error('[AI Proxy][OpenAI] chat.completions fallback failed:', (e2 as any)?.message || String(e2)); } catch {}\n throw e2;\n }\n }\n if (process.env.MARIA_TELEMETRY === '1') {\n try { console.log(JSON.stringify({ ev: 'ai_proxy_route', vendor: 'openai', model, empty: !content })); } catch {}\n }\n\n // Usage: 1 request; include tokens when available; count code when taskType suggests code/evaluation\n const consumption: Record<string, number> = { requests: 1 };\n if (totalTokens > 0) consumption.tokens = totalTokens;\n if (taskType === 'code' || taskType === 'evaluation') consumption.code = 1;\n try { await applyConsumption(uid, consumption, idemKey); } catch {}\n\n return res.json({ data: { content, routedModel: { vendor: 'openai', family: 'gpt', name: model, reason: taskType || 'code' } } });\n }\n // Fallback: if no provider branch matched, return routing error\n return res.status(500).json({ error: 'routing_error', message: 'No provider selected for AI proxy' });\n } catch (error) {\n console.error('[AI Proxy] Error:', error);\n if (process.env.MARIA_TELEMETRY === '1') {\n try { console.log(JSON.stringify({ ev: 'ai_proxy_error', message: (error as any)?.message || String(error) })); } catch {}\n }\n return res.status(500).json({ error: 'internal_error', message: 'AI proxy failed' });\n }\n});\n\n// ===== Usage endpoints (Firestore-backed when available) =====\nasync function getFirestoreSafe(): Promise<any|null> {\n try {\n const admin = await import('firebase-admin');\n if (!admin.apps?.length) { try { (admin as any).initializeApp(); } catch {} }\n const { getFirestore } = await import('firebase-admin/firestore');\n return getFirestore();\n } catch { return null; }\n}\n\nfunction calcNextReset(): string {\n const d = new Date();\n d.setUTCMonth(d.getUTCMonth() + 1, 1); // next month 1st day\n d.setUTCHours(0,0,0,0);\n return d.toISOString();\n}\n\nasync function recordConsumption(uid: string, consumption: Record<string, number>, idempotencyKey?: string) {\n const db = await getFirestoreSafe();\n if (!db) return;\n const docPath = `projects/default/usage/${uid}`;\n const usageRef = db.doc(docPath);\n const nowISO = new Date().toISOString();\n\n // Idempotency handling: if provided, ensure it is unique per user\n if (idempotencyKey) {\n const idemRef = db.doc(`projects/default/usage/${uid}/consumptions/${idempotencyKey}`);\n const idemSnap = await idemRef.get();\n if (idemSnap.exists) return; // already processed\n await idemRef.set({ createdAt: nowISO, consumption });\n }\n\n const snap = await usageRef.get();\n let data = snap.exists ? snap.data() : null;\n if (!data) {\n data = {\n plan: { name: 'FREE', limits: { requests: freePlan.buckets.req } },\n monthly: {\n requests: { used: 0, limit: freePlan.buckets.req },\n image: { used: 0, limit: freePlan.buckets.image },\n video: { used: 0, limit: freePlan.buckets.video },\n code: { used: 0, limit: freePlan.buckets.code },\n resetAt: calcNextReset(),\n },\n updatedAt: nowISO,\n };\n }\n const m = data.monthly || {};\n if (consumption?.requests) m.requests.used = Math.max(0, (m.requests.used || 0) + Number(consumption.requests));\n if (consumption?.image) m.image.used = Math.max(0, (m.image.used || 0) + Number(consumption.image));\n if (consumption?.video) m.video.used = Math.max(0, (m.video.used || 0) + Number(consumption.video));\n if (consumption?.code) m.code.used = Math.max(0, (m.code.used || 0) + Number(consumption.code));\n data.monthly = m; data.updatedAt = nowISO;\n await usageRef.set(data, { merge: true });\n}\n\n// ===== Snapshot endpoints (Firestore-backed when available) =====\napp.post('/api/v1/snapshots', rateLimitMiddleware, async (req: Request, res: Response) => {\n try {\n const auth = req.headers.authorization;\n if (!auth || !auth.startsWith('Bearer ')) return res.status(401).json({ error: 'unauthorized' });\n const idToken = auth.substring('Bearer '.length).trim();\n const decoded = await decodeFirebaseToken(idToken).catch(() => null as any);\n if (!decoded) return res.status(401).json({ error: 'unauthorized' });\n const uid = decoded?.uid || decoded?.sub;\n\n const { projectId, taskId, summary, decisions, artifacts, refs, resumePrompt } = req.body || {};\n const pid = (typeof projectId === 'string' && projectId.trim()) ? String(projectId).trim() : 'default';\n const tid = (typeof taskId === 'string' && taskId.trim()) ? String(taskId).trim() : '';\n const sum = (typeof summary === 'string' && summary.trim()) ? String(summary).trim() : '';\n try { console.log('[Snapshots][POST] incoming', { uid: String(uid).slice(0, 8) + '…', projectId: pid, taskId: tid, hasSummary: !!sum }); } catch {}\n if (!tid || !sum) return res.status(400).json({ error: 'bad_request', message: 'taskId and summary are required' });\n\n const db = await getFirestoreSafe();\n if (!db) return res.status(503).json({ error: 'unavailable', message: 'database is not configured' });\n\n const tsId = new Date().toISOString().replace(/[-:]/g, '').split('.')[0] + 'Z';\n const userRef = db.collection('users').doc(uid);\n const projRef = userRef.collection('projects').doc(pid);\n const taskRef = projRef.collection('tasks').doc(tid);\n const ref = taskRef.collection('snapshots').doc(tsId);\n const nowISO = new Date().toISOString();\n try {\n await Promise.all([\n userRef.set({ updatedAt: nowISO }, { merge: true }),\n projRef.set({ projectId: pid, updatedAt: nowISO }, { merge: true }),\n taskRef.set({ taskId: tid, updatedAt: nowISO }, { merge: true }),\n ]);\n } catch (e) { try { console.warn('[Snapshots][POST] parent set warn:', (e as any)?.message || String(e)); } catch {} }\n await ref.set({\n snapshotVersion: 1,\n uid,\n projectId: pid,\n taskId: tid,\n timestamp: nowISO,\n summary: sum,\n decisions: Array.isArray(decisions) ? decisions.slice(0, 50).map(String) : [],\n artifacts: Array.isArray(artifacts) ? artifacts.slice(0, 200).map(String) : [],\n links: Array.isArray(refs) ? refs.slice(0, 200).map((r: any) => ({ type: 'fs', ref: String(r) })) : [],\n resumePrompt: typeof resumePrompt === 'string' ? String(resumePrompt) : '',\n });\n try { console.log('[Snapshots][POST] saved', { path: `users/${uid}/projects/${pid}/tasks/${tid}/snapshots/${tsId}` }); } catch {}\n return res.json({ success: true });\n } catch (e) {\n try { console.error('[Snapshots][POST] error:', (e as any)?.message || String(e)); } catch {}\n return res.status(500).json({ error: 'internal_error' });\n }\n});\n\napp.get('/api/v1/get-snapshots', rateLimitMiddleware, async (req: Request, res: Response) => {\n try {\n const auth = req.headers.authorization;\n if (!auth || !auth.startsWith('Bearer ')) return res.status(401).json({ error: 'unauthorized' });\n const idToken = auth.substring('Bearer '.length).trim();\n const decoded = await decodeFirebaseToken(idToken).catch(() => null as any);\n if (!decoded) return res.status(401).json({ error: 'unauthorized' });\n const uid = decoded?.uid || decoded?.sub;\n\n const projectId = typeof req.query.projectId === 'string' && req.query.projectId.trim() ? String(req.query.projectId).trim() : 'default';\n const taskId = typeof req.query.taskId === 'string' && req.query.taskId.trim() ? String(req.query.taskId).trim() : undefined;\n const dateISO = typeof req.query.date === 'string' && req.query.date.trim() ? String(req.query.date).trim() : undefined;\n const limit = Number.isFinite(Number(req.query.limit)) ? Math.max(1, Math.min(50, Number(req.query.limit))) : 5;\n\n const db = await getFirestoreSafe();\n if (!db) return res.status(503).json({ error: 'unavailable', message: 'database is not configured' });\n\n let docs: any[] = [];\n if (taskId) {\n const q = db\n .collection('users').doc(uid)\n .collection('projects').doc(projectId)\n .collection('tasks').doc(taskId)\n .collection('snapshots')\n .orderBy('timestamp', 'desc')\n .limit(limit);\n const ss = await q.get();\n docs = ss.docs.map((d: any) => d.data());\n } else if (dateISO) {\n const start = new Date(dateISO).toISOString();\n const end = new Date(new Date(dateISO).getTime() + 24 * 60 * 60 * 1000).toISOString();\n try {\n const ss = await db\n .collectionGroup('snapshots')\n .where('uid', '==', uid)\n .where('projectId', '==', projectId)\n .where('timestamp', '>=', start)\n .where('timestamp', '<', end)\n .orderBy('timestamp', 'desc')\n .limit(limit)\n .get();\n docs = ss.docs.map((d: any) => d.data());\n } catch (e) {\n // Fallback without composite index: enumerate tasks and filter by date\n const projRef = db.collection('users').doc(uid).collection('projects').doc(projectId);\n const tasksSnap = await projRef.collection('tasks').get();\n const collected: any[] = [];\n for (const t of tasksSnap.docs) {\n try {\n const snaps = await t.ref.collection('snapshots').orderBy('timestamp', 'desc').limit(50).get();\n for (const s of snaps.docs) {\n const data = s.data();\n const ts = String(data?.timestamp || '');\n if (ts >= start && ts < end) collected.push(data);\n }\n } catch {}\n }\n collected.sort((a, b) => String(b?.timestamp || '').localeCompare(String(a?.timestamp || '')));\n docs = collected.slice(0, limit);\n }\n } else {\n // Try collectionGroup fast-path; on missing index, fallback to per-task merge\n try {\n const ss = await db\n .collectionGroup('snapshots')\n .where('uid', '==', uid)\n .where('projectId', '==', projectId)\n .orderBy('timestamp', 'desc')\n .limit(limit)\n .get();\n docs = ss.docs.map((d: any) => d.data());\n } catch (e: any) {\n // Fallback: enumerate tasks and merge top snapshots without requiring composite index\n const projRef = db.collection('users').doc(uid).collection('projects').doc(projectId);\n const tasksSnap = await projRef.collection('tasks').get();\n const perTaskTop: any[] = [];\n for (const t of tasksSnap.docs) {\n try {\n const snaps = await t.ref.collection('snapshots').orderBy('timestamp', 'desc').limit(Math.max(1, Math.ceil(limit / Math.max(1, tasksSnap.size)))).get();\n for (const s of snaps.docs) perTaskTop.push(s.data());\n } catch {}\n }\n // Merge-sort by timestamp desc and trim to limit\n perTaskTop.sort((a, b) => String(b?.timestamp || '').localeCompare(String(a?.timestamp || '')));\n docs = perTaskTop.slice(0, limit);\n }\n }\n\n return res.json({ success: true, data: { snapshots: docs } });\n } catch (e) {\n console.error('[Snapshots] GET error', e);\n return res.status(500).json({ error: 'internal_error' });\n }\n});\n\napp.get('/api/v1/usage', rateLimitMiddleware, async (req: Request, res: Response) => {\n try {\n const auth = req.headers.authorization;\n if (!auth || !auth.startsWith('Bearer ')) return res.status(401).json({ error: 'unauthorized' });\n const idToken = auth.substring('Bearer '.length).trim();\n const decoded = await decodeFirebaseToken(idToken).catch(() => null as any);\n if (!decoded) return res.status(401).json({ error: 'unauthorized' });\n const uid = decoded?.uid || decoded?.sub;\n const { planId: pid, limits } = await getUserPlanAndLimits(uid);\n const { data } = await ensureUsageDoc(uid);\n const periodId = getCurrentPeriodId();\n const used = data?.used || { req: 0, tokens: 0, code: 0, attachment: 0 };\n const remain = data?.remain || limits;\n const percentage = {\n req: limits.req > 0 ? Math.round((used.req / limits.req) * 100) : 0,\n tokens: limits.tokens > 0 ? Math.round((used.tokens / limits.tokens) * 100) : 0,\n code: limits.code > 0 ? Math.round((used.code / limits.code) * 100) : 0,\n attachment: limits.attachment > 0 ? Math.round((used.attachment / limits.attachment) * 100) : 0,\n };\n return res.json({\n periodId,\n planCode: pid,\n planName: planName(pid),\n used,\n remain,\n limits,\n percentage,\n resetAt: data?.resetAt || nextMonthResetISO(),\n });\n } catch (e) {\n console.error('[Usage] GET error', e);\n return res.status(500).json({ error: 'internal_error' });\n }\n});\n\napp.post('/api/v1/usage', rateLimitMiddleware, async (req: Request, res: Response) => {\n try {\n const auth = req.headers.authorization;\n if (!auth || !auth.startsWith('Bearer ')) return res.status(401).json({ error: 'unauthorized' });\n const { consumption } = req.body || {};\n const idemKey = (req.headers['idempotency-key'] as string | undefined) || undefined;\n const idToken = auth.substring('Bearer '.length).trim();\n const decoded = await decodeFirebaseToken(idToken).catch(() => null as any);\n if (!decoded) return res.status(401).json({ error: 'unauthorized' });\n const uid = decoded?.uid || decoded?.sub;\n await applyConsumption(uid, consumption || {}, idemKey);\n // Return fresh snapshot in unified shape\n const { data } = await ensureUsageDoc(uid);\n const { planId: pid, limits } = await getUserPlanAndLimits(uid);\n const periodId = getCurrentPeriodId();\n const used = data?.used || { req: 0, tokens: 0, code: 0, attachment: 0 };\n const remain = data?.remain || limits;\n const percentage = {\n req: limits.req > 0 ? Math.round((used.req / limits.req) * 100) : 0,\n tokens: limits.tokens > 0 ? Math.round((used.tokens / limits.tokens) * 100) : 0,\n code: limits.code > 0 ? Math.round((used.code / limits.code) * 100) : 0,\n attachment: limits.attachment > 0 ? Math.round((used.attachment / limits.attachment) * 100) : 0,\n };\n return res.json({ periodId, planCode: pid, planName: planName(pid), used, remain, limits, percentage, resetAt: data?.resetAt || nextMonthResetISO() });\n } catch (e) {\n console.error('[Usage] POST error', e);\n return res.status(500).json({ error: 'internal_error' });\n }\n});\n\n// 404 handler\napp.use((req: Request, res: Response) => {\n res.status(404).json({\n error: 'not_found',\n message: 'The requested endpoint does not exist',\n path: req.path\n });\n});\n\n// Error handler\napp.use((err: Error, req: Request, res: Response, next: NextFunction) => {\n console.error('[Server Error]:', err);\n res.status(500).json({\n error: 'internal_server_error',\n message: 'An unexpected error occurred'\n });\n});\n\n// Start server\nconst server = app.listen(port, () => {\n console.log(` MARIA CODE Express Server running on port ${port}`);\n console.log(` Health check: http://localhost:${port}/health`);\n console.log(` API Status: http://localhost:${port}/api/status`);\n console.log(` API Endpoints: http://localhost:${port}/`);\n \n // Start rate limit cleanup job\n startRateLimitCleanup();\n console.log(' Rate limit cleanup job started');\n});\n\n// Graceful shutdown\nprocess.on('SIGTERM', () => {\n console.log('SIGTERM signal received: closing HTTP server');\n server.close(() => {\n console.log('HTTP server closed');\n process.exit(0);\n });\n});\n\nprocess.on('SIGINT', () => {\n console.log('SIGINT signal received: closing HTTP server');\n server.close(() => {\n console.log('HTTP server closed');\n process.exit(0);\n });\n});\n\nexport { app, server };\n"]}
1
+ {"version":3,"sources":["../src/services/intelligent-model-selector/SecretManagerIntegration.ts","../src/services/media-orchestrator/image-post.ts","../src/services/routing/model-routing.ts","../src/middleware/rate-limit.ts","../src/services/media-orchestrator/types.ts","../src/services/media-orchestrator/Storage.ts","../src/providers/google/gemini-media.ts","../src/services/subscription/subscription-store.ts","../src/services/subscription/stripe-webhook-service.ts","../src/server/express-server.ts"],"names":["SecretManagerServiceClient","path","getAuth","crypto","fs","fsp","modelName","createHmac","timingSafeEqual","express","helmet","cors","compression","compressionFilter","SecretManagerIntegration","providerFromModel","startedMs","videoBytes","outExt","traceId","promptHash","manifest","baseDir","saved","idemKey","hasFtyp","isWebm","duration","header","headerStr","deadline","res","sanitizeKey","determineRouting"],"mappings":"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","file":"server-express.cjs","sourcesContent":["/**\n * Secret Manager Integration for IMS\n * Securely retrieves API keys from Google Secret Manager\n */\n\nimport { SecretManagerServiceClient } from '@google-cloud/secret-manager';\n\nexport interface SecretConfig {\n projectId: string;\n secrets: {\n googleAI?: string;\n openAI?: string;\n anthropic?: string;\n groq?: string;\n // Optional configuration (non-key) items\n defaultModel?: string;\n defaultProvider?: string;\n lmstudioApiBase?: string;\n ollamaApiUrl?: string;\n vllmApiUrl?: string;\n };\n}\n\nexport class SecretManagerIntegration {\n private client: SecretManagerServiceClient | null = null;\n private cache: Map<string, string> = new Map();\n private cacheExpiry: Map<string, number> = new Map();\n private readonly CACHE_TTL = 3600000; // 1 hour\n private readonly useGsm: boolean;\n private readonly MAX_RETRIES = 3;\n private readonly BASE_DELAY_MS = 200;\n \n constructor(private config: SecretConfig) {\n this.useGsm = this.shouldUseGsm();\n }\n\n /** Determine whether GSM should be used in this environment */\n private shouldUseGsm(): boolean {\n if (process.env.MARIA_DISABLE_GSM === 'true') return false;\n if (process.env.GOOGLE_APPLICATION_CREDENTIALS) return true;\n if (process.env.GOOGLE_CLOUD_PROJECT || process.env.GCLOUD_PROJECT) return true;\n if (process.env.CLOUD_RUN_SERVICE || process.env.K_SERVICE) return true;\n if (process.env.GCE_METADATA_HOST) return true;\n return false; // default: end-user machines don't require GSM\n }\n\n /** Lazily create Secret Manager client only when permitted */\n private ensureClient(): SecretManagerServiceClient | null {\n if (!this.useGsm) return null;\n if (this.client) return this.client;\n try {\n this.client = new SecretManagerServiceClient();\n } catch {\n this.client = null;\n }\n return this.client;\n }\n \n /**\n * Get API key from Secret Manager with caching\n */\n async getApiKey(provider: 'google' | 'openai' | 'anthropic' | 'groq'): Promise<string | undefined> {\n const secretName = this.getSecretName(provider);\n if (!secretName) {\n return undefined;\n }\n \n // Short-circuit when GSM is disabled/unavailable\n const client = this.ensureClient();\n if (!client) {\n return this.getFallbackFromEnv(provider);\n }\n\n // Valid cache first\n const valid = this.getCachedSecret(secretName);\n if (valid) return valid;\n\n // Try fetch with backoff\n const res = await this.accessWithBackoff(secretName).catch(() => undefined);\n if (res) {\n this.cacheSecret(secretName, res);\n return res;\n }\n\n // Stale-while-revalidate: if we ever cached a value, return it\n const stale = this.cache.get(secretName);\n if (stale) return stale;\n\n // Fallback to env var\n return this.getFallbackFromEnv(provider);\n }\n \n /**\n * Get all API keys\n */\n async getAllApiKeys(): Promise<{\n googleApiKey?: string;\n openaiApiKey?: string;\n anthropicApiKey?: string;\n groqApiKey?: string;\n }> {\n const [googleApiKey, openaiApiKey, anthropicApiKey, groqApiKey] = await Promise.all([\n this.getApiKey('google'),\n this.getApiKey('openai'),\n this.getApiKey('anthropic'),\n this.getApiKey('groq')\n ]);\n \n return {\n googleApiKey,\n openaiApiKey,\n anthropicApiKey,\n groqApiKey\n };\n }\n\n /** Fetch optional configuration values (not API keys) */\n async getOptionalConfig(): Promise<{\n defaultModel?: string;\n defaultProvider?: string;\n lmstudioApiBase?: string;\n ollamaApiUrl?: string;\n vllmApiUrl?: string;\n }> {\n const client = this.ensureClient();\n const read = async (name?: string): Promise<string | undefined> => {\n if (!name) return undefined;\n if (!client) return undefined;\n try {\n const resName = `projects/${this.config.projectId}/secrets/${name}/versions/latest`;\n const [version] = await client.accessSecretVersion({ name: resName });\n const payload = version.payload?.data;\n return payload?.toString();\n } catch {\n return undefined;\n }\n };\n\n const [defaultModel, defaultProvider, lmstudioApiBase, ollamaApiUrl, vllmApiUrl] = await Promise.all([\n read(this.config.secrets.defaultModel || 'default-model'),\n read(this.config.secrets.defaultProvider || 'default-provider'),\n read(this.config.secrets.lmstudioApiBase || 'lmstudio-api-base'),\n read(this.config.secrets.ollamaApiUrl || 'ollama-api-url'),\n read(this.config.secrets.vllmApiUrl || 'vllm-api-url'),\n ]);\n\n return { defaultModel, defaultProvider, lmstudioApiBase, ollamaApiUrl, vllmApiUrl };\n }\n \n /**\n * Verify that required secrets exist\n */\n async verifySecrets(): Promise<{\n available: string[];\n missing: string[];\n }> {\n // If GSM is disabled/unavailable, don't block CLI: report nothing\n const client = this.ensureClient();\n if (!client) {\n return { available: [], missing: [] };\n }\n\n const available: string[] = [];\n const missing: string[] = [];\n \n const providers: Array<'google' | 'openai' | 'anthropic' | 'groq'> = \n ['google', 'openai', 'anthropic', 'groq'];\n \n for (const provider of providers) {\n const secretName = this.getSecretName(provider);\n if (!secretName) continue;\n \n try {\n const name = `projects/${this.config.projectId}/secrets/${secretName}`;\n await client.getSecret({ name });\n available.push(provider);\n } catch (error) {\n missing.push(provider);\n }\n }\n \n return { available, missing };\n }\n \n /**\n * Create or update a secret\n */\n async createOrUpdateSecret(\n provider: 'google' | 'openai' | 'anthropic' | 'groq',\n apiKey: string\n ): Promise<boolean> {\n const secretName = this.getSecretName(provider);\n if (!secretName) {\n return false;\n }\n \n const client = this.ensureClient();\n if (!client) {\n // No GSM available locally\n return false;\n }\n\n const secretId = `projects/${this.config.projectId}/secrets/${secretName}`;\n \n try {\n // Check if secret exists\n let secretExists = false;\n try {\n await client.getSecret({ name: secretId });\n secretExists = true;\n } catch {\n secretExists = false;\n }\n \n if (!secretExists) {\n // Create the secret\n await client.createSecret({\n parent: `projects/${this.config.projectId}`,\n secretId: secretName,\n secret: {\n replication: {\n automatic: {}\n },\n labels: {\n service: 'ims',\n provider: provider\n }\n }\n });\n }\n \n // Add the secret version\n await client.addSecretVersion({\n parent: secretId,\n payload: {\n data: Buffer.from(apiKey, 'utf8')\n }\n });\n \n // Clear cache for this secret\n this.cache.delete(secretName);\n this.cacheExpiry.delete(secretName);\n \n return true;\n } catch (error) {\n // Silently handle create/update errors\n // console.error(`Failed to create/update secret ${secretName}:`, error);\n return false;\n }\n }\n \n /**\n * Get secret name for provider\n */\n private getSecretName(provider: 'google' | 'openai' | 'anthropic' | 'groq'): string | undefined {\n switch (provider) {\n case 'google':\n return this.config.secrets.googleAI || 'google-ai-api-key';\n case 'openai':\n return this.config.secrets.openAI || 'openai-api-key';\n case 'anthropic':\n return this.config.secrets.anthropic || 'anthropic-api-key';\n case 'groq':\n return this.config.secrets.groq || 'groq-api-key';\n default:\n return undefined;\n }\n }\n \n /**\n * Get cached secret if valid\n */\n private getCachedSecret(secretName: string): string | undefined {\n const expiry = this.cacheExpiry.get(secretName);\n if (!expiry || Date.now() > expiry) {\n // Cache expired\n this.cache.delete(secretName);\n this.cacheExpiry.delete(secretName);\n return undefined;\n }\n \n return this.cache.get(secretName);\n }\n\n /** Access a secret with retry + exponential backoff */\n private async accessWithBackoff(secretName: string): Promise<string | undefined> {\n const client = this.ensureClient();\n if (!client) return undefined;\n const name = `projects/${this.config.projectId}/secrets/${secretName}/versions/latest`;\n for (let attempt = 0; attempt < this.MAX_RETRIES; attempt++) {\n try {\n const [version] = await client.accessSecretVersion({ name });\n const payload = version.payload?.data;\n if (!payload) return undefined;\n return payload.toString();\n } catch (e) {\n if (attempt === this.MAX_RETRIES - 1) break;\n const delay = this.BASE_DELAY_MS * Math.pow(2, attempt);\n await new Promise((r) => setTimeout(r, delay));\n }\n }\n return undefined;\n }\n \n /**\n * Cache a secret\n */\n private cacheSecret(secretName: string, value: string): void {\n this.cache.set(secretName, value);\n this.cacheExpiry.set(secretName, Date.now() + this.CACHE_TTL);\n }\n \n /**\n * Get fallback from environment variable\n */\n private getFallbackFromEnv(provider: 'google' | 'openai' | 'anthropic' | 'groq'): string | undefined {\n switch (provider) {\n case 'google':\n return process.env.GOOGLE_AI_API_KEY;\n case 'openai':\n return process.env.OPENAI_API_KEY;\n case 'anthropic':\n return process.env.ANTHROPIC_API_KEY;\n case 'groq':\n return process.env.GROQ_API_KEY;\n default:\n return undefined;\n }\n }\n \n /**\n * Clear cache\n */\n clearCache(): void {\n this.cache.clear();\n this.cacheExpiry.clear();\n }\n}\n","// Optional sharp-based post-processing (sRGB/EXIF/format)\n// Dynamic import guarded by MARIA_SHARP to avoid hard dependency\n\nexport async function processImageOptional(\n bytes: Buffer,\n format: 'png'|'webp'|'jpg',\n keepExif?: boolean,\n targetSize?: { width: number; height: number },\n): Promise<Buffer> {\n try {\n // dynamic import (no env gate): try sharp, fall back silently if unavailable\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const sharp = (await import('sharp')).default;\n let img = sharp(bytes).toColourspace('srgb');\n if (targetSize && Number.isFinite(targetSize.width) && Number.isFinite(targetSize.height)) {\n const width = Math.max(1, Math.floor(targetSize.width));\n const height = Math.max(1, Math.floor(targetSize.height));\n img = img.resize(width, height, { fit: 'cover' });\n }\n if (keepExif) img = img.withMetadata();\n const qEnv = Number(process.env.MARIA_SHARP_QUALITY || '80');\n const quality = Number.isFinite(qEnv) ? Math.max(1, Math.min(100, Math.floor(qEnv))) : 80;\n const alphaMode = String(process.env.MARIA_SHARP_ALPHA || '').toLowerCase();\n if (format === 'jpg' && alphaMode !== 'preserve') {\n img = img.flatten({ background: { r: 255, g: 255, b: 255 } });\n }\n switch (format) {\n case 'png': return await img.png().toBuffer();\n case 'webp': return await img.webp({ quality }).toBuffer();\n case 'jpg': return await img.jpeg({ mozjpeg: true, quality }).toBuffer();\n }\n return bytes;\n } catch {\n return bytes;\n }\n}\n","export type Provider = 'google' | 'openai';\n\nexport interface RoutingInput {\n requestedModel?: string;\n requestedProvider?: Provider | string;\n taskType?: string;\n isProOrAbove?: boolean;\n hasGeminiKey: boolean;\n hasOpenAIKey: boolean;\n}\n\nexport interface RoutingDecision {\n provider?: Provider;\n model?: string;\n error?: 'missing_key' | 'unknown_model' | 'no_provider_available';\n message?: string;\n}\n\nexport function providerFromModel(model?: string): Provider | undefined {\n const m = (model || '').toLowerCase();\n if (!m) return undefined;\n if (m.startsWith('gemini') || m.startsWith('veo')) return 'google';\n if (m.startsWith('gpt') || m.startsWith('sora')) return 'openai';\n return undefined;\n}\n\nexport function determineRouting(input: RoutingInput): RoutingDecision {\n const requestedProvider = normalizeProvider(input.requestedProvider);\n const requestedModel = input.requestedModel?.trim();\n const isPro = !!input.isProOrAbove;\n\n // 1) Explicit model wins; infer provider from model family\n if (requestedModel && requestedModel.length > 0) {\n const p = providerFromModel(requestedModel);\n if (!p) return { error: 'unknown_model', message: `Unknown model family for '${requestedModel}'` };\n if (p === 'google' && !input.hasGeminiKey) return { error: 'missing_key', message: `Requested model '${requestedModel}' requires Google API key` };\n if (p === 'openai' && !input.hasOpenAIKey) return { error: 'missing_key', message: `Requested model '${requestedModel}' requires OpenAI API key` };\n return { provider: p, model: requestedModel };\n }\n\n // 2) Explicit provider next; choose sensible default model for that provider\n if (requestedProvider) {\n if (requestedProvider === 'google') {\n if (!input.hasGeminiKey) return { error: 'missing_key', message: 'Google API key is not configured' };\n return { provider: 'google', model: 'gemini-2.5-flash' };\n }\n if (requestedProvider === 'openai') {\n if (!input.hasOpenAIKey) return { error: 'missing_key', message: 'OpenAI API key is not configured' };\n return { provider: 'openai', model: isPro ? 'gpt-5' : 'gpt-5-mini' };\n }\n }\n\n // 3) Task-type special cases\n if ((input.taskType || '').toLowerCase() === 'research') {\n // Research requires Google grounding; do not auto-switch\n if (!input.hasGeminiKey) return { error: 'missing_key', message: 'Google API key is required for research task' };\n return { provider: 'google', model: 'gemini-2.5-flash' };\n }\n\n // 4) Plan-based defaults\n if (isPro && input.hasOpenAIKey) {\n return { provider: 'openai', model: 'gpt-5' };\n }\n if (input.hasGeminiKey) {\n return { provider: 'google', model: 'gemini-2.5-flash' };\n }\n if (input.hasOpenAIKey) {\n return { provider: 'openai', model: 'gpt-5-mini' };\n }\n\n return { error: 'no_provider_available', message: 'No valid provider API key configured' };\n}\n\nfunction normalizeProvider(p?: string): Provider | undefined {\n const s = (p || '').toLowerCase().trim();\n if (s === 'google' || s === 'openai') return s;\n return undefined;\n}\n\n\n","/**\n * Production-ready Rate Limit Middleware\n * Fixes: First-call false positive, Infinity/Invalid Date errors\n */\n\nimport type { Request, Response, NextFunction } from 'express';\nimport { getAuth } from 'firebase-admin/auth';\n\n// In-memory store (TODO: Replace with Redis for multi-instance)\nconst rateLimitStore = new Map<string, { lastAt: number }>();\n\n// Rate limit configurations per endpoint and plan\ninterface RateLimitConfig {\n windowMs: number;\n requests: number;\n}\n\nconst RATE_LIMITS: Record<string, RateLimitConfig> = {\n '/image:FREE': { windowMs: 3000, requests: 1 }, // 1 req per 3s\n '/video:FREE': { windowMs: 15000, requests: 1 }, // 1 req per 15s\n '/code:FREE': { windowMs: 1000, requests: 1 }, // 1 req per 1s\n '/chat:FREE': { windowMs: 500, requests: 1 }, // 2 req per sec\n \n '/image:STARTER': { windowMs: 1000, requests: 1 }, // 1 req per 1s\n '/video:STARTER': { windowMs: 5000, requests: 1 }, // 1 req per 5s\n '/code:STARTER': { windowMs: 500, requests: 1 }, // 2 req per sec\n \n '/image:PRO': { windowMs: 100, requests: 1 }, // 10 req per sec\n '/video:PRO': { windowMs: 1000, requests: 1 }, // 1 req per sec\n '/code:PRO': { windowMs: 100, requests: 1 }, // 10 req per sec\n \n 'default': { windowMs: 1000, requests: 1 } // Fallback\n};\n\n/**\n * Get rate limit config for specific endpoint and plan\n */\nfunction getRateLimitConfig(endpoint: string, plan: string): RateLimitConfig {\n const key = `${endpoint}:${plan.toUpperCase()}`;\n return RATE_LIMITS[key] || RATE_LIMITS.default;\n}\n\n/**\n * Extract endpoint category from request path\n */\nfunction getEndpointCategory(path: string): string {\n if (path.includes('/image')) return '/image';\n if (path.includes('/video')) return '/video';\n if (path.includes('/code')) return '/code';\n if (path.includes('/chat')) return '/chat';\n return 'default';\n}\n\n/**\n * Main rate limit middleware\n */\nexport async function rateLimitMiddleware(\n req: Request,\n res: Response,\n next: NextFunction\n): Promise<void> {\n try {\n // 1. Identify user (from JWT or API key)\n const authHeader = req.headers.authorization;\n const bearer = authHeader?.split(' ')[1];\n \n let userId = 'anonymous';\n let userPlan = 'FREE';\n \n if (bearer) {\n try {\n const decodedToken = await getAuth().verifyIdToken(bearer);\n userId = decodedToken.uid;\n // Resolve plan from Firestore (fallback to FREE)\n userPlan = await getFirestorePlan(userId);\n } catch {\n // Invalid token, treat as anonymous\n }\n } else if (req.headers['x-api-key']) {\n userId = `apikey:${req.headers['x-api-key']}`;\n // TODO: Resolve plan from API key\n }\n \n // 2. Determine endpoint category\n const endpoint = getEndpointCategory(req.path);\n \n // 3. Get rate limit config\n const config = getRateLimitConfig(endpoint, userPlan);\n \n // 4. Build unique key for this user-endpoint combination\n const rateLimitKey = `${userId}:${endpoint}`;\n \n // 5. Check rate limit\n const now = Date.now();\n const userRecord = rateLimitStore.get(rateLimitKey);\n \n // First request - always allow\n if (!userRecord || typeof userRecord.lastAt !== 'number') {\n rateLimitStore.set(rateLimitKey, { lastAt: now });\n next();\n return;\n }\n \n // Calculate time elapsed since last request\n const elapsedMs = now - userRecord.lastAt;\n const remainingMs = Math.max(0, config.windowMs - elapsedMs);\n \n // If window hasn't passed, reject\n if (remainingMs > 0) {\n // Ensure clean, bounded values for response\n const retryAfterSeconds = Math.max(1, Math.ceil(remainingMs / 1000));\n const resetAt = new Date(now + remainingMs);\n\n // Standard rate-limit headers for client backoff\n try {\n res.setHeader('Retry-After', String(retryAfterSeconds));\n res.setHeader('X-RateLimit-Reset', String(resetAt.getTime()));\n res.setHeader('RateLimit-Reset', String(resetAt.getTime()));\n } catch {}\n\n res.status(429).json({\n error: 'rate_limit_exceeded',\n message: `Rate limit exceeded for ${endpoint} endpoint`,\n details: {\n endpoint,\n plan: userPlan,\n limit: `${config.requests} request per ${config.windowMs / 1000} seconds`,\n retryAfterSeconds,\n resetAt: resetAt.toISOString()\n },\n hint: userPlan === 'FREE' \n ? `Free plan limit: ${config.requests} request per ${config.windowMs / 1000}s. Upgrade at https://maria-code.ai/manage`\n : `Please wait ${retryAfterSeconds} seconds before retrying.`\n });\n return;\n }\n \n // Window has passed - allow and update timestamp\n rateLimitStore.set(rateLimitKey, { lastAt: now });\n next();\n return;\n \n } catch (error) {\n // Fail open - don't block users on rate limiter errors\n console.error('[RateLimit] Error in middleware:', error);\n next();\n return;\n }\n}\n\n/**\n * Clear rate limit for specific user (e.g., after upgrade)\n */\nexport function clearUserRateLimit(userId: string): void {\n const keysToDelete: string[] = [];\n \n rateLimitStore.forEach((_, key) => {\n if (key.startsWith(`${userId}:`)) {\n keysToDelete.push(key);\n }\n });\n \n keysToDelete.forEach(key => rateLimitStore.delete(key));\n}\n\n/**\n * Periodic cleanup of old entries (prevent memory leak)\n */\nexport function startRateLimitCleanup(): void {\n setInterval(() => {\n const now = Date.now();\n const maxAge = 60 * 60 * 1000; // 1 hour\n \n rateLimitStore.forEach((value, key) => {\n if (now - value.lastAt > maxAge) {\n rateLimitStore.delete(key);\n }\n });\n }, 10 * 60 * 1000); // Run every 10 minutes\n}\nasync function getFirestorePlan(uid: string): Promise<string> {\n try {\n const admin = await import('firebase-admin');\n if (!(admin as any).apps?.length) { try { (admin as any).initializeApp(); } catch {} }\n const { getFirestore } = await import('firebase-admin/firestore');\n const db = getFirestore();\n const doc = await db.doc(`projects/default/users/${uid}`).get();\n const plan = (doc.exists && (doc.data() as any)?.plan) || 'FREE';\n return String(plan).toUpperCase();\n } catch {\n return 'FREE';\n }\n}\n","// Media orchestrator types and helpers (named exports only)\n\nimport * as crypto from 'node:crypto';\n\nexport type MediaKind = 'image' | 'video';\n\nexport type PixelSize = [number, number];\nexport type Seconds = number;\n\nexport type ImageFormat = 'png' | 'webp' | 'jpg';\nexport type VideoFormat = 'mp4' | 'webm';\n\nexport interface BaseParams {\n prompt: string;\n model: string;\n seed?: number;\n trace?: string;\n}\n\nexport interface ImageParams extends BaseParams {\n size: PixelSize;\n format: ImageFormat;\n count: number;\n}\n\nexport interface VideoParams extends BaseParams {\n duration: Seconds;\n fps: number;\n size: PixelSize;\n format: VideoFormat;\n}\n\nexport type NormalizedParams = ImageParams | VideoParams;\n\nexport interface ProviderCaps {\n provider: 'google';\n model: string;\n kind: MediaKind;\n // Image caps\n maxImageSize?: PixelSize;\n supportedImageFormats?: ImageFormat[];\n maxBatch?: number;\n // Video caps\n maxVideoSize?: PixelSize;\n maxDuration?: Seconds;\n maxFps?: number;\n supportedVideoFormats?: VideoFormat[];\n // SLA\n maxRps?: number;\n timeoutMs?: number;\n}\n\nexport const PROVIDER_MATRIX: ProviderCaps[] = [\n {\n provider: 'google',\n model: 'gemini-2.5-flash-image-preview',\n kind: 'image',\n maxImageSize: [2048, 2048],\n supportedImageFormats: ['png', 'webp', 'jpg'],\n maxBatch: 8,\n maxRps: 4,\n timeoutMs: 60_000,\n },\n {\n provider: 'google',\n model: 'veo3',\n kind: 'video',\n maxVideoSize: [1920, 1080],\n maxDuration: 30,\n maxFps: 30,\n supportedVideoFormats: ['mp4', 'webm'],\n maxRps: 2,\n timeoutMs: 120_000,\n },\n];\n\nexport interface ManifestV1 {\n manifestVersion: 1;\n kind: MediaKind;\n request: {\n promptHash: string;\n seed?: number;\n params: Record<string, unknown>;\n model: string;\n provider: 'google' | 'openai';\n };\n artifacts: Array<{\n file: string;\n hash: string;\n size?: PixelSize;\n frames?: number;\n }>;\n metrics: {\n durationMs: number;\n retries: number;\n fallbacks: number;\n };\n trace?: string;\n createdAt: string;\n}\n\nexport function hashPrompt(prompt: string): string {\n const h = crypto.createHash('sha256').update(prompt, 'utf8').digest('hex');\n return `sha256:${h}`;\n}\n\nexport function hashBytes(buf: Buffer): string {\n const h = crypto.createHash('sha256').update(buf).digest('hex');\n return `sha256:${h}`;\n}\n\nexport function datePath(d: Date = new Date()): string {\n const y = d.getUTCFullYear();\n const m = String(d.getUTCMonth() + 1).padStart(2, '0');\n const day = String(d.getUTCDate()).padStart(2, '0');\n return `${y}/${m}/${day}`;\n}\n\nexport function hashPrefix(hash: string, n: number = 6): string {\n return hash.replace(/^sha256:/, '').slice(0, n);\n}\n\n","// Atomic artifact storage for media orchestrator\n// Named exports only\n\nimport * as fs from 'node:fs';\nimport * as fsp from 'node:fs/promises';\nimport * as path from 'node:path';\nimport { datePath, hashBytes, hashPrefix, type ManifestV1 } from './types';\n\nexport interface SaveContext {\n root: string;\n kind: 'image' | 'video';\n baseDir?: string; // default based on kind\n trace?: string;\n flat?: boolean; // when true, save directly under baseDir/root without date/hash segments\n skipManifest?: boolean; // when true, do not write manifest.json\n}\n\nexport interface SaveItem {\n bytes: Buffer;\n ext: string; // '.webp' | '.png' | '.mp4' etc\n logicalName?: string; // optional label e.g., 'frame-0001'\n}\n\nexport interface SaveResult {\n files: string[]; // relative to root\n manifestPath: string; // relative to root (empty when skipManifest)\n}\n\nfunction ensureDirSync(p: string): void {\n fs.mkdirSync(p, { recursive: true });\n}\n\nfunction safeJoin(root: string, ...segs: string[]): { full: string; rel: string } {\n const full = path.resolve(root, ...segs);\n const rel = path.relative(root, full);\n if (rel.startsWith('..') || path.isAbsolute(rel)) {\n throw new Error(`path escapes root: ${segs.join('/')}`);\n }\n return { full, rel };\n}\n\nfunction stageDir(root: string, trace: string): string {\n return path.join(root, `.stage/${trace}`);\n}\n\nasync function existsSameHash(destFull: string): Promise<boolean> {\n try {\n await fsp.access(destFull);\n return true;\n } catch {\n return false;\n }\n}\n\nconst WINDOWS_RESERVED = new Set(['con','prn','aux','nul','com1','lpt1']);\nfunction validateWinPathEdge(fullPath: string) {\n if (process.platform === 'win32') {\n if (fullPath.length > 240) throw new Error('path too long for Windows');\n const base = fullPath.split(/[/\\\\]/).pop()?.toLowerCase() || '';\n if (WINDOWS_RESERVED.has(base.split('.')[0])) throw new Error('reserved filename on Windows');\n }\n}\n\nasync function hasCaseInsensitiveCollision(dirFull: string, targetFile: string): Promise<boolean> {\n try {\n const list = await fsp.readdir(dirFull);\n const set = new Set(list.map((n) => n.toLowerCase()));\n return set.has(targetFile.toLowerCase()) && !list.includes(targetFile);\n } catch {\n return false;\n }\n}\n\nasync function atomicRename(stage: string, dest: string): Promise<void> {\n try {\n await fsp.rename(stage, dest);\n try {\n const fd = await fsp.open(dest, 'r');\n try { await fd.sync(); } finally { await fd.close(); }\n } catch {}\n } catch (e: any) {\n if (e && e.code === 'EXDEV') {\n await fsp.copyFile(stage, dest);\n const fd = await fsp.open(dest, 'r');\n try {\n await fd.sync();\n } finally {\n await fd.close();\n }\n await fsp.unlink(stage);\n } else {\n throw e;\n }\n }\n}\n\nexport async function saveArtifacts(\n ctx: SaveContext,\n items: SaveItem[],\n manifest: Omit<ManifestV1, 'createdAt' | 'manifestVersion'> & { createdAt?: string },\n): Promise<SaveResult> {\n const root = ctx.root;\n // default to project root when not specified\n const base = typeof ctx.baseDir === 'string' ? ctx.baseDir : '';\n\n const trace = ctx.trace || Math.random().toString(36).slice(2, 10).toUpperCase();\n const stage = stageDir(root, trace);\n ensureDirSync(stage);\n\n try {\n const dateSeg = datePath(new Date());\n const reqHash = (manifest.request && (manifest.request as any).promptHash) || 'sha256:unknown';\n const slug = hashPrefix(reqHash, 6);\n const outDirSeg = ctx.flat ? (base || '') : `${base ? base + '/' : ''}${dateSeg}/${slug}`;\n const outDir = safeJoin(root, outDirSeg).full;\n ensureDirSync(outDir);\n\n const saved: string[] = [];\n for (let i = 0; i < items.length; i++) {\n const it = items[i];\n const contentHash = hashBytes(it.bytes).replace(/^sha256:/, '');\n const ext = it.ext.startsWith('.') ? it.ext : `.${it.ext}`;\n // Prefer logicalName if provided to preserve ordering (e.g., frames)\n const baseName = it.logicalName ? `${it.logicalName}` : `${contentHash}`;\n const fname = `${baseName}${ext}`;\n const relPath = outDirSeg ? `${outDirSeg}/${fname}` : `${fname}`;\n const dest = safeJoin(root, relPath);\n validateWinPathEdge(dest.full);\n if (await hasCaseInsensitiveCollision(path.dirname(dest.full), path.basename(dest.full))) {\n throw new Error('case-insensitive filename collision');\n }\n const stg = path.join(stage, `${fname}.part`);\n\n // Diagnostic logging – size and signature\n try {\n const sig = it.bytes.slice(0, 8).toString('hex');\n const looksJson = it.bytes.length >= 1 && it.bytes[0] === 0x7b /* '{' */;\n console.log(`[store] writing ${dest.rel} (${it.bytes.length} bytes, sig=${sig}${looksJson ? ', WARN:json-like' : ''})`);\n } catch {}\n\n if (await existsSameHash(dest.full)) {\n // duplicate; reference existing\n saved.push(dest.rel);\n continue;\n }\n\n await fsp.writeFile(stg, it.bytes);\n await atomicRename(stg, dest.full);\n const relPosix = dest.rel.replace(/\\\\/g, '/');\n saved.push(relPosix);\n }\n\n if (!ctx.skipManifest) {\n const manifestObj: ManifestV1 = {\n manifestVersion: 1,\n ...(manifest as any),\n createdAt: manifest.createdAt || new Date().toISOString(),\n artifacts: (manifest.artifacts && manifest.artifacts.length > 0)\n ? manifest.artifacts\n : saved.map((file) => ({ file, hash: `sha256:${path.basename(file).split('.')[0]}` })),\n };\n\n const manifestPathRel = `${outDirSeg ? outDirSeg + '/' : ''}manifest.json`;\n const manifestStage = path.join(stage, 'manifest.json.part');\n const manifestFull = safeJoin(root, manifestPathRel).full;\n\n await fsp.writeFile(manifestStage, JSON.stringify(manifestObj, null, 2), 'utf8');\n try { console.log(`[store] manifest -> ${manifestPathRel}`); } catch {}\n await atomicRename(manifestStage, manifestFull);\n\n await fsp.rm(stage, { recursive: true, force: true });\n return { files: saved, manifestPath: manifestPathRel.replace(/\\\\/g, '/') };\n } else {\n await fsp.rm(stage, { recursive: true, force: true });\n return { files: saved, manifestPath: '' };\n }\n } catch (e) {\n await fsp.rm(stage, { recursive: true, force: true });\n throw e;\n }\n}\n","// Real Gemini provider using @google/genai — no mock fallback\nimport type { MediaProvider, ImageRequestCommon, VideoRequestCommon, ImageResult, VideoFramesResult } from '../ProviderTypes';\n\nexport class GeminiMediaProvider implements MediaProvider {\n private ai: any;\n private primaryModel: string;\n\n constructor(opts?: { model?: string }) {\n const apiKey = process.env.GOOGLE_API_KEY || process.env.GEMINI_API_KEY;\n if (!apiKey) {\n const hasGoogle = Boolean(process.env.GOOGLE_API_KEY);\n const hasGemini = Boolean(process.env.GEMINI_API_KEY);\n throw new Error(\n `GeminiMediaProvider: missing API key (GOOGLE_API_KEY=${hasGoogle ? 'set' : 'unset'}, GEMINI_API_KEY=${hasGemini ? 'set' : 'unset'})`\n );\n }\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const { GoogleGenAI } = require('@google/genai');\n this.ai = new GoogleGenAI({ apiKey });\n this.primaryModel = opts?.model || process.env.MARIA_IMAGE_MODEL || 'gemini-2.5-flash-image-preview';\n }\n\n async generateImage(req: ImageRequestCommon): Promise<ImageResult> {\n const modelName = this.primaryModel;\n const promptPreview = String(req.prompt ?? '').replace(/\\s+/g, ' ').slice(0, 200);\n const targetMime = (() => {\n const fmt = (req.format || 'png').toLowerCase();\n if (fmt === 'jpg') return 'image/jpeg';\n if (fmt === 'jpeg') return 'image/jpeg';\n if (fmt === 'png') return 'image/png';\n if (fmt === 'webp') return 'image/webp';\n return 'image/png';\n })();\n let resp: any;\n try {\n resp = await this.ai.models.generateContent({\n model: modelName,\n contents: [{ role: 'user', parts: [{ text: String(req.prompt) }]}],\n generationConfig: {\n responseModalities: ['IMAGE'],\n responseMimeType: targetMime,\n },\n });\n } catch (err: any) {\n const errMsg = err?.message || String(err);\n throw new Error(\n `GeminiMediaProvider.generateImage request failed: model=${modelName}; prompt=\"${promptPreview}\"; error=${errMsg}`\n );\n }\n const feedback = resp?.response?.promptFeedback;\n const blockReason = feedback?.blockReason || feedback?.block_reason;\n if (blockReason) {\n const modelName = this.primaryModel;\n const reason = String(blockReason);\n throw new Error(`GeminiMediaProvider.policy_violation: model=${modelName}; reason=${reason}`);\n }\n const parts = resp?.response?.candidates?.[0]?.content?.parts || [];\n for (const p of parts) {\n const data = (p?.inlineData?.data) || (p?.inline_data?.data);\n const mime = (p?.inlineData?.mimeType) || (p?.inline_data?.mime_type) || (p?.inline_data?.mimeType) || (p?.inlineData?.mime_type);\n if (data) {\n const buf = Buffer.from(String(data), 'base64');\n if (buf.length > 0) return { bytes: buf, mime: typeof mime === 'string' ? mime : targetMime };\n }\n }\n // Fallback path: try Imagen models if Gemini preview returned no inline data\n try {\n const imagenModel = process.env.MARIA_IMAGE_FALLBACK_MODEL || 'imagen-4.0-generate-001';\n const r2 = await this.ai.models.generateImages({\n model: imagenModel,\n prompt: String(req.prompt),\n });\n const img0 = r2?.generatedImages?.[0]?.image;\n const bytesB64 = img0?.imageBytes || img0?.bytesBase64Encoded;\n if (bytesB64) {\n const buf = Buffer.from(String(bytesB64), 'base64');\n if (buf.length > 0) return { bytes: buf, mime: targetMime };\n }\n } catch {}\n\n const candidatesLen = resp?.response?.candidates?.length ?? 0;\n const finish = resp?.response?.candidates?.[0]?.finishReason || resp?.response?.promptFeedback?.blockReason || 'unknown';\n const firstPartKeys = parts[0] ? Object.keys(parts[0]).join(',') : 'n/a';\n throw new Error(\n `GeminiMediaProvider.generateImage: no inline image returned; model=${modelName}; prompt=\"${promptPreview}\"; candidates=${candidatesLen}; parts=${parts.length}; firstPartKeys=${firstPartKeys}; finish=${finish}`\n );\n }\n\n async generateVideoFrames(req: VideoRequestCommon): Promise<VideoFramesResult> {\n // Not supported in local provider. Use server Veo 3 path.\n const fps = typeof req?.fps === 'number' ? req.fps : 'n/a';\n const duration = typeof req?.duration === 'number' ? req.duration : 'n/a';\n throw new Error(\n `GeminiMediaProvider.generateVideoFrames is not supported locally. Use server /api/v1/video (veo-3.1-generate-preview). requested_fps=${fps}; requested_duration=${duration}`\n );\n }\n}\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\n\nexport type SubscriptionPlanId = 'free' | 'starter' | 'pro' | 'ultra';\n\nexport interface SubscriptionEventRecord {\n id: string;\n type: string;\n status: 'received' | 'processed' | 'failed' | 'skipped';\n receivedAt: string;\n stripeCreatedAt?: string;\n processedAt?: string;\n error?: string;\n}\n\nexport interface CustomerRecord {\n id: string;\n uid?: string;\n email?: string;\n metadata?: Record<string, string>;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface SubscriptionRecord {\n id: string;\n customerId: string;\n uid?: string;\n status: string;\n planId: SubscriptionPlanId;\n pendingPlanId?: SubscriptionPlanId | null;\n pendingPlanEffectiveAt?: string | null;\n cancelAt?: string | null;\n cancelAtPeriodEnd?: boolean;\n canceledAt?: string | null;\n currentPeriodStart: string;\n currentPeriodEnd: string;\n trialEnd?: string | null;\n latestInvoiceId?: string;\n latestInvoiceStatus?: 'succeeded' | 'failed' | 'pending';\n latestInvoiceAmount?: number;\n metadata?: Record<string, string>;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface InvoiceRecord {\n id: string;\n subscriptionId?: string;\n customerId?: string;\n amountPaid: number;\n currency: string;\n status: 'succeeded' | 'failed';\n paidAt: string;\n createdAt: string;\n periodStart?: string;\n periodEnd?: string;\n hostedInvoiceUrl?: string;\n}\n\nexport interface EntitlementRecord {\n uid: string;\n planId: SubscriptionPlanId;\n features: string[];\n updatedAt: string;\n}\n\nexport interface UsageRecord {\n uid: string;\n planId: SubscriptionPlanId;\n periodId: string;\n limits: QuotaSnapshot;\n used: QuotaSnapshot;\n remaining: QuotaSnapshot;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface QuotaSnapshot {\n requests: number;\n tokens: number;\n code: number;\n attachment: number;\n}\n\ninterface SubscriptionState {\n events: Record<string, SubscriptionEventRecord>;\n customers: Record<string, CustomerRecord>;\n subscriptions: Record<string, SubscriptionRecord>;\n invoices: Record<string, InvoiceRecord>;\n entitlements: Record<string, EntitlementRecord>;\n usage: Record<string, UsageRecord>;\n}\n\nconst DEFAULT_STATE: SubscriptionState = {\n events: {},\n customers: {},\n subscriptions: {},\n invoices: {},\n entitlements: {},\n usage: {}\n};\n\nexport class SubscriptionStore {\n private readonly filePath: string;\n private state: SubscriptionState | null = null;\n private loadPromise: Promise<void> | null = null;\n private queue: Promise<void> = Promise.resolve();\n\n constructor(filePath?: string) {\n this.filePath = filePath ?? path.resolve(process.cwd(), 'data', 'subscription-state.json');\n }\n\n private async ensureLoaded(): Promise<void> {\n if (this.state) {\n return;\n }\n if (!this.loadPromise) {\n this.loadPromise = this.loadStateFromDisk();\n }\n await this.loadPromise;\n }\n\n private async loadStateFromDisk(): Promise<void> {\n try {\n const raw = await fs.readFile(this.filePath, 'utf8');\n const parsed = JSON.parse(raw) as SubscriptionState;\n this.state = {\n events: parsed.events ?? {},\n customers: parsed.customers ?? {},\n subscriptions: parsed.subscriptions ?? {},\n invoices: parsed.invoices ?? {},\n entitlements: parsed.entitlements ?? {},\n usage: parsed.usage ?? {}\n };\n } catch (error: any) {\n if (error?.code === 'ENOENT') {\n this.state = { ...DEFAULT_STATE };\n await this.persist();\n return;\n }\n throw error;\n }\n }\n\n private async persist(): Promise<void> {\n if (!this.state) {\n return;\n }\n const directory = path.dirname(this.filePath);\n await fs.mkdir(directory, { recursive: true });\n const payload = JSON.stringify(this.state, null, 2);\n await fs.writeFile(this.filePath, payload, 'utf8');\n }\n\n private runExclusive<T>(task: () => Promise<T>): Promise<T> {\n const result = this.queue.then(task);\n this.queue = result.then(() => undefined).catch(() => undefined);\n return result;\n }\n\n async markEventReceived(event: { id: string; type: string; created?: number }): Promise<'new' | 'duplicate' | 'pending'> {\n return this.runExclusive(async () => {\n await this.ensureLoaded();\n const now = new Date().toISOString();\n const state = this.state!;\n const existing = state.events[event.id];\n\n if (!existing) {\n state.events[event.id] = {\n id: event.id,\n type: event.type,\n status: 'received',\n receivedAt: now,\n stripeCreatedAt: event.created ? new Date(event.created * 1000).toISOString() : undefined\n };\n await this.persist();\n return 'new';\n }\n\n if (existing.status === 'processed') {\n return 'duplicate';\n }\n\n state.events[event.id] = {\n ...existing,\n type: event.type,\n status: existing.status === 'failed' ? 'received' : existing.status,\n receivedAt: existing.receivedAt ?? now\n };\n await this.persist();\n return 'pending';\n });\n }\n\n async markEventProcessed(eventId: string): Promise<void> {\n await this.runExclusive(async () => {\n await this.ensureLoaded();\n const state = this.state!;\n const existing = state.events[eventId];\n if (!existing) {\n return;\n }\n state.events[eventId] = {\n ...existing,\n status: 'processed',\n processedAt: new Date().toISOString(),\n error: undefined\n };\n await this.persist();\n });\n }\n\n async markEventFailed(eventId: string, error: unknown): Promise<void> {\n await this.runExclusive(async () => {\n await this.ensureLoaded();\n const state = this.state!;\n const existing = state.events[eventId];\n if (!existing) {\n return;\n }\n state.events[eventId] = {\n ...existing,\n status: 'failed',\n error: error instanceof Error ? error.message : String(error)\n };\n await this.persist();\n });\n }\n\n async upsertCustomer(record: Omit<CustomerRecord, 'createdAt' | 'updatedAt'> & Partial<Pick<CustomerRecord, 'createdAt' | 'updatedAt'>>): Promise<CustomerRecord> {\n return this.runExclusive(async () => {\n await this.ensureLoaded();\n const now = new Date().toISOString();\n const state = this.state!;\n const existing = state.customers[record.id];\n const createdAt = existing?.createdAt ?? record.createdAt ?? now;\n\n const nextRecord: CustomerRecord = {\n id: record.id,\n uid: record.uid ?? existing?.uid,\n email: record.email ?? existing?.email,\n metadata: {\n ...(existing?.metadata ?? {}),\n ...(record.metadata ?? {})\n },\n createdAt,\n updatedAt: record.updatedAt ?? now\n };\n\n state.customers[record.id] = nextRecord;\n await this.persist();\n return nextRecord;\n });\n }\n\n async getCustomer(customerId: string): Promise<CustomerRecord | undefined> {\n await this.ensureLoaded();\n const state = this.state!;\n const record = state.customers[customerId];\n return record ? { ...record, metadata: record.metadata ? { ...record.metadata } : undefined } : undefined;\n }\n\n async upsertSubscription(record: Omit<SubscriptionRecord, 'createdAt' | 'updatedAt'> & Partial<Pick<SubscriptionRecord, 'createdAt' | 'updatedAt'>>): Promise<SubscriptionRecord> {\n return this.runExclusive(async () => {\n await this.ensureLoaded();\n const now = new Date().toISOString();\n const state = this.state!;\n const existing = state.subscriptions[record.id];\n const createdAt = existing?.createdAt ?? record.createdAt ?? now;\n\n const nextRecord: SubscriptionRecord = {\n id: record.id,\n customerId: record.customerId,\n uid: record.uid ?? existing?.uid,\n status: record.status,\n planId: record.planId,\n pendingPlanId: record.pendingPlanId !== undefined\n ? record.pendingPlanId\n : existing?.pendingPlanId ?? null,\n pendingPlanEffectiveAt: record.pendingPlanEffectiveAt !== undefined\n ? record.pendingPlanEffectiveAt\n : existing?.pendingPlanEffectiveAt ?? null,\n cancelAt: record.cancelAt ?? null,\n cancelAtPeriodEnd: record.cancelAtPeriodEnd ?? false,\n canceledAt: record.canceledAt ?? null,\n currentPeriodStart: record.currentPeriodStart,\n currentPeriodEnd: record.currentPeriodEnd,\n trialEnd: record.trialEnd ?? null,\n latestInvoiceId: record.latestInvoiceId ?? existing?.latestInvoiceId,\n latestInvoiceStatus: record.latestInvoiceStatus ?? existing?.latestInvoiceStatus,\n latestInvoiceAmount: record.latestInvoiceAmount ?? existing?.latestInvoiceAmount,\n metadata: {\n ...(existing?.metadata ?? {}),\n ...(record.metadata ?? {})\n },\n createdAt,\n updatedAt: record.updatedAt ?? now\n };\n\n state.subscriptions[record.id] = nextRecord;\n await this.persist();\n return nextRecord;\n });\n }\n\n async getSubscription(subscriptionId: string): Promise<SubscriptionRecord | undefined> {\n await this.ensureLoaded();\n const state = this.state!;\n const record = state.subscriptions[subscriptionId];\n if (!record) {\n return undefined;\n }\n return {\n ...record,\n metadata: record.metadata ? { ...record.metadata } : undefined\n };\n }\n\n async findSubscriptionByCustomer(customerId: string): Promise<SubscriptionRecord | undefined> {\n await this.ensureLoaded();\n const state = this.state!;\n return Object.values(state.subscriptions).find((sub) => sub.customerId === customerId);\n }\n\n async recordInvoice(record: InvoiceRecord): Promise<InvoiceRecord> {\n return this.runExclusive(async () => {\n await this.ensureLoaded();\n const state = this.state!;\n state.invoices[record.id] = { ...record };\n await this.persist();\n return state.invoices[record.id];\n });\n }\n\n async setEntitlements(uid: string, planId: SubscriptionPlanId, features: string[]): Promise<EntitlementRecord> {\n return this.runExclusive(async () => {\n await this.ensureLoaded();\n const now = new Date().toISOString();\n const state = this.state!;\n const record: EntitlementRecord = {\n uid,\n planId,\n features: [...features],\n updatedAt: now\n };\n state.entitlements[uid] = record;\n await this.persist();\n return record;\n });\n }\n\n async setUsage(params: {\n uid: string;\n planId: SubscriptionPlanId;\n periodId: string;\n limits: QuotaSnapshot;\n }): Promise<UsageRecord> {\n return this.runExclusive(async () => {\n await this.ensureLoaded();\n const now = new Date().toISOString();\n const state = this.state!;\n const key = `${params.uid}:${params.periodId}`;\n const existing = state.usage[key];\n const used: QuotaSnapshot = existing?.used ?? {\n requests: 0,\n tokens: 0,\n code: 0,\n attachment: 0\n };\n const remaining: QuotaSnapshot = {\n requests: Math.max(0, params.limits.requests - used.requests),\n tokens: Math.max(0, params.limits.tokens - used.tokens),\n code: Math.max(0, params.limits.code - used.code),\n attachment: Math.max(0, params.limits.attachment - used.attachment)\n };\n\n const record: UsageRecord = {\n uid: params.uid,\n planId: params.planId,\n periodId: params.periodId,\n limits: { ...params.limits },\n used,\n remaining,\n createdAt: existing?.createdAt ?? now,\n updatedAt: now\n };\n\n state.usage[key] = record;\n await this.persist();\n return record;\n });\n }\n\n async getUsage(uid: string, periodId: string): Promise<UsageRecord | undefined> {\n await this.ensureLoaded();\n const key = `${uid}:${periodId}`;\n const record = this.state!.usage[key];\n if (!record) {\n return undefined;\n }\n return {\n ...record,\n limits: { ...record.limits },\n used: { ...record.used },\n remaining: { ...record.remaining }\n };\n }\n\n async getEntitlements(uid: string): Promise<EntitlementRecord | undefined> {\n await this.ensureLoaded();\n const record = this.state!.entitlements[uid];\n if (!record) {\n return undefined;\n }\n return {\n ...record,\n features: [...record.features]\n };\n }\n\n async snapshot(): Promise<SubscriptionState> {\n await this.ensureLoaded();\n const state = this.state!;\n return JSON.parse(JSON.stringify(state)) as SubscriptionState;\n }\n}\n\nexport default SubscriptionStore;\n","import { createHmac, timingSafeEqual } from 'node:crypto';\nimport SubscriptionStore, {\n CustomerRecord,\n QuotaSnapshot,\n SubscriptionPlanId\n} from './subscription-store.js';\n\nexport type StripeEventType =\n | 'checkout.session.completed'\n | 'customer.subscription.created'\n | 'customer.subscription.updated'\n | 'customer.subscription.deleted'\n | 'invoice.payment_succeeded'\n | 'invoice.payment_failed';\n\ninterface StripeEvent<T = unknown> {\n id: string;\n type: StripeEventType | string;\n created: number;\n data: {\n object: T;\n };\n livemode?: boolean;\n}\n\ninterface StripeSubscriptionItem {\n price?: {\n id?: string;\n nickname?: string | null;\n product?: string | { id?: string } | null;\n metadata?: Record<string, string | undefined>;\n };\n plan?: {\n product?: string | { id?: string } | null;\n metadata?: Record<string, string | undefined>;\n } | null;\n metadata?: Record<string, string | undefined>;\n}\n\ninterface StripeSubscription {\n id: string;\n status: string;\n customer: string | { id?: string; email?: string | null };\n items?: {\n data?: StripeSubscriptionItem[];\n };\n metadata?: Record<string, string | undefined>;\n cancel_at?: number | null;\n cancel_at_period_end?: boolean;\n canceled_at?: number | null;\n current_period_start: number;\n current_period_end: number;\n trial_end?: number | null;\n latest_invoice?: string | { id?: string } | null;\n}\n\ninterface StripeInvoiceLine {\n period?: {\n start?: number;\n end?: number;\n };\n plan?: {\n id?: string;\n metadata?: Record<string, string | undefined>;\n } | null;\n price?: {\n id?: string;\n product?: string | { id?: string } | null;\n metadata?: Record<string, string | undefined>;\n } | null;\n metadata?: Record<string, string | undefined>;\n}\n\ninterface StripeInvoice {\n id: string;\n status?: 'draft' | 'open' | 'paid' | 'uncollectible' | 'void';\n amount_paid?: number;\n currency?: string;\n customer?: string | { id?: string } | null;\n subscription?: string | { id?: string } | null;\n hosted_invoice_url?: string | null;\n created?: number;\n paid?: boolean;\n lines?: {\n data?: StripeInvoiceLine[];\n };\n period_start?: number;\n period_end?: number;\n}\n\ninterface StripeCheckoutSession {\n id: string;\n customer?: string | { id?: string } | null;\n customer_email?: string | null;\n metadata?: Record<string, string | undefined>;\n client_reference_id?: string | null;\n subscription?: string | null;\n mode?: string;\n}\n\ninterface StripeWebhookServiceOptions {\n secret: string;\n store?: SubscriptionStore;\n toleranceSeconds?: number;\n priceIdMap?: Record<string, SubscriptionPlanId>;\n productIdMap?: Record<string, SubscriptionPlanId>;\n}\n\nconst PLAN_PRIORITY: Record<SubscriptionPlanId, number> = {\n free: 0,\n starter: 1,\n pro: 2,\n ultra: 3\n};\n\nconst PLAN_CONFIG: Record<SubscriptionPlanId, { entitlements: string[]; quota: QuotaSnapshot }> = {\n free: {\n entitlements: [\n 'core.cli.basic',\n 'ai.chat.basic',\n 'usage.metrics.basic'\n ],\n quota: {\n requests: 100,\n tokens: 50000,\n code: 30,\n attachment: 10\n }\n },\n starter: {\n entitlements: [\n 'core.cli.basic',\n 'ai.chat.basic',\n 'ai.chat.priority',\n 'usage.metrics.expanded',\n 'workspace.multi-device'\n ],\n quota: {\n requests: 500,\n tokens: 250000,\n code: 200,\n attachment: 50\n }\n },\n pro: {\n entitlements: [\n 'core.cli.basic',\n 'ai.chat.priority',\n 'ai.code.advanced',\n 'orchestrator.code',\n 'usage.metrics.expanded',\n 'workspace.multi-device',\n 'api.webhooks'\n ],\n quota: {\n requests: 2000,\n tokens: 1000000,\n code: 1000,\n attachment: 200\n }\n },\n ultra: {\n entitlements: [\n 'core.cli.basic',\n 'ai.chat.priority',\n 'ai.code.advanced',\n 'orchestrator.code',\n 'orchestrator.media',\n 'monitoring.analytics',\n 'api.webhooks',\n 'support.priority'\n ],\n quota: {\n requests: 10000,\n tokens: 5000000,\n code: 5000,\n attachment: 1000\n }\n }\n};\n\nconst PLAN_ALIAS_MAP: Record<string, SubscriptionPlanId> = {\n starterannual: 'starter',\n 'starter-annual': 'starter',\n 'starter_yearly': 'starter',\n 'starter-yearly': 'starter',\n starteryearly: 'starter',\n proannual: 'pro',\n 'pro-annual': 'pro',\n 'pro_yearly': 'pro',\n 'pro-yearly': 'pro',\n proyearly: 'pro',\n ultraannual: 'ultra',\n 'ultra-annual': 'ultra',\n 'ultra_yearly': 'ultra',\n 'ultra-yearly': 'ultra',\n ultrayearly: 'ultra'\n};\n\nfunction sanitizeKey(value: string): string {\n return value.trim().toLowerCase().replace(/[^a-z0-9-]/g, '');\n}\n\nfunction toIso(timestamp?: number | null): string | null {\n if (!timestamp) {\n return null;\n }\n return new Date(timestamp * 1000).toISOString();\n}\n\nfunction formatPeriodId(date: Date | number): string {\n const instance = typeof date === 'number' ? new Date(date) : date;\n const year = instance.getUTCFullYear();\n const month = String(instance.getUTCMonth() + 1).padStart(2, '0');\n return `${year}${month}`;\n}\n\nfunction extractId(value: string | { id?: string } | null | undefined): string | undefined {\n if (!value) {\n return undefined;\n }\n if (typeof value === 'string') {\n return value;\n }\n return value.id ?? undefined;\n}\n\nfunction extractMetadataPlan(metadata?: Record<string, string | undefined>): string | undefined {\n if (!metadata) {\n return undefined;\n }\n const keys = ['planId', 'plan_id', 'plan', 'plan-id', 'plan_name'];\n for (const key of keys) {\n const value = metadata[key];\n if (value && value.trim()) {\n return value.trim();\n }\n }\n return undefined;\n}\n\nfunction extractUidFromMetadata(metadata?: Record<string, string | undefined>): string | undefined {\n if (!metadata) {\n return undefined;\n }\n const keys = ['uid', 'userId', 'user_id', 'customer_uid'];\n for (const key of keys) {\n const value = metadata[key];\n if (value && value.trim()) {\n return value.trim();\n }\n }\n return undefined;\n}\n\nexport class StripeWebhookService {\n private readonly secret: string;\n private readonly toleranceSeconds: number;\n private readonly store: SubscriptionStore;\n private readonly pricePlanMap: Map<string, SubscriptionPlanId> = new Map();\n private readonly productPlanMap: Map<string, SubscriptionPlanId> = new Map();\n\n constructor(options: StripeWebhookServiceOptions) {\n if (!options.secret) {\n throw new Error('Stripe webhook secret must be provided');\n }\n this.secret = options.secret;\n this.toleranceSeconds = options.toleranceSeconds ?? 300;\n this.store = options.store ?? new SubscriptionStore();\n this.registerEnvPlanMappings();\n\n if (options.priceIdMap) {\n for (const [id, plan] of Object.entries(options.priceIdMap)) {\n this.pricePlanMap.set(sanitizeKey(id), plan);\n }\n }\n\n if (options.productIdMap) {\n for (const [id, plan] of Object.entries(options.productIdMap)) {\n this.productPlanMap.set(sanitizeKey(id), plan);\n }\n }\n }\n\n verifySignature(rawBody: Buffer, signatureHeader: string | string[] | undefined): void {\n if (!signatureHeader) {\n throw new Error('Stripe signature header is missing');\n }\n const header = Array.isArray(signatureHeader) ? signatureHeader.join(',') : signatureHeader;\n const { timestamp, signatures } = this.parseSignatureHeader(header);\n if (!timestamp || signatures.length === 0) {\n throw new Error('Stripe signature header is invalid');\n }\n\n const timestampSeconds = Number(timestamp);\n if (!Number.isFinite(timestampSeconds)) {\n throw new Error('Stripe signature timestamp is invalid');\n }\n\n const nowSeconds = Math.floor(Date.now() / 1000);\n if (Math.abs(nowSeconds - timestampSeconds) > this.toleranceSeconds) {\n throw new Error('Stripe signature timestamp outside of tolerance window');\n }\n\n const signedPayload = `${timestamp}.${rawBody.toString('utf8')}`;\n const expected = createHmac('sha256', this.secret).update(signedPayload).digest('hex');\n const expectedBuffer = Buffer.from(expected, 'hex');\n\n const isValid = signatures.some((signature) => {\n const signatureBuffer = Buffer.from(signature, 'hex');\n if (signatureBuffer.length !== expectedBuffer.length) {\n return false;\n }\n return timingSafeEqual(signatureBuffer, expectedBuffer);\n });\n\n if (!isValid) {\n throw new Error('Stripe signature verification failed');\n }\n }\n\n parseEvent<T = unknown>(rawBody: Buffer): StripeEvent<T> {\n try {\n const parsed = JSON.parse(rawBody.toString('utf8')) as StripeEvent<T>;\n if (!parsed || typeof parsed !== 'object' || !parsed.id || !parsed.type) {\n throw new Error('Invalid event payload');\n }\n return parsed;\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n throw new Error(`Failed to parse Stripe event payload: ${message}`);\n }\n }\n\n async processEvent(event: StripeEvent): Promise<void> {\n const receipt = await this.store.markEventReceived({\n id: event.id,\n type: event.type,\n created: event.created\n });\n\n if (receipt === 'duplicate') {\n return;\n }\n\n try {\n switch (event.type) {\n case 'checkout.session.completed':\n await this.handleCheckoutSession(event as StripeEvent<StripeCheckoutSession>);\n break;\n case 'customer.subscription.created':\n await this.handleSubscriptionCreated(event as StripeEvent<StripeSubscription>);\n break;\n case 'customer.subscription.updated':\n await this.handleSubscriptionUpdated(event as StripeEvent<StripeSubscription>);\n break;\n case 'customer.subscription.deleted':\n await this.handleSubscriptionDeleted(event as StripeEvent<StripeSubscription>);\n break;\n case 'invoice.payment_succeeded':\n await this.handleInvoicePayment(event as StripeEvent<StripeInvoice>, true);\n break;\n case 'invoice.payment_failed':\n await this.handleInvoicePayment(event as StripeEvent<StripeInvoice>, false);\n break;\n default:\n // Mark unhandled events as processed to avoid replays\n console.info(`Unhandled Stripe event type: ${event.type}`);\n }\n await this.store.markEventProcessed(event.id);\n } catch (error) {\n await this.store.markEventFailed(event.id, error);\n throw error;\n }\n }\n\n private parseSignatureHeader(signatureHeader: string): { timestamp?: string; signatures: string[] } {\n const parts = signatureHeader.split(',');\n let timestamp: string | undefined;\n const signatures: string[] = [];\n\n for (const part of parts) {\n const [key, value] = part.trim().split('=');\n if (key === 't') {\n timestamp = value;\n } else if (key.startsWith('v')) {\n signatures.push(value);\n }\n }\n\n return { timestamp, signatures };\n }\n\n private registerEnvPlanMappings(): void {\n const mapping: Array<[string | undefined, SubscriptionPlanId]> = [\n [process.env.STRIPE_PRICE_STARTER, 'starter'],\n [process.env.STRIPE_PRICE_STARTER_ANNUAL, 'starter'],\n [process.env.STRIPE_PRICE_PRO, 'pro'],\n [process.env.STRIPE_PRICE_PRO_ANNUAL, 'pro'],\n [process.env.STRIPE_PRICE_ULTRA, 'ultra'],\n [process.env.STRIPE_PRICE_ULTRA_ANNUAL, 'ultra']\n ];\n\n mapping.forEach(([id, plan]) => {\n if (id && id.trim()) {\n this.pricePlanMap.set(sanitizeKey(id), plan);\n }\n });\n\n const productMapping: Array<[string | undefined, SubscriptionPlanId]> = [\n [process.env.STRIPE_PRODUCT_STARTER, 'starter'],\n [process.env.STRIPE_PRODUCT_PRO, 'pro'],\n [process.env.STRIPE_PRODUCT_ULTRA, 'ultra']\n ];\n\n productMapping.forEach(([id, plan]) => {\n if (id && id.trim()) {\n this.productPlanMap.set(sanitizeKey(id), plan);\n }\n });\n }\n\n private normalizePlanId(planId: string | undefined | null): SubscriptionPlanId {\n if (!planId) {\n return 'free';\n }\n const key = sanitizeKey(planId);\n if (PLAN_CONFIG[key as SubscriptionPlanId]) {\n return key as SubscriptionPlanId;\n }\n const alias = PLAN_ALIAS_MAP[key];\n if (alias) {\n return alias;\n }\n return 'free';\n }\n\n private resolvePlanFromSubscription(subscription: StripeSubscription): SubscriptionPlanId {\n const metadataPlan = extractMetadataPlan(subscription.metadata);\n if (metadataPlan) {\n return this.normalizePlanId(metadataPlan);\n }\n\n const items = subscription.items?.data ?? [];\n for (const item of items) {\n const itemMetadataPlan = extractMetadataPlan(item.metadata);\n if (itemMetadataPlan) {\n return this.normalizePlanId(itemMetadataPlan);\n }\n const priceMetadataPlan = extractMetadataPlan(item.price?.metadata);\n if (priceMetadataPlan) {\n return this.normalizePlanId(priceMetadataPlan);\n }\n const planMetadataPlan = extractMetadataPlan(item.plan?.metadata);\n if (planMetadataPlan) {\n return this.normalizePlanId(planMetadataPlan);\n }\n\n const priceId = item.price?.id;\n if (priceId) {\n const mapped = this.pricePlanMap.get(sanitizeKey(priceId));\n if (mapped) {\n return mapped;\n }\n }\n\n const productId = extractId(item.price?.product ?? item.plan?.product ?? null);\n if (productId) {\n const mapped = this.productPlanMap.get(sanitizeKey(productId));\n if (mapped) {\n return mapped;\n }\n }\n\n const nickname = item.price?.nickname;\n if (nickname) {\n const candidate = this.normalizePlanId(nickname);\n if (candidate !== 'free') {\n return candidate;\n }\n }\n }\n\n return 'free';\n }\n\n private getPlanConfig(planId: SubscriptionPlanId) {\n return PLAN_CONFIG[planId] ?? PLAN_CONFIG.free;\n }\n\n private async applyPlanEntitlements(uid: string, planId: SubscriptionPlanId, subscription: StripeSubscription | null, overridePeriod?: { start?: number; end?: number }): Promise<void> {\n const config = this.getPlanConfig(planId);\n await this.store.setEntitlements(uid, planId, config.entitlements);\n\n const periodStart = overridePeriod?.start ?? subscription?.current_period_start;\n const periodEnd = overridePeriod?.end ?? subscription?.current_period_end;\n const periodId = periodStart ? formatPeriodId(new Date(periodStart * 1000)) : formatPeriodId(Date.now());\n\n await this.store.setUsage({\n uid,\n planId,\n periodId,\n limits: config.quota\n });\n }\n\n private comparePlanPriority(a: SubscriptionPlanId, b: SubscriptionPlanId): number {\n return PLAN_PRIORITY[a] - PLAN_PRIORITY[b];\n }\n\n private async resolveUid(customerId: string | undefined, ...metadataSources: Array<Record<string, string | undefined> | undefined>): Promise<string | undefined> {\n for (const metadata of metadataSources) {\n const uidFromMetadata = extractUidFromMetadata(metadata);\n if (uidFromMetadata) {\n return uidFromMetadata;\n }\n }\n if (customerId) {\n const customer = await this.store.getCustomer(customerId);\n return customer?.uid;\n }\n return undefined;\n }\n\n private async handleCheckoutSession(event: StripeEvent<StripeCheckoutSession>): Promise<void> {\n const session = event.data.object;\n const customerId = extractId(session.customer ?? null);\n const uid = await this.resolveUid(customerId, session.metadata);\n\n if (!customerId) {\n console.warn('checkout.session.completed received without customer id', { sessionId: session.id });\n return;\n }\n\n const metadata: Record<string, string> = {};\n if (session.metadata) {\n for (const [key, value] of Object.entries(session.metadata)) {\n if (typeof value === 'string') {\n metadata[key] = value;\n }\n }\n }\n\n await this.store.upsertCustomer({\n id: customerId,\n uid,\n email: session.customer_email ?? undefined,\n metadata: {\n ...metadata,\n lastCheckoutSessionId: session.id,\n lastCheckoutMode: session.mode ?? undefined\n }\n });\n }\n\n private async handleSubscriptionCreated(event: StripeEvent<StripeSubscription>): Promise<void> {\n const subscription = event.data.object;\n const customerId = extractId(subscription.customer);\n if (!customerId) {\n throw new Error(`Subscription ${subscription.id} missing customer id`);\n }\n\n const planId = this.resolvePlanFromSubscription(subscription);\n const uid = await this.resolveUid(customerId, subscription.metadata);\n\n const customerRecord: CustomerRecord = {\n id: customerId,\n uid,\n email: typeof subscription.customer === 'object' ? subscription.customer.email ?? undefined : undefined,\n metadata: subscription.metadata && Object.keys(subscription.metadata).length > 0 ? { ...subscription.metadata } : undefined,\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString()\n };\n\n await this.store.upsertCustomer(customerRecord);\n\n await this.store.upsertSubscription({\n id: subscription.id,\n customerId,\n uid,\n status: subscription.status,\n planId,\n pendingPlanId: null,\n pendingPlanEffectiveAt: null,\n cancelAt: toIso(subscription.cancel_at),\n cancelAtPeriodEnd: subscription.cancel_at_period_end ?? false,\n canceledAt: toIso(subscription.canceled_at),\n currentPeriodStart: toIso(subscription.current_period_start) ?? new Date().toISOString(),\n currentPeriodEnd: toIso(subscription.current_period_end) ?? new Date().toISOString(),\n trialEnd: toIso(subscription.trial_end),\n metadata: subscription.metadata && Object.keys(subscription.metadata).length > 0 ? { ...subscription.metadata } : undefined\n });\n\n if (uid) {\n await this.applyPlanEntitlements(uid, planId, subscription);\n }\n }\n\n private async handleSubscriptionUpdated(event: StripeEvent<StripeSubscription>): Promise<void> {\n const subscription = event.data.object;\n const customerId = extractId(subscription.customer);\n if (!customerId) {\n throw new Error(`Subscription ${subscription.id} missing customer id`);\n }\n\n const existing = await this.store.getSubscription(subscription.id);\n const resolvedPlan = this.resolvePlanFromSubscription(subscription);\n const uid = await this.resolveUid(customerId, subscription.metadata, existing?.metadata);\n const planChange = existing ? this.comparePlanPriority(resolvedPlan, existing.planId) : 0;\n\n let effectivePlan = resolvedPlan;\n let pendingPlan: SubscriptionPlanId | null = existing?.pendingPlanId ?? null;\n let pendingEffectiveAt: string | null = existing?.pendingPlanEffectiveAt ?? null;\n\n if (existing) {\n if (planChange < 0) {\n // Downgrade scheduled: keep current plan active until invoice confirms\n effectivePlan = existing.planId;\n pendingPlan = resolvedPlan;\n pendingEffectiveAt = toIso(subscription.current_period_end) ?? toIso(subscription.cancel_at) ?? existing.currentPeriodEnd;\n } else {\n pendingPlan = null;\n pendingEffectiveAt = null;\n if (planChange > 0 && uid) {\n // Upgrade: apply entitlements immediately\n await this.applyPlanEntitlements(uid, resolvedPlan, subscription);\n }\n }\n } else if (uid) {\n await this.applyPlanEntitlements(uid, resolvedPlan, subscription);\n }\n\n await this.store.upsertSubscription({\n id: subscription.id,\n customerId,\n uid,\n status: subscription.status,\n planId: effectivePlan,\n pendingPlanId: pendingPlan,\n pendingPlanEffectiveAt: pendingEffectiveAt,\n cancelAt: toIso(subscription.cancel_at),\n cancelAtPeriodEnd: subscription.cancel_at_period_end ?? false,\n canceledAt: toIso(subscription.canceled_at),\n currentPeriodStart: toIso(subscription.current_period_start) ?? existing?.currentPeriodStart ?? new Date().toISOString(),\n currentPeriodEnd: toIso(subscription.current_period_end) ?? existing?.currentPeriodEnd ?? new Date().toISOString(),\n trialEnd: toIso(subscription.trial_end),\n metadata: subscription.metadata && Object.keys(subscription.metadata).length > 0 ? { ...subscription.metadata } : undefined\n });\n\n if (uid) {\n await this.store.upsertCustomer({\n id: customerId,\n uid,\n metadata: subscription.metadata && Object.keys(subscription.metadata).length > 0 ? { ...subscription.metadata } : undefined\n });\n }\n }\n\n private async handleSubscriptionDeleted(event: StripeEvent<StripeSubscription>): Promise<void> {\n const subscription = event.data.object;\n const customerId = extractId(subscription.customer);\n const existing = await this.store.getSubscription(subscription.id);\n const uid = await this.resolveUid(customerId, subscription.metadata, existing?.metadata);\n\n await this.store.upsertSubscription({\n id: subscription.id,\n customerId: customerId ?? existing?.customerId ?? 'unknown',\n uid: uid ?? existing?.uid,\n status: 'canceled',\n planId: 'free',\n pendingPlanId: null,\n pendingPlanEffectiveAt: null,\n cancelAt: toIso(subscription.cancel_at),\n cancelAtPeriodEnd: subscription.cancel_at_period_end ?? false,\n canceledAt: toIso(subscription.canceled_at) ?? new Date().toISOString(),\n currentPeriodStart: toIso(subscription.current_period_start) ?? existing?.currentPeriodStart ?? new Date().toISOString(),\n currentPeriodEnd: toIso(subscription.current_period_end) ?? existing?.currentPeriodEnd ?? new Date().toISOString(),\n trialEnd: toIso(subscription.trial_end),\n metadata: subscription.metadata && Object.keys(subscription.metadata).length > 0 ? { ...subscription.metadata } : undefined\n });\n\n if (uid) {\n await this.applyPlanEntitlements(uid, 'free', subscription);\n }\n }\n\n private async handleInvoicePayment(event: StripeEvent<StripeInvoice>, succeeded: boolean): Promise<void> {\n const invoice = event.data.object;\n const subscriptionId = extractId(invoice.subscription ?? null);\n if (!subscriptionId) {\n console.warn('Invoice received without subscription id', { invoiceId: invoice.id });\n return;\n }\n\n const subscription = await this.store.getSubscription(subscriptionId);\n if (!subscription) {\n console.warn('Invoice received for unknown subscription', { invoiceId: invoice.id, subscriptionId });\n return;\n }\n\n const customerId = extractId(invoice.customer ?? subscription.customerId);\n\n await this.store.recordInvoice({\n id: invoice.id,\n subscriptionId,\n customerId,\n amountPaid: (invoice.amount_paid ?? 0) / 100,\n currency: invoice.currency ?? 'usd',\n status: succeeded ? 'succeeded' : 'failed',\n paidAt: invoice.created ? new Date(invoice.created * 1000).toISOString() : new Date().toISOString(),\n createdAt: new Date().toISOString(),\n periodStart: toIso(invoice.lines?.data?.[0]?.period?.start ?? invoice.period_start ?? null),\n periodEnd: toIso(invoice.lines?.data?.[0]?.period?.end ?? invoice.period_end ?? null),\n hostedInvoiceUrl: invoice.hosted_invoice_url ?? undefined\n });\n\n if (!succeeded) {\n await this.store.upsertSubscription({\n id: subscription.id,\n customerId: subscription.customerId,\n uid: subscription.uid,\n status: subscription.status,\n planId: subscription.planId,\n pendingPlanId: subscription.pendingPlanId ?? null,\n pendingPlanEffectiveAt: subscription.pendingPlanEffectiveAt ?? null,\n cancelAt: subscription.cancelAt ?? null,\n cancelAtPeriodEnd: subscription.cancelAtPeriodEnd ?? false,\n canceledAt: subscription.canceledAt ?? null,\n currentPeriodStart: subscription.currentPeriodStart,\n currentPeriodEnd: subscription.currentPeriodEnd,\n trialEnd: subscription.trialEnd ?? null,\n latestInvoiceId: invoice.id,\n latestInvoiceStatus: 'failed',\n latestInvoiceAmount: (invoice.amount_paid ?? 0) / 100\n });\n return;\n }\n\n const fallbackPeriodStart = subscription.currentPeriodStart ? Date.parse(subscription.currentPeriodStart) / 1000 : undefined;\n const fallbackPeriodEnd = subscription.currentPeriodEnd ? Date.parse(subscription.currentPeriodEnd) / 1000 : undefined;\n\n const periodStart = invoice.lines?.data?.[0]?.period?.start\n ?? invoice.period_start\n ?? fallbackPeriodStart;\n const periodEnd = invoice.lines?.data?.[0]?.period?.end\n ?? invoice.period_end\n ?? fallbackPeriodEnd;\n\n let nextPlanId = subscription.planId;\n let pendingPlanId = subscription.pendingPlanId ?? null;\n let pendingEffectiveAt = subscription.pendingPlanEffectiveAt ?? null;\n\n if (subscription.pendingPlanId) {\n nextPlanId = subscription.pendingPlanId;\n pendingPlanId = null;\n pendingEffectiveAt = null;\n if (subscription.uid) {\n await this.applyPlanEntitlements(subscription.uid, nextPlanId, null, { start: periodStart, end: periodEnd });\n }\n } else if (subscription.uid) {\n await this.applyPlanEntitlements(subscription.uid, subscription.planId, null, { start: periodStart, end: periodEnd });\n }\n\n await this.store.upsertSubscription({\n id: subscription.id,\n customerId: subscription.customerId,\n uid: subscription.uid,\n status: subscription.status,\n planId: nextPlanId,\n pendingPlanId,\n pendingPlanEffectiveAt: pendingEffectiveAt,\n cancelAt: subscription.cancelAt ?? null,\n cancelAtPeriodEnd: subscription.cancelAtPeriodEnd ?? false,\n canceledAt: subscription.canceledAt ?? null,\n currentPeriodStart: periodStart ? toIso(periodStart) ?? subscription.currentPeriodStart : subscription.currentPeriodStart,\n currentPeriodEnd: periodEnd ? toIso(periodEnd) ?? subscription.currentPeriodEnd : subscription.currentPeriodEnd,\n trialEnd: subscription.trialEnd ?? null,\n latestInvoiceId: invoice.id,\n latestInvoiceStatus: 'succeeded',\n latestInvoiceAmount: (invoice.amount_paid ?? 0) / 100\n });\n }\n}\n\nexport default StripeWebhookService;\n","/**\n * Express Server for MARIA CODE API\n * With Rate Limiting and API Endpoints\n */\n\nimport express, { Request, Response, NextFunction } from 'express';\nimport cors from 'cors';\nimport helmet from 'helmet';\nimport compression, { filter as compressionFilter } from 'compression';\nimport { rateLimitMiddleware, startRateLimitCleanup } from '../middleware/rate-limit';\nimport { saveArtifacts } from '../services/media-orchestrator/Storage';\nimport { GeminiMediaProvider } from '../providers/google/gemini-media';\nimport { hasFfmpeg, muxFramesToMp4 } from '../services/media-orchestrator/ffmpeg';\nimport { hashPrompt, type ManifestV1 } from '../services/media-orchestrator/types';\nimport path from 'node:path';\nimport fs from 'node:fs/promises';\nimport freePlan from '../config/plans/free-plan.json';\nimport IMSFacade from '../services/intelligent-model-selector/IMSFacade';\nimport SubscriptionStore from '../services/subscription/subscription-store';\nimport StripeWebhookService from '../services/subscription/stripe-webhook-service';\n\n// Simple in-memory job registry (ephemeral). For production, persist to DB.\ntype JobStatus = 'queued' | 'running' | 'completed' | 'failed';\ntype JobKind = 'image' | 'video';\ninterface JobInfo {\n id: string;\n status: JobStatus;\n kind: JobKind;\n manifestPath?: string;\n error?: string;\n createdAt: string;\n updatedAt: string;\n uid?: string;\n}\nconst jobIndex: Map<string, JobInfo> = new Map();\n\nconst app: express.Express = express();\nconst port = process.env.PORT || 8080;\n\nconst subscriptionStore = new SubscriptionStore();\nconst stripeWebhookSecret = process.env.STRIPE_WEBHOOK_SECRET;\nlet stripeWebhookService: StripeWebhookService | null = null;\n\nif (stripeWebhookSecret) {\n try {\n stripeWebhookService = new StripeWebhookService({\n secret: stripeWebhookSecret,\n store: subscriptionStore\n });\n } catch (error) {\n stripeWebhookService = null;\n console.error('Failed to initialize Stripe webhook service:', error);\n }\n} else {\n console.warn('STRIPE_WEBHOOK_SECRET is not configured; Stripe webhook endpoint will be disabled.');\n}\n\n// Security middleware\napp.use(helmet());\napp.use(cors());\n// Disable compression for media files to avoid any chance of corrupting binary transfers\napp.use(compression({\n filter: (req, res) => {\n if (/\\.(mp4|webm|mov)$/i.test(req.url)) return false;\n return compressionFilter(req, res);\n }\n}));\napp.use('/api/stripe/webhook', express.raw({ type: 'application/json' }));\n// Increase body limit to comfortably accept base64 attachments (images, PDFs)\napp.use(express.json({ limit: '50mb' }));\napp.use(express.urlencoded({ extended: true }));\n\n// Serve artifacts statically (read-only). In production, protect via CDN or auth middleware.\ntry {\n const artifactsDir = path.resolve(process.cwd(), 'artifacts');\n app.use('/artifacts', express.static(artifactsDir, { fallthrough: true, extensions: ['json','png','jpg','webp','mp4','webm','mov'] }));\n} catch {}\n\n// Request logging\napp.use((req: Request, res: Response, next: NextFunction) => {\n console.log(`[${new Date().toISOString()}] ${req.method} ${req.path}`);\n next();\n});\n\n// Health check (no rate limit)\napp.get('/health', (req: Request, res: Response) => {\n res.status(200).send('OK');\n});\n\napp.get('/api/status', (req: Request, res: Response) => {\n res.json({\n status: 'healthy',\n version: '4.3.9',\n uptime: process.uptime(),\n memory: process.memoryUsage(),\n platform: process.platform,\n node: process.version,\n timestamp: new Date().toISOString()\n });\n});\n\n// Root endpoint\napp.get('/', (req: Request, res: Response) => {\n res.json({\n name: 'MARIA CODE API',\n version: '4.4.7',\n status: 'running',\n environment: process.env.NODE_ENV || 'development',\n endpoints: {\n health: '/health',\n status: '/api/status',\n ai: '/api/ai',\n image: '/api/v1/image',\n video: '/api/v1/video',\n code: '/api/v1/code',\n chat: '/api/v1/chat'\n },\n timestamp: new Date().toISOString()\n });\n});\n\napp.post('/api/stripe/webhook', async (req: Request, res: Response) => {\n if (!stripeWebhookService) {\n return res.status(503).json({ error: 'Stripe webhook processing is not configured' });\n }\n\n const signature = req.headers['stripe-signature'];\n const rawBody = Buffer.isBuffer(req.body)\n ? req.body\n : Buffer.from(typeof req.body === 'string' ? req.body : JSON.stringify(req.body ?? {}), 'utf8');\n\n try {\n stripeWebhookService.verifySignature(rawBody, signature);\n } catch (error) {\n console.error('Stripe webhook signature verification failed:', error);\n return res.status(400).json({ error: 'Invalid Stripe signature' });\n }\n\n let event;\n try {\n event = stripeWebhookService.parseEvent(rawBody);\n } catch (error) {\n console.error('Stripe webhook payload parsing failed:', error);\n return res.status(400).json({ error: 'Invalid Stripe payload' });\n }\n\n stripeWebhookService.processEvent(event).catch((error) => {\n console.error('Stripe webhook processing error:', error);\n });\n\n return res.sendStatus(200);\n});\n\n// ---- Error classification helpers (provider/auth/policy) ----\nfunction classifyMediaError(err: unknown): { status: number; code: string; message: string; hint?: string } {\n const raw = (err as any);\n const msg: string = String(raw?.message || raw || 'unknown error');\n const lower = msg.toLowerCase();\n // Auth / key issues\n if (lower.includes('missing api key') || lower.includes('api key') && lower.includes('missing')) {\n return { status: 503, code: 'provider_unavailable', message: 'Provider API key is not configured', hint: 'Set GOOGLE_API_KEY or GEMINI_API_KEY on the server' };\n }\n if (lower.includes('invalid api key') || lower.includes('permission denied') || lower.includes('unauthorized')) {\n return { status: 502, code: 'provider_auth_failed', message: 'Provider authentication failed', hint: 'Verify your Google AI Studio API key' };\n }\n // Policy / moderation blocks from Gemini\n if (lower.includes('blockreason') || lower.includes('safety') || lower.includes('blocked') || lower.includes('policy')) {\n return { status: 422, code: 'policy_violation', message: 'Request was blocked by provider policy', hint: 'Modify the prompt to comply with safety policies' };\n }\n // No content returned (model refusal or empty)\n if (lower.includes('no inline image returned') || lower.includes('no video returned') || lower.includes('refus')) {\n return { status: 422, code: 'content_refused', message: 'Model refused or returned no content', hint: 'Try rephrasing the prompt' };\n }\n // Timeouts / rate limits\n if (lower.includes('timeout')) {\n return { status: 504, code: 'timeout', message: 'Generation timed out', hint: 'Please retry later' };\n }\n if (lower.includes('rate limit') || lower.includes('429')) {\n return { status: 429, code: 'rate_limited', message: 'Rate limit exceeded', hint: 'Slow down requests or try again shortly' };\n }\n // Fallback\n return { status: 500, code: 'internal_error', message: 'Failed to generate media' };\n}\n\n// Helper: verify Firebase ID token if firebase-admin is available; otherwise decode payload best-effort\nasync function decodeFirebaseToken(token: string): Promise<any | null> {\n try {\n // Dynamic import to avoid hard dep at build time\n const admin: any = await import('firebase-admin').catch(() => null);\n if (admin) {\n if (!admin.apps || admin.apps.length === 0) {\n try { admin.initializeApp(); } catch { /* ignore double init */ }\n }\n const decoded = await admin.auth().verifyIdToken(token, true);\n return decoded;\n }\n } catch {\n // ignore and fallback to unsafe decode\n }\n try {\n const parts = token.split('.');\n if (parts.length !== 3) return null;\n const payload = JSON.parse(Buffer.from(parts[1], 'base64').toString('utf8'));\n return payload;\n } catch {\n return null;\n }\n}\n\n// ---- Plan/Usage helpers (Firestore) ----\nfunction getCurrentPeriodId(): string {\n const now = new Date();\n return `${now.getUTCFullYear()}${String(now.getUTCMonth() + 1).padStart(2, '0')}`;\n}\n\nfunction nextMonthResetISO(): string {\n const d = new Date();\n d.setUTCMonth(d.getUTCMonth() + 1, 1);\n d.setUTCHours(0, 0, 0, 0);\n return d.toISOString();\n}\n\nconst PLAN_LIMITS: Record<string, { req: number; tokens: number; code: number; attachment: number }> = {\n free: { req: 300, tokens: 50000, code: 40, attachment: 5 },\n starter: { req: 1400, tokens: 1000000, code: 300, attachment: 50 },\n 'starter-annual': { req: 1400, tokens: 1000000, code: 300, attachment: 50 },\n pro: { req: 5000, tokens: 3500000, code: 1200, attachment: 200 },\n 'pro-annual': { req: 5000, tokens: 3500000, code: 1200, attachment: 200 },\n ultra: { req: 10000, tokens: 5000000, code: 5000, attachment: 500 },\n 'ultra-annual': { req: 10000, tokens: 5000000, code: 5000, attachment: 500 },\n enterprise: { req: -1, tokens: -1, code: -1, attachment: -1 },\n};\n\nfunction planName(planId: string): string {\n const names: Record<string, string> = {\n free: 'Free', starter: 'Starter', 'starter-annual': 'Starter (Annual)',\n pro: 'Pro', 'pro-annual': 'Pro (Annual)', ultra: 'Ultra', 'ultra-annual': 'Ultra (Annual)', enterprise: 'Enterprise'\n };\n return names[planId] || 'Free';\n}\n\nasync function getUserPlanAndLimits(uid: string): Promise<{ planId: string; limits: { req: number; tokens: number; code: number; attachment: number } }> {\n const db = await getFirestoreSafe();\n const fallback = { planId: 'free', limits: PLAN_LIMITS.free };\n if (!db) return fallback;\n try {\n const snap = await db.collection('user_subscriptions').doc(uid).get();\n const pid = (snap.exists && (snap.data() as any)?.planId) ? String((snap.data() as any).planId) : 'free';\n return { planId: pid, limits: PLAN_LIMITS[pid] || PLAN_LIMITS.free };\n } catch {\n return fallback;\n }\n}\n\nasync function ensureUsageDoc(uid: string): Promise<{ ref: any; data: any; planId: string; limits: { req: number; tokens: number; code: number; attachment: number } }> {\n const db = await getFirestoreSafe();\n if (!db) return { ref: null, data: null, planId: 'free', limits: PLAN_LIMITS.free };\n const periodId = getCurrentPeriodId();\n const { planId: pid, limits } = await getUserPlanAndLimits(uid);\n const ref = db.collection('users').doc(uid).collection('usage').doc(periodId);\n const snap = await ref.get();\n if (!snap.exists) {\n const nowISO = new Date().toISOString();\n const init = {\n periodId,\n createdAt: nowISO,\n updatedAt: nowISO,\n resetAt: nextMonthResetISO(),\n limits,\n remain: limits,\n used: { req: 0, tokens: 0, code: 0, attachment: 0 },\n };\n await ref.set(init, { merge: true });\n return { ref, data: init, planId: pid, limits };\n }\n return { ref, data: snap.data(), planId: pid, limits };\n}\n\nasync function applyConsumption(uid: string, consumption: Record<string, number>, idemKey?: string): Promise<any> {\n const db = await getFirestoreSafe();\n if (!db) return null;\n const { ref, data, planId: pid, limits } = await ensureUsageDoc(uid);\n const nowISO = new Date().toISOString();\n // Optional idempotency per-period\n if (idemKey) {\n const idemRef = ref.collection('consumptions').doc(idemKey);\n const idemSnap = await idemRef.get();\n if (!idemSnap.exists) await idemRef.set({ createdAt: nowISO, consumption });\n else return data; // already applied\n }\n const toNum = (v: unknown) => (typeof v === 'number' && isFinite(v) ? v : 0);\n const incReq = toNum(consumption.requests) + toNum((consumption as any).req);\n const incTokens = toNum((consumption as any).tokens);\n const incCode = toNum((consumption as any).code) + toNum((consumption as any).image) + toNum((consumption as any).video);\n const incAttachment = toNum((consumption as any).attachment);\n const used = data?.used || { req: 0, tokens: 0, code: 0, attachment: 0 };\n const newUsed = {\n req: Math.max(0, used.req + incReq),\n tokens: Math.max(0, used.tokens + incTokens),\n code: Math.max(0, used.code + incCode),\n attachment: Math.max(0, used.attachment + incAttachment),\n };\n const remain = {\n req: limits.req < 0 ? -1 : Math.max(0, limits.req - newUsed.req),\n tokens: limits.tokens < 0 ? -1 : Math.max(0, limits.tokens - newUsed.tokens),\n code: limits.code < 0 ? -1 : Math.max(0, limits.code - newUsed.code),\n attachment: limits.attachment < 0 ? -1 : Math.max(0, limits.attachment - newUsed.attachment),\n };\n await ref.set({ used: newUsed, remain, updatedAt: nowISO }, { merge: true });\n return { ...(data || {}), used: newUsed, remain, limits, periodId: getCurrentPeriodId(), updatedAt: nowISO };\n}\n\n/**\n * Auth: Get current user profile\n * Mirrors expected CLI contract at GET /api/user/profile\n */\napp.get('/api/user/profile', async (req: Request, res: Response) => {\n try {\n const authHeader = req.headers.authorization || '';\n if (!authHeader.startsWith('Bearer ')) {\n return res.status(401).json({ error: 'unauthorized' });\n }\n\n const idToken = authHeader.substring('Bearer '.length).trim();\n\n const decoded = await decodeFirebaseToken(idToken);\n if (!decoded) {\n return res.status(401).json({ error: 'invalid_token' });\n }\n\n // Extract identity\n const uid = decoded.uid || decoded.sub || 'unknown';\n const email = decoded.email || '';\n const displayName = decoded.name || decoded.displayName || (email ? String(email).split('@')[0] : 'User');\n let provider = decoded.firebase?.sign_in_provider as string | undefined;\n if (!provider && decoded.firebase?.identities) {\n const ids = decoded.firebase.identities as Record<string, unknown>;\n if (Array.isArray(ids['github.com']) && ids['github.com'].length > 0) provider = 'github';\n else if (Array.isArray(ids['google.com']) && ids['google.com'].length > 0) provider = 'google';\n }\n\n const { planId: pid, limits } = await getUserPlanAndLimits(uid);\n const periodRef = await ensureUsageDoc(uid);\n const currentUsedReq = Number(periodRef?.data?.used?.req || 0);\n const response = {\n id: uid,\n email,\n name: displayName,\n provider: provider || 'unknown',\n plan: String(pid).toUpperCase(),\n usage: {\n requests: currentUsedReq,\n requestLimit: limits.req < 0 ? Number.MAX_SAFE_INTEGER : limits.req,\n tokens: Number(periodRef?.data?.used?.tokens || 0),\n tokenLimit: limits.tokens < 0 ? Number.MAX_SAFE_INTEGER : limits.tokens,\n resetDate: periodRef?.data?.resetAt || nextMonthResetISO()\n },\n models: ['gpt-5', 'gemini-2.5-pro']\n };\n\n return res.status(200).json(response);\n } catch (error) {\n console.error('[User Profile] Error:', error);\n return res.status(500).json({ error: 'PROFILE_FETCH_FAILED' });\n }\n});\n\n/**\n * Minimal AI Proxy Endpoint\n * - Accepts { prompt, model?, provider? }\n * - Uses Secret Manager (ADC) to fetch API keys\n * - Currently supports provider: 'openai' (default)\n */\napp.post('/api/ai', rateLimitMiddleware, async (_req: Request, res: Response) => {\n return res.status(410).json({\n error: 'gone',\n message: 'This endpoint is deprecated. Please use /v1/ai-proxy.'\n });\n});\n\n/**\n * Research Endpoint with Gemini Grounding and Web Scraping\n * Body: { query?: string; url?: string; topK?: number }\n * Returns: { success, data: { summary, sources: [{ url, title? }] } }\n */\napp.post('/api/v1/research', rateLimitMiddleware, async (req: Request, res: Response) => {\n try {\n await loadProviderKeys();\n\n const auth = req.headers.authorization;\n if (!auth || !auth.startsWith('Bearer ')) {\n return res.status(401).json({ error: 'unauthorized', message: 'Login required' });\n }\n\n const body = (req.body || {}) as { query?: string; url?: string; topK?: number };\n const query = typeof body.query === 'string' ? body.query.trim() : '';\n const url = typeof body.url === 'string' ? body.url.trim() : '';\n const topK = Number.isFinite(body.topK) ? Math.max(1, Math.min(5, Math.floor(body.topK as number))) : 5;\n\n if (!query && !url) {\n return res.status(400).json({ error: 'bad_request', message: 'query or url required' });\n }\n\n // Helper: basic HTML -> text extraction (no external deps)\n const extractText = (html: string): string => {\n try {\n const withoutScripts = html.replace(/<script[\\s\\S]*?<\\/script>/gi, ' ').replace(/<style[\\s\\S]*?<\\/style>/gi, ' ');\n const noTags = withoutScripts.replace(/<[^>]+>/g, ' ');\n const unescaped = noTags\n .replace(/&nbsp;/g, ' ')\n .replace(/&amp;/g, '&')\n .replace(/&lt;/g, '<')\n .replace(/&gt;/g, '>')\n .replace(/&quot;/g, '\"')\n .replace(/&#39;/g, \"'\");\n return unescaped.replace(/\\s+/g, ' ').trim();\n } catch {\n return html;\n }\n };\n\n // Helper: fetch URL to text (with timeout)\n const fetchText = async (targetUrl: string): Promise<{ url: string; title?: string; text: string } | null> => {\n try {\n const ctrl = new AbortController();\n const to = setTimeout(() => ctrl.abort(), 20000);\n const r = await fetch(targetUrl, { method: 'GET', signal: ctrl.signal } as any);\n clearTimeout(to);\n if (!r.ok) return null;\n const html = await r.text();\n const titleMatch = /<title>([\\s\\S]*?)<\\/title>/i.exec(html);\n return { url: targetUrl, title: titleMatch ? titleMatch[1].trim() : undefined, text: extractText(html).slice(0, 120_000) };\n } catch {\n return null;\n }\n };\n\n // Resolve candidate sources\n let sources: Array<{ url: string; title?: string }> = [];\n let seedSummary = '';\n\n if (url) {\n sources = [{ url }];\n } else {\n // Use Gemini with grounding to get top web results\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const { GoogleGenAI } = require('@google/genai');\n const apiKey = process.env.GOOGLE_API_KEY || process.env.GEMINI_API_KEY;\n if (!apiKey) {\n return res.status(503).json({ error: 'provider_unavailable', message: 'Provider API key is not configured' });\n }\n const ai = new GoogleGenAI({ apiKey });\n const groundingTool = { googleSearch: {} };\n const config = { tools: [groundingTool] } as any;\n const modelName = process.env.MARIA_RESEARCH_MODEL || 'gemini-2.5-flash';\n const response: any = await ai.models.generateContent({ model: modelName, contents: String(query), config });\n const textOut: string = String((response?.text) || (response?.response?.candidates?.[0]?.content?.parts?.[0]?.text || ''));\n seedSummary = textOut;\n const chunks: any[] = (response?.response?.candidates?.[0]?.groundingMetadata?.groundingChunks || []) as any[];\n const urls = chunks\n .map((c: any) => ({ url: String(c?.web?.uri || '').trim(), title: String(c?.web?.title || '').trim() }))\n .filter((c: any) => c.url && /^https?:\\/\\//i.test(c.url));\n // De-duplicate by URL\n const seen = new Set<string>();\n const deduped: Array<{ url: string; title?: string }> = [];\n for (const c of urls) { if (!seen.has(c.url)) { seen.add(c.url); deduped.push(c); } }\n sources = deduped.slice(0, topK);\n }\n\n // Scrape top sources (or the single URL)\n const scraped: Array<{ url: string; title?: string; text: string }> = [];\n for (const s of sources) {\n const got = await fetchText(s.url);\n if (got) scraped.push({ url: got.url, title: got.title || s.title, text: got.text });\n }\n\n // Summarize scraped content in English plaintext\n const summarize = async (inputText: string): Promise<string> => {\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const { GoogleGenAI } = require('@google/genai');\n const apiKey = process.env.GOOGLE_API_KEY || process.env.GEMINI_API_KEY;\n if (!apiKey) return '';\n const ai = new GoogleGenAI({ apiKey });\n const modelName = process.env.MARIA_RESEARCH_MODEL || 'gemini-2.5-flash';\n const prompt = `Summarize the following web research into concise English plaintext.\\n- Focus on verifiable facts and key takeaways.\\n- Keep it under 12 sentences.\\n- Do not include markdown, just plain text.\\n\\nCONTENT BEGIN\\n${inputText}\\nCONTENT END`;\n const resp: any = await ai.models.generateContent({ model: modelName, contents: prompt });\n return String(resp?.text || resp?.response?.candidates?.[0]?.content?.parts?.[0]?.text || '').trim();\n };\n\n const combined = [seedSummary, ...scraped.map(s => `${s.title ? `${s.title}\\n` : ''}${s.text}`)]\n .filter(Boolean)\n .join('\\n\\n')\n .slice(0, 180_000);\n\n const summary = (await summarize(combined)) || (scraped[0]?.text?.slice(0, 600) || seedSummary || '');\n\n // Record usage minimally\n try {\n const idToken = auth.substring('Bearer '.length).trim();\n const decoded = await decodeFirebaseToken(idToken).catch(() => null as any);\n const uid = decoded?.uid || decoded?.sub || 'current';\n const idemKey = (req.headers['idempotency-key'] as string | undefined) || undefined;\n await applyConsumption(uid, { requests: 1 }, idemKey);\n } catch {}\n\n return res.json({ success: true, data: { summary, sources } });\n } catch (error) {\n console.error('[Research API] Error:', error);\n const mapped = classifyMediaError(error);\n return res.status(mapped.status).json({ error: mapped.code, message: mapped.message, hint: mapped.hint });\n }\n});\n\n/**\n * Auth: Revoke tokens\n * Expected by CLI at POST /api/auth/revoke\n */\napp.post('/api/auth/revoke', async (req: Request, res: Response) => {\n try {\n const authHeader = req.headers.authorization || '';\n if (!authHeader.startsWith('Bearer ')) {\n return res.status(401).json({ error: 'unauthorized' });\n }\n\n // Accept both fields used by CLI\n const { refresh_token, all_devices } = req.body || {};\n // TODO: Integrate with real session store/token revocation\n return res.status(200).json({ success: true, allDevices: Boolean(all_devices) });\n } catch (error) {\n console.error('[Auth Revoke] Error:', error);\n return res.status(500).json({ error: 'REVOCATION_FAILED' });\n }\n});\n\n// ===========================================\n// API ENDPOINTS WITH RATE LIMITING\n// ===========================================\n\n// ---- Secret Manager integration (lazy, cached) ----\nlet _keysCache: { openaiApiKey?: string; googleApiKey?: string } | null = null;\nasync function loadProviderKeys(): Promise<{ openaiApiKey?: string; googleApiKey?: string }> {\n if (_keysCache) return _keysCache;\n try {\n const { SecretManagerIntegration } = await import('../services/intelligent-model-selector/SecretManagerIntegration');\n const sm = new SecretManagerIntegration({\n projectId: process.env.GOOGLE_CLOUD_PROJECT || process.env.GCLOUD_PROJECT || 'maria-code-470602',\n secrets: {\n openAI: 'openai-api-key',\n googleAI: 'google-ai-api-key',\n },\n });\n const keys = await sm.getAllApiKeys().catch(() => ({} as any));\n _keysCache = {\n openaiApiKey: keys.openaiApiKey,\n googleApiKey: keys.googleApiKey,\n };\n if (_keysCache.googleApiKey && !process.env.GEMINI_API_KEY && !process.env.GOOGLE_API_KEY) {\n process.env.GEMINI_API_KEY = _keysCache.googleApiKey;\n }\n if (_keysCache.openaiApiKey && !process.env.OPENAI_API_KEY) {\n process.env.OPENAI_API_KEY = _keysCache.openaiApiKey;\n }\n } catch {\n _keysCache = {\n openaiApiKey: process.env.OPENAI_API_KEY,\n googleApiKey: process.env.GEMINI_API_KEY || process.env.GOOGLE_API_KEY,\n };\n }\n return _keysCache;\n}\n\n/**\n * Image Generation Endpoint\n */\napp.post('/api/v1/image', rateLimitMiddleware, async (req: Request, res: Response) => {\n try {\n await loadProviderKeys();\n const auth = req.headers.authorization;\n if (!auth || !auth.startsWith('Bearer ')) return res.status(401).json({ error: 'unauthorized', message: 'Login required', hint: 'Sign in and retry' });\n const idToken = auth.substring('Bearer '.length).trim();\n const decoded = await decodeFirebaseToken(idToken).catch(() => null as any);\n if (!decoded) return res.status(401).json({ error: 'unauthorized', message: 'Invalid login session', hint: 'Re-login to continue' });\n const uid = decoded?.uid || decoded?.sub || 'current';\n const { prompt, model, size = '1024x1024', format: formatRaw = 'png', count = 1, seed } = req.body || {};\n const fmt0 = String(formatRaw || 'png').toLowerCase();\n const format = (fmt0 === 'jpeg') ? 'jpg' : (['png','jpg','webp'].includes(fmt0) ? (fmt0 as 'png'|'jpg'|'webp') : 'png');\n if (!prompt) return res.status(400).json({ error: 'bad_request', message: 'prompt required' });\n const m = /^(\\d{2,4})x(\\d{2,4})$/.exec(String(size));\n if (!m) return res.status(400).json({ error: 'bad_request', message: 'size must be WxH' });\n const w = +m[1], h = +m[2];\n\n const provider = new GeminiMediaProvider();\n const started = Date.now();\n const buffers: Buffer[] = [];\n for (let i = 0; i < Math.max(1, Math.min(8, Number(count || 1))); i++) {\n const r = await provider.generateImage({ prompt, width: w, height: h, format, seed: (seed ?? 0) + i });\n // Align output to requested size/format using optional post-processing\n const processed = await (await import('../services/media-orchestrator/image-post')).processImageOptional(\n r.bytes,\n (String(format) as 'png'|'webp'|'jpg'),\n false,\n { width: w, height: h }\n );\n buffers.push(processed);\n }\n const promptHash = hashPrompt(prompt);\n const manifest: Omit<ManifestV1, 'manifestVersion'|'createdAt'> = {\n kind: 'image',\n request: { promptHash, seed, params: { size: [w,h], format, count }, model: model || 'gemini-2.5-flash-image-preview', provider: 'google' },\n artifacts: [],\n metrics: { durationMs: Date.now() - started, retries: 0, fallbacks: 0 },\n trace: Math.random().toString(36).slice(2,8).toUpperCase(),\n };\n const saved = await saveArtifacts({ root: process.cwd(), kind: 'image' }, buffers.map(b => ({ bytes: b, ext: `.${format}` })), manifest);\n jobIndex.set(String(manifest.trace), {\n id: String(manifest.trace),\n status: 'completed',\n kind: 'image',\n manifestPath: saved.manifestPath,\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n uid,\n });\n // Record usage: 1 request, image count mapped into command bucket\n const idemKey = (req.headers['idempotency-key'] as string | undefined) || undefined;\n await applyConsumption(uid, { requests: 1, image: Math.max(1, buffers.length) }, idemKey);\n // Inline small payloads for direct client save\n const filesInline = buffers.map((b, idx) => ({\n file: saved.files[idx] || '',\n mime: format === 'jpg' ? 'image/jpeg' : `image/${format}`,\n bytesBase64: b.toString('base64'),\n }));\n const publicUrl = saved.manifestPath.startsWith('/') ? saved.manifestPath : `/${saved.manifestPath}`;\n return res.json({ success: true, data: { url: publicUrl, files: saved.files, filesInline, jobId: manifest.trace } });\n } catch (error) {\n console.error('[Image API] Error:', error);\n const mapped = classifyMediaError(error);\n return res.status(mapped.status).json({ error: mapped.code, message: mapped.message, hint: mapped.hint });\n }\n});\n\n/**\n * Video Generation Endpoint\n */\napp.post('/api/v1/video', rateLimitMiddleware, async (req: Request, res: Response) => {\n try {\n await loadProviderKeys();\n const auth = req.headers.authorization;\n if (!auth || !auth.startsWith('Bearer ')) return res.status(401).json({ error: 'unauthorized', message: 'Login required', hint: 'Sign in and retry' });\n const { prompt, duration = 8, fps = 24, res: resStr = '1280x720', aspect: aspectStr, format = 'mp4', model, seed, provider: reqProvider } = req.body || {};\n if (!prompt) return res.status(400).json({ error: 'bad_request', message: 'prompt required' });\n // Accept WxH (legacy) or 720|1080 with optional aspect 16:9|9:16\n let w: number, h: number;\n const aspect = (typeof aspectStr === 'string' && (aspectStr === '16:9' || aspectStr === '9:16')) ? aspectStr : undefined;\n const sv = String(resStr).toLowerCase().replace(/p$/, '');\n const m = /^(\\d{2,4})x(\\d{2,4})$/.exec(String(resStr));\n if (m) {\n w = +m[1]; h = +m[2];\n } else if (sv === '720') {\n if (aspect === '9:16') { w = 720; h = 1280; } else { w = 1280; h = 720; }\n } else if (sv === '1080') {\n if (aspect === '9:16') { w = 1080; h = 1920; } else { w = 1920; h = 1080; }\n } else {\n return res.status(400).json({ error: 'bad_request', message: 'res must be WxH or 720|1080' });\n }\n // Determine plan and provider defaults\n const vidToken = auth.substring('Bearer '.length).trim();\n const vidDecoded = await decodeFirebaseToken(vidToken).catch(() => null as any);\n const vidUid = vidDecoded?.uid || vidDecoded?.sub || 'current';\n let isProOrAbove = false;\n try {\n const { planId: _pid } = await getUserPlanAndLimits(vidUid);\n const p = String(_pid || 'free').toLowerCase();\n isProOrAbove = ['pro','pro-annual','ultra','ultra-annual','enterprise'].includes(p);\n } catch {}\n const requestedProvider = typeof reqProvider === 'string' ? reqProvider.toLowerCase() : undefined;\n const requestedModel = typeof model === 'string' ? String(model).trim().toLowerCase() : undefined;\n const providerFromModel: 'openai' | 'google' | undefined = (() => {\n if (!requestedModel) return undefined;\n if (requestedModel.startsWith('sora')) return 'openai';\n if (requestedModel.startsWith('veo') || requestedModel.startsWith('gemini')) return 'google';\n return undefined;\n })();\n const openaiKey = process.env.OPENAI_API_KEY;\n // Decide provider with precedence: explicit model -> explicit provider -> plan default\n const goOpenAI = (providerFromModel === 'openai')\n || (requestedProvider === 'openai')\n || (!providerFromModel && !requestedProvider && (isProOrAbove && !!openaiKey));\n\n // Prefer OpenAI Sora when selected, fallback to Veo\n if (goOpenAI && openaiKey) {\n const OpenAI = (await import('openai')).default;\n const client = new OpenAI({ apiKey: openaiKey });\n const soraModel = (requestedModel && requestedModel.startsWith('sora')) ? requestedModel : 'sora-2';\n // Sora 2 currently accepts only \"4\", \"8\", \"12\" as strings for seconds\n const secondsStr: string = (() => {\n const d = Number(duration) || 8;\n if (d <= 4) return '4';\n if (d <= 8) return '8';\n return '12';\n })();\n const size = `${w}x${h}`;\n const startedMs = Date.now();\n // Create job and poll\n let job: any;\n try {\n job = await (client as any).videos.create({ model: soraModel, prompt: String(prompt), seconds: secondsStr, size });\n } catch (e) {\n try { console.warn('[Video API][Sora] videos.create failed:', (e as any)?.message || String(e)); } catch {}\n throw e;\n }\n let safetyDeadline = Date.now() + 720_000;\n while (job && (job.status === 'queued' || job.status === 'in_progress')) {\n if (Date.now() > safetyDeadline) return res.status(504).json({ error: 'timeout', message: 'video generation timed out' });\n await new Promise(r => setTimeout(r, 8000));\n job = await (client as any).videos.retrieve(job.id);\n }\n if (!job || job.status !== 'completed') {\n return res.status(500).json({ error: 'internal_error', message: `video generation failed: ${job?.status || 'unknown'}` });\n }\n // Download content\n // Retry-safe download with exponential backoff for transient 5xx / network\n const downloadWithBackoff = async (): Promise<Buffer> => {\n let delay = 2000;\n for (let i = 0; i < 6; i++) {\n try {\n const content = await (client as any).videos.downloadContent(job.id);\n const ab = await (content as any).arrayBuffer();\n return Buffer.from(ab);\n } catch (e) {\n if (i === 5) throw e;\n await new Promise(r => setTimeout(r, delay));\n delay = Math.min(15000, Math.floor(delay * 1.8));\n }\n }\n throw new Error('download failed after retries');\n };\n const videoBytes = await downloadWithBackoff();\n const outExt = '.mp4';\n const traceId = Math.random().toString(36).slice(2,8).toUpperCase();\n const promptHash = hashPrompt(prompt);\n const manifest: Omit<ManifestV1, 'manifestVersion'|'createdAt'> = {\n kind: 'video',\n request: { promptHash, seed, params: { size: [w,h], fps: Number(fps) || 24, duration: Number(secondsStr), format: 'mp4' }, model: soraModel, provider: 'openai' as const },\n artifacts: [],\n metrics: { durationMs: Date.now() - startedMs, retries: 0, fallbacks: 0 },\n trace: traceId,\n };\n const baseDir = path.join('artifacts', 'media', 'videos', traceId);\n const saved = await saveArtifacts({ root: process.cwd(), kind: 'video', baseDir, flat: true, trace: traceId }, [{ bytes: videoBytes, ext: outExt, logicalName: 'video' }], manifest);\n const idemKey = (req.headers['idempotency-key'] as string | undefined) || undefined;\n await applyConsumption(vidUid, { requests: 1, video: 1 }, idemKey);\n jobIndex.set(String(manifest.trace), { id: String(manifest.trace), status: 'completed', kind: 'video', manifestPath: saved.manifestPath, createdAt: new Date().toISOString(), updatedAt: new Date().toISOString(), uid: vidUid });\n const publicUrl = saved.manifestPath.startsWith('/') ? saved.manifestPath : `/${saved.manifestPath}`;\n return res.json({ success: true, data: { url: publicUrl || (saved.files[0] ? `/${saved.files[0]}` : undefined), files: saved.files, jobId: manifest.trace, applied: { durationSeconds: Number(secondsStr), frameRate: Number(fps) || 24 } } });\n }\n\n // Fallback: Use Google GenAI Veo 3 for video generation\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const { GoogleGenAI } = require('@google/genai');\n const apiKey = process.env.GOOGLE_API_KEY || process.env.GEMINI_API_KEY;\n if (!apiKey) return res.status(503).json({ error: 'provider_unavailable', message: 'Provider API key is not configured', hint: 'Set GOOGLE_API_KEY or GEMINI_API_KEY on the server' });\n const ai = new GoogleGenAI({ apiKey });\n const veoModel = (model && String(model).trim()) || process.env.MARIA_VIDEO_MODEL || 'veo-3.1-generate-preview';\n // Map size to aspect ratio per Veo 3.1 spec\n const aspectRatio = w >= h ? '16:9' : '9:16';\n\n const startedMs = Date.now();\n // Veo 3.1: 1080p fixed 8s; 720p allows 4/6/8\n const requestedDuration = Number(duration);\n const maxEdge = Math.max(w, h);\n const is1080 = maxEdge >= 1920;\n const effectiveDuration = (() => {\n if (is1080) return 8;\n const d = Number.isFinite(requestedDuration) ? Math.floor(requestedDuration) : 8;\n if (d <= 4) return 4;\n if (d <= 6) return 6;\n return 8;\n })();\n // Frame rate sanity (clamp 1..60, default 24)\n const requestedFps = Number(fps);\n const effectiveFps = Number.isFinite(requestedFps) ? Math.min(60, Math.max(1, Math.floor(requestedFps))) : 24;\n\n // Map requested size to discrete provider resolution (not passed, just for internal logic)\n const resolution = Math.max(w, h) >= 1920 ? '1080p' : '720p';\n let operation = await ai.models.generateVideos({\n model: veoModel,\n prompt: String(prompt),\n // Pass aspect + resolution + duration/fps explicitly -> resolution is not supported in veo3\n config: { aspectRatio, /* resolution: resolution, */ durationSeconds: effectiveDuration, frameRate: effectiveFps }\n });\n\n // Poll until done (official guidance ~ up to 6 minutes; use a safe cap)\n const deadline = Date.now() + 900_000; // extend to 15 minutes for large jobs\n while (!(operation as any)?.done) {\n if (Date.now() > deadline) {\n return res.status(504).json({ error: 'timeout', message: 'video generation timed out' });\n }\n await new Promise(r => setTimeout(r, 12000));\n operation = await ai.operations.getVideosOperation({ operation });\n }\n // Give the file service a short settle time before first download attempt\n await new Promise(r => setTimeout(r, 2500));\n\n const videoRef = (operation as any)?.response?.generatedVideos?.[0]?.video;\n const videoMime: string | undefined = (videoRef && (videoRef.mimeType || videoRef.mime_type)) ? String(videoRef.mimeType || videoRef.mime_type) : undefined;\n if (!videoRef) {\n return res.status(500).json({ error: 'internal_error', message: 'no video returned by provider' });\n }\n\n const traceId = Math.random().toString(36).slice(2,8).toUpperCase();\n const tmpDir = path.join(process.cwd(), '.stage', traceId);\n await fs.mkdir(tmpDir, { recursive: true });\n const tmpOut = path.join(tmpDir, 'video.bin');\n\n // Robust download with SDK first, then manual fetch fallback\n const dlApiKey = process.env.GOOGLE_API_KEY || process.env.GEMINI_API_KEY || '';\n\n const isLikelyValidVideo = async (buf: Buffer): Promise<boolean> => {\n if (!buf || buf.length < 16) return false;\n const head = buf.subarray(0, Math.min(256, buf.length));\n const headStr = head.toString('latin1');\n const hasFtyp = headStr.indexOf('ftyp') >= 0 || head.includes(Buffer.from('ftyp', 'ascii'));\n const isWebm = head[0] === 0x1A && head[1] === 0x45 && head[2] === 0xDF && head[3] === 0xA3;\n const looksHtml = headStr.includes('<!doctype') || headStr.includes('<html') || headStr.includes('<?xml');\n return (hasFtyp || isWebm) && !looksHtml;\n };\n\n const readUint32BE = (buf: Buffer, off: number): number => ((buf[off] << 24) | (buf[off+1] << 16) | (buf[off+2] << 8) | buf[off+3]) >>> 0;\n const readUint64BE = (buf: Buffer, off: number): number => {\n const hi = readUint32BE(buf, off);\n const lo = readUint32BE(buf, off + 4);\n // clamp to Number max safe\n return hi * 2 ** 32 + lo;\n };\n const tryParseMp4DurationSec = (buf: Buffer): number | null => {\n try {\n // Scan for 'mvhd' atom (Movie Header Box)\n for (let i = 0; i + 8 < buf.length; ) {\n const size = readUint32BE(buf, i);\n const type = buf.subarray(i + 4, i + 8).toString('latin1');\n if (!size || size < 8) break;\n if (type === 'moov') {\n // dive inside moov\n const end = Math.min(buf.length, i + size);\n let j = i + 8;\n while (j + 8 < end) {\n const sz = readUint32BE(buf, j);\n const tp = buf.subarray(j + 4, j + 8).toString('latin1');\n if (!sz || sz < 8) break;\n if (tp === 'mvhd') {\n const ver = buf[j + 8];\n if (ver === 1) {\n const timescale = readUint32BE(buf, j + 28);\n const duration = readUint64BE(buf, j + 32);\n if (timescale > 0) return duration / timescale;\n } else {\n const timescale = readUint32BE(buf, j + 20);\n const duration = readUint32BE(buf, j + 24);\n if (timescale > 0) return duration / timescale;\n }\n break;\n }\n j += sz;\n }\n break;\n }\n i += size;\n }\n } catch {}\n return null;\n };\n\n const hasAtom = (buf: Buffer, atom: string): boolean => {\n const tgt = Buffer.from(atom, 'latin1');\n return buf.indexOf(tgt) !== -1;\n };\n\n const validateVideoBytes = (buf: Buffer): { kind: 'mp4'|'mov'|'webm'|'unknown'; ok: boolean; durationSec: number | null; reason?: string } => {\n if (!buf || buf.length < 1024) return { kind: 'unknown', ok: false, durationSec: null, reason: 'too_small' };\n const header = buf.subarray(0, 256);\n const headerStr = header.toString('latin1');\n const hasFtyp = headerStr.indexOf('ftyp') >= 0 || header.includes(Buffer.from('ftyp', 'ascii'));\n const isWebm = header[0] === 0x1A && header[1] === 0x45 && header[2] === 0xDF && header[3] === 0xA3;\n if (isWebm) {\n // Accept WebM when header matches and size appears reasonable\n return { kind: 'webm', ok: buf.length > 200_000, durationSec: null };\n }\n if (hasFtyp) {\n const majorBrand = header.subarray(8, 12).toString('latin1').toLowerCase();\n const kind: 'mp4'|'mov' = majorBrand.startsWith('qt') ? 'mov' : 'mp4';\n // Require 'moov' atom present and duration near requested\n const hasMoov = hasAtom(buf, 'moov');\n const dur = tryParseMp4DurationSec(buf);\n const nearTarget = typeof dur === 'number' ? (dur + 0.75 /*slack*/ >= effectiveDuration) : false;\n const ok = hasMoov && nearTarget;\n return { kind, ok, durationSec: dur, reason: ok ? undefined : (!hasMoov ? 'missing_moov' : 'short_duration') };\n }\n return { kind: 'unknown', ok: false, durationSec: null, reason: 'unknown_header' };\n };\n\n const ensureFileMaterialized = async (p: string, waitMs = 45000): Promise<void> => {\n const deadline = Date.now() + waitMs;\n let lastSize = -1;\n let stableCount = 0;\n // eslint-disable-next-line no-constant-condition\n while (true) {\n try {\n const st = await fs.stat(p);\n if (st && st.size > 0) {\n if (st.size === lastSize) {\n stableCount++;\n if (stableCount >= 5) return; // ~1s stability at 200ms interval\n } else {\n stableCount = 0;\n lastSize = st.size;\n }\n }\n } catch {}\n if (Date.now() > deadline) throw new Error(`video file not fully materialized: ${p}`);\n await new Promise(r => setTimeout(r, 200));\n }\n };\n\n const trySdkDownloadOnce = async (): Promise<Buffer | null> => {\n try {\n await ai.files.download({ file: videoRef, downloadPath: tmpOut });\n await ensureFileMaterialized(tmpOut, 45000);\n const bytes = await fs.readFile(tmpOut);\n if (await isLikelyValidVideo(bytes)) return bytes;\n } catch {}\n return null;\n };\n\n // Manual fetch fallback using direct URI when SDK path fails\n const tryManualDownload = async (): Promise<Buffer | null> => {\n try {\n const fileObj: any = videoRef as any;\n const direct = fileObj?.uri || fileObj?.url || fileObj?.downloadUri || fileObj?.downloadUrl || '';\n if (!direct || typeof direct !== 'string') return null;\n const res = await fetch(direct, {\n method: 'GET',\n headers: dlApiKey ? { 'x-goog-api-key': dlApiKey } as any : undefined,\n redirect: 'follow',\n } as any);\n if (!res.ok) return null;\n const lenHeader = res.headers?.get?.('content-length');\n const expectedLen = lenHeader ? Number(lenHeader) : undefined;\n const ab = await res.arrayBuffer();\n const buf = Buffer.from(ab);\n if (typeof expectedLen === 'number' && Number.isFinite(expectedLen) && expectedLen > 0 && buf.length !== expectedLen) {\n // size mismatch -> treat as invalid\n return null;\n }\n await fs.writeFile(tmpOut, buf);\n if (await isLikelyValidVideo(buf)) return buf;\n } catch {}\n return null;\n };\n\n // Robust acquire loop: prefer SDK, fallback to manual, validate duration/moov\n let videoBytes: Buffer | null = null;\n const maxAttempts = 15; // tolerate slower file availability\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n let bytes: Buffer | null = await trySdkDownloadOnce();\n if (!bytes) bytes = await tryManualDownload();\n if (bytes && await isLikelyValidVideo(bytes)) {\n const v = validateVideoBytes(bytes);\n if (v.ok) { videoBytes = bytes; break; }\n }\n // backoff then retry\n await new Promise(r => setTimeout(r, Math.min(12000, 1800 * attempt)));\n }\n if (!videoBytes) throw new Error('failed to obtain fully materialized video');\n // Detect container & decide extension\n const header = videoBytes.subarray(0, 256);\n const headerStr = header.toString('latin1');\n let outExt = '.mp4';\n let outMime = 'video/mp4';\n // MP4 typically contains 'ftyp' at bytes 4-7\n // Detect 'ftyp' anywhere in the first 256 bytes to determine MP4\n const hasFtyp = headerStr.indexOf('ftyp') >= 0 || header.includes(Buffer.from('ftyp', 'ascii'));\n // WebM/Matroska starts with 0x1A 0x45 0xDF 0xA3\n const isWebm = header[0] === 0x1A && header[1] === 0x45 && header[2] === 0xDF && header[3] === 0xA3;\n if (videoMime && /webm/i.test(videoMime)) { outExt = '.webm'; outMime = 'video/webm'; }\n else if (videoMime && /quicktime/i.test(videoMime)) { outExt = '.mov'; outMime = 'video/quicktime'; }\n else if (isWebm) { outExt = '.webm'; outMime = 'video/webm'; }\n else if (hasFtyp) {\n // Inspect major brand to distinguish MOV vs MP4\n const majorBrand = header.subarray(8, 12).toString('latin1');\n if ((majorBrand || '').toLowerCase().startsWith('qt')) { outExt = '.mov'; outMime = 'video/quicktime'; }\n else { outExt = '.mp4'; outMime = 'video/mp4'; }\n }\n await fs.rm(tmpDir, { recursive: true, force: true });\n\n const promptHash = hashPrompt(prompt);\n const manifest: Omit<ManifestV1, 'manifestVersion'|'createdAt'> = {\n kind: 'video',\n request: { promptHash, seed, params: { size: [w,h], fps: effectiveFps, duration: effectiveDuration, format: outExt.replace('.', '') }, model: veoModel, provider: 'google' as const },\n artifacts: [],\n metrics: { durationMs: Date.now() - startedMs, retries: 0, fallbacks: 0 },\n trace: traceId,\n };\n\n // Save shallow path: artifacts/media/videos/{traceId}/<file>\n const baseDir = path.join('artifacts', 'media', 'videos', traceId);\n const saved = await saveArtifacts({ root: process.cwd(), kind: 'video', baseDir, flat: true }, [{ bytes: videoBytes, ext: outExt }], manifest);\n const idemKey = (req.headers['idempotency-key'] as string | undefined) || undefined;\n const idToken = auth.substring('Bearer '.length).trim();\n const decoded = await decodeFirebaseToken(idToken).catch(() => null as any);\n const uid = decoded?.uid || decoded?.sub || 'current';\n await applyConsumption(uid, { requests: 1, video: 1 }, idemKey);\n jobIndex.set(String(manifest.trace), {\n id: String(manifest.trace),\n status: 'completed',\n kind: 'video',\n manifestPath: saved.manifestPath,\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n uid,\n });\n return res.json({ success: true, data: { url: saved.manifestPath || (saved.files[0] ? `/${saved.files[0]}` : undefined), files: saved.files, jobId: manifest.trace, applied: { durationSeconds: effectiveDuration, frameRate: effectiveFps } } });\n } catch (error) {\n console.error('[Video API] Error:', error);\n const mapped = classifyMediaError(error);\n return res.status(mapped.status).json({ error: mapped.code, message: mapped.message, hint: mapped.hint });\n }\n});\n\n/**\n * Job Status Endpoint\n * GET /api/v1/jobs/:id -> { id, status, kind, manifestPath, manifest? }\n */\napp.get('/api/v1/jobs/:id', async (req: Request, res: Response) => {\n try {\n const auth = req.headers.authorization;\n if (!auth || !auth.startsWith('Bearer ')) return res.status(401).json({ error: 'unauthorized' });\n const idToken = auth.substring('Bearer '.length).trim();\n const decoded = await decodeFirebaseToken(idToken).catch(() => null as any);\n const uid = decoded?.uid || decoded?.sub || 'current';\n const id = String(req.params.id || '').trim();\n if (!id) return res.status(400).json({ error: 'bad_request', message: 'id required' });\n const info = jobIndex.get(id);\n if (!info || (info.uid && info.uid !== uid)) return res.status(404).json({ error: 'not_found', message: 'job not found' });\n\n let manifest: any | undefined;\n if (info.manifestPath) {\n try {\n const full = path.resolve(process.cwd(), info.manifestPath);\n const txt = await fs.readFile(full, 'utf8');\n manifest = JSON.parse(txt);\n } catch {\n // ignore\n }\n }\n\n return res.json({\n id: info.id,\n status: info.status,\n kind: info.kind,\n manifestPath: info.manifestPath,\n manifest,\n createdAt: info.createdAt,\n updatedAt: info.updatedAt,\n });\n } catch (error) {\n console.error('[Jobs API] Error:', error);\n return res.status(500).json({ error: 'internal_error', message: 'failed to fetch job' });\n }\n});\n\n/**\n * Code Generation Endpoint\n */\napp.post('/api/v1/code', rateLimitMiddleware, async (req: Request, res: Response) => {\n try {\n const auth = req.headers.authorization;\n if (!auth || !auth.startsWith('Bearer ')) return res.status(401).json({ error: 'unauthorized' });\n const idToken = auth.substring('Bearer '.length).trim();\n const decoded = await decodeFirebaseToken(idToken).catch(() => null as any);\n if (!decoded) return res.status(401).json({ error: 'unauthorized' });\n const uid = decoded?.uid || decoded?.sub;\n // Determine plan (Pro+ uses GPT-5 as default; others use GPT-5-mini)\n let isProOrAbove = false;\n try {\n const { planId: _pid } = await getUserPlanAndLimits(uid);\n const p = String(_pid || 'free').toLowerCase();\n isProOrAbove = ['pro','pro-annual','ultra','ultra-annual','enterprise'].includes(p);\n } catch {}\n\n const { prompt, language = 'typescript', model = 'gpt-4' } = req.body;\n \n if (!prompt) {\n return res.status(400).json({\n error: 'bad_request',\n message: 'Prompt is required'\n });\n }\n \n // TODO: Implement actual code generation logic\n // Record usage: count as one request and one code command\n const idemKey = (req.headers['idempotency-key'] as string | undefined) || undefined;\n await applyConsumption(uid, { requests: 1, code: 1 }, idemKey);\n\n return res.json({\n success: true,\n data: {\n code: `// Generated code for: ${prompt}\\nfunction example() {\\n return \"Generated by MARIA CODE\";\\n}`,\n language,\n model,\n prompt,\n createdAt: new Date().toISOString()\n }\n });\n } catch (error) {\n console.error('[Code API] Error:', error);\n return res.status(500).json({\n error: 'internal_error',\n message: 'Failed to generate code'\n });\n }\n});\n\n/**\n * Chat Endpoint\n */\napp.post('/api/v1/chat', rateLimitMiddleware, async (req: Request, res: Response) => {\n try {\n const auth = req.headers.authorization;\n if (!auth || !auth.startsWith('Bearer ')) return res.status(401).json({ error: 'unauthorized' });\n const idToken = auth.substring('Bearer '.length).trim();\n const decoded = await decodeFirebaseToken(idToken).catch(() => null as any);\n if (!decoded) return res.status(401).json({ error: 'unauthorized' });\n const uid = decoded?.uid || decoded?.sub;\n\n const { message, model = 'gemini-2.5-flash', messages } = req.body || {};\n // Accept both single message and array of messages (OpenAI-like)\n let effectiveMessage: string | undefined = undefined;\n if (typeof message === 'string' && message.trim()) {\n effectiveMessage = String(message).trim();\n } else if (Array.isArray(messages)) {\n try {\n // Prefer last user message content; fallback to join all\n const lastUser = [...messages].reverse().find((m: any) => (m?.role || '').toLowerCase() === 'user');\n effectiveMessage = (lastUser?.content && String(lastUser.content)) || messages.map((m: any) => String(m?.content || '')).filter(Boolean).join('\\n');\n } catch {}\n }\n if (!effectiveMessage) {\n return res.status(400).json({ error: 'bad_request', message: 'message or messages is required' });\n }\n \n // TODO: Implement actual chat logic (proxy to provider)\n // Record usage: 1 request. If token usage is known, include tokens\n const idemKey = (req.headers['idempotency-key'] as string | undefined) || undefined;\n await applyConsumption(uid, { requests: 1 }, idemKey);\n\n return res.json({\n success: true,\n data: {\n response: `Echo: ${effectiveMessage}`,\n model,\n createdAt: new Date().toISOString()\n }\n });\n } catch (error) {\n console.error('[Chat API] Error:', error);\n return res.status(500).json({\n error: 'internal_error',\n message: 'Failed to process chat'\n });\n }\n});\n\n// AI proxy for /code using OpenAI GPT (server-side OPENAI_API_KEY)\napp.post('/v1/ai-proxy', rateLimitMiddleware, async (req: Request, res: Response) => {\n try {\n const auth = req.headers.authorization;\n if (!auth || !auth.startsWith('Bearer ')) return res.status(401).json({ error: 'unauthorized' });\n const { prompt, taskType, research, messages, provider: reqProvider, model: reqModel } = req.body || {};\n // Derive effective prompt\n let effectivePrompt: string | undefined = undefined;\n if (typeof prompt === 'string' && prompt.trim()) {\n effectivePrompt = String(prompt).trim();\n } else if (Array.isArray(messages)) {\n try {\n const lastUser = [...messages].reverse().find((m: any) => (m?.role || '').toLowerCase() === 'user');\n effectivePrompt = (lastUser?.content && String(lastUser.content)) || messages.map((m: any) => String(m?.content || '')).filter(Boolean).join('\\n');\n } catch {}\n }\n if (!effectivePrompt && !(taskType === 'research' && research?.query)) return res.status(400).json({ error: 'bad_request', message: 'prompt or messages or research.query required' });\n const idToken = auth.substring('Bearer '.length).trim();\n const decoded = await decodeFirebaseToken(idToken).catch(() => null as any);\n if (!decoded) return res.status(401).json({ error: 'unauthorized' });\n const uid = decoded?.uid || decoded?.sub;\n const idemKey = (req.headers['idempotency-key'] as string | undefined) || undefined;\n if (process.env.MARIA_TELEMETRY === '1') {\n try {\n const attCount = Array.isArray((req.body?.metadata || {}).attachments) ? ((req.body.metadata.attachments as any[]) || []).filter(Boolean).length : 0;\n console.log(JSON.stringify({ ev: 'ai_proxy_request', taskType: taskType || 'unknown', promptLen: String(effectivePrompt || research?.query || '').length, requestedProvider: reqProvider || null, requestedModel: reqModel || null, attachments: attCount }));\n } catch {}\n }\n // Helper: sanitize API keys (trim, strip quotes/Bearer prefix)\n const sanitizeKey = (v?: string | null): string | undefined => {\n if (!v) return undefined;\n let k = String(v).trim();\n if (!k) return undefined;\n // Remove surrounding quotes often present in env\n if ((k.startsWith('\"') && k.endsWith('\"')) || (k.startsWith(\"'\") && k.endsWith(\"'\"))) {\n k = k.slice(1, -1);\n }\n // Strip accidental Bearer prefix\n if (/^Bearer\\s+/i.test(k)) k = k.replace(/^Bearer\\s+/i, '');\n // Reject placeholders\n if (/your_.*key|example|placeholder/i.test(k)) return undefined;\n // Disallow whitespace/newlines in header values\n if (/\\s/.test(k)) k = k.replace(/\\s+/g, '');\n return k || undefined;\n };\n\n // Prefer Gemini when valid key provided; fallback to OpenAI only when its key is valid\n const keys = await (async () => {\n try { return await (global as any).___maria_keys ?? await (async () => { const k = await (await import('../services/intelligent-model-selector/SecretManagerIntegration')).SecretManagerIntegration; const sm = new k({ projectId: process.env.GOOGLE_CLOUD_PROJECT || process.env.GCLOUD_PROJECT || 'maria-code-470602', secrets: { openAI: 'openai-api-key', googleAI: 'google-ai-api-key' } }); const all = await sm.getAllApiKeys().catch(() => ({} as any)); (global as any).___maria_keys = all; return all; })(); } catch { return {}; } })();\n const gemKey = sanitizeKey((keys as any)?.googleApiKey || process.env.GEMINI_API_KEY || process.env.GOOGLE_API_KEY);\n const requestedProvider = typeof reqProvider === 'string' ? reqProvider.toLowerCase() : undefined;\n const requestedModel = typeof reqModel === 'string' ? String(reqModel).trim() : undefined;\n // Determine plan (Pro+ prefers OpenAI by default)\n let isProOrAbove = false;\n try {\n const { planId: _pid } = await getUserPlanAndLimits(uid);\n const p = String(_pid || 'free').toLowerCase();\n isProOrAbove = ['pro','pro-annual','ultra','ultra-annual','enterprise'].includes(p);\n } catch {}\n\n // Local-first path: Enterprise local-only, or LOCAL_MODE=1 when no explicit non-local provider\n let isEnterprise = false;\n try {\n const { planId: _pid } = await getUserPlanAndLimits(uid);\n isEnterprise = String(_pid || 'free').toLowerCase() === 'enterprise';\n } catch {}\n\n // Enterprise: do not allow server-side local CLI/HTTP spawning; rely on client-local short-circuit\n if (isEnterprise && requestedProvider && !['lmstudio','ollama'].includes(requestedProvider)) {\n return res.status(403).json({ error: 'enterprise_local_only', message: 'Enterprise plan requires local LLM only' });\n }\n\n // SSOT routing policy\n const { determineRouting } = await import('../services/routing/model-routing');\n const decision = determineRouting({\n requestedModel,\n requestedProvider,\n taskType,\n isProOrAbove,\n hasGeminiKey: !!gemKey,\n hasOpenAIKey: !!((keys as any)?.openaiApiKey || process.env.OPENAI_API_KEY),\n } as any);\n\n if (decision.error) {\n const map: any = { missing_key: 503, unknown_model: 400, no_provider_available: 503 };\n const status = map[decision.error] || 400;\n return res.status(status).json({ error: decision.error, message: decision.message });\n }\n const effectiveProvider = decision.provider as 'google' | 'openai';\n const effectiveModel = decision.model as string | undefined;\n\n if (effectiveProvider === 'google') {\n try {\n const { GoogleGenerativeAI } = await import('@google/generative-ai');\n const ai = new GoogleGenerativeAI(gemKey as string);\n const modelName = effectiveModel || 'gemini-2.5-flash';\n const model = ai.getGenerativeModel({ model: modelName });\n let content = '';\n\n if (taskType === 'research' && research?.query) {\n // Use Gemini grounding via googleSearch tool\n const tool = { googleSearch: {} } as any;\n const r: any = await (ai as any).models.generateContent({ model: modelName, contents: String(research.query), config: { tools: [tool] } });\n content = String((r?.text?.()) || r?.text || r?.response?.candidates?.[0]?.content?.parts?.[0]?.text || '');\n } else {\n // Standard prompt path with optional attachments\n const attachments = Array.isArray((req.body?.metadata || {}).attachments)\n ? ((req.body.metadata.attachments as any[]) || []).filter(Boolean)\n : [];\n const parts: any[] = [{ text: String(effectivePrompt || '') }];\n for (const a of attachments) {\n try {\n const b64 = String(a.data_base64 || '');\n const mime = String(a.mime || 'application/octet-stream');\n if (!b64) continue;\n // Gemini inlineData 最大サイズの安全域として ~10MB 未満を推奨\n if (Buffer.byteLength(b64, 'base64') > 10 * 1024 * 1024) continue;\n parts.push({ inlineData: { data: b64, mimeType: mime } });\n } catch {}\n }\n const resp = await model.generateContent({ contents: [{ role: 'user', parts }] });\n content = resp?.response?.text?.() || resp?.response?.candidates?.[0]?.content?.parts?.[0]?.text || '';\n }\n if (process.env.MARIA_TELEMETRY === '1') {\n try { console.log(JSON.stringify({ ev: 'ai_proxy_route', vendor: 'google', model: modelName, empty: !content })); } catch {}\n }\n // Usage: 1 request; tokens unknown for Gemini SDK. Count code when taskType suggests code/evaluation\n const consumption: Record<string, number> = { requests: 1 };\n if (taskType === 'code' || taskType === 'evaluation') consumption.code = 1;\n try { await applyConsumption(uid, consumption, idemKey); } catch {}\n return res.json({ data: { content, routedModel: { vendor: 'google', family: 'gemini', name: modelName, reason: taskType || 'code' } } });\n } catch (e) {\n const msg = (e as any)?.message || 'Google provider request failed';\n if (process.env.MARIA_TELEMETRY === '1') {\n try { console.log(JSON.stringify({ ev: 'ai_proxy_google_error', message: (e as any)?.message || String(e) })); } catch {}\n }\n return res.status(502).json({ error: 'provider_error', message: String(msg) });\n }\n }\n\n if (effectiveProvider === 'openai') {\n const openaiKey = sanitizeKey((keys as any)?.openaiApiKey || process.env.OPENAI_API_KEY);\n if (!openaiKey) {\n if (process.env.MARIA_TELEMETRY === '1') {\n try { console.log(JSON.stringify({ ev: 'ai_proxy_no_keys' })); } catch {}\n }\n return res.status(503).json({ error: 'provider_unavailable', message: 'No valid OpenAI API key' });\n }\n const OpenAI = (await import('openai')).default;\n const client = new OpenAI({ apiKey: openaiKey });\n let model = effectiveModel || (isProOrAbove ? 'gpt-5' : 'gpt-5-mini');\n let content = '';\n let totalTokens = 0;\n const attachments = Array.isArray((req.body?.metadata || {}).attachments)\n ? ((req.body.metadata.attachments as any[]) || []).filter(Boolean)\n : [];\n try {\n if (attachments.length > 0) {\n // Create a vector store and upload text-like attachments for file search\n const vs = await client.vectorStores.create({ name: `ai-proxy-${uid}-${Date.now()}` } as any);\n for (const a of attachments) {\n try {\n const b64 = String(a.data_base64 || '');\n if (!b64) continue;\n const buffer = Buffer.from(b64, 'base64');\n const filename = a.name || 'attachment.txt';\n const toFile = (OpenAI as any).toFile;\n const fileInput = toFile ? await toFile(buffer, filename) : buffer as any;\n const file = await client.files.create({ file: fileInput, purpose: 'assistants' } as any);\n await (client as any).vectorStores.files.create((vs as any).id, { file_id: (file as any).id });\n } catch {}\n }\n const r = await client.responses.create({\n model,\n input: String(effectivePrompt || ''),\n tools: [{ type: 'file_search', vector_store_ids: [(vs as any).id] }] as any,\n } as any);\n content = (r as any)?.output_text || (r as any)?.content?.[0]?.text || '';\n const u: any = (r as any)?.usage;\n if (u) {\n const inTok = Number(u.input_tokens || u.inputTokens || 0);\n const outTok = Number(u.output_tokens || u.outputTokens || 0);\n totalTokens = Number(u.total_tokens || u.totalTokens || (inTok + outTok) || 0);\n }\n } else {\n const r = await client.responses.create({\n model,\n input: [\n { role: 'system', content: 'You output only code blocks when asked for code.' },\n { role: 'user', content: effectivePrompt || '' },\n ] as any,\n } as any);\n content = (r as any)?.output_text || (r as any)?.content?.[0]?.text || '';\n const u: any = (r as any)?.usage;\n if (u) {\n const inTok = Number(u.input_tokens || u.inputTokens || 0);\n const outTok = Number(u.output_tokens || u.outputTokens || 0);\n totalTokens = Number(u.total_tokens || u.totalTokens || (inTok + outTok) || 0);\n }\n }\n } catch (_e) {\n try { console.warn('[AI Proxy][OpenAI] responses.create failed:', (_e as any)?.message || String(_e)); } catch {}\n model = 'gpt-5-mini';\n try {\n const r2 = await client.chat.completions.create({\n model,\n messages: [\n { role: 'system', content: 'You output only code blocks when asked for code.' },\n { role: 'user', content: effectivePrompt || '' },\n ],\n });\n content = r2.choices?.[0]?.message?.content || '';\n const u2: any = (r2 as any)?.usage;\n if (u2) totalTokens = Number(u2.total_tokens || 0);\n } catch (e2) {\n try { console.error('[AI Proxy][OpenAI] chat.completions fallback failed:', (e2 as any)?.message || String(e2)); } catch {}\n throw e2;\n }\n }\n if (process.env.MARIA_TELEMETRY === '1') {\n try { console.log(JSON.stringify({ ev: 'ai_proxy_route', vendor: 'openai', model, empty: !content })); } catch {}\n }\n\n // Usage: 1 request; include tokens when available; count code when taskType suggests code/evaluation\n const consumption: Record<string, number> = { requests: 1 };\n if (totalTokens > 0) consumption.tokens = totalTokens;\n if (taskType === 'code' || taskType === 'evaluation') consumption.code = 1;\n try { await applyConsumption(uid, consumption, idemKey); } catch {}\n\n return res.json({ data: { content, routedModel: { vendor: 'openai', family: 'gpt', name: model, reason: taskType || 'code' } } });\n }\n // Fallback: if no provider branch matched, return routing error\n return res.status(500).json({ error: 'routing_error', message: 'No provider selected for AI proxy' });\n } catch (error) {\n console.error('[AI Proxy] Error:', error);\n if (process.env.MARIA_TELEMETRY === '1') {\n try { console.log(JSON.stringify({ ev: 'ai_proxy_error', message: (error as any)?.message || String(error) })); } catch {}\n }\n return res.status(500).json({ error: 'internal_error', message: 'AI proxy failed' });\n }\n});\n\n// ===== Usage endpoints (Firestore-backed when available) =====\nasync function getFirestoreSafe(): Promise<any|null> {\n try {\n const admin = await import('firebase-admin');\n if (!admin.apps?.length) { try { (admin as any).initializeApp(); } catch {} }\n const { getFirestore } = await import('firebase-admin/firestore');\n return getFirestore();\n } catch { return null; }\n}\n\nfunction calcNextReset(): string {\n const d = new Date();\n d.setUTCMonth(d.getUTCMonth() + 1, 1); // next month 1st day\n d.setUTCHours(0,0,0,0);\n return d.toISOString();\n}\n\nasync function recordConsumption(uid: string, consumption: Record<string, number>, idempotencyKey?: string) {\n const db = await getFirestoreSafe();\n if (!db) return;\n const docPath = `projects/default/usage/${uid}`;\n const usageRef = db.doc(docPath);\n const nowISO = new Date().toISOString();\n\n // Idempotency handling: if provided, ensure it is unique per user\n if (idempotencyKey) {\n const idemRef = db.doc(`projects/default/usage/${uid}/consumptions/${idempotencyKey}`);\n const idemSnap = await idemRef.get();\n if (idemSnap.exists) return; // already processed\n await idemRef.set({ createdAt: nowISO, consumption });\n }\n\n const snap = await usageRef.get();\n let data = snap.exists ? snap.data() : null;\n if (!data) {\n data = {\n plan: { name: 'FREE', limits: { requests: freePlan.buckets.req } },\n monthly: {\n requests: { used: 0, limit: freePlan.buckets.req },\n image: { used: 0, limit: freePlan.buckets.image },\n video: { used: 0, limit: freePlan.buckets.video },\n code: { used: 0, limit: freePlan.buckets.code },\n resetAt: calcNextReset(),\n },\n updatedAt: nowISO,\n };\n }\n const m = data.monthly || {};\n if (consumption?.requests) m.requests.used = Math.max(0, (m.requests.used || 0) + Number(consumption.requests));\n if (consumption?.image) m.image.used = Math.max(0, (m.image.used || 0) + Number(consumption.image));\n if (consumption?.video) m.video.used = Math.max(0, (m.video.used || 0) + Number(consumption.video));\n if (consumption?.code) m.code.used = Math.max(0, (m.code.used || 0) + Number(consumption.code));\n data.monthly = m; data.updatedAt = nowISO;\n await usageRef.set(data, { merge: true });\n}\n\n// ===== Snapshot endpoints (Firestore-backed when available) =====\napp.post('/api/v1/snapshots', rateLimitMiddleware, async (req: Request, res: Response) => {\n try {\n const auth = req.headers.authorization;\n if (!auth || !auth.startsWith('Bearer ')) return res.status(401).json({ error: 'unauthorized' });\n const idToken = auth.substring('Bearer '.length).trim();\n const decoded = await decodeFirebaseToken(idToken).catch(() => null as any);\n if (!decoded) return res.status(401).json({ error: 'unauthorized' });\n const uid = decoded?.uid || decoded?.sub;\n\n const { projectId, taskId, summary, decisions, artifacts, refs, resumePrompt } = req.body || {};\n const pid = (typeof projectId === 'string' && projectId.trim()) ? String(projectId).trim() : 'default';\n const tid = (typeof taskId === 'string' && taskId.trim()) ? String(taskId).trim() : '';\n const sum = (typeof summary === 'string' && summary.trim()) ? String(summary).trim() : '';\n try { console.log('[Snapshots][POST] incoming', { uid: String(uid).slice(0, 8) + '…', projectId: pid, taskId: tid, hasSummary: !!sum }); } catch {}\n if (!tid || !sum) return res.status(400).json({ error: 'bad_request', message: 'taskId and summary are required' });\n\n const db = await getFirestoreSafe();\n if (!db) return res.status(503).json({ error: 'unavailable', message: 'database is not configured' });\n\n const tsId = new Date().toISOString().replace(/[-:]/g, '').split('.')[0] + 'Z';\n const userRef = db.collection('users').doc(uid);\n const projRef = userRef.collection('projects').doc(pid);\n const taskRef = projRef.collection('tasks').doc(tid);\n const ref = taskRef.collection('snapshots').doc(tsId);\n const nowISO = new Date().toISOString();\n try {\n await Promise.all([\n userRef.set({ updatedAt: nowISO }, { merge: true }),\n projRef.set({ projectId: pid, updatedAt: nowISO }, { merge: true }),\n taskRef.set({ taskId: tid, updatedAt: nowISO }, { merge: true }),\n ]);\n } catch (e) { try { console.warn('[Snapshots][POST] parent set warn:', (e as any)?.message || String(e)); } catch {} }\n await ref.set({\n snapshotVersion: 1,\n uid,\n projectId: pid,\n taskId: tid,\n timestamp: nowISO,\n summary: sum,\n decisions: Array.isArray(decisions) ? decisions.slice(0, 50).map(String) : [],\n artifacts: Array.isArray(artifacts) ? artifacts.slice(0, 200).map(String) : [],\n links: Array.isArray(refs) ? refs.slice(0, 200).map((r: any) => ({ type: 'fs', ref: String(r) })) : [],\n resumePrompt: typeof resumePrompt === 'string' ? String(resumePrompt) : '',\n });\n try { console.log('[Snapshots][POST] saved', { path: `users/${uid}/projects/${pid}/tasks/${tid}/snapshots/${tsId}` }); } catch {}\n return res.json({ success: true });\n } catch (e) {\n try { console.error('[Snapshots][POST] error:', (e as any)?.message || String(e)); } catch {}\n return res.status(500).json({ error: 'internal_error' });\n }\n});\n\napp.get('/api/v1/get-snapshots', rateLimitMiddleware, async (req: Request, res: Response) => {\n try {\n const auth = req.headers.authorization;\n if (!auth || !auth.startsWith('Bearer ')) return res.status(401).json({ error: 'unauthorized' });\n const idToken = auth.substring('Bearer '.length).trim();\n const decoded = await decodeFirebaseToken(idToken).catch(() => null as any);\n if (!decoded) return res.status(401).json({ error: 'unauthorized' });\n const uid = decoded?.uid || decoded?.sub;\n\n const projectId = typeof req.query.projectId === 'string' && req.query.projectId.trim() ? String(req.query.projectId).trim() : 'default';\n const taskId = typeof req.query.taskId === 'string' && req.query.taskId.trim() ? String(req.query.taskId).trim() : undefined;\n const dateISO = typeof req.query.date === 'string' && req.query.date.trim() ? String(req.query.date).trim() : undefined;\n const limit = Number.isFinite(Number(req.query.limit)) ? Math.max(1, Math.min(50, Number(req.query.limit))) : 5;\n\n const db = await getFirestoreSafe();\n if (!db) return res.status(503).json({ error: 'unavailable', message: 'database is not configured' });\n\n let docs: any[] = [];\n if (taskId) {\n const q = db\n .collection('users').doc(uid)\n .collection('projects').doc(projectId)\n .collection('tasks').doc(taskId)\n .collection('snapshots')\n .orderBy('timestamp', 'desc')\n .limit(limit);\n const ss = await q.get();\n docs = ss.docs.map((d: any) => d.data());\n } else if (dateISO) {\n const start = new Date(dateISO).toISOString();\n const end = new Date(new Date(dateISO).getTime() + 24 * 60 * 60 * 1000).toISOString();\n try {\n const ss = await db\n .collectionGroup('snapshots')\n .where('uid', '==', uid)\n .where('projectId', '==', projectId)\n .where('timestamp', '>=', start)\n .where('timestamp', '<', end)\n .orderBy('timestamp', 'desc')\n .limit(limit)\n .get();\n docs = ss.docs.map((d: any) => d.data());\n } catch (e) {\n // Fallback without composite index: enumerate tasks and filter by date\n const projRef = db.collection('users').doc(uid).collection('projects').doc(projectId);\n const tasksSnap = await projRef.collection('tasks').get();\n const collected: any[] = [];\n for (const t of tasksSnap.docs) {\n try {\n const snaps = await t.ref.collection('snapshots').orderBy('timestamp', 'desc').limit(50).get();\n for (const s of snaps.docs) {\n const data = s.data();\n const ts = String(data?.timestamp || '');\n if (ts >= start && ts < end) collected.push(data);\n }\n } catch {}\n }\n collected.sort((a, b) => String(b?.timestamp || '').localeCompare(String(a?.timestamp || '')));\n docs = collected.slice(0, limit);\n }\n } else {\n // Try collectionGroup fast-path; on missing index, fallback to per-task merge\n try {\n const ss = await db\n .collectionGroup('snapshots')\n .where('uid', '==', uid)\n .where('projectId', '==', projectId)\n .orderBy('timestamp', 'desc')\n .limit(limit)\n .get();\n docs = ss.docs.map((d: any) => d.data());\n } catch (e: any) {\n // Fallback: enumerate tasks and merge top snapshots without requiring composite index\n const projRef = db.collection('users').doc(uid).collection('projects').doc(projectId);\n const tasksSnap = await projRef.collection('tasks').get();\n const perTaskTop: any[] = [];\n for (const t of tasksSnap.docs) {\n try {\n const snaps = await t.ref.collection('snapshots').orderBy('timestamp', 'desc').limit(Math.max(1, Math.ceil(limit / Math.max(1, tasksSnap.size)))).get();\n for (const s of snaps.docs) perTaskTop.push(s.data());\n } catch {}\n }\n // Merge-sort by timestamp desc and trim to limit\n perTaskTop.sort((a, b) => String(b?.timestamp || '').localeCompare(String(a?.timestamp || '')));\n docs = perTaskTop.slice(0, limit);\n }\n }\n\n return res.json({ success: true, data: { snapshots: docs } });\n } catch (e) {\n console.error('[Snapshots] GET error', e);\n return res.status(500).json({ error: 'internal_error' });\n }\n});\n\napp.get('/api/v1/usage', rateLimitMiddleware, async (req: Request, res: Response) => {\n try {\n const auth = req.headers.authorization;\n if (!auth || !auth.startsWith('Bearer ')) return res.status(401).json({ error: 'unauthorized' });\n const idToken = auth.substring('Bearer '.length).trim();\n const decoded = await decodeFirebaseToken(idToken).catch(() => null as any);\n if (!decoded) return res.status(401).json({ error: 'unauthorized' });\n const uid = decoded?.uid || decoded?.sub;\n const { planId: pid, limits } = await getUserPlanAndLimits(uid);\n const { data } = await ensureUsageDoc(uid);\n const periodId = getCurrentPeriodId();\n const used = data?.used || { req: 0, tokens: 0, code: 0, attachment: 0 };\n const remain = data?.remain || limits;\n const percentage = {\n req: limits.req > 0 ? Math.round((used.req / limits.req) * 100) : 0,\n tokens: limits.tokens > 0 ? Math.round((used.tokens / limits.tokens) * 100) : 0,\n code: limits.code > 0 ? Math.round((used.code / limits.code) * 100) : 0,\n attachment: limits.attachment > 0 ? Math.round((used.attachment / limits.attachment) * 100) : 0,\n };\n return res.json({\n periodId,\n planCode: pid,\n planName: planName(pid),\n used,\n remain,\n limits,\n percentage,\n resetAt: data?.resetAt || nextMonthResetISO(),\n });\n } catch (e) {\n console.error('[Usage] GET error', e);\n return res.status(500).json({ error: 'internal_error' });\n }\n});\n\napp.post('/api/v1/usage', rateLimitMiddleware, async (req: Request, res: Response) => {\n try {\n const auth = req.headers.authorization;\n if (!auth || !auth.startsWith('Bearer ')) return res.status(401).json({ error: 'unauthorized' });\n const { consumption } = req.body || {};\n const idemKey = (req.headers['idempotency-key'] as string | undefined) || undefined;\n const idToken = auth.substring('Bearer '.length).trim();\n const decoded = await decodeFirebaseToken(idToken).catch(() => null as any);\n if (!decoded) return res.status(401).json({ error: 'unauthorized' });\n const uid = decoded?.uid || decoded?.sub;\n await applyConsumption(uid, consumption || {}, idemKey);\n // Return fresh snapshot in unified shape\n const { data } = await ensureUsageDoc(uid);\n const { planId: pid, limits } = await getUserPlanAndLimits(uid);\n const periodId = getCurrentPeriodId();\n const used = data?.used || { req: 0, tokens: 0, code: 0, attachment: 0 };\n const remain = data?.remain || limits;\n const percentage = {\n req: limits.req > 0 ? Math.round((used.req / limits.req) * 100) : 0,\n tokens: limits.tokens > 0 ? Math.round((used.tokens / limits.tokens) * 100) : 0,\n code: limits.code > 0 ? Math.round((used.code / limits.code) * 100) : 0,\n attachment: limits.attachment > 0 ? Math.round((used.attachment / limits.attachment) * 100) : 0,\n };\n return res.json({ periodId, planCode: pid, planName: planName(pid), used, remain, limits, percentage, resetAt: data?.resetAt || nextMonthResetISO() });\n } catch (e) {\n console.error('[Usage] POST error', e);\n return res.status(500).json({ error: 'internal_error' });\n }\n});\n\n// 404 handler\napp.use((req: Request, res: Response) => {\n res.status(404).json({\n error: 'not_found',\n message: 'The requested endpoint does not exist',\n path: req.path\n });\n});\n\n// Error handler\napp.use((err: Error, req: Request, res: Response, next: NextFunction) => {\n console.error('[Server Error]:', err);\n res.status(500).json({\n error: 'internal_server_error',\n message: 'An unexpected error occurred'\n });\n});\n\n// Start server\nconst server = app.listen(port, () => {\n console.log(` MARIA CODE Express Server running on port ${port}`);\n console.log(` Health check: http://localhost:${port}/health`);\n console.log(` API Status: http://localhost:${port}/api/status`);\n console.log(` API Endpoints: http://localhost:${port}/`);\n \n // Start rate limit cleanup job\n startRateLimitCleanup();\n console.log(' Rate limit cleanup job started');\n});\n\n// Graceful shutdown\nprocess.on('SIGTERM', () => {\n console.log('SIGTERM signal received: closing HTTP server');\n server.close(() => {\n console.log('HTTP server closed');\n process.exit(0);\n });\n});\n\nprocess.on('SIGINT', () => {\n console.log('SIGINT signal received: closing HTTP server');\n server.close(() => {\n console.log('HTTP server closed');\n process.exit(0);\n });\n});\n\nexport { app, server };\n"]}