@umituz/web-ai 1.0.11 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/README.md +29 -3
  2. package/dist/{cancellation-error-_39nYWwz.d.cts → cancellation-error-BWb59Wkj.d.cts} +1 -1
  3. package/dist/{cancellation-error-hYcE9AS9.d.ts → cancellation-error-D9LETLCD.d.ts} +1 -1
  4. package/dist/chat/index.cjs +1 -0
  5. package/dist/chat/index.cjs.map +1 -1
  6. package/dist/chat/index.js +1 -0
  7. package/dist/chat/index.js.map +1 -1
  8. package/dist/content/index.cjs +622 -8
  9. package/dist/content/index.cjs.map +1 -1
  10. package/dist/content/index.d.cts +2 -2
  11. package/dist/content/index.d.ts +2 -2
  12. package/dist/content/index.js +622 -8
  13. package/dist/content/index.js.map +1 -1
  14. package/dist/context-manager-CuZz0vnC.d.cts +104 -0
  15. package/dist/context-manager-CuZz0vnC.d.ts +104 -0
  16. package/dist/core/index.cjs +147 -10
  17. package/dist/core/index.cjs.map +1 -1
  18. package/dist/core/index.d.cts +91 -73
  19. package/dist/core/index.d.ts +91 -73
  20. package/dist/core/index.js +141 -11
  21. package/dist/core/index.js.map +1 -1
  22. package/dist/{create-ai-D-oEWzf9.d.ts → create-ai-Cq3HkJxd.d.ts} +61 -1
  23. package/dist/{create-ai-DRysRImc.d.cts → create-ai-DDyTVzef.d.cts} +61 -1
  24. package/dist/hooks/index.cjs +747 -15
  25. package/dist/hooks/index.cjs.map +1 -1
  26. package/dist/hooks/index.d.cts +57 -4
  27. package/dist/hooks/index.d.ts +57 -4
  28. package/dist/hooks/index.js +746 -16
  29. package/dist/hooks/index.js.map +1 -1
  30. package/dist/index.cjs +1180 -242
  31. package/dist/index.cjs.map +1 -1
  32. package/dist/index.d.cts +7 -6
  33. package/dist/index.d.ts +7 -6
  34. package/dist/index.js +1140 -243
  35. package/dist/index.js.map +1 -1
  36. package/dist/providers/index.cjs +1212 -362
  37. package/dist/providers/index.cjs.map +1 -1
  38. package/dist/providers/index.d.cts +422 -10
  39. package/dist/providers/index.d.ts +422 -10
  40. package/dist/providers/index.js +1179 -363
  41. package/dist/providers/index.js.map +1 -1
  42. package/dist/remote-chat-client-LrNlew4n.d.cts +70 -0
  43. package/dist/remote-chat-client-LrNlew4n.d.ts +70 -0
  44. package/dist/{requestQueue-D89wx91Q.d.cts → requestQueue--h2uZ-Q3.d.cts} +1 -1
  45. package/dist/{requestQueue-AP6n_bRH.d.ts → requestQueue-BGeCy4Fd.d.ts} +1 -1
  46. package/package.json +1 -1
  47. package/dist/tool-call-accumulator-C7KhaXZA.d.cts +0 -69
  48. package/dist/tool-call-accumulator-C7KhaXZA.d.ts +0 -69
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/content/domain/types/index.ts","../../src/content/domain/calculations/ContentCreditCost.ts","../../src/content/domain/limits/ImageFormatOptions.ts","../../src/content/domain/calculations/AspectRatioDimensions.ts","../../src/content/domain/predicates/QualityRecommenderByRatio.ts","../../src/content/domain/constants/GenerationConstants.ts","../../src/core/errors/ai-error-types.ts","../../src/core/errors/ai-error.ts","../../src/content/domain/errors/AIErrors.ts","../../src/content/domain/limits/ValidationLimits.ts","../../src/content/domain/limits/SpeechPaceConfig.ts","../../src/content/domain/limits/ProviderTimingConfig.ts","../../src/content/domain/limits/ModelDefaults.ts","../../src/content/domain/limits/RequestQueueConfig.ts","../../src/content/domain/limits/MemoryConfig.ts","../../src/content/domain/calculations/SpeechPaceEstimate.ts","../../src/content/domain/calculations/SeoKeywordDensity.ts","../../src/content/domain/calculations/AbTestImprovementRatio.ts","../../src/content/domain/calculations/RetryBackoffDelay.ts","../../src/content/domain/calculations/ContentCalendarDateOffset.ts","../../src/content/domain/calculations/DefaultModelSelection.ts","../../src/content/domain/predicates/KeywordProminenceClassifier.ts","../../src/content/domain/predicates/HashtagPriorityRanker.ts","../../src/content/domain/predicates/PlatformSpecResolver.ts","../../src/content/domain/predicates/ScoreRangeGuard.ts","../../src/content/domain/predicates/AbTestConfidence.ts","../../src/content/domain/predicates/ProviderCostEstimator.ts","../../src/content/domain/predicates/FalImageRenderingOptions.ts","../../src/content/domain/validation/TopicTextValidator.ts","../../src/content/domain/validation/ContentBodyValidator.ts","../../src/content/domain/validation/KeywordListValidator.ts","../../src/content/domain/validation/DurationSecondsValidator.ts","../../src/content/domain/validation/CalendarDaysValidator.ts","../../src/content/domain/validation/HashtagCountValidator.ts","../../src/content/domain/utils/IdGenerator.ts","../../src/core/errors/groq-error.ts","../../src/core/errors/error-classifier.ts","../../src/core/errors/http-status-classifier.ts","../../src/core/errors/response-error-message-extractor.ts","../../src/providers/base/provider.types.ts","../../src/providers/factory/provider.factory.ts","../../src/core/constants/protocol.constants.ts","../../src/core/parsers/sse-lines.ts","../../src/core/parsers/json-content-extractor.ts","../../src/core/parsers/json-response.parser.ts","../../src/core/parsers/structured-prompt.builder.ts","../../src/core/tiers/index.ts","../../src/providers/anthropic/anthropic.constants.ts","../../src/providers/anthropic/anthropic-http.transport.ts","../../src/providers/anthropic/anthropic-request.builder.ts","../../src/providers/anthropic/anthropic-stream.parser.ts","../../src/providers/anthropic/anthropic.provider.ts","../../src/core/calculations/lru-key-selector.ts","../../src/core/calculations/cache-hit-rate.ts","../../src/core/utils/cache-key-builder.ts","../../src/core/utils/cache-manager.ts","../../src/core/calculations/exponential-backoff.ts","../../src/core/constants/identifier.constants.ts","../../src/core/utils/retry.ts","../../src/core/utils/request-queue.util.ts","../../src/core/utils/request-deduplicator.util.ts","../../src/core/utils/api-key-validator.ts","../../src/providers/groq/groq.constants.ts","../../src/providers/groq/groq-request.builder.ts","../../src/providers/groq/groq-config-store.ts","../../src/providers/groq/groq-http-transport.ts","../../src/core/executor/retry-executor.strategy.ts","../../src/core/executor/queue-executor.strategy.ts","../../src/core/executor/dedupe-executor.strategy.ts","../../src/core/executor/composite-executor.strategy.ts","../../src/providers/groq/groq-http-client.ts","../../src/providers/groq/groq-sse.ts","../../src/providers/groq/groq.provider.ts","../../src/providers/base/base.provider.ts","../../src/providers/gemini/gemini.provider.ts","../../src/providers/fal/fal.provider.ts","../../src/providers/pruna/client/core/constants/limits.ts","../../src/providers/pruna/client/core/constants/network.ts","../../src/providers/pruna/client/core/constants/mime-types.ts","../../src/providers/pruna/client/core/errors/cancellation-error.ts","../../src/providers/pruna/client/core/errors/authentication-error.ts","../../src/providers/pruna/client/core/errors/timeout-error.ts","../../src/providers/pruna/client/core/errors/validation-error.ts","../../src/providers/pruna/client/core/utils/base64.ts","../../src/providers/pruna/client/core/utils/mime-detector.ts","../../src/providers/pruna/client/core/utils/api-error-parser.ts","../../src/providers/pruna/client/core/protocol/http-status.ts","../../src/providers/pruna/client/core/protocol/job-status.ts","../../src/providers/pruna/client/core/protocol/abort-signal-classifier.ts","../../src/providers/pruna/client/core/protocol/pruna-url-builder.ts","../../src/providers/pruna/client/core/math/exponential-backoff.ts","../../src/providers/pruna/client/core/utils/uri-resolver.ts","../../src/providers/pruna/client/core/services/pruna-client.service.ts","../../src/providers/pruna/client/core/math/comparison-hash.ts","../../src/providers/pruna/client/core/math/cache-key-derivation.ts","../../src/providers/pruna/client/core/validation/api-key-validator.ts","../../src/providers/pruna/client/core/validation/image-source-validator.ts","../../src/providers/pruna/client/core/validation/aspect-ratio-validator.ts","../../src/providers/pruna/client/core/validation/resolution-validator.ts","../../src/providers/pruna/client/core/validation/duration-validator.ts","../../src/providers/pruna/client/core/validation/prompt-validator.ts","../../src/providers/pruna/client/core/validation/seed-validator.ts","../../src/providers/pruna/client/core/protocol/input-type-guard.ts","../../src/providers/pruna/client/core/utils/request-deduplicator.ts","../../src/providers/pruna/client/generation/builders/text-to-image.builder.ts","../../src/providers/pruna/client/generation/builders/image-to-image.builder.ts","../../src/providers/pruna/client/generation/builders/image-to-video.builder.ts","../../src/providers/pruna/client/generation/builders/model-input-builder.ts","../../src/providers/pruna/client/generation/builders/builder-factory.ts","../../src/providers/pruna/client/generation/services/generation.service.ts","../../src/providers/pruna/pruna-generate.ts","../../src/providers/pruna/pruna.provider.ts","../../src/providers/factory/create-ai.ts","../../src/content/application/prompts/PromptBuilder.ts","../../src/content/application/services/BlogService.ts","../../src/content/infrastructure/utils/requestQueue.ts","../../src/content/application/services/SocialService.ts","../../src/content/application/services/VideoScriptService.ts","../../src/content/application/services/AnalysisService.ts","../../src/content/application/services/SeoService.ts","../../src/content/application/services/ABTestService.ts","../../src/content/application/services/ImagePromptService.ts","../../src/content/application/services/ContentCalendarService.ts","../../src/content/application/services/ProviderServices.ts","../../src/content/infrastructure/utils/jsonParser.ts","../../src/content/application/services/GenerationExecutor.ts","../../src/content/application/services/AIContentService.ts","../../src/wizard/content.wizard.ts","../../src/wizard/image.wizard.ts","../../src/wizard/video.wizard.ts"],"names":["AIErrorType","retryManager","findLastIndex","ValidationError","calculateExponentialBackoff","RequestDeduplicator","RequestPriority","RequestQueue","repairCommonJsonDefects","executor","factory"],"mappings":"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","file":"index.cjs","sourcesContent":["\nexport type SocialPlatform = 'twitter' | 'linkedin' | 'instagram' | 'threads' | 'tiktok' | 'facebook';\n\nexport type ContentTone = 'professional' | 'casual' | 'enthusiastic' | 'humorous' | 'dramatic' | 'educational' | 'inspirational';\n\nexport type ContentType = 'blog' | 'video' | 'social' | 'email' | 'advertisement' | 'caption' | 'script';\n\nexport type Emotion = 'happy' | 'excited' | 'calm' | 'sad' | 'angry' | 'surprised' | 'fearful' | 'disgusted' | 'neutral';\n\nexport type Sentiment = 'positive' | 'neutral' | 'negative';\n\nexport type BlogType = 'tutorial' | 'listicle' | 'review' | 'opinion' | 'howto';\n\nexport interface PlatformSpecs {\n maxLength: number;\n style: string;\n emojiSupport: boolean;\n hashtagSupport: boolean;\n imageSupport: boolean;\n videoSupport: boolean;\n maxHashtags: number;\n}\n\nexport const PLATFORM_SPECS: Record<SocialPlatform, PlatformSpecs> = {\n twitter: {\n maxLength: 280,\n style: 'concise, engaging, thread-friendly',\n emojiSupport: true,\n hashtagSupport: true,\n imageSupport: true,\n videoSupport: true,\n maxHashtags: 5,\n },\n linkedin: {\n maxLength: 3000,\n style: 'professional, insightful, industry-focused',\n emojiSupport: true,\n hashtagSupport: true,\n imageSupport: true,\n videoSupport: true,\n maxHashtags: 5,\n },\n instagram: {\n maxLength: 2200,\n style: 'visual, engaging, emoji-rich',\n emojiSupport: true,\n hashtagSupport: true,\n imageSupport: true,\n videoSupport: true,\n maxHashtags: 30,\n },\n threads: {\n maxLength: 500,\n style: 'conversational, community-driven',\n emojiSupport: true,\n hashtagSupport: true,\n imageSupport: true,\n videoSupport: true,\n maxHashtags: 5,\n },\n tiktok: {\n maxLength: 150,\n style: 'catchy, trending, short-form',\n emojiSupport: true,\n hashtagSupport: true,\n imageSupport: false,\n videoSupport: true,\n maxHashtags: 5,\n },\n facebook: {\n maxLength: 63206,\n style: 'conversational, engaging, shareable',\n emojiSupport: true,\n hashtagSupport: true,\n imageSupport: true,\n videoSupport: true,\n maxHashtags: 5,\n },\n};\n","\nimport type { GenerationType } from '../types/GenerationTypes';\nimport type { ImageQuality, VideoQuality } from '../limits/ImageFormatOptions';\n\nexport type QualityTier = 'standard' | 'hd' | '4k';\n\nexport const CREDIT_COSTS: Readonly<Record<GenerationType, Readonly<Record<QualityTier, number>>>> = {\n 'text-to-image': { standard: 1, hd: 2, '4k': 4 },\n 'image-to-image': { standard: 1, hd: 2, '4k': 4 },\n 'image-to-video': { standard: 3, hd: 5, '4k': 8 },\n 'text-to-video': { standard: 5, hd: 8, '4k': 12 },\n} as const;\n\nexport const DEFAULT_CREDIT_COST: number = 0;\n\nexport type AnyQuality = QualityTier | ImageQuality | VideoQuality;\n\nexport function toQualityTier(quality: AnyQuality | undefined): QualityTier {\n if (quality === '4k') return '4k';\n if (quality === 'hd' || quality === '1080p') return 'hd';\n return 'standard';\n}\n\nexport function calculateContentCreditCost(\n type: GenerationType,\n quality: AnyQuality = 'standard',\n): number {\n const tierCosts = CREDIT_COSTS[type];\n if (!tierCosts) return DEFAULT_CREDIT_COST;\n return tierCosts[toQualityTier(quality)] ?? tierCosts.standard;\n}\n","\nexport type AspectRatio = '1:1' | '16:9' | '9:16' | '4:3' | '3:4';\nexport type ImageQuality = 'standard' | 'hd' | '4k';\nexport type VideoQuality = '720p' | '1080p' | '4k';\nexport type MotionStrength = 'slow' | 'medium' | 'fast';\nexport type ImageStyle = 'realistic' | 'artistic' | 'anime' | 'cinematic' | 'vintage' | 'fantasy' | 'minimalist' | 'abstract';\n\nexport interface AspectRatioOption {\n value: AspectRatio;\n label: string;\n width: number;\n height: number;\n}\n\nexport interface ImageQualityOption {\n value: ImageQuality;\n label: string;\n description: string;\n resolution: string;\n}\n\nexport interface VideoQualityOption {\n value: VideoQuality;\n label: string;\n resolution: string;\n}\n\nexport interface MotionOption {\n value: MotionStrength;\n label: string;\n description: string;\n}\n\nexport interface StylePreset {\n value: ImageStyle;\n label: string;\n promptFragment: string;\n}\n\nexport const ASPECT_RATIO_OPTIONS: ReadonlyArray<AspectRatioOption> = [\n { value: '1:1', label: 'Square', width: 1024, height: 1024 },\n { value: '16:9', label: 'Landscape', width: 1920, height: 1080 },\n { value: '9:16', label: 'Portrait', width: 1080, height: 1920 },\n { value: '4:3', label: 'Standard', width: 1440, height: 1080 },\n { value: '3:4', label: 'Tall', width: 1080, height: 1440 },\n] as const;\n\nexport const IMAGE_QUALITY_OPTIONS: ReadonlyArray<ImageQualityOption> = [\n { value: 'standard', label: 'Standard', description: '1024x1024, good quality', resolution: '1024x1024' },\n { value: 'hd', label: 'HD', description: '1920x1080, high quality', resolution: '1920x1080' },\n { value: '4k', label: '4K', description: '3840x2160, ultra quality', resolution: '3840x2160' },\n] as const;\n\nexport const VIDEO_QUALITY_OPTIONS: ReadonlyArray<VideoQualityOption> = [\n { value: '720p', label: '720p HD', resolution: '1280x720' },\n { value: '1080p', label: '1080p Full HD', resolution: '1920x1080' },\n { value: '4k', label: '4K Ultra HD', resolution: '3840x2160' },\n] as const;\n\nexport const VIDEO_DURATION_OPTIONS_SECONDS: ReadonlyArray<number> = [2, 3, 4, 5, 6, 7, 8, 9, 10] as const;\n\nexport const MOTION_OPTIONS: ReadonlyArray<MotionOption> = [\n { value: 'slow', label: 'Slow', description: 'Gentle movement' },\n { value: 'medium', label: 'Medium', description: 'Balanced motion' },\n { value: 'fast', label: 'Fast', description: 'Dynamic movement' },\n] as const;\n\nexport const STYLE_PRESETS: ReadonlyArray<StylePreset> = [\n { value: 'realistic', label: 'Realistic', promptFragment: 'realistic, photograph, detailed' },\n { value: 'artistic', label: 'Artistic', promptFragment: 'artistic, painting, creative' },\n { value: 'anime', label: 'Anime', promptFragment: 'anime style, manga, vibrant colors' },\n { value: 'cinematic', label: 'Cinematic', promptFragment: 'cinematic, movie scene, dramatic lighting' },\n { value: 'vintage', label: 'Vintage', promptFragment: 'vintage, retro, film grain' },\n { value: 'fantasy', label: 'Fantasy', promptFragment: 'fantasy, magical, ethereal' },\n { value: 'minimalist', label: 'Minimalist', promptFragment: 'minimalist, clean, simple' },\n { value: 'abstract', label: 'Abstract', promptFragment: 'abstract, geometric, artistic' },\n] as const;\n","\nimport { ASPECT_RATIO_OPTIONS, type AspectRatio } from '../limits/ImageFormatOptions';\n\nconst FALLBACK_DIMENSIONS = { width: 1024, height: 1024 } as const;\n\nexport function resolveDimensionsForAspectRatio(\n ratio: AspectRatio,\n): { width: number; height: number } {\n const match = ASPECT_RATIO_OPTIONS.find((option) => option.value === ratio);\n return match ? { width: match.width, height: match.height } : FALLBACK_DIMENSIONS;\n}\n","\nimport type { AspectRatio, ImageQuality, VideoQuality } from '../limits/ImageFormatOptions';\n\nconst WIDE_RATIOS: ReadonlySet<AspectRatio> = new Set(['16:9', '4:3']);\n\nexport function recommendQualityForAspectRatio(\n ratio: AspectRatio,\n): ImageQuality | VideoQuality {\n return WIDE_RATIOS.has(ratio) ? 'hd' : 'standard';\n}\n","\nimport {\n ASPECT_RATIO_OPTIONS,\n IMAGE_QUALITY_OPTIONS,\n VIDEO_QUALITY_OPTIONS,\n VIDEO_DURATION_OPTIONS_SECONDS,\n MOTION_OPTIONS,\n STYLE_PRESETS,\n} from '../limits/ImageFormatOptions';\nimport {\n resolveDimensionsForAspectRatio,\n} from '../calculations/AspectRatioDimensions';\nimport { recommendQualityForAspectRatio } from '../predicates/QualityRecommenderByRatio';\n\nexport const ASPECT_RATIO_VALUES = ASPECT_RATIO_OPTIONS.map((o) => o.value);\nexport const IMAGE_QUALITY_VALUES = IMAGE_QUALITY_OPTIONS.map((o) => o.value);\nexport const VIDEO_QUALITY_VALUES = VIDEO_QUALITY_OPTIONS.map((o) => o.value);\n\nexport const VIDEO_DURATION_OPTIONS = VIDEO_DURATION_OPTIONS_SECONDS;\n\nexport { MOTION_OPTIONS, STYLE_PRESETS };\n\nexport const getDimensionsForAspectRatio = resolveDimensionsForAspectRatio;\n\nexport const getRecommendedQuality = recommendQualityForAspectRatio;\n","\nexport enum AIErrorType {\n INVALID_API_KEY = \"INVALID_API_KEY\",\n MISSING_CONFIG = \"MISSING_CONFIG\",\n NETWORK_ERROR = \"NETWORK_ERROR\",\n ABORT_ERROR = \"ABORT_ERROR\",\n RATE_LIMIT_ERROR = \"RATE_LIMIT_ERROR\",\n SERVER_ERROR = \"SERVER_ERROR\",\n CLIENT_ERROR = \"CLIENT_ERROR\",\n UNKNOWN_ERROR = \"UNKNOWN_ERROR\",\n}\n\nexport const USER_FRIENDLY_ERROR_MESSAGES: Readonly<Record<AIErrorType, string>> = {\n [AIErrorType.INVALID_API_KEY]: \"Please check your API key and try again.\",\n [AIErrorType.MISSING_CONFIG]: \"The provider is not configured. Please create a provider with createAI first.\",\n [AIErrorType.NETWORK_ERROR]: \"Network error. Please check your connection and try again.\",\n [AIErrorType.ABORT_ERROR]: \"Request was cancelled.\",\n [AIErrorType.RATE_LIMIT_ERROR]: \"You've reached the rate limit. Please wait a moment and try again.\",\n [AIErrorType.SERVER_ERROR]: \"The AI service is temporarily unavailable. Please try again later.\",\n [AIErrorType.CLIENT_ERROR]: \"The request was invalid. Please check your input and try again.\",\n [AIErrorType.UNKNOWN_ERROR]: \"An unexpected error occurred. Please try again.\",\n};\n","\nimport { AIErrorType } from \"./ai-error-types\";\n\nexport interface AIErrorMetadata {\n readonly status?: number;\n readonly url?: string;\n readonly [key: string]: unknown;\n}\n\nconst KNOWN_ERROR_TYPES = new Set<string>(Object.values(AIErrorType));\n\nfunction mapCodeToType(code: string): AIErrorType {\n switch (code) {\n case \"VALIDATION_ERROR\":\n case \"CLIENT_ERROR\":\n return AIErrorType.CLIENT_ERROR;\n case \"INVALID_API_KEY\":\n return AIErrorType.INVALID_API_KEY;\n case \"MISSING_CONFIG\":\n case \"PROVIDER_UNAVAILABLE\":\n return AIErrorType.MISSING_CONFIG;\n case \"PROVIDER_QUOTA_EXHAUSTED\":\n case \"RATE_LIMIT_ERROR\":\n return AIErrorType.RATE_LIMIT_ERROR;\n case \"NETWORK_ERROR\":\n case \"TIMEOUT\":\n return AIErrorType.NETWORK_ERROR;\n case \"ABORT_ERROR\":\n case \"ABORTED\":\n return AIErrorType.ABORT_ERROR;\n case \"SERVER_ERROR\":\n case \"PROVIDER_ERROR\":\n case \"NO_RESULT\":\n return AIErrorType.SERVER_ERROR;\n default:\n return AIErrorType.UNKNOWN_ERROR;\n }\n}\n\nfunction mapMessageToCode(message: string, fallback: string = \"UNKNOWN\"): string {\n const lower = message.toLowerCase();\n if (lower.includes(\"validation\")) return \"VALIDATION_ERROR\";\n if (lower.includes(\"quota\")) return \"PROVIDER_QUOTA_EXHAUSTED\";\n if (lower.includes(\"unavailable\")) return \"PROVIDER_UNAVAILABLE\";\n if (lower.includes(\"timeout\") || lower.includes(\"aborted\")) {\n return lower.includes(\"aborted\") ? \"ABORTED\" : \"TIMEOUT\";\n }\n if (lower.includes(\"parse\") || lower.includes(\"json\")) return \"PARSE_ERROR\";\n if (lower.includes(\"no result\")) return \"NO_RESULT\";\n if (lower.includes(\"network\") || lower.includes(\"fetch\")) return \"NETWORK_ERROR\";\n return fallback;\n}\n\nexport class AIError extends Error {\n public readonly type: AIErrorType;\n public readonly code: string;\n public readonly cause?: unknown;\n public readonly metadata: AIErrorMetadata;\n\n constructor(\n typeOrMessage: AIErrorType | string,\n messageOrCode?: string,\n cause?: unknown,\n metadata: AIErrorMetadata = {},\n ) {\n let effectiveType: AIErrorType;\n let effectiveMessage: string;\n let effectiveCode: string;\n\n if (KNOWN_ERROR_TYPES.has(typeOrMessage)) {\n effectiveType = typeOrMessage as AIErrorType;\n effectiveMessage = messageOrCode ?? \"\";\n effectiveCode = effectiveType;\n } else {\n effectiveMessage = typeOrMessage;\n effectiveCode = messageOrCode ?? \"UNKNOWN\";\n effectiveType = mapCodeToType(effectiveCode);\n }\n\n super(effectiveMessage);\n this.name = \"AIError\";\n this.type = effectiveType;\n this.code = effectiveCode;\n this.cause = cause;\n this.metadata = metadata;\n }\n\n static from(error: unknown, fallbackCode: string = \"UNKNOWN\"): AIError {\n if (error instanceof AIError) return error;\n if (error instanceof Error) {\n const code = mapMessageToCode(error.message, fallbackCode);\n return new AIError(error.message, code, error);\n }\n return new AIError(String(error), fallbackCode, error);\n }\n\n override toString(): string {\n const statusPart =\n typeof this.metadata.status === \"number\" ? ` (HTTP ${this.metadata.status})` : \"\";\n return `${this.name} [${this.type}]: ${this.message}${statusPart}`;\n }\n\n toJSON(): {\n name: string;\n type: AIErrorType;\n code: string;\n message: string;\n metadata: AIErrorMetadata;\n } {\n return {\n name: this.name,\n type: this.type,\n code: this.code,\n message: this.message,\n metadata: this.metadata,\n };\n }\n}\n","\nimport { AIError } from \"../../../core/errors/ai-error\";\n\nexport type AIErrorCode =\n | 'VALIDATION_ERROR'\n | 'PROVIDER_UNAVAILABLE'\n | 'PROVIDER_QUOTA_EXHAUSTED'\n | 'PROVIDER_ERROR'\n | 'NETWORK_ERROR'\n | 'TIMEOUT'\n | 'ABORTED'\n | 'PARSE_ERROR'\n | 'NO_RESULT'\n | 'UNKNOWN';\n\nexport { AIError };\n\nexport class ValidationError extends AIError {\n constructor(message: string) {\n super(message, 'VALIDATION_ERROR');\n this.name = 'ValidationError';\n }\n}\n\nexport class ProviderUnavailableError extends AIError {\n constructor(providerId: string) {\n super(`Provider ${providerId} is not available`, 'PROVIDER_UNAVAILABLE');\n this.name = 'ProviderUnavailableError';\n }\n}\n\nexport class ProviderQuotaExhaustedError extends AIError {\n constructor(providerId: string) {\n super(`Provider ${providerId} quota exhausted`, 'PROVIDER_QUOTA_EXHAUSTED');\n this.name = 'ProviderQuotaExhaustedError';\n }\n}\n","\nexport const ValidationLimits = {\n TOPIC: {\n MIN: 1,\n MAX: 500,\n },\n CONTENT: {\n MIN: 1,\n MAX: 10_000,\n },\n KEYWORD: {\n MAX_COUNT: 20,\n MAX_LENGTH: 50,\n },\n DURATION_SECONDS: {\n MIN: 10,\n MAX: 600,\n },\n CALENDAR_DAYS: {\n MIN: 1,\n MAX: 90,\n },\n HASHTAG_COUNT: {\n MIN: 1,\n MAX: 50,\n },\n SEO_CONTENT_PREVIEW: 500,\n BLOG_PROMPT_PREVIEW: 1_000,\n AB_VARIANT_CONTENT_PREVIEW: 200,\n} as const;\n\nexport type ValidationLimitsConfig = typeof ValidationLimits;\n","\nexport const SpeechPaceConfig = {\n WORDS_PER_SECOND: 2.5,\n\n TOKENS_PER_SECOND: 10,\n\n JSON_TOKEN_OVERHEAD: 500,\n\n TOKENS_PER_CALENDAR_DAY: 150,\n} as const;\n","\nexport const ProviderTimingConfig = {\n DEFAULT_TIMEOUT_MS: 30_000,\n DEFAULT_RETRY_ATTEMPTS: 3,\n\n FAL_TIMEOUT_MS: 120_000,\n FAL_RETRY_ATTEMPTS: 2,\n\n GEMINI_TIMEOUT_MS: 60_000,\n GEMINI_RETRY_ATTEMPTS: 3,\n\n GROQ_TIMEOUT_MS: 30_000,\n GROQ_RETRY_ATTEMPTS: 3,\n\n HEALTH_CHECK_TTL_MS: 5 * 60 * 1000,\n\n RETRY_BACKOFF_BASE_MS: 1_000,\n} as const;\n","\nexport const ModelDefaults = {\n GROQ_TEXT: 'llama-3.1-8b-instant',\n GROQ_CHAT: 'llama-3.1-8b-instant',\n FAL_IMAGE: 'fal-ai/flux/schnell',\n FAL_VIDEO: 'fal-ai/hunyuan-video/1',\n FAL_IMAGE_TO_VIDEO: 'fal-ai/fast-animatediff/image-to-video',\n GEMINI_TEXT: 'gemini-2.0-flash',\n GEMINI_IMAGE: 'imagen-4.0-generate-001',\n PRUNA_IMAGE: 'p-image',\n PRUNA_IMAGE_EDIT: 'p-image-edit',\n PRUNA_VIDEO: 'p-video',\n} as const;\n\nexport const TextModelDefaults = {\n TEXT_MODEL: 'claude-sonnet-4-20250514',\n MAX_TOKENS: 4_096,\n DEFAULT_TEMPERATURE: 0.7,\n DEFAULT_TOP_P: 0.9,\n} as const;\n","\nexport const RequestQueueConfig = {\n MAX_CONCURRENT: 3,\n MAX_QUEUE_SIZE: 50,\n DEFAULT_TIMEOUT_MS: 30_000,\n RETRY_DELAY_MS: 1_000,\n\n RATE_LIMIT: {\n ENABLED: true,\n WINDOW_MS: 60_000,\n MAX_REQUESTS_PER_WINDOW: 100,\n },\n\n POLL_INTERVAL_MS: 100,\n} as const;\n","\nexport const MemoryConfig = {\n MANAGER: {\n MAX_SIZE_BYTES: 50 * 1024 * 1024,\n CLEANUP_THRESHOLD_RATIO: 0.8,\n RETENTION_RATIO: 0.5,\n },\n POOL: {\n DEFAULT_MAX_SIZE: 100,\n },\n EXPIRING_CACHE: {\n DEFAULT_TTL_MS: 60_000,\n CLEANUP_INTERVAL_MS: 60_000,\n },\n} as const;\n","\nimport { SpeechPaceConfig } from '../limits/SpeechPaceConfig';\n\nexport function estimateWordCountForDuration(durationSeconds: number): number {\n return Math.floor(durationSeconds * SpeechPaceConfig.WORDS_PER_SECOND);\n}\n\nexport function estimateTokenBudgetForDuration(durationSeconds: number): number {\n return durationSeconds * SpeechPaceConfig.TOKENS_PER_SECOND + SpeechPaceConfig.JSON_TOKEN_OVERHEAD;\n}\n\nexport function estimateTokenBudgetForCalendarDays(days: number): number {\n return days * SpeechPaceConfig.TOKENS_PER_CALENDAR_DAY + SpeechPaceConfig.JSON_TOKEN_OVERHEAD;\n}\n","\nexport function countKeywordOccurrences(content: string, keyword: string): number {\n if (!keyword) return 0;\n const escaped = keyword.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n const matches = content.match(new RegExp(escaped, 'gi'));\n return matches ? matches.length : 0;\n}\n\nexport function countWordsInContent(content: string): number {\n const tokens = content.split(/\\s+/).filter(Boolean);\n return tokens.length || 1;\n}\n\nexport function calculateKeywordDensity(content: string, keyword: string): number {\n const totalWords = countWordsInContent(content);\n const occurrences = countKeywordOccurrences(content, keyword);\n return (occurrences / totalWords) * 100;\n}\n","\nexport function calculateImprovementPercentage(scoreA: number, scoreB: number): string {\n const higher = Math.max(scoreA, scoreB);\n const lower = Math.min(scoreA, scoreB);\n if (lower <= 0) {\n return '100';\n }\n const delta = ((higher / lower) - 1) * 100;\n return Math.abs(delta).toFixed(0);\n}\n\nexport function selectHigherScoreVariantId(\n scoreA: number,\n scoreB: number,\n idA: string = 'A',\n idB: string = 'B',\n): string {\n return scoreA > scoreB ? idA : idB;\n}\n","\nimport { ProviderTimingConfig } from '../limits/ProviderTimingConfig';\n\nexport function calculateRetryBackoffDelayMs(attemptIndex: number): number {\n return ProviderTimingConfig.RETRY_BACKOFF_BASE_MS * Math.pow(2, attemptIndex);\n}\n","\nconst ONE_DAY_MS = 24 * 60 * 60 * 1000;\n\nexport function resolveCalendarEntryDate(dayIndex: number, baseTimestamp: number = Date.now()): Date {\n return new Date(baseTimestamp + (dayIndex - 1) * ONE_DAY_MS);\n}\n","\nimport type { GenerationType } from '../types/GenerationTypes';\nimport { ModelDefaults } from '../limits/ModelDefaults';\n\nexport function resolveDefaultPrunaModel(generationType: GenerationType): string {\n switch (generationType) {\n case 'image-to-image':\n return ModelDefaults.PRUNA_IMAGE_EDIT;\n case 'image-to-video':\n return ModelDefaults.PRUNA_VIDEO;\n case 'text-to-image':\n return ModelDefaults.PRUNA_IMAGE;\n case 'text-to-video':\n return ModelDefaults.PRUNA_VIDEO;\n }\n}\n","\nexport type KeywordProminence = 'high' | 'medium' | 'low';\n\nconst HIGH_DENSITY_THRESHOLD = 2;\nconst MEDIUM_DENSITY_THRESHOLD = 1;\n\nexport function classifyKeywordProminence(densityPercent: number): KeywordProminence {\n if (densityPercent > HIGH_DENSITY_THRESHOLD) return 'high';\n if (densityPercent > MEDIUM_DENSITY_THRESHOLD) return 'medium';\n return 'low';\n}\n\nexport function isUnderutilizedKeyword(densityPercent: number): boolean {\n return densityPercent < 1;\n}\n","\nimport type { SocialPlatform } from '../types';\nimport { PLATFORM_SPECS } from '../types';\n\nexport const DEFAULT_HASHTAG_BUDGET: number = Number.MAX_SAFE_INTEGER;\n\nexport function resolveHashtagBudget(platform: SocialPlatform): number {\n return PLATFORM_SPECS[platform]?.maxHashtags ?? DEFAULT_HASHTAG_BUDGET;\n}\n\nexport function rankAndTrimHashtags(hashtags: ReadonlyArray<string>, budget: number): string[] {\n if (hashtags.length <= budget) return [...hashtags];\n return [...hashtags].sort((a, b) => b.length - a.length).slice(0, budget);\n}\n","\nimport type { PlatformSpecs, SocialPlatform } from '../types';\nimport { PLATFORM_SPECS } from '../types';\n\nconst FALLBACK_SPEC: PlatformSpecs = {\n maxLength: 280,\n style: 'concise, engaging, audience-friendly',\n emojiSupport: true,\n hashtagSupport: true,\n imageSupport: true,\n videoSupport: true,\n maxHashtags: 5,\n};\n\nexport function resolvePlatformSpec(platform: SocialPlatform): PlatformSpecs {\n return PLATFORM_SPECS[platform] ?? FALLBACK_SPEC;\n}\n\nexport function resolveMaxContentLength(platform: SocialPlatform, override?: number): number {\n return override ?? resolvePlatformSpec(platform).maxLength;\n}\n","\nconst SCORE_MIN = 0;\nconst SCORE_MAX = 100;\nconst SCORE_FALLBACK = 50;\n\nconst CONFIDENCE_MIN = 0;\nconst CONFIDENCE_MAX = 1;\nconst CONFIDENCE_FALLBACK = 0.5;\n\nexport function clampScoreToValidRange(score: number, fallback: number = SCORE_FALLBACK): number {\n if (!Number.isFinite(score)) return fallback;\n return Math.max(SCORE_MIN, Math.min(SCORE_MAX, score));\n}\n\nexport function clampConfidenceToValidRange(\n confidence: number,\n fallback: number = CONFIDENCE_FALLBACK,\n): number {\n if (!Number.isFinite(confidence)) return fallback;\n return Math.max(CONFIDENCE_MIN, Math.min(CONFIDENCE_MAX, confidence));\n}\n","\nexport const AB_TEST_DEFAULT_CONFIDENCE: number = 0.7;\n","\nimport type { ImageGenerationRequest, TextGenerationRequest, VideoGenerationRequest } from '../config/ProviderConfig';\n\nconst FAL_FIXED_COST = 1;\nconst GROQ_FREE_TIER_COST = 0;\nconst GEMINI_IMAGE_COST = 0.02;\nconst GEMINI_TEXT_PER_1K_CHARS_COST = 0.0001;\nconst PRUNA_FIXED_COST = 1;\nconst UNKNOWN_PROVIDER_COST = 0;\n\nexport function estimateGroqGenerationCost(\n _request?: TextGenerationRequest | ImageGenerationRequest | VideoGenerationRequest,\n): number {\n return GROQ_FREE_TIER_COST;\n}\n\nexport function estimateFalGenerationCost(\n _request?: ImageGenerationRequest | VideoGenerationRequest,\n): number {\n return FAL_FIXED_COST;\n}\n\nexport function estimateGeminiGenerationCost(\n request: TextGenerationRequest | ImageGenerationRequest,\n): number {\n if (request.type === 'image') return GEMINI_IMAGE_COST;\n return GEMINI_TEXT_PER_1K_CHARS_COST;\n}\n\nexport function estimatePrunaGenerationCost(): number {\n return PRUNA_FIXED_COST;\n}\n\nexport function estimateUnknownProviderCost(): number {\n return UNKNOWN_PROVIDER_COST;\n}\n","\nconst FAL_FORMAT_TO_IMAGE_SIZE: Readonly<Record<string, string>> = {\n square: 'square_hd',\n landscape: 'landscape_16_9',\n portrait: 'portrait_9_16',\n story: 'portrait_9_16',\n banner: 'landscape_16_9',\n};\n\nconst FAL_DEFAULT_IMAGE_SIZE = 'square_hd';\n\nconst FAL_QUALITY_TO_STEPS: Readonly<Record<string, number>> = {\n standard: 4,\n high: 6,\n ultra: 8,\n};\n\nconst FAL_DEFAULT_QUALITY_STEPS = 6;\n\nexport function resolveFalImageSize(format?: string): string {\n if (!format) return FAL_DEFAULT_IMAGE_SIZE;\n return FAL_FORMAT_TO_IMAGE_SIZE[format] ?? FAL_DEFAULT_IMAGE_SIZE;\n}\n\nexport function resolveFalInferenceSteps(quality?: string): number {\n if (!quality) return FAL_DEFAULT_QUALITY_STEPS;\n return FAL_QUALITY_TO_STEPS[quality] ?? FAL_DEFAULT_QUALITY_STEPS;\n}\n","\nimport { ValidationLimits } from '../limits/ValidationLimits';\nimport { ValidationError } from '../errors/AIErrors';\n\nexport function validateTopicText(topic: string): string {\n if (typeof topic !== 'string' || topic.trim().length < ValidationLimits.TOPIC.MIN) {\n throw new ValidationError('Topic cannot be empty');\n }\n const trimmed = topic.trim();\n if (trimmed.length > ValidationLimits.TOPIC.MAX) {\n throw new ValidationError(`Topic exceeds maximum length of ${ValidationLimits.TOPIC.MAX} characters`);\n }\n return trimmed;\n}\n","\nimport { ValidationLimits } from '../limits/ValidationLimits';\nimport { ValidationError } from '../errors/AIErrors';\n\nexport function validateContentBody(content: string): string {\n if (typeof content !== 'string' || content.trim().length < ValidationLimits.CONTENT.MIN) {\n throw new ValidationError('Content cannot be empty');\n }\n const trimmed = content.trim();\n if (trimmed.length > ValidationLimits.CONTENT.MAX) {\n throw new ValidationError(`Content exceeds maximum length of ${ValidationLimits.CONTENT.MAX} characters`);\n }\n return trimmed;\n}\n\nexport function truncateForSeoPreview(content: string): string {\n return content.substring(0, ValidationLimits.SEO_CONTENT_PREVIEW);\n}\n\nexport function truncateForBlogPromptPreview(content: string): string {\n return content.substring(0, ValidationLimits.BLOG_PROMPT_PREVIEW);\n}\n\nexport function truncateForAbVariantPreview(content: string): string {\n return content.substring(0, ValidationLimits.AB_VARIANT_CONTENT_PREVIEW);\n}\n","\nimport { ValidationLimits } from '../limits/ValidationLimits';\nimport { ValidationError } from '../errors/AIErrors';\n\nexport function validateKeywordList(keywords: unknown): string[] {\n if (!Array.isArray(keywords)) {\n throw new ValidationError('Keywords must be an array');\n }\n if (keywords.length > ValidationLimits.KEYWORD.MAX_COUNT) {\n throw new ValidationError(`Cannot process more than ${ValidationLimits.KEYWORD.MAX_COUNT} keywords`);\n }\n return keywords\n .filter((k): k is string => typeof k === 'string' && k.trim().length > 0)\n .map((keyword) => {\n const trimmed = keyword.trim();\n if (trimmed.length > ValidationLimits.KEYWORD.MAX_LENGTH) {\n const preview = trimmed.substring(0, 20);\n throw new ValidationError(\n `Keyword \"${preview}...\" exceeds maximum length of ${ValidationLimits.KEYWORD.MAX_LENGTH} characters`,\n );\n }\n return trimmed;\n });\n}\n","\nimport { ValidationLimits } from '../limits/ValidationLimits';\nimport { ValidationError } from '../errors/AIErrors';\n\nexport function validateDurationSeconds(duration: number): number {\n if (!Number.isFinite(duration)) {\n throw new ValidationError(\n `Duration must be between ${ValidationLimits.DURATION_SECONDS.MIN} and ${ValidationLimits.DURATION_SECONDS.MAX} seconds`,\n );\n }\n if (duration < ValidationLimits.DURATION_SECONDS.MIN || duration > ValidationLimits.DURATION_SECONDS.MAX) {\n throw new ValidationError(\n `Duration must be between ${ValidationLimits.DURATION_SECONDS.MIN} and ${ValidationLimits.DURATION_SECONDS.MAX} seconds`,\n );\n }\n return duration;\n}\n","\nimport { ValidationLimits } from '../limits/ValidationLimits';\nimport { ValidationError } from '../errors/AIErrors';\n\nexport function validateCalendarDays(days: number): number {\n if (!Number.isFinite(days)) {\n throw new ValidationError(\n `Days must be between ${ValidationLimits.CALENDAR_DAYS.MIN} and ${ValidationLimits.CALENDAR_DAYS.MAX}`,\n );\n }\n if (days < ValidationLimits.CALENDAR_DAYS.MIN || days > ValidationLimits.CALENDAR_DAYS.MAX) {\n throw new ValidationError(\n `Days must be between ${ValidationLimits.CALENDAR_DAYS.MIN} and ${ValidationLimits.CALENDAR_DAYS.MAX}`,\n );\n }\n return days;\n}\n","\nimport { ValidationLimits } from '../limits/ValidationLimits';\nimport { ValidationError } from '../errors/AIErrors';\n\nexport function validateHashtagCount(count: number): number {\n if (!Number.isFinite(count)) {\n throw new ValidationError(\n `Hashtag count must be between ${ValidationLimits.HASHTAG_COUNT.MIN} and ${ValidationLimits.HASHTAG_COUNT.MAX}`,\n );\n }\n if (count < ValidationLimits.HASHTAG_COUNT.MIN || count > ValidationLimits.HASHTAG_COUNT.MAX) {\n throw new ValidationError(\n `Hashtag count must be between ${ValidationLimits.HASHTAG_COUNT.MIN} and ${ValidationLimits.HASHTAG_COUNT.MAX}`,\n );\n }\n return Math.floor(count);\n}\n","\nexport function generateId(prefix?: string): string {\n const id =\n typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function'\n ? crypto.randomUUID()\n : `${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 11)}`;\n\n return prefix ? `${prefix}-${id}` : id;\n}\n","import { AIError, type AIErrorMetadata } from \"./ai-error\";\nimport { AIErrorType } from \"./ai-error-types\";\n\nexport type GroqErrorMetadata = AIErrorMetadata;\nexport { AIErrorType as GroqErrorType };\n\n/**\n * Drop-in backwards-compatible GroqError extending core AIError.\n * Ensures `err instanceof GroqError` and `err instanceof AIError` both evaluate to true.\n */\nexport class GroqError extends AIError {\n constructor(\n type: AIErrorType,\n message: string,\n cause?: Error,\n metadata: GroqErrorMetadata = {},\n ) {\n super(type, message, cause, metadata);\n this.name = \"GroqError\";\n }\n}\n","\nimport { AIErrorType } from \"./ai-error-types\";\n\nconst DEFAULT_RETRYABLE_TYPES: ReadonlySet<AIErrorType> = new Set([\n AIErrorType.NETWORK_ERROR,\n AIErrorType.RATE_LIMIT_ERROR,\n AIErrorType.SERVER_ERROR,\n]);\n\nconst DEFAULT_AUTH_TYPES: ReadonlySet<AIErrorType> = new Set([\n AIErrorType.INVALID_API_KEY,\n]);\n\nexport interface ErrorClassificationRule {\n readonly retryable: ReadonlySet<AIErrorType>;\n readonly auth: ReadonlySet<AIErrorType>;\n}\n\nexport const DEFAULT_ERROR_CLASSIFICATION_RULE: ErrorClassificationRule = {\n retryable: DEFAULT_RETRYABLE_TYPES,\n auth: DEFAULT_AUTH_TYPES,\n};\n\nexport function isRetryableErrorType(\n type: AIErrorType,\n rule: ErrorClassificationRule = DEFAULT_ERROR_CLASSIFICATION_RULE,\n): boolean {\n return rule.retryable.has(type);\n}\n\nexport function isAuthErrorType(\n type: AIErrorType,\n rule: ErrorClassificationRule = DEFAULT_ERROR_CLASSIFICATION_RULE,\n): boolean {\n return rule.auth.has(type);\n}\n","\nimport { AIErrorType } from \"./ai-error-types\";\n\nexport interface HttpStatusClassificationRule {\n readonly unauthorizedStatuses: ReadonlySet<number>;\n readonly rateLimitedStatus: number;\n readonly serverErrorThreshold: number;\n readonly clientErrorThreshold: number;\n}\n\nexport const DEFAULT_HTTP_STATUS_RULE: HttpStatusClassificationRule = {\n unauthorizedStatuses: new Set([401, 403]),\n rateLimitedStatus: 429,\n serverErrorThreshold: 500,\n clientErrorThreshold: 400,\n};\n\nexport function classifyHttpStatus(\n status: number,\n rule: HttpStatusClassificationRule = DEFAULT_HTTP_STATUS_RULE,\n): AIErrorType {\n if (rule.unauthorizedStatuses.has(status)) return AIErrorType.INVALID_API_KEY;\n if (status === rule.rateLimitedStatus) return AIErrorType.RATE_LIMIT_ERROR;\n if (status >= rule.serverErrorThreshold) return AIErrorType.SERVER_ERROR;\n if (status >= rule.clientErrorThreshold) return AIErrorType.CLIENT_ERROR;\n return AIErrorType.UNKNOWN_ERROR;\n}\n","\nimport { AIErrorType } from \"./ai-error-types\";\n\nexport interface AIErrorBody {\n readonly error?: { readonly message?: string };\n readonly message?: string;\n}\n\nexport function extractErrorMessageFromJsonBody(body: unknown): string | null {\n if (!body || typeof body !== \"object\") return null;\n const candidate = body as AIErrorBody;\n const message = candidate.error?.message ?? candidate.message;\n if (typeof message === \"string\" && message.length > 0) return message;\n return null;\n}\n\nexport function buildHttpStatusFallback(status: number, statusText: string): string {\n const trimmedStatusText = statusText.trim();\n if (trimmedStatusText.length > 0) {\n return `HTTP ${status}: ${trimmedStatusText}`;\n }\n return `HTTP ${status}`;\n}\n\nexport async function extractErrorMessageFromResponse(response: Response): Promise<string> {\n const body: unknown = await response.json().catch(() => null);\n const fromBody = extractErrorMessageFromJsonBody(body);\n if (fromBody) return fromBody;\n return buildHttpStatusFallback(response.status, response.statusText);\n}\n\nexport function describeAIErrorType(type: AIErrorType): string {\n return `AIError[${type}]`;\n}\n","\nimport type {\n GenerationResult,\n ProviderHealth,\n StreamCallbacks,\n StructuredGeneration,\n StructuredTextRequest,\n TextRequest,\n TextTier,\n} from \"../../core/types\";\nimport type {\n GeneratedContent,\n ImageGenerationRequest,\n ImageToVideoRequest,\n TextGenerationRequest,\n VideoGenerationRequest,\n VideoToVideoRequest,\n} from \"../../content/domain/config/ProviderConfig\";\n\n/**\n * What a provider can serve. Replaces the old single `'multimodal'` type flag:\n * a provider declares exactly the capabilities it implements, and the factory\n * walks providers by capability when routing or failing over.\n */\nexport type ProviderCapability = \"text\" | \"image\" | \"video\";\n\n/** Cost estimation input — any generation request shape the fleet knows. */\nexport type CostEstimateRequest =\n | TextGenerationRequest\n | ImageGenerationRequest\n | VideoGenerationRequest;\n\nexport interface IProviderBase {\n readonly id: string;\n readonly name: string;\n readonly capabilities: ReadonlyArray<ProviderCapability>;\n healthCheck(): Promise<ProviderHealth>;\n estimateCost(request: CostEstimateRequest): Promise<number>;\n}\n\n/**\n * A provider that can turn conversations into text. This is the surface the\n * factory's `chat`/`chatStream` walk; model choice per quality tier is the\n * provider's own business (each maps neutral tiers onto its catalogue).\n */\nexport interface ITextProvider extends IProviderBase {\n generate(request: TextRequest): Promise<GenerationResult>;\n generateStructured<T>(request: StructuredTextRequest): Promise<StructuredGeneration<T>>;\n stream(request: TextRequest, callbacks: StreamCallbacks): Promise<GenerationResult>;\n resolveModel(tier: TextTier): string;\n}\n\n/**\n * A provider that generates media. Kept as B's media surface — image/video\n * request and result shapes are already provider-neutral.\n */\nexport interface IMediaProvider extends IProviderBase {\n generateImage(request: ImageGenerationRequest): Promise<GeneratedContent>;\n generateVideo(request: VideoGenerationRequest): Promise<GeneratedContent>;\n imageToVideo(request: ImageToVideoRequest): Promise<GeneratedContent>;\n videoToVideo(request: VideoToVideoRequest): Promise<GeneratedContent>;\n}\n\nexport type AnyProvider = ITextProvider | IMediaProvider;\nexport type IAIProvider = AnyProvider;\n\nexport function isTextProvider(provider: AnyProvider): provider is ITextProvider {\n return provider.capabilities.includes(\"text\");\n}\n\nexport function isMediaProvider(provider: AnyProvider): provider is IMediaProvider {\n return provider.capabilities.includes(\"image\") || provider.capabilities.includes(\"video\");\n}\n","\nimport type {\n GenerationResult,\n ProviderHealth,\n StreamCallbacks,\n StructuredGeneration,\n StructuredTextRequest,\n TextRequest,\n TextTier,\n} from \"../../core/types\";\nimport { AIError, AIErrorType } from \"../../core/errors\";\nimport type {\n AnyProvider,\n IMediaProvider,\n ITextProvider,\n ProviderCapability,\n} from \"../base/provider.types\";\nimport { isTextProvider } from \"../base/provider.types\";\nimport type {\n GeneratedContent,\n ImageGenerationRequest,\n ImageToVideoRequest,\n VideoGenerationRequest,\n VideoToVideoRequest,\n} from \"../../content/domain/config/ProviderConfig\";\nimport type {\n ITextGenerator,\n TextGenerationOptions,\n} from \"../../content/domain/interfaces/ITextGenerator\";\nimport { ProviderTimingConfig } from \"../../content/domain/limits/ProviderTimingConfig\";\n\nexport interface ProviderFactoryConfig {\n /** Provider ids in preference order; unlisted providers follow in registration order. */\n priority?: ReadonlyArray<string>;\n fallbackEnabled?: boolean;\n /** Tier used when a request names neither a model nor a tier. */\n defaultTier?: TextTier;\n}\n\ninterface HealthCheckCache {\n health: ProviderHealth;\n timestamp: number;\n}\n\n/**\n * Composition-aware registry and router. Replaces both ancestors at once:\n * B's ProviderFactory (health TTL cache, priority fallback walk, media\n * dispatch) and A's singleton configureProvider (via createAI). Adds the\n * provider-neutral `chat`/`chatStream` text surface with full usage\n * propagation, and keeps B's ITextGenerator string facade so the ported\n * content services compile unchanged.\n */\nexport class ProviderFactory implements ITextGenerator {\n private readonly providers = new Map<string, AnyProvider>();\n private readonly healthCache = new Map<string, HealthCheckCache>();\n private readonly priority: ReadonlyArray<string>;\n private readonly fallbackEnabled: boolean;\n readonly defaultTier: TextTier;\n\n constructor(config: ProviderFactoryConfig = {}) {\n this.priority = config.priority ?? [];\n this.fallbackEnabled = config.fallbackEnabled ?? true;\n this.defaultTier = config.defaultTier ?? \"balanced\";\n }\n\n register(provider: AnyProvider): void {\n this.providers.set(provider.id, provider);\n }\n\n getProvider(id: string): AnyProvider | undefined {\n return this.providers.get(id);\n }\n\n getAllProviders(): AnyProvider[] {\n return Array.from(this.providers.values());\n }\n\n getByCapability(capability: ProviderCapability): AnyProvider[] {\n return this.getAllProviders().filter((provider) =>\n provider.capabilities.includes(capability),\n );\n }\n\n getTextProviders(): ITextProvider[] {\n return this.getAllProviders().filter(isTextProvider);\n }\n\n hasTextProvider(): boolean {\n return this.getByCapability(\"text\").length > 0;\n }\n\n /* ---------- neutral text surface ---------- */\n\n /**\n * Single-chat entry point: resolves a healthy text provider by priority,\n * injects the default tier when the request names neither model nor tier,\n * and walks the fallback chain on failure. Providers map tiers onto their\n * own models, so switching Groq→Anthropic is a config change.\n */\n async chat(request: TextRequest): Promise<GenerationResult> {\n const effective: TextRequest =\n request.model || request.tier ? request : { ...request, tier: this.defaultTier };\n return this.executeWithFallback(\"text\", (provider) =>\n (provider as ITextProvider).generate(effective),\n );\n }\n\n async chatStream(\n request: TextRequest,\n callbacks: StreamCallbacks,\n ): Promise<GenerationResult> {\n const effective: TextRequest =\n request.model || request.tier ? request : { ...request, tier: this.defaultTier };\n\n let lastError: unknown;\n // onError is withheld until every provider has failed — a successful\n // fallback would otherwise have already reported a spurious error.\n const attemptCallbacks: StreamCallbacks = {\n onChunk: callbacks.onChunk,\n onComplete: callbacks.onComplete,\n };\n\n const providers = this.getByCapability(\"text\");\n if (providers.length === 0) {\n throw this.noProviderError(\"text\");\n }\n\n const ordered = this.orderByPriority(providers);\n for (const provider of ordered) {\n if (!this.isProviderHealthy(provider.id)) continue;\n try {\n return await (provider as ITextProvider).stream(effective, attemptCallbacks);\n } catch (error) {\n lastError = error;\n this.markDegraded(provider.id);\n if (!this.fallbackEnabled) {\n callbacks.onError?.(error instanceof Error ? error : new Error(String(error)));\n throw error;\n }\n }\n }\n\n const failure = new AIError(\n AIErrorType.SERVER_ERROR,\n `All providers failed for capability 'text'`,\n lastError instanceof Error ? lastError : undefined,\n );\n callbacks.onError?.(lastError instanceof Error ? lastError : failure);\n throw failure;\n }\n\n /** AsyncGenerator adapter over chatStream — A's familiar consumption shape. */\n async *streamText(request: TextRequest): AsyncGenerator<string> {\n const queue: string[] = [];\n let wake: (() => void) | null = null;\n let finished = false;\n let failure: unknown;\n\n const controller = new AbortController();\n const onAbort = () => controller.abort();\n request.signal?.addEventListener(\"abort\", onAbort);\n const effectiveRequest = { ...request, signal: controller.signal };\n\n const notify = (): void => {\n const resolve = wake;\n wake = null;\n resolve?.();\n };\n\n const completion = this.chatStream(effectiveRequest, {\n onChunk: (chunk) => {\n queue.push(chunk);\n notify();\n },\n }).then(\n () => {\n finished = true;\n notify();\n },\n (error) => {\n failure = error;\n finished = true;\n notify();\n },\n );\n\n try {\n while (!finished || queue.length > 0) {\n if (queue.length === 0 && !finished) {\n await new Promise<void>((resolve) => {\n wake = resolve;\n });\n }\n while (queue.length > 0) {\n yield queue.shift() as string;\n }\n if (failure) throw failure;\n }\n await completion;\n } finally {\n controller.abort();\n request.signal?.removeEventListener(\"abort\", onAbort);\n }\n }\n\n async generateJson<T>(\n request: StructuredTextRequest,\n ): Promise<StructuredGeneration<T>> {\n const effective: StructuredTextRequest =\n request.model || request.tier ? request : { ...request, tier: this.defaultTier };\n return this.executeWithFallback(\"text\", (provider) =>\n (provider as ITextProvider).generateStructured<T>(effective),\n );\n }\n\n /* ---------- content-layer string facade (ITextGenerator) ---------- */\n\n async generateText(prompt: string, options: TextGenerationOptions = {}): Promise<string> {\n const result = await this.chat({\n messages: [{ role: \"user\", content: prompt }],\n model: options.model,\n maxTokens: options.maxTokens,\n temperature: options.temperature,\n topP: options.topP,\n });\n return result.text;\n }\n\n generateTextStream(prompt: string, options: TextGenerationOptions = {}): AsyncGenerator<string> {\n return this.streamText({\n messages: [{ role: \"user\", content: prompt }],\n model: options.model,\n maxTokens: options.maxTokens,\n temperature: options.temperature,\n topP: options.topP,\n });\n }\n\n /* ---------- media surface ---------- */\n\n async generateImage(request: ImageGenerationRequest): Promise<GeneratedContent> {\n return this.executeWithFallback(\"image\", (provider) =>\n (provider as IMediaProvider).generateImage(request),\n );\n }\n\n async generateVideo(request: VideoGenerationRequest): Promise<GeneratedContent> {\n return this.executeWithFallback(\"video\", (provider) =>\n (provider as IMediaProvider).generateVideo(request),\n );\n }\n\n async imageToVideo(request: ImageToVideoRequest): Promise<GeneratedContent> {\n return this.executeWithFallback(\"video\", (provider) =>\n (provider as IMediaProvider).imageToVideo(request),\n );\n }\n\n async videoToVideo(request: VideoToVideoRequest): Promise<GeneratedContent> {\n return this.executeWithFallback(\"video\", (provider) =>\n (provider as IMediaProvider).videoToVideo(request),\n );\n }\n\n /* ---------- health ---------- */\n\n async checkProviderHealth(providerId: string, forceRefresh = false): Promise<ProviderHealth> {\n const provider = this.providers.get(providerId);\n if (!provider) {\n return \"unavailable\";\n }\n\n const cached = this.healthCache.get(providerId);\n const now = Date.now();\n const ttl = ProviderTimingConfig.HEALTH_CHECK_TTL_MS;\n\n if (!forceRefresh && cached && now - cached.timestamp < ttl) {\n return cached.health;\n }\n\n try {\n const health = await provider.healthCheck();\n this.healthCache.set(providerId, { health, timestamp: now });\n return health;\n } catch {\n this.healthCache.set(providerId, { health: \"unavailable\", timestamp: now });\n return \"unavailable\";\n }\n }\n\n isProviderHealthy(providerId: string): boolean {\n const cached = this.healthCache.get(providerId);\n if (!cached) {\n return true;\n }\n return cached.health === \"healthy\" || cached.health === \"degraded\";\n }\n\n async refreshAllHealth(): Promise<void> {\n await Promise.all(\n Array.from(this.providers.keys()).map((id) => this.checkProviderHealth(id)),\n );\n }\n\n /* ---------- internals ---------- */\n\n private async executeWithFallback<T>(\n capability: ProviderCapability,\n fn: (provider: AnyProvider) => Promise<T>,\n ): Promise<T> {\n const providers = this.getByCapability(capability);\n if (providers.length === 0) {\n throw this.noProviderError(capability);\n }\n\n let lastError: unknown;\n for (const provider of this.orderByPriority(providers)) {\n if (!this.isProviderHealthy(provider.id)) {\n continue;\n }\n\n try {\n return await fn(provider);\n } catch (error) {\n lastError = error;\n this.markDegraded(provider.id);\n if (!this.fallbackEnabled) {\n throw error;\n }\n }\n }\n\n throw new AIError(\n AIErrorType.SERVER_ERROR,\n `All providers failed for capability '${capability}'`,\n lastError instanceof Error ? lastError : undefined,\n );\n }\n\n private orderByPriority(providers: AnyProvider[]): AnyProvider[] {\n if (this.priority.length === 0) {\n return providers;\n }\n const ordered: AnyProvider[] = [];\n for (const providerId of this.priority) {\n const provider = providers.find((p) => p.id === providerId);\n if (provider) ordered.push(provider);\n }\n for (const provider of providers) {\n if (!this.priority.includes(provider.id)) {\n ordered.push(provider);\n }\n }\n return ordered;\n }\n\n private markDegraded(providerId: string): void {\n const cached = this.healthCache.get(providerId);\n if (cached) {\n this.healthCache.set(providerId, { health: \"degraded\", timestamp: cached.timestamp });\n }\n }\n\n private noProviderError(capability: ProviderCapability): AIError {\n return new AIError(\n AIErrorType.MISSING_CONFIG,\n `No provider registered for capability '${capability}' — create one with createAI() and include its config block`,\n );\n }\n}\n\nexport function createProviderFactory(config?: ProviderFactoryConfig): ProviderFactory {\n return new ProviderFactory(config);\n}\n","export const SSE_PREFIX = \"data: \" as const;\nexport const SSE_DONE_MARKER = \"[DONE]\" as const;\n\nexport const JSON_CODE_BLOCK_PATTERN = /```(?:json)?\\s*\\n?([\\s\\S]*?)\\n?```/;\nexport const JSON_OBJECT_PATTERN = /\\{[\\s\\S]*\\}/;\nexport const JSON_ARRAY_PATTERN = /\\[[\\s\\S]*\\]/;\n","import { SSE_DONE_MARKER, SSE_PREFIX } from \"../constants/protocol.constants\";\n\nexport function isSseDataLine(line: string): boolean {\n return line.startsWith(SSE_PREFIX) || line.startsWith(\"data:\");\n}\n\nexport function extractSseDataPayload(line: string): string {\n if (line.startsWith(SSE_PREFIX)) {\n return line.slice(SSE_PREFIX.length);\n }\n if (line.startsWith(\"data:\")) {\n return line.slice(5);\n }\n return line;\n}\n\nexport function isSseDoneMarker(payload: string): boolean {\n return payload === SSE_DONE_MARKER;\n}\n\nexport function splitSseLines(rawChunk: string): ReadonlyArray<string> {\n return rawChunk.split(\"\\n\").map((l) => l.trim()).filter((l) => l.length > 0);\n}\n\nexport interface NormalizedSseChunk {\n readonly payload: string;\n readonly isDone: boolean;\n}\n\nexport function normalizeSseChunk(rawChunk: string): ReadonlyArray<NormalizedSseChunk> {\n const lines = splitSseLines(rawChunk);\n const result: NormalizedSseChunk[] = [];\n for (const line of lines) {\n if (!isSseDataLine(line)) continue;\n const payload = extractSseDataPayload(line);\n result.push({ payload, isDone: isSseDoneMarker(payload) });\n }\n return result;\n}\n","\nimport {\n JSON_ARRAY_PATTERN,\n JSON_CODE_BLOCK_PATTERN,\n JSON_OBJECT_PATTERN,\n} from \"../constants/protocol.constants\";\n\nexport function extractJsonFromCodeFence(content: string): string | null {\n const match = content.match(JSON_CODE_BLOCK_PATTERN);\n if (match && match[1]) return match[1].trim();\n return null;\n}\n\nexport function extractJsonObject(content: string): string | null {\n const match = content.match(JSON_OBJECT_PATTERN);\n if (match && match[0]) return match[0];\n return null;\n}\n\nexport function extractJsonArray(content: string): string | null {\n const match = content.match(JSON_ARRAY_PATTERN);\n if (match && match[0]) return match[0];\n return null;\n}\n\nexport function repairCommonJsonDefects(text: string): string {\n return text\n .replace(/(:\\s*-?\\d+(?:\\.\\d+)?)\\s*\"/g, \"$1\")\n .replace(/(:\\s*\"[^\"]*\")\"/g, \"$1\");\n}\n\nexport function extractJsonCandidate(content: string): string {\n const fromFence = extractJsonFromCodeFence(content);\n if (fromFence) return fromFence;\n\n const objectIndex = content.indexOf(\"{\");\n const arrayIndex = content.indexOf(\"[\");\n\n if (objectIndex !== -1 && (arrayIndex === -1 || objectIndex < arrayIndex)) {\n const obj = extractJsonObject(content);\n if (obj) return obj;\n } else if (arrayIndex !== -1) {\n const arr = extractJsonArray(content);\n if (arr) return arr;\n }\n\n return content.trim();\n}\n","\nimport { AIError } from \"../errors/ai-error\";\nimport { AIErrorType } from \"../errors/ai-error-types\";\nimport { extractJsonCandidate, repairCommonJsonDefects } from \"./json-content-extractor\";\n\nexport class JsonResponseParser {\n parse<T>(rawContent: string): T {\n const candidate = extractJsonCandidate(rawContent);\n try {\n return JSON.parse(candidate) as T;\n } catch {\n try {\n return JSON.parse(repairCommonJsonDefects(candidate)) as T;\n } catch (error) {\n throw new AIError(\n AIErrorType.UNKNOWN_ERROR,\n \"Failed to parse structured response as JSON\",\n error instanceof Error ? error : undefined,\n { rawContent },\n );\n }\n }\n }\n}\n","\nexport class StructuredPromptBuilder {\n private schema: Record<string, unknown> | undefined;\n private request: string;\n\n constructor(request: string) {\n this.request = request;\n }\n\n static for(request: string): StructuredPromptBuilder {\n return new StructuredPromptBuilder(request);\n }\n\n withSchema(schema: Record<string, unknown> | undefined): this {\n this.schema = schema;\n return this;\n }\n\n build(): string {\n const schemaSection = this.schema\n ? `Expected JSON schema:\\n${JSON.stringify(this.schema, null, 2)}\\n\\n`\n : \"\";\n\n return (\n \"Please generate a JSON response for the following request.\\n\\n\" +\n schemaSection +\n `Request:\\n${this.request}\\n\\n` +\n \"Respond only with valid JSON, formatted as:\\n```json\\n{...}\\n```\"\n );\n }\n}\n","import type { TextTier } from \"../types\";\n\n/**\n * Per-provider default model per tier. Config can override any slot; an\n * explicit `model` on a request overrides everything. This table is the knob\n * that turns \"switch from Claude to Groq\" into a config edit.\n */\nexport type TierModelMap = Readonly<Partial<Record<TextTier, string>>>;\n\nexport const TEXT_TIERS: ReadonlyArray<TextTier> = [\"fast\", \"balanced\", \"powerful\"];\n\nexport function isTextTier(value: unknown): value is TextTier {\n return typeof value === \"string\" && (TEXT_TIERS as readonly string[]).includes(value);\n}\n\nexport function resolveModel(\n tiers: TierModelMap,\n tier: TextTier,\n providerId: string,\n): string {\n const model = tiers[tier] ?? tiers.balanced;\n if (!model) {\n throw new Error(\n `${providerId} has no model configured for tier \"${tier}\" — pass an explicit model or configure the tier map`,\n );\n }\n return model;\n}\n\nexport function mergeTierOverrides(\n defaults: TierModelMap,\n overrides?: TierModelMap,\n): TierModelMap {\n if (!overrides) return defaults;\n return { ...defaults, ...overrides };\n}\n","\nimport type { TierModelMap } from \"../../core/tiers\";\n\nexport const ANTHROPIC_MODELS = {\n OPUS_5_5: \"claude-opus-5-5\",\n SONNET_5_5: \"claude-sonnet-5-5\",\n HAIKU_5_5: \"claude-haiku-5-5\",\n} as const;\n\n/**\n * Neutral tier → Claude model. fast = Haiku for cheap high-volume turns,\n * balanced = Sonnet for everyday quality, powerful = Opus for the heavy\n * lifting. Override per instance via `models` in provider config.\n */\nexport const ANTHROPIC_TIERS: TierModelMap = {\n fast: ANTHROPIC_MODELS.HAIKU_5_5,\n balanced: ANTHROPIC_MODELS.SONNET_5_5,\n powerful: ANTHROPIC_MODELS.OPUS_5_5,\n};\n\n/**\n * Single bump point for the wire protocol version. Every request sends this\n * as the `anthropic-version` header; the shapes in anthropic.entities.ts are\n * pinned to it.\n */\nexport const ANTHROPIC_API_VERSION = \"2026-10-21\" as const;\n\n/** The Messages API requires max_tokens on every request. */\nexport const ANTHROPIC_DEFAULT_MAX_TOKENS = 16000;\n\nexport const ANTHROPIC_BASE_URL = \"https://api.anthropic.com\" as const;\nexport const ANTHROPIC_MESSAGES_PATH = \"/v1/messages\" as const;\nexport const ANTHROPIC_MODELS_PATH = \"/v1/models\" as const;\n\nexport const ANTHROPIC_TIMEOUTS = {\n DEFAULT: 60000,\n STREAMING: 120000,\n} as const;\n\nexport const ANTHROPIC_HEADERS = {\n CONTENT_TYPE: \"Content-Type\",\n APPLICATION_JSON: \"application/json\",\n API_KEY: \"x-api-key\",\n VERSION: \"anthropic-version\",\n} as const;\n\n/**\n * Default reasoning effort per model family. Opus and Haiku default to\n * medium; Sonnet benefits from high. Requests can override via\n * `output_config.effort` — the builder applies these defaults only when the\n * request says nothing.\n */\nexport const ANTHROPIC_DEFAULT_EFFORT = {\n [ANTHROPIC_MODELS.OPUS_5_5]: \"medium\",\n [ANTHROPIC_MODELS.SONNET_5_5]: \"high\",\n [ANTHROPIC_MODELS.HAIKU_5_5]: \"medium\",\n} as const;\n\nexport type AnthropicEffort = \"low\" | \"medium\" | \"high\";\n","\nimport type {\n AnthropicErrorResponse,\n AnthropicMessagesRequest,\n AnthropicMessagesResponse,\n AnthropicProviderConfig,\n} from \"./anthropic.entities\";\nimport { AIError, type AIErrorMetadata, AIErrorType } from \"../../core/errors\";\nimport { classifyHttpStatus, extractErrorMessageFromResponse } from \"../../core/errors\";\nimport {\n ANTHROPIC_BASE_URL,\n ANTHROPIC_HEADERS,\n ANTHROPIC_MESSAGES_PATH,\n ANTHROPIC_MODELS_PATH,\n ANTHROPIC_API_VERSION,\n ANTHROPIC_TIMEOUTS,\n} from \"./anthropic.constants\";\n\nexport interface StreamRequestOptions {\n readonly signal?: AbortSignal;\n}\n\n/**\n * Raw HTTP transport for the Anthropic Messages API (anthropic-version\n * 2026-10-21). Auth is `x-api-key` — NOT a Bearer header. All failures leave\n * here as core AIError with the neutral taxonomy (401→INVALID_API_KEY,\n * 429→RATE_LIMIT, ≥500→SERVER, network TypeError→NETWORK, abort→ABORT).\n */\nexport class AnthropicHttpTransport {\n constructor(private readonly config: AnthropicProviderConfig) {}\n\n async postMessages(\n request: AnthropicMessagesRequest,\n options: StreamRequestOptions = {},\n ): Promise<AnthropicMessagesResponse> {\n const url = `${this.baseUrl()}${ANTHROPIC_MESSAGES_PATH}`;\n const timeout = this.config.timeoutMs ?? ANTHROPIC_TIMEOUTS.DEFAULT;\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeout);\n const onExternalAbort = (): void => controller.abort();\n options.signal?.addEventListener(\"abort\", onExternalAbort);\n\n try {\n const response = await fetch(url, {\n method: \"POST\",\n headers: this.buildHeaders(),\n body: JSON.stringify({ ...request, stream: false }),\n signal: controller.signal,\n });\n\n if (!response.ok) await this.throwFromErrorResponse(response);\n\n return (await response.json()) as AnthropicMessagesResponse;\n } catch (error) {\n throw this.normalizeError(error);\n } finally {\n clearTimeout(timeoutId);\n options.signal?.removeEventListener(\"abort\", onExternalAbort);\n }\n }\n\n async streamMessages(\n request: AnthropicMessagesRequest,\n options: StreamRequestOptions = {},\n ): Promise<ReadableStream<Uint8Array>> {\n const url = `${this.baseUrl()}${ANTHROPIC_MESSAGES_PATH}`;\n const timeout = this.config.timeoutMs ?? ANTHROPIC_TIMEOUTS.STREAMING;\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeout);\n const onExternalAbort = (): void => controller.abort();\n options.signal?.addEventListener(\"abort\", onExternalAbort);\n\n try {\n const response = await fetch(url, {\n method: \"POST\",\n headers: this.buildHeaders(),\n body: JSON.stringify({ ...request, stream: true }),\n signal: controller.signal,\n });\n\n if (!response.ok) await this.throwFromErrorResponse(response);\n\n if (!response.body) {\n throw new AIError(AIErrorType.NETWORK_ERROR, \"Response body is null\");\n }\n\n return response.body;\n } catch (error) {\n options.signal?.removeEventListener(\"abort\", onExternalAbort);\n throw this.normalizeError(error);\n } finally {\n clearTimeout(timeoutId);\n }\n }\n\n async listModels(): Promise<Response> {\n const url = `${this.baseUrl()}${ANTHROPIC_MODELS_PATH}`;\n return fetch(url, {\n method: \"GET\",\n headers: this.buildHeaders(),\n });\n }\n\n private baseUrl(): string {\n return this.config.baseUrl ?? ANTHROPIC_BASE_URL;\n }\n\n private buildHeaders(): HeadersInit {\n return {\n [ANTHROPIC_HEADERS.CONTENT_TYPE]: ANTHROPIC_HEADERS.APPLICATION_JSON,\n [ANTHROPIC_HEADERS.API_KEY]: this.config.apiKey,\n [ANTHROPIC_HEADERS.VERSION]: ANTHROPIC_API_VERSION,\n };\n }\n\n private async throwFromErrorResponse(response: Response): Promise<never> {\n const errorMessage = await extractErrorMessageFromResponse(response);\n const metadata: AIErrorMetadata = {\n status: response.status,\n url: response.url,\n };\n throw new AIError(\n classifyHttpStatus(response.status),\n errorMessage,\n undefined,\n metadata,\n );\n }\n\n private normalizeError(error: unknown): AIError {\n if (error instanceof AIError) return error;\n\n if (error instanceof Error) {\n if (error.name === \"AbortError\") {\n return new AIError(\n AIErrorType.ABORT_ERROR,\n \"Request was aborted by the client\",\n error,\n );\n }\n if (error.name === \"TypeError\" && error.message.toLowerCase().includes(\"network\")) {\n return new AIError(\n AIErrorType.NETWORK_ERROR,\n \"Network error: Unable to connect to the AI service\",\n error,\n );\n }\n }\n\n return new AIError(\n AIErrorType.UNKNOWN_ERROR,\n error instanceof Error ? error.message : \"Unknown error occurred\",\n error instanceof Error ? error : undefined,\n );\n }\n}\n\n/** Shape guard for tests and error extraction. */\nexport type { AnthropicErrorResponse };\n","\nimport type { TextRequest } from \"../../core/types\";\nimport { ANTHROPIC_DEFAULT_EFFORT, ANTHROPIC_DEFAULT_MAX_TOKENS } from \"./anthropic.constants\";\nimport type {\n AnthropicEffort,\n} from \"./anthropic.constants\";\nimport type {\n AnthropicMessage,\n AnthropicMessagesRequest,\n} from \"./anthropic.entities\";\n\n/**\n * Builds Messages API requests from neutral TextRequests.\n *\n * Wire rules enforced here (anthropic-version 2026-10-21):\n * - `max_tokens` is always set — the API rejects requests without it.\n * - temperature/top_p are NEVER emitted. This API version rejects them with\n * a 400 even when copied straight from the request; they stay hints on\n * TextRequest for providers that still honor sampling.\n * - `systemPrompt` maps to the top-level `system` slot, not an in-band message.\n * - `thinking` is omitted — adaptive thinking is the API's default.\n * - `output_config.effort` defaults per model (opus/haiku medium, sonnet high)\n * unless the caller pinned one on provider config.\n */\nexport class AnthropicRequestBuilder {\n private readonly model: string;\n private messages: AnthropicMessage[] = [];\n private systemPrompt: string | undefined;\n private maxTokens: number = ANTHROPIC_DEFAULT_MAX_TOKENS;\n private effort: AnthropicEffort | undefined;\n private stopSequences: string[] | undefined;\n private streamEnabled = false;\n\n constructor(model: string) {\n this.model = model;\n }\n\n static for(model: string): AnthropicRequestBuilder {\n return new AnthropicRequestBuilder(model);\n }\n\n withRequest(request: TextRequest): this {\n this.messages = toAnthropicMessages(request.messages);\n this.systemPrompt = request.systemPrompt;\n if (request.maxTokens !== undefined) this.maxTokens = request.maxTokens;\n if (request.stopSequences !== undefined && request.stopSequences.length > 0) {\n this.stopSequences = [...request.stopSequences];\n }\n return this;\n }\n\n withEffort(effort: AnthropicEffort | undefined): this {\n this.effort = effort;\n return this;\n }\n\n withStream(stream: boolean): this {\n this.streamEnabled = stream;\n return this;\n }\n\n withSystemPromptOverride(systemPrompt: string | undefined): this {\n this.systemPrompt = systemPrompt;\n return this;\n }\n\n withMessagesOverride(messages: AnthropicMessage[]): this {\n this.messages = messages;\n return this;\n }\n\n build(): AnthropicMessagesRequest {\n const request: {\n model: string;\n messages: AnthropicMessage[];\n max_tokens: number;\n system?: string;\n output_config?: { effort: AnthropicEffort };\n stop_sequences?: string[];\n stream?: boolean;\n } = {\n model: this.model,\n messages: this.messages,\n max_tokens: this.maxTokens,\n output_config: {\n effort: this.effort ?? defaultEffortForModel(this.model),\n },\n };\n\n if (this.systemPrompt !== undefined && this.systemPrompt.length > 0) {\n request.system = this.systemPrompt;\n }\n if (this.stopSequences !== undefined) {\n request.stop_sequences = this.stopSequences;\n }\n if (this.streamEnabled) {\n request.stream = true;\n }\n\n return request as AnthropicMessagesRequest;\n }\n}\n\n/**\n * Maps neutral messages to the wire format. System messages have no in-band\n * slot on this API — they are folded into the top-level system prompt, which\n * the caller sets separately.\n */\nexport function toAnthropicMessages(\n messages: ReadonlyArray<{ role: \"system\" | \"user\" | \"assistant\"; content: string }>,\n): AnthropicMessage[] {\n return messages\n .filter((message) => message.role !== \"system\" && message.content.length > 0)\n .map((message) => ({\n role: message.role as AnthropicMessageRole,\n content: message.content,\n }));\n}\n\ntype AnthropicMessageRole = \"user\" | \"assistant\";\n\nexport function defaultEffortForModel(model: string): AnthropicEffort {\n return ANTHROPIC_DEFAULT_EFFORT[model as keyof typeof ANTHROPIC_DEFAULT_EFFORT] ?? \"medium\";\n}\n\n/** Exported for the builder's max_tokens guarantee in tests. */\nexport const BUILDER_DEFAULT_MAX_TOKENS = ANTHROPIC_DEFAULT_MAX_TOKENS;\n","\nimport type { FinishReason, StreamCallbacks } from \"../../core/types\";\nimport { AIError, AIErrorType } from \"../../core/errors\";\nimport { extractSseDataPayload, isSseDataLine } from \"../../core/parsers\";\nimport type {\n AnthropicStopReason,\n AnthropicStreamEvent,\n} from \"./anthropic.entities\";\n\nexport function mapAnthropicStopReason(\n reason: AnthropicStopReason | null | undefined,\n): FinishReason | undefined {\n if (reason === \"end_turn\") return \"stop\";\n if (reason === \"stop_sequence\") return \"stop\";\n if (reason === \"max_tokens\") return \"length\";\n if (reason === \"refusal\") return \"refusal\";\n return undefined;\n}\n\nexport interface AnthropicStreamOutcome {\n readonly text: string;\n readonly model: string | null;\n readonly inputTokens: number | undefined;\n readonly outputTokens: number | undefined;\n readonly finishReason: FinishReason | undefined;\n}\n\n/**\n * Line-buffered SSE consumer for Anthropic stream events. Only `data:` lines\n * carry payloads (each JSON payload self-describes via `type`); `event:`\n * lines are ignored as decoration. Harvests the model from message_start,\n * output tokens + stop reason from message_delta, and input tokens from the\n * message_start usage block, so the final GenerationResult matches the\n * non-streaming shape.\n */\nexport async function consumeAnthropicStream(\n stream: ReadableStream<Uint8Array>,\n callbacks: Pick<StreamCallbacks, \"onChunk\">,\n): Promise<AnthropicStreamOutcome> {\n const reader = stream.getReader();\n const decoder = new TextDecoder();\n const chunks: string[] = [];\n let buffer = \"\";\n let model: string | null = null;\n let inputTokens: number | undefined;\n let outputTokens: number | undefined;\n let finishReason: FinishReason | undefined;\n\n const consumeLine = (rawLine: string): void => {\n const line = rawLine.endsWith(\"\\r\") ? rawLine.slice(0, -1) : rawLine;\n const trimmed = line.trim();\n if (trimmed.length === 0 || !isSseDataLine(trimmed)) return;\n const payload = extractSseDataPayload(trimmed);\n\n let event: AnthropicStreamEvent;\n try {\n event = JSON.parse(payload) as AnthropicStreamEvent;\n } catch {\n return;\n }\n\n switch (event.type) {\n case \"message_start\":\n model = event.message.model;\n if (event.message.usage?.input_tokens !== undefined) {\n inputTokens = event.message.usage.input_tokens;\n }\n break;\n case \"content_block_delta\":\n if (typeof event.delta.text === \"string\" && event.delta.text.length > 0) {\n chunks.push(event.delta.text);\n callbacks.onChunk?.(event.delta.text);\n }\n break;\n case \"message_delta\":\n if (event.delta?.stop_reason !== undefined && event.delta.stop_reason !== null) {\n finishReason = mapAnthropicStopReason(event.delta.stop_reason);\n }\n if (event.usage?.output_tokens !== undefined) {\n outputTokens = event.usage.output_tokens;\n }\n break;\n case \"message_stop\":\n break;\n case \"error\": {\n const errType = event.error.type;\n const mappedType =\n errType === \"rate_limit_error\"\n ? AIErrorType.RATE_LIMIT_ERROR\n : errType === \"authentication_error\"\n ? AIErrorType.INVALID_API_KEY\n : errType === \"invalid_request_error\"\n ? AIErrorType.CLIENT_ERROR\n : AIErrorType.SERVER_ERROR;\n throw new AIError(\n mappedType,\n event.error.message || \"Anthropic stream failed mid-flight\",\n );\n }\n default:\n break;\n }\n };\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop() ?? \"\";\n for (const line of lines) consumeLine(line);\n }\n\n buffer += decoder.decode();\n if (buffer.length > 0) consumeLine(buffer);\n } catch (error) {\n if (error instanceof AIError) throw error;\n throw new AIError(\n AIErrorType.NETWORK_ERROR,\n \"Stream was interrupted\",\n error instanceof Error ? error : undefined,\n );\n } finally {\n reader.releaseLock();\n }\n\n return {\n text: chunks.join(\"\"),\n model,\n inputTokens,\n outputTokens,\n finishReason,\n };\n}\n\n/** Fixture helper for tests: builds the SSE wire framing for one event. */\nexport function sseFrame(event: unknown): string {\n return `data: ${JSON.stringify(event)}\\n\\n`;\n}\n","\nimport type {\n GenerationResult,\n ProviderHealth,\n StreamCallbacks,\n StructuredGeneration,\n StructuredTextRequest,\n TextRequest,\n TextTier,\n} from \"../../core/types\";\nimport { AIError, AIErrorType } from \"../../core/errors\";\nimport { JsonResponseParser, StructuredPromptBuilder } from \"../../core/parsers\";\nimport { mergeTierOverrides, resolveModel, type TierModelMap } from \"../../core/tiers\";\nimport type { ITextProvider } from \"../base/provider.types\";\nimport { AnthropicHttpTransport } from \"./anthropic-http.transport\";\nimport { AnthropicRequestBuilder } from \"./anthropic-request.builder\";\nimport { consumeAnthropicStream, mapAnthropicStopReason } from \"./anthropic-stream.parser\";\nimport { ANTHROPIC_TIERS } from \"./anthropic.constants\";\nimport type {\n AnthropicContentBlock,\n AnthropicMessagesResponse,\n AnthropicProviderConfig,\n AnthropicUsage,\n} from \"./anthropic.entities\";\n\n/**\n * Graceful stand-in when the model refuses: surfaced as a flagged\n * GenerationResult rather than an exception, so chat UIs can render it.\n */\nconst REFUSAL_FALLBACK_TEXT =\n \"I'm not able to help with that request. Could you rephrase or ask something else?\";\n\n/**\n * Anthropic provider over raw fetch — no SDK dependency, Workers-safe.\n * Implements the neutral ITextProvider surface with tier-based model\n * resolution and full token-usage propagation.\n */\nexport class AnthropicProvider implements ITextProvider {\n readonly id = \"anthropic\";\n readonly name = \"Anthropic\";\n readonly capabilities = [\"text\"] as const;\n\n private readonly transport: AnthropicHttpTransport;\n private readonly tiers: TierModelMap;\n private readonly jsonParser = new JsonResponseParser();\n\n constructor(readonly config: AnthropicProviderConfig) {\n this.transport = new AnthropicHttpTransport(config);\n this.tiers = mergeTierOverrides(ANTHROPIC_TIERS, config.models);\n }\n\n resolveModel(tier: TextTier): string {\n return resolveModel(this.tiers, tier, this.id);\n }\n\n async healthCheck(): Promise<ProviderHealth> {\n if (!this.config.apiKey) return \"unavailable\";\n try {\n const response = await this.transport.listModels();\n if (response.ok) return \"healthy\";\n if (response.status === 401 || response.status === 403) return \"unavailable\";\n return \"degraded\";\n } catch {\n return \"unavailable\";\n }\n }\n\n async estimateCost(): Promise<number> {\n return 0;\n }\n\n async generate(request: TextRequest): Promise<GenerationResult> {\n const model = request.model ?? this.resolveModel(request.tier ?? \"balanced\");\n const wireRequest = new AnthropicRequestBuilder(model)\n .withRequest(request)\n .withEffort(this.config.effort)\n .build();\n\n const response = await this.transport.postMessages(wireRequest, {\n signal: request.signal,\n });\n\n return this.toGenerationResult(response, model);\n }\n\n async generateStructured<T>(\n request: StructuredTextRequest,\n ): Promise<StructuredGeneration<T>> {\n const model = request.model ?? this.resolveModel(request.tier ?? \"balanced\");\n\n const messages = [...request.messages];\n const lastUserIndex = findLastIndex(messages, (m) => m.role === \"user\");\n if (lastUserIndex === -1) {\n throw new AIError(\n AIErrorType.UNKNOWN_ERROR,\n \"generateStructured requires at least one user message\",\n );\n }\n\n const structuredPrompt = new StructuredPromptBuilder(\n messages[lastUserIndex].content,\n )\n .withSchema(request.schema)\n .build();\n messages[lastUserIndex] = { role: \"user\", content: structuredPrompt };\n\n const wireRequest = new AnthropicRequestBuilder(model)\n .withRequest({ ...request, messages })\n .withEffort(this.config.effort)\n .build();\n\n const response = await this.transport.postMessages(wireRequest, {\n signal: request.signal,\n });\n\n const result = this.toGenerationResult(response, model);\n return { value: this.jsonParser.parse<T>(result.text), result };\n }\n\n async stream(\n request: TextRequest,\n callbacks: StreamCallbacks,\n ): Promise<GenerationResult> {\n const model = request.model ?? this.resolveModel(request.tier ?? \"balanced\");\n const wireRequest = new AnthropicRequestBuilder(model)\n .withRequest(request)\n .withEffort(this.config.effort)\n .withStream(true)\n .build();\n\n const streamBody = await this.transport.streamMessages(wireRequest, {\n signal: request.signal,\n });\n\n try {\n const outcome = await consumeAnthropicStream(streamBody, callbacks);\n const text =\n outcome.text.length > 0 ? outcome.text : refusalTextFor(outcome.finishReason);\n const result: GenerationResult = {\n text,\n usage: {\n inputTokens: outcome.inputTokens ?? 0,\n outputTokens: outcome.outputTokens ?? 0,\n },\n model: outcome.model ?? model,\n providerId: this.id,\n finishReason: outcome.finishReason,\n };\n callbacks.onComplete?.(result);\n return result;\n } catch (error) {\n callbacks.onError?.(error instanceof Error ? error : new Error(String(error)));\n throw error;\n }\n }\n\n private toGenerationResult(\n response: AnthropicMessagesResponse,\n fallbackModel: string,\n ): GenerationResult {\n const text = extractText(response.content);\n const finishReason = mapAnthropicStopReason(response.stop_reason);\n\n if (text.length === 0) {\n // A refusal arrives as an empty completion with stop_reason\n // 'refusal' — return a flagged fallback line instead of throwing,\n // per API guidance. Any other empty completion is a server fault.\n if (finishReason === \"refusal\") {\n return {\n text: REFUSAL_FALLBACK_TEXT,\n usage: mapAnthropicUsage(response.usage),\n model: response.model || fallbackModel,\n providerId: this.id,\n finishReason,\n };\n }\n throw new AIError(\n AIErrorType.SERVER_ERROR,\n \"No content generated from Anthropic API\",\n undefined,\n { model: response.model || fallbackModel, stopReason: response.stop_reason ?? undefined },\n );\n }\n\n return {\n text,\n usage: mapAnthropicUsage(response.usage),\n model: response.model || fallbackModel,\n providerId: this.id,\n finishReason,\n };\n }\n}\n\nfunction extractText(blocks: ReadonlyArray<AnthropicContentBlock>): string {\n return blocks\n .filter((block) => block.type === \"text\")\n .map((block) => block.text)\n .join(\"\");\n}\n\nfunction refusalTextFor(finishReason: string | undefined): string {\n return finishReason === \"refusal\" ? REFUSAL_FALLBACK_TEXT : \"\";\n}\n\nfunction mapAnthropicUsage(usage: AnthropicUsage | undefined) {\n if (!usage) return undefined;\n return {\n inputTokens: usage.input_tokens,\n outputTokens: usage.output_tokens,\n };\n}\n\nfunction findLastIndex<T>(items: ReadonlyArray<T>, predicate: (item: T) => boolean): number {\n for (let i = items.length - 1; i >= 0; i--) {\n if (predicate(items[i])) return i;\n }\n return -1;\n}\n","\nexport interface AccessTimestamped {\n readonly lastAccess: number;\n}\n\nexport function selectLeastRecentlyUsedKey<K, V extends AccessTimestamped>(\n entries: ReadonlyMap<K, V>,\n): K | null {\n let oldestKey: K | null = null;\n let oldestAccess = Number.POSITIVE_INFINITY;\n\n for (const [key, entry] of entries.entries()) {\n if (entry.lastAccess < oldestAccess) {\n oldestAccess = entry.lastAccess;\n oldestKey = key;\n }\n }\n\n return oldestKey;\n}\n","\nexport interface AccessCounted {\n readonly accessCount: number;\n}\n\nexport function calculateCacheHitRate(\n entries: ReadonlyArray<AccessCounted>,\n): number {\n if (entries.length === 0) return 0;\n const totalAccess = entries.reduce((sum, e) => sum + e.accessCount, 0);\n return totalAccess / entries.length;\n}\n","\nexport function buildCacheKey(params: Readonly<Record<string, unknown>>): string {\n const sortedKeys = Object.keys(params).sort();\n const sortedParams: Record<string, unknown> = {};\n for (const key of sortedKeys) {\n sortedParams[key] = params[key];\n }\n return JSON.stringify(sortedParams);\n}\n","\nimport { selectLeastRecentlyUsedKey } from \"../calculations/lru-key-selector\";\nimport { calculateCacheHitRate } from \"../calculations/cache-hit-rate\";\nimport { buildCacheKey } from \"./cache-key-builder\";\n\ninterface CacheEntry<T> {\n readonly value: T;\n readonly timestamp: number;\n accessCount: number;\n lastAccess: number;\n}\n\nexport interface CacheOptions {\n readonly maxSize?: number;\n readonly ttl?: number;\n}\n\nconst DEFAULT_CACHE_MAX_SIZE = 100;\nconst DEFAULT_CACHE_TTL_MS = 300_000;\n\nexport class CacheManager {\n private readonly cache = new Map<string, CacheEntry<unknown>>();\n private readonly maxSize: number;\n private readonly ttl: number;\n\n constructor(options: CacheOptions = {}) {\n this.maxSize = options.maxSize ?? DEFAULT_CACHE_MAX_SIZE;\n this.ttl = options.ttl ?? DEFAULT_CACHE_TTL_MS;\n }\n\n get<T>(key: string): T | null {\n const entry = this.cache.get(key);\n if (!entry) return null;\n if (this.isExpired(entry)) {\n this.cache.delete(key);\n return null;\n }\n entry.accessCount += 1;\n entry.lastAccess = Date.now();\n return entry.value as T;\n }\n\n set<T>(key: string, value: T): void {\n if (this.cache.size >= this.maxSize && !this.cache.has(key)) {\n const lruKey = selectLeastRecentlyUsedKey(this.cache);\n if (lruKey !== null) this.cache.delete(lruKey);\n }\n this.cache.set(key, {\n value,\n timestamp: Date.now(),\n accessCount: 1,\n lastAccess: Date.now(),\n });\n }\n\n has(key: string): boolean {\n const entry = this.cache.get(key);\n return entry !== undefined && !this.isExpired(entry);\n }\n\n delete(key: string): boolean {\n return this.cache.delete(key);\n }\n\n clear(): void {\n this.cache.clear();\n }\n\n generateKey(params: Readonly<Record<string, unknown>>): string {\n return buildCacheKey(params);\n }\n\n getStats(): CacheStats {\n const now = Date.now();\n const entries = Array.from(this.cache.entries()).map(([key, entry]) => ({\n key,\n accessCount: entry.accessCount,\n ageMs: now - entry.timestamp,\n }));\n const hitRate = calculateCacheHitRate(\n Array.from(this.cache.values()).map((e) => ({ accessCount: e.accessCount })),\n );\n return {\n size: this.cache.size,\n maxSize: this.maxSize,\n hitRate,\n entries,\n };\n }\n\n private isExpired(entry: CacheEntry<unknown>): boolean {\n return Date.now() - entry.timestamp > this.ttl;\n }\n}\n\nexport interface CacheStats {\n readonly size: number;\n readonly maxSize: number;\n readonly hitRate: number;\n readonly entries: ReadonlyArray<{\n readonly key: string;\n readonly accessCount: number;\n readonly ageMs: number;\n }>;\n}\n\nexport const cacheManager = new CacheManager();\n","\nexport interface ExponentialBackoffParams {\n readonly attempt: number;\n readonly initialDelay: number;\n readonly maxDelay: number;\n readonly backoffMultiplier: number;\n readonly jitterFactor: number;\n readonly random?: () => number;\n}\n\nexport function calculateExponentialBackoff(params: ExponentialBackoffParams): number {\n const {\n attempt,\n initialDelay,\n maxDelay,\n backoffMultiplier,\n jitterFactor,\n random = Math.random,\n } = params;\n\n const base = initialDelay * Math.pow(backoffMultiplier, Math.max(0, attempt - 1));\n const capped = Math.min(base, maxDelay);\n const jitterMultiplier = random() * 2 - 1;\n const jitter = capped * jitterFactor * jitterMultiplier;\n\n return Math.max(0, capped + jitter);\n}\n","\nexport const MESSAGE_ID_PREFIX = \"msg-\" as const;\nexport const CHAT_MESSAGE_ID_SUFFIX_LENGTH = 9;\nexport const CACHE_KEY_TYPE_COMPLETION = \"completion\" as const;\nexport const CACHE_KEY_TYPE_CHAT = \"chat\" as const;\nexport const CACHE_KEY_TYPE_RESPONSE = \"response\" as const;\nexport const SYSTEM_PROMPT_CACHE_PREFIX = \"system-prompt\" as const;\n\nexport const USER_ROLE = \"user\" as const;\nexport const ASSISTANT_ROLE = \"assistant\" as const;\nexport const SYSTEM_ROLE = \"system\" as const;\n\nexport const QUEUE_PRIORITY_USER_REQUEST = 10;\nexport const DEFAULT_RETRY_MAX_ATTEMPTS = 3;\nexport const DEFAULT_RETRY_INITIAL_DELAY_MS = 1000;\nexport const DEFAULT_RETRY_MAX_DELAY_MS = 10000;\nexport const DEFAULT_RETRY_BACKOFF_MULTIPLIER = 2;\nexport const DEFAULT_RETRY_JITTER_FACTOR = 0.1;\n","\nimport { AIError } from \"../errors/ai-error\";\nimport { calculateExponentialBackoff } from \"../calculations/exponential-backoff\";\nimport {\n isRetryableErrorType,\n DEFAULT_ERROR_CLASSIFICATION_RULE,\n} from \"../errors/error-classifier\";\nimport {\n DEFAULT_RETRY_MAX_ATTEMPTS,\n DEFAULT_RETRY_INITIAL_DELAY_MS,\n DEFAULT_RETRY_MAX_DELAY_MS,\n DEFAULT_RETRY_BACKOFF_MULTIPLIER,\n DEFAULT_RETRY_JITTER_FACTOR,\n} from \"../constants/identifier.constants\";\n\nexport interface RetryOptions {\n readonly maxAttempts?: number;\n readonly initialDelay?: number;\n readonly maxDelay?: number;\n readonly backoffMultiplier?: number;\n readonly jitterFactor?: number;\n readonly shouldRetry?: (error: Error) => boolean;\n}\n\nconst RETRYABLE_MESSAGE_KEYWORDS: ReadonlyArray<string> = [\n \"network\",\n \"timeout\",\n \"econnrefused\",\n \"enotfound\",\n \"etimedout\",\n];\n\nexport class RetryManager {\n private readonly defaults: Required<\n Pick<RetryOptions, \"maxAttempts\" | \"initialDelay\" | \"maxDelay\" | \"backoffMultiplier\" | \"jitterFactor\">\n >;\n\n constructor() {\n this.defaults = {\n maxAttempts: DEFAULT_RETRY_MAX_ATTEMPTS,\n initialDelay: DEFAULT_RETRY_INITIAL_DELAY_MS,\n maxDelay: DEFAULT_RETRY_MAX_DELAY_MS,\n backoffMultiplier: DEFAULT_RETRY_BACKOFF_MULTIPLIER,\n jitterFactor: DEFAULT_RETRY_JITTER_FACTOR,\n };\n }\n\n async execute<T>(fn: () => Promise<T>, options: RetryOptions = {}): Promise<T> {\n const maxAttempts = options.maxAttempts ?? this.defaults.maxAttempts;\n let lastError: Error | undefined;\n\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n try {\n return await fn();\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error));\n\n if (attempt >= maxAttempts || !this.shouldRetry(lastError, options)) {\n throw lastError;\n }\n\n const delay = calculateExponentialBackoff({\n attempt,\n initialDelay: options.initialDelay ?? this.defaults.initialDelay,\n maxDelay: options.maxDelay ?? this.defaults.maxDelay,\n backoffMultiplier: options.backoffMultiplier ?? this.defaults.backoffMultiplier,\n jitterFactor: options.jitterFactor ?? this.defaults.jitterFactor,\n });\n await this.delay(delay);\n }\n }\n\n throw lastError ?? new Error(\"Retry loop exited without result\");\n }\n\n private shouldRetry(error: Error, options: RetryOptions): boolean {\n if (options.shouldRetry) return options.shouldRetry(error);\n\n if (error instanceof AIError) {\n return isRetryableErrorType(error.type, DEFAULT_ERROR_CLASSIFICATION_RULE);\n }\n\n const lower = error.message.toLowerCase();\n return RETRYABLE_MESSAGE_KEYWORDS.some((kw) => lower.includes(kw));\n }\n\n private delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n}\n\nexport const retryManager = new RetryManager();\n\nexport async function withRetry<T>(fn: () => Promise<T>, options?: RetryOptions): Promise<T> {\n return retryManager.execute(fn, options);\n}\n","\ninterface QueuedRequest<T> {\n readonly id: string;\n readonly priority: number;\n readonly requestFn: () => Promise<T>;\n readonly resolve: (value: T) => void;\n readonly reject: (reason: unknown) => void;\n readonly timestamp: number;\n}\n\nexport interface QueueOptions {\n readonly maxConcurrent?: number;\n readonly defaultPriority?: number;\n readonly requestTimeout?: number;\n}\n\nconst DEFAULT_MAX_CONCURRENT = 3;\nconst DEFAULT_PRIORITY = 0;\nconst DEFAULT_REQUEST_TIMEOUT_MS = 30_000;\n\nexport class RequestQueue {\n private queue: QueuedRequest<unknown>[] = [];\n private readonly activeRequests = new Set<string>();\n private readonly maxConcurrent: number;\n private readonly defaultPriority: number;\n private readonly requestTimeout: number;\n private requestIdCounter = 0;\n\n constructor(options: QueueOptions = {}) {\n this.maxConcurrent = options.maxConcurrent ?? DEFAULT_MAX_CONCURRENT;\n this.defaultPriority = options.defaultPriority ?? DEFAULT_PRIORITY;\n this.requestTimeout = options.requestTimeout ?? DEFAULT_REQUEST_TIMEOUT_MS;\n }\n\n add<T>(requestFn: () => Promise<T>, priority?: number): Promise<T> {\n return new Promise((resolve, reject) => {\n const id = `req-${++this.requestIdCounter}`;\n const queuedRequest: QueuedRequest<T> = {\n id,\n priority: priority ?? this.defaultPriority,\n requestFn,\n resolve: resolve as (value: unknown) => void,\n reject,\n timestamp: Date.now(),\n };\n\n this.queue.push(queuedRequest as QueuedRequest<unknown>);\n this.sortQueue();\n this.process();\n });\n }\n\n cancelAll(): void {\n for (const request of this.queue) {\n request.reject(new Error(\"Request was cancelled\"));\n }\n this.queue = [];\n }\n\n private sortQueue(): void {\n this.queue.sort((a, b) => {\n if (a.priority !== b.priority) {\n return b.priority - a.priority;\n }\n return a.timestamp - b.timestamp;\n });\n }\n\n private process(): void {\n while (this.queue.length > 0 && this.activeRequests.size < this.maxConcurrent) {\n const request = this.queue.shift();\n if (!request) break;\n this.executeRequest(request);\n }\n }\n\n private executeRequest<T>(request: QueuedRequest<T>): void {\n this.activeRequests.add(request.id);\n\n const timeoutId = setTimeout(() => {\n this.activeRequests.delete(request.id);\n request.reject(new Error(`Request ${request.id} timed out`));\n this.process();\n }, this.requestTimeout);\n\n request.requestFn()\n .then((result) => {\n clearTimeout(timeoutId);\n request.resolve(result);\n })\n .catch((error: unknown) => {\n clearTimeout(timeoutId);\n request.reject(error);\n })\n .finally(() => {\n this.activeRequests.delete(request.id);\n this.process();\n });\n }\n}\n\nexport const requestQueue = new RequestQueue();\n","\ninterface PendingRequest<T> {\n readonly promise: Promise<T>;\n readonly timestamp: number;\n}\n\nconst DEFAULT_DEDUPE_TTL_MS = 30_000;\n\nexport class RequestDeduplicator {\n private readonly pendingRequests = new Map<string, PendingRequest<unknown>>();\n private readonly ttl: number;\n\n constructor(ttl: number = DEFAULT_DEDUPE_TTL_MS) {\n this.ttl = ttl;\n }\n\n execute<T>(key: string, requestFn: () => Promise<T>): Promise<T> {\n this.cleanup();\n\n const existing = this.pendingRequests.get(key);\n if (existing) {\n return existing.promise as Promise<T>;\n }\n\n const promise = requestFn();\n this.pendingRequests.set(key, {\n promise,\n timestamp: Date.now(),\n });\n\n // The cleanup chain must swallow its own rejection: callers handle the\n // original `promise`, and an unhandled `.finally` derivative would crash\n // hosts that treat unhandled rejections as fatal (Workers, vitest).\n promise\n .catch(() => undefined)\n .then(() => {\n this.pendingRequests.delete(key);\n });\n\n return promise;\n }\n\n cancelAll(): void {\n this.pendingRequests.clear();\n }\n\n private cleanup(): void {\n const now = Date.now();\n for (const [key, request] of this.pendingRequests.entries()) {\n if (now - request.timestamp > this.ttl) {\n this.pendingRequests.delete(key);\n }\n }\n }\n}\n\nexport const requestDeduplicator = new RequestDeduplicator();\n","\nexport interface ApiKeyValidationRule {\n readonly minLength: number;\n}\n\nexport const DEFAULT_API_KEY_RULE: ApiKeyValidationRule = {\n minLength: 10,\n};\n\nexport function isValidApiKey(\n apiKey: string | undefined | null,\n rule: ApiKeyValidationRule = DEFAULT_API_KEY_RULE,\n): apiKey is string {\n if (!apiKey) return false;\n return apiKey.trim().length >= rule.minLength;\n}\n\nexport function validateApiKey(\n apiKey: string | undefined | null,\n rule: ApiKeyValidationRule = DEFAULT_API_KEY_RULE,\n): { valid: boolean; reason?: string } {\n if (!apiKey) {\n return { valid: false, reason: \"API key is required\" };\n }\n const trimmed = apiKey.trim();\n if (trimmed.length === 0) {\n return { valid: false, reason: \"API key cannot be empty\" };\n }\n if (trimmed.length < rule.minLength) {\n return {\n valid: false,\n reason: `API key must be at least ${rule.minLength} characters`,\n };\n }\n return { valid: true };\n}\n","\nimport type { TierModelMap } from \"../../core/tiers\";\n\nexport const GROQ_MODELS = {\n LLAMA_3_1_8B_INSTANT: \"llama-3.1-8b-instant\",\n LLAMA_3_3_70B_VERSATILE: \"llama-3.3-70b-versatile\",\n LLAMA_3_1_70B_VERSATILE: \"llama-3.1-70b-versatile\",\n GPT_OSS_20B: \"openai/gpt-oss-20b\",\n GPT_OSS_120B: \"openai/gpt-oss-120b\",\n MIXTRAL_8X7B: \"mixtral-8x7b-32768\",\n GEMMA_2_9B: \"gemma2-9b-it\",\n LLAMA_4_SCOUT_17B: \"meta-llama/llama-4-scout-17b-16e-instruct\",\n KIMI_K2_INSTRUCT: \"moonshotai/kimi-k2-instruct\",\n QWEN3_32B: \"qwen/qwen3-32b\",\n} as const;\n\n/**\n * Neutral tier → Groq model. fast = 8b instant for cheap high-volume turns,\n * balanced = 70b versatile for everyday quality, powerful = gpt-oss-120b for\n * the heavy lifting. Override per instance via `models` in provider config.\n */\nexport const GROQ_TIERS: TierModelMap = {\n fast: GROQ_MODELS.LLAMA_3_1_8B_INSTANT,\n balanced: GROQ_MODELS.LLAMA_3_3_70B_VERSATILE,\n powerful: GROQ_MODELS.GPT_OSS_120B,\n};\n\nexport const DEFAULT_GENERATION_CONFIG = {\n temperature: 0.7,\n maxTokens: 1024,\n topP: 1.0,\n} as const;\n\nexport const DEFAULT_MODELS = {\n TEXT: GROQ_MODELS.LLAMA_3_1_8B_INSTANT,\n FAST: GROQ_MODELS.LLAMA_3_1_8B_INSTANT,\n EXPERIMENTAL: GROQ_MODELS.GPT_OSS_20B,\n} as const;\n\nexport const GROQ_BASE_URL = \"https://api.groq.com/openai/v1\" as const;\nexport const DEFAULT_BASE_URL = GROQ_BASE_URL;\n\nexport const CHAT_COMPLETIONS_PATH = \"/chat/completions\" as const;\nexport const API_ENDPOINTS = {\n CHAT: CHAT_COMPLETIONS_PATH,\n} as const;\n\nexport const GROQ_TIMEOUTS = {\n DEFAULT: 30000,\n STREAMING: 60000,\n} as const;\nexport const TIMEOUTS = GROQ_TIMEOUTS;\n\nexport const HTTP_HEADERS = {\n CONTENT_TYPE: \"Content-Type\",\n APPLICATION_JSON: \"application/json\",\n AUTHORIZATION: \"Authorization\",\n BEARER_PREFIX: \"Bearer \",\n} as const;\n","\nimport type {\n GroqChatRequest,\n GroqGenerationConfig,\n GroqMessage,\n GroqReasoningEffort,\n} from \"./groq.entities\";\nimport { DEFAULT_GENERATION_CONFIG } from \"./groq.constants\";\n\ninterface MutableRequest {\n model: string;\n messages: GroqMessage[];\n temperature?: number;\n max_tokens?: number;\n top_p?: number;\n n?: number;\n stop?: string[];\n frequency_penalty?: number;\n presence_penalty?: number;\n reasoning_effort?: GroqReasoningEffort;\n stream?: boolean;\n}\n\nexport class GroqChatRequestBuilder {\n private readonly model: string;\n private messages: GroqMessage[] = [];\n private generationConfig: GroqGenerationConfig = {};\n private streamEnabled = false;\n private jsonResponse = false;\n\n constructor(model: string) {\n this.model = model;\n }\n\n static for(model: string): GroqChatRequestBuilder {\n return new GroqChatRequestBuilder(model);\n }\n\n withMessages(messages: ReadonlyArray<GroqMessage>): this {\n this.messages = [...messages];\n return this;\n }\n\n withConfig(config: GroqGenerationConfig | undefined): this {\n this.generationConfig = config ? { ...config } : {};\n return this;\n }\n\n withStream(stream: boolean): this {\n this.streamEnabled = stream;\n return this;\n }\n\n withJsonResponse(enabled: boolean): this {\n this.jsonResponse = enabled;\n return this;\n }\n\n build(): GroqChatRequest {\n const cfg = this.generationConfig;\n const request: MutableRequest = {\n model: this.model,\n messages: this.messages,\n temperature: cfg.temperature ?? DEFAULT_GENERATION_CONFIG.temperature,\n max_tokens: cfg.maxTokens ?? DEFAULT_GENERATION_CONFIG.maxTokens,\n top_p: cfg.topP ?? DEFAULT_GENERATION_CONFIG.topP,\n };\n\n if (cfg.n !== undefined) request.n = cfg.n;\n if (cfg.stop !== undefined) request.stop = cfg.stop;\n if (cfg.frequencyPenalty !== undefined) request.frequency_penalty = cfg.frequencyPenalty;\n if (cfg.presencePenalty !== undefined) request.presence_penalty = cfg.presencePenalty;\n if (cfg.reasoningEffort !== undefined) request.reasoning_effort = cfg.reasoningEffort;\n if (this.jsonResponse) {\n (request as { response_format?: { type: string } }).response_format = { type: \"json_object\" };\n }\n if (this.streamEnabled) request.stream = true;\n\n return request as GroqChatRequest;\n }\n}\n","import type { GroqProviderConfig } from \"./groq.entities\";\nimport { GroqError, GroqErrorType } from \"../../core/errors/groq-error\";\nimport { DEFAULT_BASE_URL, TIMEOUTS } from \"./groq.constants\";\nimport { validateApiKey } from \"../../core/utils/api-key-validator\";\n\nexport class GroqConfigStore {\n private config: GroqProviderConfig | null = null;\n\n initialize(config: GroqProviderConfig): GroqProviderConfig {\n const validation = validateApiKey(config.apiKey, { minLength: 1 });\n if (!validation.valid) {\n throw new GroqError(GroqErrorType.INVALID_API_KEY, validation.reason ?? \"Invalid API key\");\n }\n\n const normalized: GroqProviderConfig = {\n apiKey: config.apiKey.trim(),\n baseUrl: config.baseUrl ?? DEFAULT_BASE_URL,\n timeoutMs: config.timeoutMs ?? TIMEOUTS.DEFAULT,\n ...(config.models !== undefined ? { models: config.models } : {}),\n ...(config.textModel !== undefined ? { textModel: config.textModel } : {}),\n };\n\n this.config = normalized;\n return normalized;\n }\n\n get(): GroqProviderConfig {\n if (!this.config) {\n throw new GroqError(\n GroqErrorType.MISSING_CONFIG,\n \"Client not initialized. Call configureProvider first.\",\n );\n }\n return this.config;\n }\n\n getOrNull(): GroqProviderConfig | null {\n return this.config;\n }\n\n isInitialized(): boolean {\n return this.config !== null;\n }\n\n setApiKey(apiKey: string): void {\n const current = this.get();\n const validation = validateApiKey(apiKey, { minLength: 1 });\n if (!validation.valid) {\n throw new GroqError(GroqErrorType.INVALID_API_KEY, validation.reason ?? \"Invalid API key\");\n }\n this.config = { ...current, apiKey: apiKey.trim() };\n }\n\n reset(): void {\n this.config = null;\n }\n}\n","\nimport type { GroqChatRequest, GroqChatResponse, StreamRequestOptions } from \"./groq.entities\";\nimport { AIError, type AIErrorMetadata } from \"../../core/errors\";\nimport { AIErrorType } from \"../../core/errors\";\nimport { classifyHttpStatus, extractErrorMessageFromResponse } from \"../../core/errors\";\nimport {\n CHAT_COMPLETIONS_PATH,\n GROQ_BASE_URL,\n GROQ_TIMEOUTS,\n HTTP_HEADERS,\n} from \"./groq.constants\";\nimport type { GroqProviderConfig } from \"./groq.entities\";\nimport type { GroqConfigStore } from \"./groq-config-store\";\n\n/**\n * Raw HTTP transport for Groq's OpenAI-compatible chat/completions endpoint.\n * All failures leave here as core AIError with the right AIErrorType —\n * callers up the stack only ever see the neutral taxonomy.\n */\nexport class GroqHttpTransport {\n private readonly pendingAbortControllers = new Set<AbortController>();\n\n constructor(private readonly configSource: GroqProviderConfig | GroqConfigStore) {}\n\n private getConfig(): GroqProviderConfig {\n if (\"get\" in this.configSource && typeof this.configSource.get === \"function\") {\n return this.configSource.get();\n }\n return this.configSource as GroqProviderConfig;\n }\n\n cancelPendingRequests(): void {\n for (const controller of this.pendingAbortControllers) {\n controller.abort();\n }\n this.pendingAbortControllers.clear();\n }\n\n async postChatCompletion(request: GroqChatRequest): Promise<GroqChatResponse> {\n return this.request<GroqChatResponse>(CHAT_COMPLETIONS_PATH, {\n ...request,\n stream: false,\n });\n }\n\n async streamChatCompletion(\n request: GroqChatRequest,\n options: StreamRequestOptions = {},\n ): Promise<ReadableStream<Uint8Array>> {\n const url = `${this.baseUrl()}${CHAT_COMPLETIONS_PATH}`;\n const timeout = this.getConfig().timeoutMs ?? GROQ_TIMEOUTS.STREAMING;\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeout);\n const onExternalAbort = (): void => controller.abort();\n options.signal?.addEventListener(\"abort\", onExternalAbort);\n this.pendingAbortControllers.add(controller);\n\n try {\n const response = await fetch(url, {\n method: \"POST\",\n headers: this.buildHeaders(),\n body: JSON.stringify({ ...request, stream: true }),\n signal: controller.signal,\n });\n\n if (!response.ok) await this.throwFromErrorResponse(response);\n\n if (!response.body) {\n throw new AIError(AIErrorType.NETWORK_ERROR, \"Response body is null\");\n }\n\n return response.body;\n } catch (error) {\n options.signal?.removeEventListener(\"abort\", onExternalAbort);\n throw this.normalizeError(error);\n } finally {\n clearTimeout(timeoutId);\n this.pendingAbortControllers.delete(controller);\n }\n }\n\n private baseUrl(): string {\n return this.getConfig().baseUrl ?? GROQ_BASE_URL;\n }\n\n private async request<T>(endpoint: string, body: unknown): Promise<T> {\n const url = `${this.baseUrl()}${endpoint}`;\n const timeout = this.getConfig().timeoutMs ?? GROQ_TIMEOUTS.DEFAULT;\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeout);\n this.pendingAbortControllers.add(controller);\n\n try {\n const response = await fetch(url, {\n method: \"POST\",\n headers: this.buildHeaders(),\n body: JSON.stringify(body),\n signal: controller.signal,\n });\n\n if (!response.ok) await this.throwFromErrorResponse(response);\n\n return (await response.json()) as T;\n } catch (error) {\n throw this.normalizeError(error);\n } finally {\n clearTimeout(timeoutId);\n this.pendingAbortControllers.delete(controller);\n }\n }\n\n private buildHeaders(): HeadersInit {\n return {\n [HTTP_HEADERS.CONTENT_TYPE]: HTTP_HEADERS.APPLICATION_JSON,\n [HTTP_HEADERS.AUTHORIZATION]: `${HTTP_HEADERS.BEARER_PREFIX}${this.getConfig().apiKey}`,\n };\n }\n\n private async throwFromErrorResponse(response: Response): Promise<never> {\n const errorMessage = await extractErrorMessageFromResponse(response);\n const metadata: AIErrorMetadata = {\n status: response.status,\n url: response.url,\n };\n throw new AIError(\n classifyHttpStatus(response.status),\n errorMessage,\n undefined,\n metadata,\n );\n }\n\n private normalizeError(error: unknown): AIError {\n if (error instanceof AIError) return error;\n\n if (error instanceof Error) {\n if (error.name === \"AbortError\") {\n return new AIError(\n AIErrorType.ABORT_ERROR,\n \"Request was aborted by the client\",\n error,\n );\n }\n if (error.name === \"TypeError\" && error.message.toLowerCase().includes(\"network\")) {\n return new AIError(\n AIErrorType.NETWORK_ERROR,\n \"Network error: Unable to connect to the AI service\",\n error,\n );\n }\n }\n\n return new AIError(\n AIErrorType.UNKNOWN_ERROR,\n error instanceof Error ? error.message : \"Unknown error occurred\",\n error instanceof Error ? error : undefined,\n );\n }\n}\n","\nimport type { IRequestExecutor } from \"./request-executor.strategy\";\nimport { RetryManager, RetryOptions } from \"../utils/retry\";\n\nexport class RetryExecutor<TArgs extends unknown[], TResult>\n implements IRequestExecutor<TArgs, TResult>\n{\n constructor(\n private readonly retryManager: RetryManager,\n private readonly options?: RetryOptions,\n ) {}\n\n execute(fn: (...args: TArgs) => Promise<TResult>, ...args: TArgs): Promise<TResult> {\n return this.retryManager.execute(() => fn(...args), this.options);\n }\n}\n","\nimport type { IRequestExecutor } from \"./request-executor.strategy\";\nimport { RequestQueue } from \"../utils/request-queue.util\";\n\nexport class QueueExecutor<TArgs extends unknown[], TResult>\n implements IRequestExecutor<TArgs, TResult>\n{\n constructor(\n private readonly queue: RequestQueue,\n private readonly priority: number,\n ) {}\n\n execute(fn: (...args: TArgs) => Promise<TResult>, ...args: TArgs): Promise<TResult> {\n return this.queue.add(() => fn(...args), this.priority);\n }\n}\n","\nimport type { IRequestExecutor } from \"./request-executor.strategy\";\nimport type { RequestDeduplicator } from \"../utils/request-deduplicator.util\";\n\nexport type KeyGenerator<TArgs extends unknown[]> = (...args: TArgs) => string;\n\nexport interface DedupeExecutorOptions<TArgs extends unknown[]> {\n readonly generateKey: KeyGenerator<TArgs>;\n}\n\nexport class DedupeExecutor<TArgs extends unknown[], TResult>\n implements IRequestExecutor<TArgs, TResult>\n{\n constructor(\n private readonly deduplicator: RequestDeduplicator,\n private readonly options: DedupeExecutorOptions<TArgs>,\n ) {}\n\n execute(fn: (...args: TArgs) => Promise<TResult>, ...args: TArgs): Promise<TResult> {\n const key = this.options.generateKey(...args);\n return this.deduplicator.execute(key, () => fn(...args));\n }\n}\n","\nimport type { IRequestExecutor } from \"./request-executor.strategy\";\n\ntype AnyExecutor = IRequestExecutor<unknown[], unknown>;\n\nexport class CompositeExecutor<TArgs extends unknown[], TResult>\n implements IRequestExecutor<TArgs, TResult>\n{\n private readonly executors: ReadonlyArray<AnyExecutor>;\n\n constructor(executors: ReadonlyArray<IRequestExecutor<TArgs, TResult>>) {\n this.executors = executors as unknown as ReadonlyArray<AnyExecutor>;\n }\n\n execute(fn: (...args: TArgs) => Promise<TResult>, ...args: TArgs): Promise<TResult> {\n const composed = this.compress(fn as unknown as (...a: unknown[]) => Promise<unknown>);\n return composed(...args) as Promise<TResult>;\n }\n\n private compress(fn: (...args: unknown[]) => Promise<unknown>): (...args: unknown[]) => Promise<unknown> {\n return this.executors.reduceRight(\n (innerFn, executor) => (...a: unknown[]) => executor.execute(innerFn, ...a),\n fn,\n );\n }\n}\n","\nimport type { GroqChatRequest, GroqChatResponse, GroqProviderConfig, StreamRequestOptions } from \"./groq.entities\";\nimport type { IRequestExecutor } from \"../../core/executor\";\nimport { GroqConfigStore } from \"./groq-config-store\";\nimport { GroqHttpTransport } from \"./groq-http-transport\";\nimport { RequestDeduplicator } from \"../../core/utils\";\nimport { RequestQueue } from \"../../core/utils\";\nimport { RetryManager } from \"../../core/utils\";\nimport {\n CompositeExecutor,\n DedupeExecutor,\n QueueExecutor,\n RetryExecutor,\n} from \"../../core/executor\";\nimport { QUEUE_PRIORITY_USER_REQUEST } from \"../../core/constants/identifier.constants\";\n\nexport interface GroqHttpClientDeps {\n readonly configStore?: GroqConfigStore;\n readonly transport?: GroqHttpTransport;\n readonly retryManager?: RetryManager;\n readonly queue?: RequestQueue;\n readonly deduplicator?: RequestDeduplicator;\n}\n\n/**\n * Groq HTTP client with the ported strategy stack: identical concurrent\n * requests are deduplicated, transient failures retried with backoff, and\n * everything is funneled through a priority queue.\n *\n * Supports both standalone initialization `new GroqHttpClient(config)`\n * and deferred initialization `const c = new GroqHttpClient(); c.initialize(config)`.\n */\nexport class GroqHttpClient {\n private readonly configStore: GroqConfigStore;\n private readonly transport: GroqHttpTransport;\n private readonly executor: IRequestExecutor<[GroqChatRequest], GroqChatResponse>;\n\n constructor(\n configOrDeps?: GroqProviderConfig | GroqHttpClientDeps,\n maybeDeps: GroqHttpClientDeps = {},\n ) {\n const isConfig =\n typeof configOrDeps === \"object\" &&\n configOrDeps !== null &&\n \"apiKey\" in configOrDeps &&\n typeof (configOrDeps as GroqProviderConfig).apiKey === \"string\";\n\n const deps = isConfig ? maybeDeps : (configOrDeps as GroqHttpClientDeps | undefined) ?? {};\n\n this.configStore = deps.configStore ?? new GroqConfigStore();\n if (isConfig) {\n this.configStore.initialize(configOrDeps as GroqProviderConfig);\n }\n\n this.transport = deps.transport ?? new GroqHttpTransport(this.configStore);\n\n const retryManager = deps.retryManager ?? new RetryManager();\n const queue = deps.queue ?? new RequestQueue();\n const deduplicator = deps.deduplicator ?? new RequestDeduplicator();\n\n this.executor = new CompositeExecutor<[GroqChatRequest], GroqChatResponse>([\n new DedupeExecutor<[GroqChatRequest], GroqChatResponse>(deduplicator, {\n generateKey: (request) =>\n deduplicatorKey(request, this.configStore.isInitialized() ? this.configStore.get().apiKey : \"\"),\n }),\n new RetryExecutor<[GroqChatRequest], GroqChatResponse>(retryManager),\n new QueueExecutor<[GroqChatRequest], GroqChatResponse>(queue, QUEUE_PRIORITY_USER_REQUEST),\n ]);\n }\n\n initialize(config: GroqProviderConfig): void {\n this.configStore.initialize(config);\n }\n\n isInitialized(): boolean {\n return this.configStore.isInitialized();\n }\n\n getApiKey(): string {\n return this.configStore.get().apiKey;\n }\n\n setApiKey(apiKey: string): void {\n this.configStore.setApiKey(apiKey);\n }\n\n cancelPendingRequests(): void {\n this.transport.cancelPendingRequests();\n }\n\n postChatCompletion(request: GroqChatRequest): Promise<GroqChatResponse> {\n return this.executor.execute(\n (req) => this.transport.postChatCompletion(req),\n request,\n );\n }\n\n streamChatCompletion(\n request: GroqChatRequest,\n options?: StreamRequestOptions,\n ): Promise<ReadableStream<Uint8Array>> {\n return this.transport.streamChatCompletion(request, options);\n }\n\n reset(): void {\n this.transport.cancelPendingRequests();\n this.configStore.reset();\n }\n}\n\nfunction deduplicatorKey(request: GroqChatRequest, apiKey: string): string {\n const { model, messages, stream: _stream, ...rest } = request;\n const stable = JSON.stringify({\n apiKey,\n model,\n messages: messages.map((m) => ({ role: m.role, content: m.content })),\n ...rest,\n });\n return stable;\n}\n","\nimport type { FinishReason, StreamCallbacks, TokenUsage } from \"../../core/types\";\nimport { AIError, AIErrorType } from \"../../core/errors\";\nimport { extractSseDataPayload, isSseDataLine, isSseDoneMarker } from \"../../core/parsers\";\nimport type { GroqChatChunk, GroqErrorResponse, GroqUsage } from \"./groq.entities\";\n\n/**\n * Extracts the displayable text delta from one Groq SSE `data:` payload.\n * Returns null for role-only chunks, finish-only chunks, and unparseable\n * payloads — the generic line machinery skips nulls.\n */\nexport function extractContentFromSsePayload(payload: string): string | null {\n try {\n const parsed = JSON.parse(payload) as GroqChatChunk;\n const delta = parsed.choices?.[0]?.delta?.content;\n return typeof delta === \"string\" && delta.length > 0 ? delta : null;\n } catch {\n return null;\n }\n}\n\nexport function mapGroqFinishReason(reason: string | null | undefined): FinishReason | undefined {\n if (reason === \"stop\") return \"stop\";\n if (reason === \"length\") return \"length\";\n if (reason === \"content_filter\") return \"content_filter\";\n return undefined;\n}\n\nexport function mapGroqUsage(usage: GroqUsage | undefined): TokenUsage | undefined {\n if (!usage) return undefined;\n return {\n inputTokens: usage.prompt_tokens,\n outputTokens: usage.completion_tokens,\n totalTokens: usage.total_tokens,\n };\n}\n\nexport interface GroqStreamOutcome {\n readonly text: string;\n readonly model: string | null;\n readonly finishReason: FinishReason | undefined;\n readonly usage: TokenUsage | undefined;\n}\n\n/**\n * Consumes a Groq SSE body: forwards text deltas through `callbacks.onChunk`\n * and harvests model/finish_reason/usage from the surrounding chunks so the\n * resulting GenerationResult is as complete as the non-streaming one.\n */\nexport async function consumeGroqStream(\n stream: ReadableStream<Uint8Array>,\n callbacks: Pick<StreamCallbacks, \"onChunk\">,\n): Promise<GroqStreamOutcome> {\n const reader = stream.getReader();\n const decoder = new TextDecoder();\n const chunks: string[] = [];\n let buffer = \"\";\n let model: string | null = null;\n let finishReason: FinishReason | undefined;\n let usage: TokenUsage | undefined;\n\n const consumeLine = (rawLine: string): void => {\n const line = rawLine.endsWith(\"\\r\") ? rawLine.slice(0, -1) : rawLine;\n const trimmed = line.trim();\n if (trimmed.length === 0 || !isSseDataLine(trimmed)) return;\n const payload = extractSseDataPayload(trimmed);\n if (isSseDoneMarker(payload)) return;\n\n let chunk: GroqChatChunk;\n try {\n chunk = JSON.parse(payload) as GroqChatChunk;\n } catch {\n return;\n }\n\n const errorBody = (chunk as unknown as GroqErrorResponse).error;\n if (errorBody) {\n throw new AIError(\n errorBody.message?.toLowerCase().includes(\"rate limit\")\n ? AIErrorType.RATE_LIMIT_ERROR\n : AIErrorType.SERVER_ERROR,\n errorBody.message || \"Groq stream failed mid-flight\",\n );\n }\n\n if (chunk.model) model = chunk.model;\n\n const choice = chunk.choices?.[0];\n const delta = choice?.delta?.content;\n if (typeof delta === \"string\" && delta.length > 0) {\n chunks.push(delta);\n callbacks.onChunk?.(delta);\n }\n if (choice?.finish_reason) {\n finishReason = mapGroqFinishReason(choice.finish_reason);\n }\n const tailUsage = chunk.x_groq?.usage;\n if (tailUsage) {\n usage = mapGroqUsage(tailUsage);\n }\n };\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop() ?? \"\";\n for (const line of lines) consumeLine(line);\n }\n\n buffer += decoder.decode();\n if (buffer.length > 0) consumeLine(buffer);\n } catch (error) {\n if (error instanceof AIError) throw error;\n throw new AIError(\n AIErrorType.NETWORK_ERROR,\n \"Stream was interrupted\",\n error instanceof Error ? error : undefined,\n );\n } finally {\n reader.releaseLock();\n }\n\n return { text: chunks.join(\"\"), model, finishReason, usage };\n}\n","\nimport type {\n GenerationResult,\n ProviderHealth,\n StreamCallbacks,\n StructuredGeneration,\n StructuredTextRequest,\n TextRequest,\n TextTier,\n ChatMessage,\n} from \"../../core/types\";\nimport { AIError, AIErrorType } from \"../../core/errors\";\nimport { CacheManager } from \"../../core/utils\";\nimport { JsonResponseParser, StructuredPromptBuilder } from \"../../core/parsers\";\nimport { mergeTierOverrides, resolveModel, type TierModelMap } from \"../../core/tiers\";\nimport type { ITextProvider } from \"../base/provider.types\";\nimport { GroqChatRequestBuilder } from \"./groq-request.builder\";\nimport { GroqHttpClient } from \"./groq-http-client\";\nimport { GROQ_TIERS } from \"./groq.constants\";\nimport {\n consumeGroqStream,\n mapGroqFinishReason,\n mapGroqUsage,\n} from \"./groq-sse\";\nimport type {\n GroqChatRequest,\n GroqGenerationConfig,\n GroqMessage,\n GroqProviderConfig,\n} from \"./groq.entities\";\n\n/** Cache key layout version — bumped when the cached value shape changes. */\nconst CACHE_LAYOUT_VERSION = 2;\nconst STRUCTURED_TEMPERATURE = 0.1;\n\n/**\n * Groq provider over the ported machinery (dedupe/retry/queue pipeline,\n * LRU+TTL response cache). Implements the neutral ITextProvider surface:\n * tier-based model resolution, GenerationResult with token usage, and\n * callback-based streaming.\n */\nexport class GroqProvider implements ITextProvider {\n readonly id = \"groq\";\n readonly name = \"Groq\";\n readonly capabilities = [\"text\"] as const;\n\n private readonly client: GroqHttpClient;\n private readonly tiers: TierModelMap;\n private readonly cache = new CacheManager();\n private readonly jsonParser = new JsonResponseParser();\n\n constructor(readonly config: GroqProviderConfig) {\n this.client = new GroqHttpClient(config);\n this.tiers = mergeTierOverrides(GROQ_TIERS, config.models);\n }\n\n resolveModel(tier: TextTier): string {\n return resolveModel(this.tiers, tier, this.id);\n }\n\n async healthCheck(): Promise<ProviderHealth> {\n return this.config.apiKey ? \"healthy\" : \"unavailable\";\n }\n\n async estimateCost(): Promise<number> {\n return 0;\n }\n\n async generate(request: TextRequest): Promise<GenerationResult> {\n const model = request.model ?? this.resolveModel(request.tier ?? \"balanced\");\n const cacheKey = this.cache.generateKey({\n v: CACHE_LAYOUT_VERSION,\n provider: this.id,\n op: \"generate\",\n model,\n messages: request.messages,\n systemPrompt: request.systemPrompt ?? null,\n temperature: request.temperature ?? null,\n maxTokens: request.maxTokens ?? null,\n topP: request.topP ?? null,\n });\n\n const cached = this.cache.get<GenerationResult>(cacheKey);\n if (cached) return cached;\n\n const response = await this.client.postChatCompletion(\n this.buildWireRequest(model, request),\n );\n\n const choice = response.choices?.[0];\n const text = choice?.message?.content ?? \"\";\n if (text.length === 0) {\n throw new AIError(\n AIErrorType.SERVER_ERROR,\n \"No content generated from Groq API\",\n undefined,\n { model },\n );\n }\n\n const result: GenerationResult = {\n text,\n usage: mapGroqUsage(response.usage),\n model: response.model || model,\n providerId: this.id,\n finishReason: mapGroqFinishReason(choice?.finish_reason),\n };\n this.cache.set(cacheKey, result);\n return result;\n }\n\n async generateStructured<T>(\n request: StructuredTextRequest,\n ): Promise<StructuredGeneration<T>> {\n const model = request.model ?? this.resolveModel(request.tier ?? \"balanced\");\n\n const messages = toGroqMessages(request.messages, request.systemPrompt);\n const lastUserIndex = findLastIndex(messages, (m) => m.role === \"user\");\n if (lastUserIndex === -1) {\n throw new AIError(\n AIErrorType.UNKNOWN_ERROR,\n \"generateStructured requires at least one user message\",\n );\n }\n\n const structuredPrompt = new StructuredPromptBuilder(\n messages[lastUserIndex].content,\n )\n .withSchema(request.schema)\n .build();\n messages[lastUserIndex] = { role: \"user\", content: structuredPrompt };\n\n const wireRequest = GroqChatRequestBuilder.for(model)\n .withMessages(messages)\n .withConfig(this.generationConfig(request, STRUCTURED_TEMPERATURE))\n .withJsonResponse(true)\n .build();\n\n const response = await this.client.postChatCompletion(wireRequest);\n const choice = response.choices?.[0];\n const text = choice?.message?.content ?? \"\";\n if (text.length === 0) {\n throw new AIError(\n AIErrorType.SERVER_ERROR,\n \"No content generated from Groq API\",\n undefined,\n { model },\n );\n }\n\n return {\n value: this.jsonParser.parse<T>(text),\n result: {\n text,\n usage: mapGroqUsage(response.usage),\n model: response.model || model,\n providerId: this.id,\n finishReason: mapGroqFinishReason(choice?.finish_reason),\n },\n };\n }\n\n async stream(\n request: TextRequest,\n callbacks: StreamCallbacks,\n ): Promise<GenerationResult> {\n const model = request.model ?? this.resolveModel(request.tier ?? \"balanced\");\n const streamBody = await this.client.streamChatCompletion(\n this.buildWireRequest(model, request),\n { signal: request.signal },\n );\n\n try {\n const outcome = await consumeGroqStream(streamBody, callbacks);\n if (outcome.text.length === 0) {\n throw new AIError(\n AIErrorType.SERVER_ERROR,\n \"No content generated from Groq API\",\n undefined,\n { model },\n );\n }\n const result: GenerationResult = {\n text: outcome.text,\n usage: outcome.usage,\n model: outcome.model ?? model,\n providerId: this.id,\n finishReason: outcome.finishReason,\n };\n callbacks.onComplete?.(result);\n return result;\n } catch (error) {\n callbacks.onError?.(error instanceof Error ? error : new Error(String(error)));\n throw error;\n }\n }\n\n getCacheStats() {\n return this.cache.getStats();\n }\n\n clearCache() {\n this.cache.clear();\n }\n\n cancelPendingRequests() {\n this.client.cancelPendingRequests();\n }\n\n private buildWireRequest(model: string, request: TextRequest): GroqChatRequest {\n return GroqChatRequestBuilder.for(model)\n .withMessages(toGroqMessages(request.messages, request.systemPrompt))\n .withConfig(this.generationConfig(request))\n .build();\n }\n\n private generationConfig(\n request: TextRequest,\n temperatureOverride?: number,\n ): GroqGenerationConfig {\n return {\n ...(request.temperature !== undefined\n ? { temperature: request.temperature }\n : {}),\n ...(temperatureOverride !== undefined\n ? { temperature: temperatureOverride }\n : {}),\n ...(request.maxTokens !== undefined ? { maxTokens: request.maxTokens } : {}),\n ...(request.topP !== undefined ? { topP: request.topP } : {}),\n ...(request.stopSequences !== undefined && request.stopSequences.length > 0\n ? { stop: [...request.stopSequences] }\n : {}),\n };\n }\n}\n\n/** Maps neutral messages to Groq's wire format; systemPrompt becomes the leading system message. */\nexport function toGroqMessages(\n messages: ReadonlyArray<ChatMessage>,\n systemPrompt?: string,\n): GroqMessage[] {\n const wire: GroqMessage[] = [];\n if (systemPrompt && systemPrompt.length > 0) {\n wire.push({ role: \"system\", content: systemPrompt });\n }\n for (const message of messages) {\n if (message.role === \"system\") {\n wire.push({ role: \"system\", content: message.content });\n continue;\n }\n wire.push({ role: message.role, content: message.content });\n }\n return wire;\n}\n\nexport function createGroqProvider(config: GroqProviderConfig): GroqProvider {\n return new GroqProvider(config);\n}\n\nfunction findLastIndex<T>(items: ReadonlyArray<T>, predicate: (item: T) => boolean): number {\n for (let i = items.length - 1; i >= 0; i--) {\n if (predicate(items[i])) return i;\n }\n return -1;\n}\n","\nimport type { ProviderHealth } from \"../../core/types\";\nimport { AIError } from \"../../content/domain/errors/AIErrors\";\nimport { ProviderTimingConfig } from \"../../content/domain/limits/ProviderTimingConfig\";\nimport { calculateRetryBackoffDelayMs } from \"../../content/domain/calculations/RetryBackoffDelay\";\nimport type { CostEstimateRequest } from \"./provider.types\";\n\nexport interface BaseProviderConfig {\n apiKey: string;\n baseUrl?: string;\n timeout?: number;\n retryAttempts?: number;\n}\n\n/**\n * Convenience base for providers that talk raw fetch (gemini/fal/pruna style):\n * timeout-bounded fetch plus a simple retry loop. The Groq and Anthropic\n * providers bring their own transport machinery and do not extend this.\n */\nexport abstract class BaseProvider {\n protected config: BaseProviderConfig;\n\n constructor(config: BaseProviderConfig) {\n this.config = config;\n }\n\n async healthCheck(): Promise<ProviderHealth> {\n if (!this.config.apiKey) {\n return \"unavailable\";\n }\n return \"healthy\";\n }\n\n async estimateCost(_request: CostEstimateRequest): Promise<number> {\n return 0;\n }\n\n protected async fetchWithTimeout(url: string, options: RequestInit, timeout?: number): Promise<Response> {\n const effectiveTimeout = timeout ?? this.config.timeout ?? ProviderTimingConfig.DEFAULT_TIMEOUT_MS;\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), effectiveTimeout);\n\n try {\n const response = await fetch(url, {\n ...options,\n signal: controller.signal,\n });\n clearTimeout(timeoutId);\n return response;\n } catch (error) {\n clearTimeout(timeoutId);\n throw error;\n }\n }\n\n protected async withRetry<T>(fn: () => Promise<T>, maxAttempts?: number): Promise<T> {\n const attempts = maxAttempts ?? this.config.retryAttempts ?? ProviderTimingConfig.DEFAULT_RETRY_ATTEMPTS;\n let lastError: Error | undefined;\n\n for (let i = 0; i < attempts; i++) {\n try {\n return await fn();\n } catch (error) {\n lastError = error as Error;\n if (i < attempts - 1) {\n await new Promise(resolve => setTimeout(resolve, calculateRetryBackoffDelayMs(i)));\n }\n }\n }\n\n throw lastError || new Error(\"Retry attempts exhausted\");\n }\n}\n\nexport { BaseProvider as BaseAIProvider };\n\nexport class ProviderError extends AIError {\n constructor(\n message: string,\n public readonly providerId: string,\n originalError?: unknown\n ) {\n super(message, \"PROVIDER_ERROR\", originalError);\n this.name = \"ProviderError\";\n }\n}\n","\nimport { BaseProvider } from '../base/base.provider';\nimport type { GeneratedContent } from '../../content/domain/config/ProviderConfig';\nimport type {\n GenerationResult,\n ProviderHealth,\n StreamCallbacks,\n StructuredGeneration,\n StructuredTextRequest,\n TextRequest,\n TextTier,\n ChatMessage,\n} from '../../core/types';\nimport {\n AIError,\n AIErrorType,\n classifyHttpStatus,\n extractErrorMessageFromResponse,\n} from '../../core/errors';\nimport { JsonResponseParser, StructuredPromptBuilder } from '../../core/parsers';\nimport { mergeTierOverrides, resolveModel, type TierModelMap } from '../../core/tiers';\nimport type {\n CostEstimateRequest,\n IMediaProvider,\n ITextProvider,\n} from '../base/provider.types';\nimport { ProviderTimingConfig } from '../../content/domain/limits/ProviderTimingConfig';\nimport { estimateGeminiGenerationCost } from '../../content/domain/predicates/ProviderCostEstimator';\nimport { ModelDefaults } from '../../content/domain/limits/ModelDefaults';\nimport type {\n GeminiConfig,\n ImageGenerationRequest,\n ImageToVideoRequest,\n VideoGenerationRequest,\n VideoToVideoRequest,\n} from '../../content/domain/config/ProviderConfig';\n\ninterface GeminiResponse {\n candidates: Array<{\n content: {\n parts: Array<{\n text?: string;\n inlineData?: {\n data: string;\n mimeType: string;\n };\n }>;\n };\n finishReason: string;\n }>;\n usageMetadata?: {\n promptTokenCount: number;\n candidatesTokenCount: number;\n totalTokenCount: number;\n };\n}\n\nexport const GEMINI_TIERS: TierModelMap = {\n fast: 'gemini-2.0-flash-lite',\n balanced: ModelDefaults.GEMINI_TEXT,\n powerful: 'gemini-2.5-pro',\n};\n\n/**\n * Gemini provider — text via generateContent (multi-turn aware, system\n * instruction in the proper slot) plus inline image generation. Video is not\n * supported by this surface and throws with a clear message.\n */\nexport class GeminiProvider extends BaseProvider implements ITextProvider, IMediaProvider {\n readonly id = 'gemini';\n readonly name = 'Google Gemini';\n readonly capabilities = ['text', 'image'] as const;\n\n private models: { text: string; image: string; video?: string };\n private readonly tiers: TierModelMap;\n private readonly jsonParser = new JsonResponseParser();\n\n constructor(config: GeminiConfig) {\n super({\n apiKey: config.apiKey,\n baseUrl: config.baseUrl || 'https://generativelanguage.googleapis.com/v1beta',\n timeout: config.timeout || ProviderTimingConfig.GEMINI_TIMEOUT_MS,\n retryAttempts: config.retryAttempts || ProviderTimingConfig.GEMINI_RETRY_ATTEMPTS,\n });\n\n this.models = {\n text: ModelDefaults.GEMINI_TEXT,\n image: ModelDefaults.GEMINI_IMAGE,\n };\n if (config.models) {\n this.models = { ...this.models, ...config.models };\n }\n this.tiers = mergeTierOverrides(\n GEMINI_TIERS,\n config.models ? { balanced: config.models.text } : undefined,\n );\n }\n\n resolveModel(tier: TextTier): string {\n return resolveModel(this.tiers, tier, this.id);\n }\n\n async healthCheck(): Promise<ProviderHealth> {\n try {\n if (!this.config.apiKey) {\n return 'unavailable';\n }\n\n const response = await this.fetchWithTimeout(\n `${this.config.baseUrl}/models`,\n {\n method: 'GET',\n headers: this.authHeaders(),\n }\n );\n\n if (response.ok) return 'healthy';\n if (response.status === 401 || response.status === 403) return 'unavailable';\n return 'degraded';\n } catch {\n return 'unavailable';\n }\n }\n\n async estimateCost(request: CostEstimateRequest): Promise<number> {\n return estimateGeminiGenerationCost(request as Parameters<typeof estimateGeminiGenerationCost>[0]);\n }\n\n async generate(request: TextRequest): Promise<GenerationResult> {\n try {\n const model = request.model ?? this.resolveModel(request.tier ?? 'balanced');\n const systemMessages = request.messages.filter((m) => m.role === 'system');\n const systemPrompt =\n request.systemPrompt && request.systemPrompt.length > 0\n ? request.systemPrompt\n : systemMessages.length > 0\n ? systemMessages.map((m) => m.content).join('\\n')\n : undefined;\n\n const response = await this.withRetry(async () => {\n return await this.fetchWithTimeout(\n `${this.config.baseUrl}/models/${model}:generateContent`,\n {\n method: 'POST',\n headers: this.authHeaders(),\n body: JSON.stringify({\n systemInstruction:\n systemPrompt && systemPrompt.length > 0\n ? { parts: [{ text: systemPrompt }] }\n : undefined,\n contents: toGeminiContents(request.messages),\n generationConfig: {\n temperature: request.temperature ?? 0.7,\n maxOutputTokens: request.maxTokens ?? 2048,\n topP: request.topP ?? 0.9,\n },\n }),\n }\n );\n });\n\n if (!response.ok) {\n const message = await extractErrorMessageFromResponse(response);\n throw new AIError(\n classifyHttpStatus(response.status),\n `Gemini API error (${response.status}): ${message}`,\n undefined,\n { status: response.status, model },\n );\n }\n\n const data: GeminiResponse = await response.json();\n const text = data.candidates?.[0]?.content?.parts\n ?.map((part) => part.text ?? '')\n .join('') ?? '';\n if (text.length === 0) {\n throw new AIError(AIErrorType.SERVER_ERROR, 'No content generated from Gemini API', undefined, { model });\n }\n\n return {\n text,\n usage: data.usageMetadata\n ? {\n inputTokens: data.usageMetadata.promptTokenCount,\n outputTokens: data.usageMetadata.candidatesTokenCount,\n totalTokens: data.usageMetadata.totalTokenCount,\n }\n : undefined,\n model,\n providerId: this.id,\n finishReason: mapGeminiFinishReason(data.candidates?.[0]?.finishReason),\n };\n } catch (error) {\n if (error instanceof AIError) throw error;\n throw new AIError(\n AIErrorType.UNKNOWN_ERROR,\n `Gemini text generation failed: ${error instanceof Error ? error.message : 'Unknown error'}`,\n error instanceof Error ? error : undefined,\n );\n }\n }\n\n async generateStructured<T>(\n request: StructuredTextRequest,\n ): Promise<StructuredGeneration<T>> {\n const messages = [...request.messages];\n const lastUserIndex = findLastIndex(messages, (m) => m.role === 'user');\n if (lastUserIndex === -1) {\n throw new AIError(\n AIErrorType.UNKNOWN_ERROR,\n 'generateStructured requires at least one user message',\n );\n }\n messages[lastUserIndex] = {\n role: 'user',\n content: new StructuredPromptBuilder(messages[lastUserIndex].content)\n .withSchema(request.schema)\n .build(),\n };\n\n const result = await this.generate({ ...request, messages, temperature: 0.1 });\n return { value: this.jsonParser.parse<T>(result.text), result };\n }\n\n async stream(request: TextRequest, callbacks: StreamCallbacks): Promise<GenerationResult> {\n // Gemini text streaming arrives as a single buffered payload on this\n // surface — emit it as one chunk so callers keep one code path.\n const result = await this.generate(request);\n callbacks.onChunk?.(result.text);\n callbacks.onComplete?.(result);\n return result;\n }\n\n async generateImage(request: ImageGenerationRequest): Promise<GeneratedContent> {\n try {\n const response = await this.withRetry(async () => {\n return await this.fetchWithTimeout(\n `${this.config.baseUrl}/models/${this.models.image}:generateContent`,\n {\n method: 'POST',\n headers: this.authHeaders(),\n body: JSON.stringify({\n contents: [{\n parts: [{\n text: this.buildImagePrompt(request)\n }]\n }],\n }),\n }\n );\n });\n\n if (!response.ok) {\n const message = await extractErrorMessageFromResponse(response);\n throw new AIError(\n classifyHttpStatus(response.status),\n `Gemini image generation error (${response.status}): ${message}`,\n undefined,\n { status: response.status },\n );\n }\n\n const data: GeminiResponse = await response.json();\n\n const imageData = data.candidates?.[0]?.content?.parts?.[0]?.inlineData;\n if (!imageData) {\n throw new AIError(AIErrorType.SERVER_ERROR, 'No image data in Gemini response');\n }\n\n const url = `data:${imageData.mimeType};base64,${imageData.data}`;\n\n return {\n id: Date.now().toString(),\n type: 'image',\n url,\n metadata: {\n provider: 'gemini',\n model: this.models.image,\n mimeType: imageData.mimeType,\n },\n createdAt: new Date().toISOString(),\n };\n } catch (error) {\n throw new Error(`Gemini image generation failed: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n }\n\n async generateVideo(_request: VideoGenerationRequest): Promise<GeneratedContent> {\n throw new Error('Gemini provider does not support video generation');\n }\n\n async imageToVideo(_request: ImageToVideoRequest): Promise<GeneratedContent> {\n throw new Error('Gemini provider does not support image-to-video conversion');\n }\n\n async videoToVideo(_request: VideoToVideoRequest): Promise<GeneratedContent> {\n throw new Error('Gemini provider does not support video-to-video conversion');\n }\n\n private authHeaders(): Record<string, string> {\n return {\n 'Content-Type': 'application/json',\n 'x-goog-api-key': this.config.apiKey,\n };\n }\n\n private buildImagePrompt(request: ImageGenerationRequest): string {\n let prompt = request.prompt;\n\n if (request.style) {\n const styles: Record<string, string> = {\n realistic: 'photorealistic, highly detailed, 8k resolution',\n cartoon: 'cartoon style, colorful, animated',\n abstract: 'abstract art, modern, artistic',\n minimalist: 'minimalist, clean, simple',\n vintage: 'vintage style, retro, classic',\n };\n prompt += `, ${styles[request.style]}`;\n }\n\n if (request.quality === 'ultra') {\n prompt += ', ultra high quality, masterpiece';\n }\n\n return prompt;\n }\n}\n\n/** Maps neutral messages to Gemini contents; assistant becomes 'model'. */\nexport function toGeminiContents(messages: ReadonlyArray<ChatMessage>): Array<{\n role: 'user' | 'model';\n parts: Array<{ text: string }>;\n}> {\n return messages\n .filter((message) => message.role !== 'system' && message.content.length > 0)\n .map((message) => ({\n role: message.role === 'assistant' ? ('model' as const) : ('user' as const),\n parts: [{ text: message.content }],\n }));\n}\n\nfunction mapGeminiFinishReason(reason: string | undefined) {\n if (reason === 'STOP') return 'stop' as const;\n if (reason === 'MAX_TOKENS') return 'length' as const;\n if (reason === 'SAFETY' || reason === 'PROHIBITED_CONTENT') return 'content_filter' as const;\n return undefined;\n}\n\nfunction findLastIndex<T>(items: ReadonlyArray<T>, predicate: (item: T) => boolean): number {\n for (let i = items.length - 1; i >= 0; i--) {\n if (predicate(items[i])) return i;\n }\n return -1;\n}\n\nexport function createGeminiProvider(config: GeminiConfig): GeminiProvider {\n return new GeminiProvider(config);\n}\n","\nimport { BaseProvider } from '../base/base.provider';\nimport type { GeneratedContent } from '../../content/domain/config/ProviderConfig';\nimport type { ProviderHealth } from '../../core/types';\nimport type { CostEstimateRequest, IMediaProvider } from '../base/provider.types';\nimport { ProviderTimingConfig } from '../../content/domain/limits/ProviderTimingConfig';\nimport { ModelDefaults } from '../../content/domain/limits/ModelDefaults';\nimport { estimateFalGenerationCost, resolveFalImageSize, resolveFalInferenceSteps } from '../../content/domain/predicates';\nimport type {\n FalConfig,\n ImageGenerationRequest,\n VideoGenerationRequest,\n ImageToVideoRequest,\n VideoToVideoRequest,\n} from '../../content/domain/config/ProviderConfig';\n\ninterface FalResult {\n images?: Array<{ url: string }>;\n video?: { url: string };\n error?: string;\n}\n\n/** Media-only provider: fal.ai for image and video generation. */\nexport class FalProvider extends BaseProvider implements IMediaProvider {\n readonly id = 'fal';\n readonly name = 'FAL';\n readonly capabilities = ['image', 'video'] as const;\n\n private models: { image: string; video: string; imageToVideo: string };\n\n constructor(config: FalConfig) {\n super({\n apiKey: config.apiKey,\n baseUrl: config.baseUrl || 'https://queue.fal.run',\n timeout: config.timeout || ProviderTimingConfig.FAL_TIMEOUT_MS,\n retryAttempts: config.retryAttempts || ProviderTimingConfig.FAL_RETRY_ATTEMPTS,\n });\n\n this.models = {\n image: ModelDefaults.FAL_IMAGE,\n video: ModelDefaults.FAL_VIDEO,\n imageToVideo: ModelDefaults.FAL_IMAGE_TO_VIDEO,\n };\n if (config.models) {\n this.models = { ...this.models, ...config.models };\n }\n }\n\n async healthCheck(): Promise<ProviderHealth> {\n try {\n if (!this.config.apiKey) {\n return 'unavailable';\n }\n\n const response = await this.fetchWithTimeout(\n `${this.config.baseUrl}/fal-ai/flux/schnell/status`,\n {\n method: 'HEAD',\n headers: {\n 'Authorization': `Key ${this.config.apiKey}`,\n },\n }\n );\n\n return response.ok ? 'healthy' : 'degraded';\n } catch {\n return 'unavailable';\n }\n }\n\n async estimateCost(request: CostEstimateRequest): Promise<number> {\n return estimateFalGenerationCost(\n request as Parameters<typeof estimateFalGenerationCost>[0],\n );\n }\n\n async generateImage(request: ImageGenerationRequest): Promise<GeneratedContent> {\n try {\n const response = await this.withRetry(async () => {\n return await this.fetchWithTimeout(\n `${this.config.baseUrl}/${this.models.image}`,\n {\n method: 'POST',\n headers: {\n 'Authorization': `Key ${this.config.apiKey}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n prompt: request.prompt,\n image_size: resolveFalImageSize(request.format),\n num_inference_steps: resolveFalInferenceSteps(request.quality),\n num_images: request.quantity || 1,\n }),\n }\n );\n });\n\n if (!response.ok) {\n throw new Error(`FAL API error: ${response.statusText}`);\n }\n\n const data: FalResult = await response.json();\n\n if (data.error) {\n throw new Error(data.error);\n }\n\n return {\n id: Date.now().toString(),\n type: 'image',\n url: data.images?.[0]?.url,\n metadata: {\n provider: 'fal',\n model: this.models.image,\n },\n createdAt: new Date().toISOString(),\n };\n } catch (error) {\n throw new Error(`FAL image generation failed: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n }\n\n async generateVideo(request: VideoGenerationRequest): Promise<GeneratedContent> {\n try {\n const response = await this.withRetry(async () => {\n return await this.fetchWithTimeout(\n `${this.config.baseUrl}/${this.models.video}`,\n {\n method: 'POST',\n headers: {\n 'Authorization': `Key ${this.config.apiKey}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n prompt: request.prompt,\n aspect_ratio: request.aspectRatio || '16:9',\n }),\n }\n );\n });\n\n if (!response.ok) {\n throw new Error(`FAL API error: ${response.statusText}`);\n }\n\n const data: FalResult = await response.json();\n\n if (data.error) {\n throw new Error(data.error);\n }\n\n return {\n id: Date.now().toString(),\n type: 'video',\n url: data.video?.url,\n metadata: {\n provider: 'fal',\n model: this.models.video,\n },\n createdAt: new Date().toISOString(),\n };\n } catch (error) {\n throw new Error(`FAL video generation failed: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n }\n\n async imageToVideo(request: ImageToVideoRequest): Promise<GeneratedContent> {\n try {\n const response = await this.withRetry(async () => {\n return await this.fetchWithTimeout(\n `${this.config.baseUrl}/${this.models.imageToVideo}`,\n {\n method: 'POST',\n headers: {\n 'Authorization': `Key ${this.config.apiKey}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n image_url: request.imageUrl,\n motion: request.motion || 'medium',\n prompt: request.prompt,\n }),\n }\n );\n });\n\n if (!response.ok) {\n throw new Error(`FAL API error: ${response.statusText}`);\n }\n\n const data: FalResult = await response.json();\n\n if (data.error) {\n throw new Error(data.error);\n }\n\n return {\n id: Date.now().toString(),\n type: 'video',\n url: data.video?.url,\n metadata: {\n provider: 'fal',\n model: this.models.imageToVideo,\n },\n createdAt: new Date().toISOString(),\n };\n } catch (error) {\n throw new Error(`FAL image-to-video failed: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n }\n\n async videoToVideo(_request: VideoToVideoRequest): Promise<GeneratedContent> {\n throw new Error('FAL provider does not support video-to-video conversion');\n }\n}\n\nexport function createFalProvider(config: FalConfig): FalProvider {\n return new FalProvider(config);\n}\n","\nimport type { PrunaAspectRatio, PrunaResolution } from '../entities/types';\n\nexport const DEFAULT_ASPECT_RATIO: PrunaAspectRatio = '16:9';\n\nexport const P_VIDEO_DEFAULTS = {\n duration: 5,\n resolution: '720p' as PrunaResolution,\n fps: 24,\n draft: false,\n promptUpsampling: true,\n} as const;\n\nexport const POLL_DEFAULTS = {\n intervalMs: 3_000,\n maxAttempts: 120,\n maxIntervalMs: 10_000,\n backoffBase: 1.5,\n jitterPercent: 0.1,\n} as const;\n\nexport const DEFAULT_DEDUPLICATOR_TTL_MS = 30_000;\n\nexport const DEDUPLICATOR_CLEANUP_GRACE_MS = 100;\n\nexport const DEFAULT_CACHE_TTL_MS = 5 * 60 * 1000;\n\nexport const DEFAULT_CACHE_MAX_SIZE = 50;\n\nexport const PERFORMANCE_RETAINED_SAMPLES = 100;\n","\nexport const HTTPS_PREFIX = 'https://';\nexport const HTTP_PREFIX = 'http://';\nexport const BASE64_MARKER = 'base64,';\n\nexport const PRUNA_BASE_URL = 'https://api.pruna.ai';\n\nexport const PRUNA_PREDICTIONS_URL = `${PRUNA_BASE_URL}/v1/predictions`;\n\nexport const PRUNA_FILES_URL = `${PRUNA_BASE_URL}/v1/files`;\n\nexport const AUTH_FAILURE_STATUSES: readonly number[] = [401, 403] as const;\n\nexport const MIN_API_KEY_LENGTH = 1;\n\nexport const MAX_API_KEY_LENGTH = 256;\n","\nexport const MIME_PNG = 'image/png';\nexport const MIME_JPEG = 'image/jpeg';\nexport const MIME_WEBP = 'image/webp';\n\nexport const DEFAULT_IMAGE_MIME = MIME_PNG;\n\nexport const MIME_FILE_EXTENSION: Readonly<Record<string, string>> = {\n [MIME_PNG]: 'png',\n [MIME_JPEG]: 'jpg',\n [MIME_WEBP]: 'webp',\n};\n\nexport const IMAGE_SIGNATURES = {\n PNG: [0x89, 0x50],\n JPEG: [0xff, 0xd8],\n WEBP_RIFF: [0x52, 0x49],\n} as const;\n","\nexport const CANCELLATION_MESSAGE = 'Request cancelled by user';\n\nexport class CancellationError extends Error {\n constructor(message: string = CANCELLATION_MESSAGE) {\n super(message);\n this.name = 'CancellationError';\n }\n}\n\nexport function isCancellationError(value: unknown): value is CancellationError {\n return value instanceof CancellationError;\n}\n","\nexport const AUTHENTICATION_MESSAGE = 'Authentication failed. Please check your API key.';\n\nexport class AuthenticationError extends Error {\n constructor(message: string = AUTHENTICATION_MESSAGE) {\n super(message);\n this.name = 'AuthenticationError';\n }\n}\n","\nexport const TIMEOUT_MESSAGE = 'Generation timed out. Maximum polling attempts reached.';\n\nexport class TimeoutError extends Error {\n constructor(message: string = TIMEOUT_MESSAGE) {\n super(message);\n this.name = 'TimeoutError';\n }\n}\n","\nexport interface ValidationErrorContext {\n field: string;\n reason: string;\n receivedValue?: unknown;\n}\n\nexport class ValidationError extends Error {\n readonly field: string;\n readonly reason: string;\n readonly receivedValue: unknown;\n\n constructor(context: ValidationErrorContext) {\n super(`Invalid ${context.field}: ${context.reason}`);\n this.name = 'ValidationError';\n this.field = context.field;\n this.reason = context.reason;\n this.receivedValue = context.receivedValue;\n }\n}\n\nexport function isValidationError(value: unknown): value is ValidationError {\n return value instanceof ValidationError;\n}\n","\ninterface BufferLike {\n from: (data: string, encoding: string) => {\n buffer: ArrayBuffer;\n byteOffset: number;\n byteLength: number;\n };\n}\n\ninterface GlobalWithBuffer {\n Buffer?: BufferLike;\n}\n\nconst globalScope = globalThis as unknown as GlobalWithBuffer;\nconst hasBuffer = typeof globalScope.Buffer?.from === 'function';\n\nexport function base64ToBytes(raw: string): Uint8Array {\n if (hasBuffer) {\n const bufferFactory = globalScope.Buffer;\n if (!bufferFactory) {\n throw new Error('Buffer unavailable despite detection flag');\n }\n const buf = bufferFactory.from(raw, 'base64');\n return new Uint8Array(buf.buffer, buf.byteOffset, buf.byteLength);\n }\n\n const decoded = atob(raw);\n return Uint8Array.from(decoded, char => char.charCodeAt(0));\n}\n","\nimport { IMAGE_SIGNATURES, DEFAULT_IMAGE_MIME, MIME_PNG, MIME_JPEG, MIME_WEBP } from '../constants/mime-types';\n\nconst MIN_SIGNATURE_BYTES = 2;\n\nfunction matchesSignature(bytes: Uint8Array, signature: readonly number[]): boolean {\n if (bytes.length < signature.length) return false;\n return signature.every((value, index) => bytes[index] === value);\n}\n\nexport function detectImageMime(bytes: Uint8Array): string {\n if (bytes.length < MIN_SIGNATURE_BYTES) return DEFAULT_IMAGE_MIME;\n\n if (matchesSignature(bytes, IMAGE_SIGNATURES.PNG)) return MIME_PNG;\n if (matchesSignature(bytes, IMAGE_SIGNATURES.JPEG)) return MIME_JPEG;\n if (matchesSignature(bytes, IMAGE_SIGNATURES.WEBP_RIFF)) return MIME_WEBP;\n return DEFAULT_IMAGE_MIME;\n}\n","\nexport interface ApiErrorPayload {\n message?: string;\n}\n\nexport interface PrunaApiError extends Error {\n statusCode: number;\n}\n\nexport async function parseApiError(\n response: Response,\n fallback: string,\n): Promise<PrunaApiError> {\n const payload = await response\n .json()\n .catch(() => ({ message: response.statusText })) as ApiErrorPayload;\n\n const message = payload.message ?? `${fallback}: ${response.status}`;\n const error = new Error(message) as PrunaApiError;\n error.statusCode = response.status;\n return error;\n}\n","\nimport { AUTH_FAILURE_STATUSES } from '../constants/network';\n\nexport function isAuthFailureStatus(status: number): boolean {\n return (AUTH_FAILURE_STATUSES as readonly number[]).includes(status);\n}\n\nexport function isTransientServerError(status: number): boolean {\n return status >= 500 && status < 600;\n}\n\nexport function isClientError(status: number): boolean {\n return status >= 400 && status < 500 && !isAuthFailureStatus(status);\n}\n","\nimport type { PrunaJobStatus } from '../entities/types';\n\nexport const TERMINAL_SUCCESS_STATUSES: readonly PrunaJobStatus[] = ['succeeded', 'completed'] as const;\nexport const TERMINAL_FAILURE_STATUSES: readonly PrunaJobStatus[] = ['failed'] as const;\nexport const IN_FLIGHT_STATUSES: readonly PrunaJobStatus[] = ['processing', 'starting'] as const;\n\nexport function isTerminalSuccessStatus(status: PrunaJobStatus | undefined): boolean {\n if (!status) return false;\n return (TERMINAL_SUCCESS_STATUSES as readonly string[]).includes(status);\n}\n\nexport function isTerminalFailureStatus(status: PrunaJobStatus | undefined): boolean {\n if (!status) return false;\n return (TERMINAL_FAILURE_STATUSES as readonly string[]).includes(status);\n}\n\nexport function isInFlightStatus(status: PrunaJobStatus | undefined): boolean {\n return !isTerminalStatus(status);\n}\n\nexport function isTerminalStatus(status: PrunaJobStatus | undefined): boolean {\n return isTerminalSuccessStatus(status) || isTerminalFailureStatus(status);\n}\n","\nexport function isAbortError(err: unknown): boolean {\n if (err instanceof DOMException && err.code === DOMException.ABORT_ERR) return true;\n if (err instanceof Error && err.name === 'AbortError') return true;\n return false;\n}\n\nexport function isAbortSignal(signal: unknown): signal is AbortSignal {\n return signal instanceof AbortSignal;\n}\n\nexport function isSignalAborted(signal: AbortSignal | undefined): boolean {\n return signal?.aborted === true;\n}\n","\nimport { PRUNA_BASE_URL, PRUNA_FILES_URL } from '../constants/network';\nimport { HTTPS_PREFIX, HTTP_PREFIX } from '../constants/network';\n\nexport function isAbsoluteHttpUrl(value: string): boolean {\n return value.startsWith(HTTPS_PREFIX) || value.startsWith(HTTP_PREFIX);\n}\n\nexport function isHttpsUrl(value: string): boolean {\n return value.startsWith(HTTPS_PREFIX);\n}\n\nexport function buildPrunaApiUrl(pathOrUrl: string): string {\n if (isAbsoluteHttpUrl(pathOrUrl)) return pathOrUrl;\n return `${PRUNA_BASE_URL}${pathOrUrl}`;\n}\n\nexport function buildFileUrlById(fileId: string): string {\n return `${PRUNA_FILES_URL}/${fileId}`;\n}\n","\nimport { POLL_DEFAULTS } from '../constants/limits';\n\nexport interface BackoffInputs {\n attempt: number;\n baseIntervalMs: number;\n maxIntervalMs?: number;\n jitterPercent?: number;\n growthBase?: number;\n}\n\nexport function calculateExponentialBackoff(inputs: BackoffInputs): number {\n const {\n attempt,\n baseIntervalMs,\n maxIntervalMs = POLL_DEFAULTS.maxIntervalMs,\n jitterPercent = POLL_DEFAULTS.jitterPercent,\n growthBase = POLL_DEFAULTS.backoffBase,\n } = inputs;\n\n const safeAttempt = Math.max(0, attempt);\n const safeBase = Math.max(0, baseIntervalMs);\n const exponentialDelay = Math.min(safeBase * Math.pow(growthBase, safeAttempt), maxIntervalMs);\n const jitter = exponentialDelay * jitterPercent * Math.random();\n return exponentialDelay + jitter;\n}\n","\nimport { PRUNA_BASE_URL, BASE64_MARKER } from '../constants';\nimport type { PrunaPredictionResponse } from '../entities/types';\nimport { isTerminalSuccessStatus } from '../protocol/job-status';\nimport { isHttpsUrl } from '../protocol/pruna-url-builder';\n\ninterface UrlOutput {\n url: string;\n}\n\ntype PredictionOutput =\n | string\n | UrlOutput\n | readonly string[]\n | null\n | undefined;\n\nconst uriCache = new WeakMap<PrunaPredictionResponse, string | null>();\n\nexport function stripBase64Prefix(image: string): string {\n if (isHttpsUrl(image)) return image;\n const base64Index = image.indexOf(BASE64_MARKER);\n return base64Index !== -1 ? image.slice(base64Index + BASE64_MARKER.length) : image;\n}\n\nfunction readOutput(output: PredictionOutput): string | null {\n if (typeof output === 'string') return output;\n if (Array.isArray(output) && output.length > 0) return output[0] ?? null;\n if (output !== null && typeof output === 'object' && 'url' in output) {\n return output.url;\n }\n return null;\n}\n\nexport function extractUri(data: PrunaPredictionResponse): string | null {\n const cached = uriCache.get(data);\n if (cached !== undefined) return cached;\n\n if (!isTerminalSuccessStatus(data.status)) {\n uriCache.set(data, null);\n return null;\n }\n\n const result =\n data.generation_url ??\n readOutput(data.output as PredictionOutput) ??\n data.video_url ??\n data.data ??\n null;\n\n uriCache.set(data, result);\n return result;\n}\n\nexport function resolveUri(uri: string): string {\n return uri.startsWith('/') ? `${PRUNA_BASE_URL}${uri}` : uri;\n}\n","\nimport type {\n PrunaModelId,\n PrunaPredictionResponse,\n PrunaFileUploadResponse,\n GenerationStage,\n} from '../entities/types';\nimport {\n PRUNA_FILES_URL,\n PRUNA_PREDICTIONS_URL,\n HTTP_PREFIX,\n POLL_DEFAULTS,\n MIME_FILE_EXTENSION,\n} from '../constants';\nimport { base64ToBytes } from '../utils/base64';\nimport { detectImageMime } from '../utils/mime-detector';\nimport { parseApiError } from '../utils/api-error-parser';\nimport { CancellationError } from '../errors/cancellation-error';\nimport { AuthenticationError } from '../errors/authentication-error';\nimport { TimeoutError } from '../errors/timeout-error';\nimport { isAuthFailureStatus } from '../protocol/http-status';\nimport { isTerminalSuccessStatus, isTerminalFailureStatus } from '../protocol/job-status';\nimport { isAbortError } from '../protocol/abort-signal-classifier';\nimport {\n buildPrunaApiUrl,\n buildFileUrlById,\n isHttpsUrl,\n isAbsoluteHttpUrl,\n} from '../protocol/pruna-url-builder';\nimport { calculateExponentialBackoff } from '../math/exponential-backoff';\nimport { extractUri, resolveUri, stripBase64Prefix } from '../utils/uri-resolver';\n\ninterface UploadInit {\n method: 'POST';\n headers: Record<string, string>;\n body: FormData;\n}\n\nfunction buildFileExtension(mime: string): string {\n return MIME_FILE_EXTENSION[mime] ?? 'bin';\n}\n\n\nexport async function uploadImage(\n base64OrUrl: string,\n apiKey: string,\n onProgress?: (stage: GenerationStage) => void,\n): Promise<string> {\n if (isHttpsUrl(base64OrUrl)) return base64OrUrl;\n if (base64OrUrl.startsWith(HTTP_PREFIX)) {\n throw new Error('Only HTTPS URLs are supported for security.');\n }\n\n onProgress?.('uploading');\n\n const raw = stripBase64Prefix(base64OrUrl);\n\n let bytes: Uint8Array;\n try {\n bytes = base64ToBytes(raw);\n } catch {\n throw new Error('Invalid image format. Provide base64 or a valid HTTPS URL.');\n }\n\n const mime = detectImageMime(bytes);\n const buffer = bytes.buffer.slice(\n bytes.byteOffset,\n bytes.byteOffset + bytes.byteLength,\n ) as ArrayBuffer;\n const blob = new Blob([buffer], { type: mime });\n const formData = new FormData();\n formData.append('content', blob, `upload.${buildFileExtension(mime)}`);\n\n const res = await fetch(PRUNA_FILES_URL, {\n method: 'POST',\n headers: { apikey: apiKey },\n body: formData,\n } satisfies UploadInit as RequestInit);\n\n if (!res.ok) {\n throw await parseApiError(res, 'File upload error');\n }\n\n const data: PrunaFileUploadResponse = await res.json();\n return data.urls?.get ?? buildFileUrlById(data.id ?? '');\n}\n\n\nexport async function submitPrediction(\n model: PrunaModelId,\n input: Record<string, unknown>,\n apiKey: string,\n signal?: AbortSignal,\n onProgress?: (stage: GenerationStage) => void,\n): Promise<PrunaPredictionResponse> {\n onProgress?.('predicting');\n\n const res = await fetch(PRUNA_PREDICTIONS_URL, {\n method: 'POST',\n headers: {\n apikey: apiKey,\n Model: model,\n 'Try-Sync': 'true',\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ input }),\n signal,\n });\n\n if (!res.ok) {\n throw await parseApiError(res, 'API error');\n }\n\n return res.json();\n}\n\n\nexport class GenerationFailedError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'GenerationFailedError';\n }\n}\n\ninterface PollAttemptResult {\n outcome: 'succeeded' | 'continue' | 'transient-failure';\n uri?: string;\n}\n\nasync function attemptPoll(fullUrl: string, apiKey: string, signal: AbortSignal): Promise<PollAttemptResult> {\n let res: Response;\n try {\n res = await fetch(fullUrl, { headers: { apikey: apiKey }, signal });\n } catch (err) {\n if (isAbortError(err)) throw new CancellationError();\n return { outcome: 'transient-failure' };\n }\n\n if (!res.ok) {\n if (isAuthFailureStatus(res.status)) throw new AuthenticationError();\n return { outcome: 'transient-failure' };\n }\n\n let data: PrunaPredictionResponse;\n try {\n data = await res.json();\n } catch {\n return { outcome: 'transient-failure' };\n }\n\n if (isTerminalSuccessStatus(data.status)) {\n const uri = extractUri(data);\n if (uri) return { outcome: 'succeeded', uri: resolveUri(uri) };\n return { outcome: 'transient-failure' };\n }\n\n if (isTerminalFailureStatus(data.status)) {\n throw new GenerationFailedError(data.error ?? 'Generation failed during processing.');\n }\n\n return { outcome: 'continue' };\n}\n\nexport async function pollForResult(\n pollUrl: string,\n apiKey: string,\n maxAttempts: number = POLL_DEFAULTS.maxAttempts,\n intervalMs: number = POLL_DEFAULTS.intervalMs,\n signal?: AbortSignal,\n onProgress?: (stage: GenerationStage, attempt: number) => void,\n): Promise<string> {\n const fullUrl = isAbsoluteHttpUrl(pollUrl) ? pollUrl : buildPrunaApiUrl(pollUrl);\n const controller = new AbortController();\n const onExternalAbort = (): void => controller.abort();\n signal?.addEventListener('abort', onExternalAbort);\n\n try {\n for (let i = 0; i < maxAttempts; i++) {\n if (signal?.aborted) throw new CancellationError();\n\n const delay = calculateExponentialBackoff({ attempt: i, baseIntervalMs: intervalMs });\n await new Promise<void>(resolve => setTimeout(resolve, delay));\n\n if (signal?.aborted) throw new CancellationError();\n\n onProgress?.('polling', i + 1);\n\n const result = await attemptPoll(fullUrl, apiKey, controller.signal);\n if (result.outcome === 'succeeded' && result.uri) {\n return result.uri;\n }\n }\n\n throw new TimeoutError();\n } finally {\n signal?.removeEventListener('abort', onExternalAbort);\n controller.abort();\n }\n}\n","\nfunction sortKeysDeep(value: unknown): unknown {\n if (Array.isArray(value)) {\n return value.map(sortKeysDeep);\n }\n if (value !== null && typeof value === 'object') {\n const record = value as Record<string, unknown>;\n return Object.keys(record)\n .sort()\n .reduce<Record<string, unknown>>((acc, key) => {\n acc[key] = sortKeysDeep(record[key]);\n return acc;\n }, {});\n }\n return value;\n}\n\nexport function hashValue(value: unknown): string {\n if (value === null || typeof value !== 'object') {\n return String(value);\n }\n\n try {\n return JSON.stringify(sortKeysDeep(value));\n } catch {\n return String(value);\n }\n}\n\nexport function compositeHash(...values: unknown[]): string {\n return values.map(hashValue).join('|');\n}\n","\nimport { compositeHash, hashValue } from './comparison-hash';\n\nexport interface RequestSignature {\n method: string;\n url: string;\n body?: Record<string, unknown>;\n}\n\nexport function deriveRequestDeduplicationKey(signature: RequestSignature): string {\n const bodyHash = signature.body ? hashValue(signature.body) : '';\n return `${signature.method}:${signature.url}:${bodyHash}`;\n}\n\nexport function deriveGenerationCacheKey(apiKey: string, input: Record<string, unknown>): string {\n return `${apiKey}:${compositeHash(input)}`;\n}\n","\nimport { MAX_API_KEY_LENGTH, MIN_API_KEY_LENGTH } from '../constants/network';\nimport { ValidationError } from '../errors/validation-error';\n\nexport function assertValidApiKey(apiKey: unknown): asserts apiKey is string {\n if (typeof apiKey !== 'string') {\n throw new ValidationError({\n field: 'apiKey',\n reason: 'must be a string',\n receivedValue: typeof apiKey,\n });\n }\n if (apiKey.length < MIN_API_KEY_LENGTH) {\n throw new ValidationError({\n field: 'apiKey',\n reason: 'must not be empty',\n receivedValue: apiKey,\n });\n }\n if (apiKey.length > MAX_API_KEY_LENGTH) {\n throw new ValidationError({\n field: 'apiKey',\n reason: `exceeds maximum length of ${MAX_API_KEY_LENGTH}`,\n receivedValue: apiKey.length,\n });\n }\n}\n","\nimport { BASE64_MARKER, HTTP_PREFIX, HTTPS_PREFIX } from '../constants/network';\nimport { ValidationError } from '../errors/validation-error';\n\nexport type ImageSourceKind = 'https-url' | 'http-url' | 'base64' | 'unknown';\n\nexport function classifyImageSource(source: string): ImageSourceKind {\n if (source.startsWith(HTTPS_PREFIX)) return 'https-url';\n if (source.startsWith(HTTP_PREFIX)) return 'http-url';\n if (source.includes(BASE64_MARKER) || /^[A-Za-z0-9+/=]+$/.test(source)) return 'base64';\n return 'unknown';\n}\n\nexport function assertSecureImageSource(image: unknown, fieldName: string = 'image'): asserts image is string {\n if (typeof image !== 'string') {\n throw new ValidationError({\n field: fieldName,\n reason: 'must be a string',\n receivedValue: typeof image,\n });\n }\n const kind = classifyImageSource(image);\n if (kind === 'http-url') {\n throw new ValidationError({\n field: fieldName,\n reason: 'HTTP URLs are not supported; use HTTPS or a base64 data URI',\n receivedValue: image,\n });\n }\n if (kind === 'unknown') {\n throw new ValidationError({\n field: fieldName,\n reason: 'must be an HTTPS URL or a base64 data URI',\n receivedValue: typeof image,\n });\n }\n}\n","\nimport type { PrunaAspectRatio } from '../entities/types';\nimport { ValidationError } from '../errors/validation-error';\n\nexport const SUPPORTED_ASPECT_RATIOS: readonly PrunaAspectRatio[] = [\n '16:9',\n '9:16',\n '1:1',\n '4:3',\n '3:4',\n '3:2',\n '2:3',\n] as const;\n\nexport function isSupportedAspectRatio(value: unknown): value is PrunaAspectRatio {\n return typeof value === 'string'\n && (SUPPORTED_ASPECT_RATIOS as readonly string[]).includes(value);\n}\n\nexport function assertValidAspectRatio(\n value: unknown,\n fieldName: string = 'aspect_ratio',\n): asserts value is PrunaAspectRatio {\n if (value === undefined || value === null) return;\n if (!isSupportedAspectRatio(value)) {\n throw new ValidationError({\n field: fieldName,\n reason: `must be one of ${SUPPORTED_ASPECT_RATIOS.join(', ')}`,\n receivedValue: value,\n });\n }\n}\n","\nimport type { PrunaResolution } from '../entities/types';\nimport { ValidationError } from '../errors/validation-error';\n\nexport const SUPPORTED_RESOLUTIONS: readonly PrunaResolution[] = ['720p', '1080p'] as const;\n\nexport function isSupportedResolution(value: unknown): value is PrunaResolution {\n return typeof value === 'string'\n && (SUPPORTED_RESOLUTIONS as readonly string[]).includes(value);\n}\n\nexport function assertValidResolution(\n value: unknown,\n fieldName: string = 'resolution',\n): asserts value is PrunaResolution {\n if (value === undefined || value === null) return;\n if (!isSupportedResolution(value)) {\n throw new ValidationError({\n field: fieldName,\n reason: `must be one of ${SUPPORTED_RESOLUTIONS.join(', ')}`,\n receivedValue: value,\n });\n }\n}\n","\nimport { ValidationError } from '../errors/validation-error';\n\nexport const MIN_VIDEO_DURATION_SECONDS = 1;\nexport const MAX_VIDEO_DURATION_SECONDS = 30;\n\nexport function isValidDuration(value: unknown): value is number {\n return typeof value === 'number'\n && Number.isFinite(value)\n && value >= MIN_VIDEO_DURATION_SECONDS\n && value <= MAX_VIDEO_DURATION_SECONDS\n && Number.isInteger(value);\n}\n\nexport function assertValidDuration(\n value: unknown,\n fieldName: string = 'duration',\n): asserts value is number {\n if (value === undefined || value === null) return;\n if (!isValidDuration(value)) {\n throw new ValidationError({\n field: fieldName,\n reason: `must be an integer between ${MIN_VIDEO_DURATION_SECONDS} and ${MAX_VIDEO_DURATION_SECONDS} seconds`,\n receivedValue: value,\n });\n }\n}\n","\nimport { ValidationError } from '../errors/validation-error';\n\nexport const MIN_PROMPT_LENGTH = 1;\nexport const MAX_PROMPT_LENGTH = 4000;\n\nexport function isValidPrompt(value: unknown): value is string {\n return typeof value === 'string'\n && value.length >= MIN_PROMPT_LENGTH\n && value.length <= MAX_PROMPT_LENGTH\n && value.trim().length > 0;\n}\n\nexport function assertValidPrompt(\n value: unknown,\n fieldName: string = 'prompt',\n): asserts value is string {\n if (typeof value !== 'string') {\n throw new ValidationError({\n field: fieldName,\n reason: 'must be a string',\n receivedValue: typeof value,\n });\n }\n if (value.trim().length < MIN_PROMPT_LENGTH) {\n throw new ValidationError({\n field: fieldName,\n reason: 'must not be empty or whitespace-only',\n receivedValue: value,\n });\n }\n if (value.length > MAX_PROMPT_LENGTH) {\n throw new ValidationError({\n field: fieldName,\n reason: `exceeds maximum length of ${MAX_PROMPT_LENGTH} characters`,\n receivedValue: value.length,\n });\n }\n}\n","\nimport { ValidationError } from '../errors/validation-error';\n\nexport const MIN_SEED = -2_147_483_648;\nexport const MAX_SEED = 2_147_483_647;\n\nexport function isValidSeed(value: unknown): value is number {\n return typeof value === 'number'\n && Number.isFinite(value)\n && Number.isInteger(value)\n && value >= MIN_SEED\n && value <= MAX_SEED;\n}\n\nexport function assertValidSeed(\n value: unknown,\n fieldName: string = 'seed',\n): asserts value is number {\n if (value === undefined || value === null) return;\n if (!isValidSeed(value)) {\n throw new ValidationError({\n field: fieldName,\n reason: `must be an integer in [${MIN_SEED}, ${MAX_SEED}]`,\n receivedValue: value,\n });\n }\n}\n","\nimport type {\n PrunaInput,\n TextToImageInput,\n ImageToImageInput,\n ImageToVideoInput,\n TextToVideoInput,\n} from '../entities/types';\n\nexport function isTextToImageInput(input: PrunaInput): input is TextToImageInput {\n return input.model === 'p-image';\n}\n\nexport function isImageToImageInput(input: PrunaInput): input is ImageToImageInput {\n return input.model === 'p-image-edit';\n}\n\nexport function isImageToVideoInput(input: PrunaInput): input is ImageToVideoInput {\n return input.model === 'p-video';\n}\n\nexport function isImageGenerationModel(model: PrunaInput['model']): boolean {\n return model === 'p-image' || model === 'p-image-edit';\n}\n\nexport function isVideoGenerationModel(model: PrunaInput['model']): boolean {\n return model === 'p-video';\n}\n\nexport function isTextToVideoPipeline(input: unknown): input is TextToVideoInput {\n return typeof input === 'object'\n && input !== null\n && 'prompt' in input\n && !('model' in input);\n}\n","\nimport { DEFAULT_DEDUPLICATOR_TTL_MS, DEDUPLICATOR_CLEANUP_GRACE_MS } from '../constants/limits';\nimport { deriveRequestDeduplicationKey } from '../math/cache-key-derivation';\nimport type { RequestSignature } from '../math/cache-key-derivation';\n\ninterface PendingRequest {\n promise: Promise<unknown>;\n timestamp: number;\n}\n\nexport class RequestDeduplicator {\n private readonly pendingRequests = new Map<string, PendingRequest>();\n private readonly ttl: number;\n\n constructor(ttl: number = DEFAULT_DEDUPLICATOR_TTL_MS) {\n this.ttl = ttl;\n }\n\n execute<T>(key: string, fn: () => Promise<T>): Promise<T> {\n const existing = this.pendingRequests.get(key);\n if (existing) {\n if (Date.now() - existing.timestamp < this.ttl) {\n return existing.promise as Promise<T>;\n }\n this.pendingRequests.delete(key);\n }\n\n const promise = fn().finally(() => {\n setTimeout(() => {\n this.pendingRequests.delete(key);\n }, DEDUPLICATOR_CLEANUP_GRACE_MS);\n });\n\n this.pendingRequests.set(key, { promise, timestamp: Date.now() });\n return promise;\n }\n\n clear(): void {\n this.pendingRequests.clear();\n }\n\n size(): number {\n this.purgeExpired();\n return this.pendingRequests.size;\n }\n\n private purgeExpired(): void {\n const now = Date.now();\n for (const [key, value] of this.pendingRequests) {\n if (now - value.timestamp >= this.ttl) {\n this.pendingRequests.delete(key);\n }\n }\n }\n}\n\nexport const globalDeduplicator = new RequestDeduplicator();\n\nexport function createDeduplicationKey(\n method: string,\n url: string,\n body?: Record<string, unknown>,\n): string {\n const signature: RequestSignature = { method, url, body };\n return deriveRequestDeduplicationKey(signature);\n}\n","\nimport { DEFAULT_ASPECT_RATIO } from '../../core/constants';\nimport type { TextToImageInput } from '../../core/entities/types';\nimport type {\n ModelInputBuilder,\n ModelInputBuildContext,\n} from './model-input-builder';\n\nexport class TextToImageInputBuilder implements ModelInputBuilder<TextToImageInput> {\n readonly model = 'p-image' as const;\n\n build(\n input: TextToImageInput,\n _context: ModelInputBuildContext,\n ): Promise<Record<string, unknown>> {\n const payload: Record<string, unknown> = {\n prompt: input.prompt,\n aspect_ratio: input.aspect_ratio ?? DEFAULT_ASPECT_RATIO,\n };\n\n if (input.seed !== undefined) {\n payload.seed = input.seed;\n }\n\n return Promise.resolve(payload);\n }\n}\n","\nimport { DEFAULT_ASPECT_RATIO } from '../../core/constants';\nimport type { ImageToImageInput } from '../../core/entities/types';\nimport { stripBase64Prefix } from '../../core/utils/uri-resolver';\nimport type {\n ModelInputBuilder,\n ModelInputBuildContext,\n} from './model-input-builder';\n\nexport class ImageToImageInputBuilder implements ModelInputBuilder<ImageToImageInput> {\n readonly model = 'p-image-edit' as const;\n\n build(\n input: ImageToImageInput,\n _context: ModelInputBuildContext,\n ): Promise<Record<string, unknown>> {\n const payload: Record<string, unknown> = {\n images: [stripBase64Prefix(input.image)],\n prompt: input.prompt,\n aspect_ratio: input.aspect_ratio ?? DEFAULT_ASPECT_RATIO,\n };\n\n if (input.seed !== undefined) {\n payload.seed = input.seed;\n }\n\n return Promise.resolve(payload);\n }\n}\n","\nimport { DEFAULT_ASPECT_RATIO, P_VIDEO_DEFAULTS } from '../../core/constants';\nimport type { ImageToVideoInput } from '../../core/entities/types';\nimport { CancellationError } from '../../core/errors/cancellation-error';\nimport { uploadImage } from '../../core/services/pruna-client.service';\nimport type {\n ModelInputBuilder,\n ModelInputBuildContext,\n} from './model-input-builder';\n\nexport class ImageToVideoInputBuilder implements ModelInputBuilder<ImageToVideoInput> {\n readonly model = 'p-video' as const;\n\n async build(\n input: ImageToVideoInput,\n context: ModelInputBuildContext,\n ): Promise<Record<string, unknown>> {\n if (context.signal?.aborted) {\n throw new CancellationError();\n }\n\n const fileUrl = await uploadImage(\n input.image,\n context.apiKey,\n context.onProgress,\n );\n\n return {\n image: fileUrl,\n prompt: input.prompt,\n duration: input.duration ?? P_VIDEO_DEFAULTS.duration,\n resolution: input.resolution ?? P_VIDEO_DEFAULTS.resolution,\n fps: P_VIDEO_DEFAULTS.fps,\n draft: input.draft ?? P_VIDEO_DEFAULTS.draft,\n aspect_ratio: input.aspect_ratio ?? DEFAULT_ASPECT_RATIO,\n prompt_upsampling: P_VIDEO_DEFAULTS.promptUpsampling,\n };\n }\n}\n","\nimport type {\n PrunaInput,\n GenerateOptions,\n} from '../../core/entities/types';\nimport { isCancellationError } from '../../core/errors/cancellation-error';\n\nexport interface ModelInputBuildContext {\n apiKey: string;\n signal?: AbortSignal;\n onProgress?: GenerateOptions['onProgress'];\n}\n\nexport interface ModelInputBuilder<T extends PrunaInput = PrunaInput> {\n readonly model: T['model'];\n build(input: T, context: ModelInputBuildContext): Promise<Record<string, unknown>>;\n}\n\nexport class ModelInputBuilderRegistry {\n private readonly builders = new Map<PrunaInput['model'], ModelInputBuilder>();\n\n register(builder: ModelInputBuilder): this {\n this.builders.set(builder.model, builder);\n return this;\n }\n\n resolve(model: PrunaInput['model']): ModelInputBuilder {\n const builder = this.builders.get(model);\n if (!builder) {\n throw new Error(`No input builder registered for model: ${model}`);\n }\n return builder;\n }\n}\n\nexport { isCancellationError };\n","\nimport type { PrunaInput } from '../../core/entities/types';\nimport { TextToImageInputBuilder } from './text-to-image.builder';\nimport { ImageToImageInputBuilder } from './image-to-image.builder';\nimport { ImageToVideoInputBuilder } from './image-to-video.builder';\nimport { ModelInputBuilderRegistry } from './model-input-builder';\n\nexport function createDefaultBuilderRegistry(): ModelInputBuilderRegistry {\n return new ModelInputBuilderRegistry()\n .register(new TextToImageInputBuilder())\n .register(new ImageToImageInputBuilder())\n .register(new ImageToVideoInputBuilder());\n}\n\nexport type AnyModelInputBuilder =\n | TextToImageInputBuilder\n | ImageToImageInputBuilder\n | ImageToVideoInputBuilder;\n\nexport type { PrunaInput };\n","\nimport type {\n PrunaInput,\n PrunaResult,\n TextToVideoInput,\n GenerateOptions,\n} from '../../core/entities/types';\nimport { DEFAULT_ASPECT_RATIO, P_VIDEO_DEFAULTS, POLL_DEFAULTS } from '../../core/constants';\nimport { submitPrediction, pollForResult } from '../../core/services/pruna-client.service';\nimport { extractUri, resolveUri } from '../../core/utils/uri-resolver';\nimport { globalDeduplicator } from '../../core/utils/request-deduplicator';\nimport { assertValidApiKey } from '../../core/validation/api-key-validator';\nimport { assertValidAspectRatio } from '../../core/validation/aspect-ratio-validator';\nimport { assertValidDuration } from '../../core/validation/duration-validator';\nimport { assertValidResolution } from '../../core/validation/resolution-validator';\nimport { assertSecureImageSource } from '../../core/validation/image-source-validator';\nimport { assertValidPrompt } from '../../core/validation/prompt-validator';\nimport { assertValidSeed } from '../../core/validation/seed-validator';\nimport {\n isTextToImageInput,\n isImageToImageInput,\n isImageToVideoInput,\n} from '../../core/protocol/input-type-guard';\nimport { isTerminalSuccessStatus } from '../../core/protocol/job-status';\nimport { deriveGenerationCacheKey } from '../../core/math/cache-key-derivation';\nimport { createDefaultBuilderRegistry } from '../builders/builder-factory';\nimport type { ModelInputBuilderRegistry } from '../builders/model-input-builder';\n\nconst builderRegistry: ModelInputBuilderRegistry = createDefaultBuilderRegistry();\n\nfunction validateGenerateInput(input: PrunaInput): void {\n assertValidPrompt(input.prompt, `${input.model}.prompt`);\n assertValidAspectRatio(input.aspect_ratio, `${input.model}.aspect_ratio`);\n\n if (isTextToImageInput(input)) {\n assertValidSeed(input.seed, `${input.model}.seed`);\n } else if (isImageToImageInput(input)) {\n assertSecureImageSource(input.image, `${input.model}.image`);\n assertValidSeed(input.seed, `${input.model}.seed`);\n } else if (isImageToVideoInput(input)) {\n assertSecureImageSource(input.image, `${input.model}.image`);\n assertValidDuration(input.duration, `${input.model}.duration`);\n assertValidResolution(input.resolution, `${input.model}.resolution`);\n }\n}\n\nexport async function generate(\n apiKey: string,\n input: PrunaInput,\n options: GenerateOptions & { useCache?: boolean } = {},\n): Promise<PrunaResult> {\n assertValidApiKey(apiKey);\n validateGenerateInput(input);\n\n const { signal, onProgress, useCache = true } = options;\n\n if (useCache) {\n const cacheKey = deriveGenerationCacheKey(apiKey, input as unknown as Record<string, unknown>);\n return globalDeduplicator.execute(cacheKey, () =>\n generateInternal(apiKey, input, { signal, onProgress }),\n );\n }\n\n return generateInternal(apiKey, input, { signal, onProgress });\n}\n\nasync function generateInternal(\n apiKey: string,\n input: PrunaInput,\n options: GenerateOptions,\n): Promise<PrunaResult> {\n const { signal, onProgress } = options;\n const builder = builderRegistry.resolve(input.model);\n const modelInput = await builder.build(input, { apiKey, signal, onProgress });\n\n const response = await submitPrediction(input.model, modelInput, apiKey, signal, onProgress);\n\n const syncUri = extractUri(response);\n if (syncUri) {\n return { url: resolveUri(syncUri), model: input.model };\n }\n\n const pollUrl = response.get_url ?? response.status_url;\n if (!pollUrl) {\n throw new Error('Pruna API returned no result and no polling URL.');\n }\n\n const url = await pollForResult(\n pollUrl,\n apiKey,\n POLL_DEFAULTS.maxAttempts,\n POLL_DEFAULTS.intervalMs,\n signal,\n onProgress,\n );\n\n return { url, model: input.model };\n}\n\nexport async function generateImageThenVideo(\n apiKey: string,\n input: TextToVideoInput,\n options: GenerateOptions = {},\n): Promise<PrunaResult> {\n assertValidApiKey(apiKey);\n assertValidPrompt(input.prompt, 'text-to-video.prompt');\n assertValidAspectRatio(input.aspect_ratio, 'text-to-video.aspect_ratio');\n assertValidDuration(input.duration, 'text-to-video.duration');\n assertValidResolution(input.resolution, 'text-to-video.resolution');\n\n const { signal, onProgress } = options;\n const aspectRatio = input.aspect_ratio ?? DEFAULT_ASPECT_RATIO;\n\n onProgress?.('predicting', 1);\n const imageResult = await generate(\n apiKey,\n { model: 'p-image', prompt: input.prompt, aspect_ratio: aspectRatio },\n { signal },\n );\n\n onProgress?.('predicting', 2);\n return generate(\n apiKey,\n {\n model: 'p-video',\n prompt: input.prompt,\n image: imageResult.url,\n duration: input.duration ?? P_VIDEO_DEFAULTS.duration,\n resolution: input.resolution ?? P_VIDEO_DEFAULTS.resolution,\n aspect_ratio: aspectRatio,\n draft: input.draft ?? P_VIDEO_DEFAULTS.draft,\n },\n { signal, onProgress },\n );\n}\n\nexport { isTerminalSuccessStatus };\n","import type {\n PrunaInput,\n GenerationStage,\n PrunaModelId,\n PrunaAspectRatio,\n PrunaResolution,\n} from './client';\nimport { generate, generateImageThenVideo } from './client';\n\nexport interface PrunaRequest {\n model?: string;\n image?: string;\n prompt?: string;\n quality?: string;\n duration?: number;\n aspectRatio?: string;\n aspect_ratio?: string;\n motion?: number | string;\n resolution?: string;\n seed?: number;\n [key: string]: unknown;\n}\n\nexport interface PrunaProgressStage {\n stage: 'uploading' | 'processing' | 'polling' | 'predicting';\n result?: { url: string; model?: string };\n error?: Error;\n}\n\nexport interface PrunaCore {\n generate?: typeof generate;\n generateImageThenVideo?: typeof generateImageThenVideo;\n}\n\nexport async function* generateWithPruna(\n request: PrunaRequest,\n apiKey: string,\n signal?: AbortSignal,\n onProgress?: (stage: PrunaProgressStage['stage'], attempt?: number) => void,\n): AsyncGenerator<PrunaProgressStage> {\n const stages: PrunaProgressStage[] = [];\n let notify: (() => void) | null = null;\n let done = false;\n\n const wake = (): void => {\n const fn = notify;\n if (fn) {\n notify = null;\n fn();\n }\n };\n\n const handleProgress = (stage: GenerationStage) => {\n stages.push({ stage });\n onProgress?.(stage);\n wake();\n };\n\n const promise = (async () => {\n try {\n const model =\n (request.model as PrunaModelId | undefined) ??\n (request.image ? 'p-image-edit' : 'p-image');\n\n if (model === 'p-video' && !request.image && request.prompt) {\n // Text to video pipeline\n const videoRes = await generateImageThenVideo(\n apiKey,\n {\n prompt: request.prompt,\n duration: request.duration ?? 5,\n aspect_ratio: (request.aspectRatio ?? request.aspect_ratio ?? '16:9') as PrunaAspectRatio,\n },\n { signal, onProgress: handleProgress },\n );\n stages.push({\n stage: 'polling',\n result: { url: videoRes.url, model: 'p-video' },\n });\n return;\n }\n\n const input = {\n model,\n prompt: (request.prompt as string) ?? '',\n aspect_ratio: (request.aspectRatio ?? request.aspect_ratio ?? '1:1') as PrunaAspectRatio,\n ...(request.image ? { image: request.image as string } : {}),\n ...(request.duration ? { duration: request.duration as number } : {}),\n ...(request.resolution ? { resolution: request.resolution as PrunaResolution } : {}),\n ...(request.seed !== undefined ? { seed: request.seed as number } : {}),\n } as PrunaInput;\n\n const res = await generate(apiKey, input, {\n signal,\n onProgress: handleProgress,\n });\n\n stages.push({\n stage: 'polling',\n result: { url: res.url, model: res.model },\n });\n } catch (err) {\n stages.push({\n stage: 'processing',\n error: err instanceof Error ? err : new Error(String(err)),\n });\n } finally {\n done = true;\n wake();\n }\n })();\n\n while (!done || stages.length > 0) {\n if (stages.length === 0 && !done) {\n await new Promise<void>((resolve) => {\n notify = resolve;\n });\n notify = null;\n }\n while (stages.length > 0) {\n const nextStage = stages.shift();\n if (!nextStage) continue;\n yield nextStage;\n if (nextStage.error) {\n throw nextStage.error;\n }\n }\n }\n\n await promise;\n}\n","\nimport type {\n GeneratedContent,\n PrunaConfig,\n ImageGenerationRequest,\n VideoGenerationRequest,\n ImageToVideoRequest,\n VideoToVideoRequest,\n} from '../../content/domain/config/ProviderConfig';\nimport type { ProviderHealth } from '../../core/types';\nimport type { CostEstimateRequest, IMediaProvider } from '../base/provider.types';\nimport { AIError, AIErrorType } from '../../core/errors';\nimport { generateWithPruna } from './pruna-generate';\nexport { generateWithPruna } from './pruna-generate';\nexport type {\n PrunaRequest,\n PrunaProgressStage,\n PrunaCore,\n} from './pruna-generate';\n\n/**\n * Pruna media provider: supports text-to-image, text-to-video, and\n * image-to-video generation through the @umituz/pruna-provider client.\n */\nexport class PrunaProvider implements IMediaProvider {\n readonly id = 'pruna';\n readonly name = 'Pruna AI';\n readonly capabilities = ['image', 'video'] as const;\n\n constructor(readonly config: PrunaConfig) {}\n\n async healthCheck(): Promise<ProviderHealth> {\n return this.config.apiKey ? 'healthy' : 'unavailable';\n }\n\n async estimateCost(_request: CostEstimateRequest): Promise<number> {\n return 1;\n }\n\n async generateImage(request: ImageGenerationRequest): Promise<GeneratedContent> {\n let finalUrl: string | undefined;\n const model = this.config.models?.textToImage;\n for await (const stage of generateWithPruna(\n { prompt: request.prompt, model, quality: request.quality },\n this.config.apiKey,\n )) {\n if (stage.error) throw stage.error;\n if (stage.result?.url) finalUrl = stage.result.url;\n }\n if (!finalUrl) {\n throw new AIError(AIErrorType.SERVER_ERROR, 'No image generated by Pruna AI');\n }\n return {\n id: Date.now().toString(),\n type: 'image',\n url: finalUrl,\n metadata: { provider: this.id, model: model ?? 'p-image' },\n createdAt: new Date().toISOString(),\n };\n }\n\n async generateVideo(request: VideoGenerationRequest): Promise<GeneratedContent> {\n let finalUrl: string | undefined;\n const model = this.config.models?.textToVideo;\n for await (const stage of generateWithPruna(\n { prompt: request.prompt, model, duration: request.duration, aspectRatio: request.aspectRatio },\n this.config.apiKey,\n )) {\n if (stage.error) throw stage.error;\n if (stage.result?.url) finalUrl = stage.result.url;\n }\n if (!finalUrl) {\n throw new AIError(AIErrorType.SERVER_ERROR, 'No video generated by Pruna AI');\n }\n return {\n id: Date.now().toString(),\n type: 'video',\n url: finalUrl,\n metadata: { provider: this.id, model: model ?? 'p-video' },\n createdAt: new Date().toISOString(),\n };\n }\n\n async imageToVideo(request: ImageToVideoRequest): Promise<GeneratedContent> {\n let finalUrl: string | undefined;\n for await (const stage of generateWithPruna(\n { image: request.imageUrl, prompt: request.prompt, duration: request.duration, motion: request.motion },\n this.config.apiKey,\n )) {\n if (stage.error) throw stage.error;\n if (stage.result?.url) finalUrl = stage.result.url;\n }\n if (!finalUrl) {\n throw new AIError(AIErrorType.SERVER_ERROR, 'No video generated from image by Pruna AI');\n }\n return {\n id: Date.now().toString(),\n type: 'video',\n url: finalUrl,\n metadata: { provider: this.id, model: 'p-image-to-video' },\n createdAt: new Date().toISOString(),\n };\n }\n\n async videoToVideo(_request: VideoToVideoRequest): Promise<GeneratedContent> {\n throw new AIError(AIErrorType.CLIENT_ERROR, 'Pruna AI provider does not support video-to-video conversion');\n }\n}\n\nexport function createPrunaProvider(config: PrunaConfig): PrunaProvider {\n return new PrunaProvider(config);\n}\n","\nimport type { TextTier } from \"../../core/types\";\nimport { ProviderFactory } from \"./provider.factory\";\nimport { AnthropicProvider } from \"../anthropic/anthropic.provider\";\nimport type { AnthropicProviderConfig } from \"../anthropic/anthropic.entities\";\nimport { GroqProvider } from \"../groq/groq.provider\";\nimport type { GroqProviderConfig } from \"../groq/groq.entities\";\nimport { GeminiProvider } from \"../gemini/gemini.provider\";\nimport { FalProvider } from \"../fal/fal.provider\";\nimport { PrunaProvider } from \"../pruna/pruna.provider\";\nimport type {\n FalConfig,\n GeminiConfig,\n PrunaConfig,\n} from \"../../content/domain/config/ProviderConfig\";\n\n/**\n * Composition root for the whole package — replaces the old\n * `configureProvider()` singleton. A provider block's presence means the\n * provider is enabled; presence of its apiKey is what actually registers it.\n * `priority` decides who serves first; the fallback walk handles the rest.\n *\n * ```ts\n * const ai = createAI({\n * priority: ['anthropic', 'groq'],\n * defaultTier: 'balanced',\n * anthropic: { apiKey: env.ANTHROPIC_API_KEY },\n * groq: { apiKey: env.GROQ_API_KEY },\n * });\n * const { text, usage } = await ai.chat({ messages, systemPrompt });\n * ```\n */\nexport interface AIProviderConfig {\n /** Provider ids in preference order for every capability. */\n priority?: ReadonlyArray<string>;\n fallbackEnabled?: boolean;\n /** Tier used when a request names neither model nor tier. Default 'balanced'. */\n defaultTier?: TextTier;\n\n anthropic?: AnthropicProviderConfig;\n groq?: GroqProviderConfig;\n gemini?: Omit<GeminiConfig, \"enabled\">;\n fal?: Omit<FalConfig, \"enabled\">;\n pruna?: Omit<PrunaConfig, \"enabled\">;\n}\n\nexport function createAI(config: AIProviderConfig = {}): ProviderFactory {\n const factory = new ProviderFactory({\n priority: config.priority,\n fallbackEnabled: config.fallbackEnabled,\n defaultTier: config.defaultTier,\n });\n\n if (config.anthropic?.apiKey) {\n factory.register(new AnthropicProvider(config.anthropic));\n }\n if (config.groq?.apiKey) {\n factory.register(new GroqProvider(config.groq));\n }\n if (config.gemini?.apiKey) {\n factory.register(new GeminiProvider({ ...config.gemini, enabled: true } as GeminiConfig));\n }\n if (config.fal?.apiKey) {\n factory.register(new FalProvider({ ...config.fal, enabled: true } as FalConfig));\n }\n if (config.pruna?.apiKey) {\n factory.register(new PrunaProvider({ ...config.pruna, enabled: true } as PrunaConfig));\n }\n\n return factory;\n}\n","\nimport { estimateWordCountForDuration, estimateTokenBudgetForDuration } from '../../domain/calculations/SpeechPaceEstimate';\n\nexport class PromptBuilder {\n static blogPost(input: {\n topic: string;\n blogType: string;\n keywords: string[];\n tone: string;\n targetAudience: string;\n wordCount: number;\n language?: string;\n seoOptimization: boolean;\n includeSchema: boolean;\n includeImages: boolean;\n }): string {\n return `\nAs an expert SEO Content Strategist and Copywriter, generate a high-quality, comprehensive blog post.\n\nTOPIC: ${input.topic}\nTYPE: ${input.blogType}\nKEYWORDS: ${input.keywords.join(', ')}\nTONE: ${input.tone}\nTARGET AUDIENCE: ${input.targetAudience}\nWORD COUNT: ${input.wordCount}\nLANGUAGE: ${input.language || 'English'}\n\nOPTIMIZATION REQUIREMENTS:\n- SEO Optimization: ${input.seoOptimization ? 'ON (Include semantic keywords, LSI, and proper H1-H3 structure)' : 'OFF'}\n- Include Schema Markup: ${input.includeSchema ? 'ON (Generate JSON-LD for this blog type)' : 'OFF'}\n- Image Suggestions: ${input.includeImages ? 'ON (Provide DALL-E/Midjourney style prompts for contextually relevant images)' : 'OFF'}\n\nRESPONSE FORMAT (STRICT JSON ONLY):\n{\n \"title\": \"Compelling, Click-worthy Title\",\n \"content\": \"Full markdown-formatted blog content with headers\",\n \"metaDescription\": \"SEO-optimized description (150-160 chars)\",\n \"seoScore\": 0-100,\n \"readabilityScore\": 0-100,\n \"keywords\": [\"list\", \"of\", \"optimized\", \"keywords\"],\n \"performance\": {\n \"readingTime\": minutes (number),\n \"shareability\": 0-10 (number),\n \"seoRank\": 0-10 (number)\n },\n \"schemaMarkup\": \"JSON-LD string (if requested)\",\n \"imagePrompts\": [\"Prompt 1\", \"Prompt 2\"] (if requested)\n}\n`;\n }\n\n static socialPost(input: {\n topic: string;\n platform: string;\n tone: string;\n style: string;\n maxLength: number;\n includeHashtags: boolean;\n includeCallToAction: boolean;\n }): string {\n return `\nWrite a ${input.tone} social media post about: ${input.topic}\n\nPlatform: ${input.platform}\nStyle: ${input.style}\nMaximum length: ${input.maxLength} characters\n${input.includeHashtags ? 'Include relevant hashtags' : 'No hashtags'}\n${input.includeCallToAction ? 'Include a call-to-action' : ''}\n\nRequirements:\n- Platform-optimized formatting\n- Engaging hook in first sentence\n- Natural, conversational tone\n- Platform-appropriate emoji usage\n\nGenerate the post in JSON format:\n{\n \"content\": \"The post content\",\n \"hashtags\": [\"hashtag1\", \"hashtag2\"],\n \"emojis\": [\"emoji1\", \"emoji2\"],\n \"estimatedEngagement\": 0-100\n}\n`;\n }\n\n static videoScript(input: {\n topic: string;\n tone: string;\n duration: number;\n targetAudience: string;\n includeVisuals: boolean;\n includeCallToAction: boolean;\n }): string {\n return `\nCreate a ${input.tone} video script about: ${input.topic}\n\nDuration: ${input.duration} seconds\nTarget Audience: ${input.targetAudience}\nInclude Visual Cues: ${input.includeVisuals ? 'Yes' : 'No'}\nInclude CTA: ${input.includeCallToAction ? 'Yes' : 'No'}\n\nApproximate word count: ${estimateWordCountForDuration(input.duration)} words\n\nGenerate in JSON format:\n{\n \"script\": \"Full script with dialogue and narration\",\n \"visualCues\": [\"Visual cue 1\", \"Visual cue 2\"],\n \"callToAction\": \"Call to action text (if requested)\",\n \"estimatedEngagement\": 0-100\n}\n`;\n }\n\n static voiceScript(input: {\n topic: string;\n emotion: string;\n duration: number;\n }): string {\n return `\nCreate a ${input.emotion} voice script about: ${input.topic}\n\nDuration: ${input.duration} seconds\nEmotion: ${input.emotion}\n\nThe script should:\n- Evoke the specified emotion\n- Be suitable for voice recording with emotion control\n- Include natural speech patterns\n- Have appropriate pacing for the emotion\n- Include emotional cues in brackets where needed\n\nApproximate word count: ${estimateWordCountForDuration(input.duration)} words\n\nGenerate in JSON format:\n{\n \"script\": \"Full script with emotional cues\",\n \"visualCues\": [\"Visual cue 1\", \"Visual cue 2\"],\n \"estimatedEngagement\": 0-100\n}\n`;\n }\n\n static contentCalendar(niche: string, days: number): string {\n return `\nGenerate a ${days}-day content calendar for: ${niche}\n\nFor each day, provide:\n- Topic\n- Content type (blog, video, social, email, caption, script)\n- Best platform for this content\n- Brief description\n- Estimated engagement (0-100)\n- Priority level (high, medium, low)\n\nFormat as JSON array:\n[\n {\n \"day\": 1,\n \"topic\": \"...\",\n \"contentType\": \"blog|video|social|email|caption|script\",\n \"platform\": \"twitter|linkedin|instagram|threads|tiktok|facebook\",\n \"description\": \"...\",\n \"estimatedEngagement\": 0-100,\n \"priority\": \"high|medium|low\"\n }\n]\n\nRequirements:\n- Mix of content types across platforms\n- Platform-appropriate suggestions\n- Engaging, varied topics\n- Realistic posting schedule\n`;\n }\n\n static sentiment(content: string): string {\n return `\nAnalyze the sentiment of this social media post:\n\n\"${content}\"\n\nProvide analysis in JSON format:\n{\n \"sentiment\": \"positive|neutral|negative\",\n \"confidence\": 0-1,\n \"emotions\": [\n {\"emotion\": \"happy|excited|calm|sad|angry|surprised|fearful|disgusted|neutral\", \"score\": 0-1}\n ]\n}\n\nReturn only the JSON:\n`;\n }\n\n static contentAnalysis(content: string): string {\n return `\nAnalyze this content:\n\n\"${content}\"\n\nProvide analysis in JSON format:\n{\n \"keywords\": [\"keyword1\", \"keyword2\", ...],\n \"entities\": [\"entity1\", \"entity2\", ...],\n \"suggestedImprovements\": [\"suggestion1\", ...],\n \"readabilityScore\": 0-100,\n \"estimatedEngagement\": 0-100\n}\n\nReturn only the JSON:\n`;\n }\n\n static seoOptimization(content: string, keywords: string[]): string {\n return `\nOptimize this content for SEO:\n\nContent: \"${content}\"\nKeywords: ${keywords.join(', ')}\n\nTasks:\n1. Incorporate keywords naturally\n2. Improve engagement potential\n3. Add relevant call-to-action if appropriate\n4. Optimize for readability\n5. Enhance heading structure\n\nReturn JSON:\n{\n \"optimized\": \"...\",\n \"score\": 0-100,\n \"suggestions\": [\"suggestion1\", ...],\n \"addedKeywords\": [\"keyword1\", ...],\n \"removedFillerWords\": number,\n \"readabilityImprovements\": [\"improvement1\", ...],\n \"metaDescription\": \"SEO-optimized meta description\",\n \"titleSuggestions\": [\"title1\", ...]\n}\n\nReturn only the JSON:\n`;\n }\n\n static seoScore(content: string, keywords: string[]): string {\n return `\nCalculate SEO score for this content:\n\nContent: \"${content}\"\nKeywords: ${keywords.join(', ')}\n\nProvide breakdown in JSON:\n{\n \"keywordDensity\": 0-100,\n \"readabilityScore\": 0-100,\n \"titleOptimization\": 0-100,\n \"metaDescription\": 0-100,\n \"headingStructure\": 0-100,\n \"internalLinking\": 0-100,\n \"overall\": 0-100\n}\n\nReturn only the JSON:\n`;\n }\n\n static abTestVariant(input: {\n content: string;\n contentType: string;\n tone: string;\n targetAudience: string;\n platform: string;\n goals: string[];\n }): string {\n return `\nPredict performance for this content variant:\n\nContent: \"${input.content}\"\nContent Type: ${input.contentType}\nTone: ${input.tone}\nTarget Audience: ${input.targetAudience}\nPlatform: ${input.platform}\nGoals: ${input.goals.join(', ')}\n\nProvide prediction in JSON:\n{\n \"predictedEngagement\": 0-100,\n \"predictedCTR\": 0-100,\n \"predictedConversions\": 0-100,\n \"confidence\": 0-1,\n \"reasoning\": \"...\",\n \"strengths\": [\"strength1\", ...],\n \"weaknesses\": [\"weakness1\", ...],\n \"suggestions\": [\"suggestion1\", ...]\n}\n\nReturn only the JSON:\n`;\n }\n\n static hashtags(content: string, count: number): string {\n return `\nGenerate ${count} relevant hashtags for this content:\n\n\"${content}\"\n\nRequirements:\n- Mix of popular and niche hashtags\n- Industry-specific when possible\n- Trending if relevant\n- No duplicated words\n- Format: #hashtag (one per line)\n\nReturn only the hashtags:\n`;\n }\n\n static imagePrompt(description: string, style: string): string {\n return `\nGenerate a detailed AI image generation prompt for:\n\nDescription: ${description}\nStyle: ${style || 'realistic'}\n\nCreate a detailed, descriptive prompt that includes:\n- Subject details\n- Mood and atmosphere\n- Lighting\n- Composition\n- Art style reference\n- Technical specifications (aspect ratio, quality)\n\nThe prompt should be optimized for models like Midjourney, DALL-E, or Stable Diffusion.\n\nGenerate the prompt:\n`;\n }\n\n static blogImagePrompts(blogContent: string): string {\n return `\nAnalyze this blog content and generate 3-5 detailed image prompts for illustrative images:\n\nBlog Content: \"${blogContent}\"\n\nFor each image prompt, provide:\n- Subject description\n- Mood and atmosphere\n- Style reference\n- Composition details\n- Technical specs\n\nReturn as JSON array:\n[\"prompt1\", \"prompt2\", \"prompt3\", ...]\n\nReturn only the JSON:\n`;\n }\n\n static maxTokensForDuration(durationSeconds: number): number {\n return estimateTokenBudgetForDuration(durationSeconds);\n }\n}\n","\nimport { PromptBuilder } from '../prompts/PromptBuilder';\nimport { GenerationExecutor } from './GenerationExecutor';\nimport { validateTopicText } from '../../domain/validation/TopicTextValidator';\nimport { validateKeywordList } from '../../domain/validation/KeywordListValidator';\nimport { generateId } from '../../domain/utils/IdGenerator';\nimport type { BlogGenerationRequest, GeneratedBlog } from '../../domain/entities/ContentGeneration';\n\nexport class BlogService {\n constructor(private readonly executor: GenerationExecutor) {}\n\n async generateBlogPost(request: BlogGenerationRequest): Promise<GeneratedBlog> {\n const topic = validateTopicText(request.topic);\n const keywords = validateKeywordList(request.targetKeywords);\n\n const prompt = PromptBuilder.blogPost({\n topic,\n blogType: request.blogType,\n keywords,\n tone: request.tone,\n targetAudience: request.targetAudience,\n wordCount: request.wordCount,\n language: request.language,\n seoOptimization: request.seoOptimization,\n includeSchema: request.includeSchema,\n includeImages: request.includeImages,\n });\n\n const parsed = await this.executor.runJson<Record<string, unknown>>(\n prompt,\n {},\n { maxTokens: request.wordCount * 2, temperature: 0.7 },\n );\n\n return {\n id: generateId('blog'),\n ...(parsed as Partial<GeneratedBlog>),\n blogType: request.blogType,\n tone: request.tone,\n wordCount: request.wordCount,\n createdAt: new Date().toISOString(),\n } as GeneratedBlog;\n }\n}\n","\nimport { RequestQueueConfig } from '../../domain/limits/RequestQueueConfig';\nimport { generateId } from '../../domain/utils/IdGenerator';\n\nexport enum RequestPriority {\n LOW = 0,\n NORMAL = 1,\n HIGH = 2,\n URGENT = 3,\n}\n\ninterface QueuedRequest<T> {\n id: string;\n priority: RequestPriority;\n timestamp: number;\n fn: (signal: AbortSignal) => Promise<T>;\n resolve: (value: T) => void;\n reject: (error: Error) => void;\n retries: number;\n maxRetries: number;\n}\n\nexport interface QueueConfig {\n maxConcurrent: number;\n maxQueueSize: number;\n defaultTimeout: number;\n retryDelay: number;\n enableRateLimit: boolean;\n rateLimitWindow: number;\n rateLimitMaxRequests: number;\n}\n\nconst DEFAULT_CONFIG: QueueConfig = {\n maxConcurrent: RequestQueueConfig.MAX_CONCURRENT,\n maxQueueSize: RequestQueueConfig.MAX_QUEUE_SIZE,\n defaultTimeout: RequestQueueConfig.DEFAULT_TIMEOUT_MS,\n retryDelay: RequestQueueConfig.RETRY_DELAY_MS,\n enableRateLimit: RequestQueueConfig.RATE_LIMIT.ENABLED,\n rateLimitWindow: RequestQueueConfig.RATE_LIMIT.WINDOW_MS,\n rateLimitMaxRequests: RequestQueueConfig.RATE_LIMIT.MAX_REQUESTS_PER_WINDOW,\n};\n\nexport class RequestQueue {\n private queue: QueuedRequest<unknown>[] = [];\n private running = new Set<string>();\n private config: QueueConfig;\n private requestHistory: number[] = [];\n private isProcessing = false;\n\n constructor(config: Partial<QueueConfig> = {}) {\n this.config = { ...DEFAULT_CONFIG, ...config };\n }\n\n async add<T>(\n fn: (signal: AbortSignal) => Promise<T>,\n priority = RequestPriority.NORMAL,\n maxRetries = 3\n ): Promise<T> {\n if (this.queue.length >= this.config.maxQueueSize) {\n throw new Error('Queue is full');\n }\n\n return new Promise((resolve, reject) => {\n const request: QueuedRequest<T> = {\n id: generateId('req'),\n priority,\n timestamp: Date.now(),\n fn,\n resolve: resolve as (value: unknown) => void,\n reject,\n retries: 0,\n maxRetries,\n };\n\n this.queue.push(request as QueuedRequest<unknown>);\n this.sortQueue();\n\n if (!this.isProcessing) {\n this.process();\n }\n });\n }\n\n private sortQueue(): void {\n this.queue.sort((a, b) => {\n if (a.priority !== b.priority) {\n return b.priority - a.priority;\n }\n return a.timestamp - b.timestamp;\n });\n }\n\n private async process(): Promise<void> {\n if (this.isProcessing) return;\n this.isProcessing = true;\n\n while (this.queue.length > 0 || this.running.size > 0) {\n while (\n this.queue.length > 0 &&\n this.running.size < this.config.maxConcurrent\n ) {\n if (this.config.enableRateLimit && !this.canMakeRequest()) {\n break;\n }\n\n const request = this.queue.shift();\n if (!request) break;\n\n this.running.add(request.id);\n this.executeRequest(request);\n }\n\n await new Promise(resolve => setTimeout(resolve, RequestQueueConfig.POLL_INTERVAL_MS));\n }\n\n this.isProcessing = false;\n }\n\n private canMakeRequest(): boolean {\n const now = Date.now();\n const windowStart = now - this.config.rateLimitWindow;\n\n this.requestHistory = this.requestHistory.filter(\n timestamp => timestamp > windowStart\n );\n\n return this.requestHistory.length < this.config.rateLimitMaxRequests;\n }\n\n private async executeRequest<T>(request: QueuedRequest<T>): Promise<void> {\n try {\n if (this.config.enableRateLimit) {\n this.requestHistory.push(Date.now());\n }\n\n const result = await this.withTimeout(\n request.fn,\n this.config.defaultTimeout\n );\n\n request.resolve(result);\n } catch (error) {\n if (request.retries < request.maxRetries) {\n request.retries++;\n const delay = this.config.retryDelay * request.retries;\n setTimeout(() => {\n this.queue.unshift(request as QueuedRequest<unknown>);\n this.sortQueue();\n }, delay);\n } else {\n request.reject(error as Error);\n }\n } finally {\n this.running.delete(request.id);\n }\n }\n\n private async withTimeout<T>(\n fn: (signal: AbortSignal) => Promise<T>,\n timeout: number\n ): Promise<T> {\n const controller = new AbortController();\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n const timeoutPromise = new Promise<never>((_, reject) => {\n timeoutId = setTimeout(() => {\n controller.abort();\n reject(new Error('Request timeout'));\n }, timeout);\n });\n\n try {\n const result = await Promise.race([fn(controller.signal), timeoutPromise]);\n return result;\n } finally {\n if (timeoutId) clearTimeout(timeoutId);\n }\n }\n\n getStats(): {\n queued: number;\n running: number;\n rateLimitRemaining: number;\n } {\n return {\n queued: this.queue.length,\n running: this.running.size,\n rateLimitRemaining: this.config.enableRateLimit\n ? this.config.rateLimitMaxRequests -\n this.requestHistory.filter(\n timestamp => Date.now() - timestamp < this.config.rateLimitWindow\n ).length\n : Infinity,\n };\n }\n\n clear(): void {\n for (const request of this.queue) {\n request.reject(new Error('Queue cleared'));\n }\n this.queue = [];\n }\n\n async drain(): Promise<void> {\n while (this.running.size > 0) {\n await new Promise(resolve => setTimeout(resolve, RequestQueueConfig.POLL_INTERVAL_MS));\n }\n }\n}\n\nexport async function batchRequest<T>(\n requests: Array<() => Promise<T>>,\n options: {\n concurrency?: number;\n stopOnError?: boolean;\n } = {}\n): Promise<T[]> {\n const {\n concurrency = 3,\n stopOnError = false,\n } = options;\n\n const results: T[] = [];\n const errors: Error[] = [];\n\n for (let i = 0; i < requests.length; i += concurrency) {\n const batch = requests.slice(i, i + concurrency);\n const batchResults = await Promise.allSettled(\n batch.map(fn => fn())\n );\n\n for (const result of batchResults) {\n if (result.status === 'fulfilled') {\n results.push(result.value);\n } else {\n errors.push(result.reason);\n if (stopOnError) {\n throw new Error(\n `Batch request failed: ${errors[0].message}`\n );\n }\n }\n }\n }\n\n if (errors.length > 0 && !stopOnError) {\n console.warn(`${errors.length} requests failed in batch`);\n }\n\n return results;\n}\n","\nimport { PromptBuilder } from '../prompts/PromptBuilder';\nimport { GenerationExecutor } from './GenerationExecutor';\nimport { batchRequest } from '../../infrastructure/utils/requestQueue';\nimport { validateTopicText } from '../../domain/validation/TopicTextValidator';\nimport { validateHashtagCount } from '../../domain/validation/HashtagCountValidator';\nimport {\n resolvePlatformSpec,\n resolveMaxContentLength,\n rankAndTrimHashtags,\n resolveHashtagBudget,\n} from '../../domain/predicates';\nimport type {\n SocialContentRequest,\n GeneratedSocialContent,\n} from '../../domain/entities/ContentGeneration';\nimport type { ContentTone, SocialPlatform } from '../../domain/types';\n\nconst MULTI_PLATFORMS: ReadonlyArray<SocialPlatform> = [\n 'twitter',\n 'linkedin',\n 'instagram',\n 'threads',\n 'tiktok',\n];\n\nconst DEFAULT_SOCIAL_RESULT: GeneratedSocialContent = {\n content: '',\n platform: 'twitter',\n hashtags: [],\n emojis: [],\n characterCount: 0,\n estimatedEngagement: 0,\n};\n\nexport class SocialService {\n constructor(private readonly executor: GenerationExecutor) {}\n\n async generateSocialContent(request: SocialContentRequest): Promise<GeneratedSocialContent> {\n const topic = validateTopicText(request.topic);\n const spec = resolvePlatformSpec(request.platform);\n const maxLength = resolveMaxContentLength(request.platform, request.maxLength);\n\n const prompt = PromptBuilder.socialPost({\n topic,\n platform: request.platform,\n tone: request.tone,\n style: spec.style,\n maxLength,\n includeHashtags: request.hashtags !== false,\n includeCallToAction: Boolean(request.includeCallToAction),\n });\n\n const parsed = await this.executor.runJson<GeneratedSocialContent>(\n prompt,\n { ...DEFAULT_SOCIAL_RESULT, platform: request.platform },\n { maxTokens: 500, temperature: 0.8 },\n );\n\n return {\n ...parsed,\n platform: request.platform,\n characterCount: parsed.content?.length ?? 0,\n };\n }\n\n async generateForAllPlatforms(topic: string, tone: ContentTone): Promise<GeneratedSocialContent[]> {\n const requests = MULTI_PLATFORMS.map((platform) => () =>\n this.generateSocialContent({ topic, platform, tone }),\n );\n\n try {\n return await batchRequest(requests, { concurrency: 2, stopOnError: false });\n } catch (error) {\n console.warn('Batch execution failed, falling back to sequential:', error);\n const results: GeneratedSocialContent[] = [];\n for (const platform of MULTI_PLATFORMS) {\n try {\n results.push(await this.generateSocialContent({ topic, platform, tone }));\n } catch (err) {\n console.error(`Failed to generate for ${platform}:`, err);\n }\n }\n return results;\n }\n }\n\n async generateHashtags(content: string, count: number): Promise<string[]> {\n const validated = validateHashtagCount(count);\n const prompt = PromptBuilder.hashtags(content, validated);\n const response = await this.executor.runText(prompt, { maxTokens: 200, temperature: 0.7 });\n const hashtags = response.match(/#[\\w-]+/g) || [];\n return hashtags.slice(0, validated);\n }\n\n optimizeHashtags(hashtags: string[], platform: SocialPlatform): string[] {\n const budget = resolveHashtagBudget(platform);\n return rankAndTrimHashtags(hashtags, budget);\n }\n}\n","\nimport { PromptBuilder } from '../prompts/PromptBuilder';\nimport { GenerationExecutor } from './GenerationExecutor';\nimport { validateTopicText } from '../../domain/validation/TopicTextValidator';\nimport { validateDurationSeconds } from '../../domain/validation/DurationSecondsValidator';\nimport { estimateTokenBudgetForDuration } from '../../domain/calculations/SpeechPaceEstimate';\nimport type {\n VideoScriptRequest,\n GeneratedVideoScript,\n} from '../../domain/entities/ContentGeneration';\nimport type { Emotion } from '../../domain/types';\n\nconst buildScriptResult = (\n parsed: Partial<GeneratedVideoScript>,\n duration: number,\n): GeneratedVideoScript => {\n const script = parsed.script ?? '';\n if (!script) {\n throw new Error('AI response missing script field');\n }\n const wordCount = script.trim().length === 0 ? 0 : script.trim().split(/\\s+/).length;\n return {\n ...parsed,\n script,\n duration,\n wordCount,\n } as GeneratedVideoScript;\n};\n\nexport class VideoScriptService {\n constructor(private readonly executor: GenerationExecutor) {}\n\n async generateVideoScript(request: VideoScriptRequest): Promise<GeneratedVideoScript> {\n const topic = validateTopicText(request.topic);\n const duration = validateDurationSeconds(request.duration);\n\n const prompt = PromptBuilder.videoScript({\n topic,\n tone: request.tone,\n duration,\n targetAudience: request.targetAudience,\n includeVisuals: request.includeVisuals,\n includeCallToAction: request.includeCallToAction,\n });\n\n const parsed = await this.executor.runJson<GeneratedVideoScript>(\n prompt,\n { script: '', visualCues: [], duration, wordCount: 0, estimatedEngagement: 0 },\n { maxTokens: estimateTokenBudgetForDuration(duration), temperature: 0.8 },\n );\n\n return buildScriptResult(parsed, duration);\n }\n\n async generateVoiceScript(topic: string, emotion: Emotion, duration: number): Promise<GeneratedVideoScript> {\n const validatedTopic = validateTopicText(topic);\n const validatedDuration = validateDurationSeconds(duration);\n\n const prompt = PromptBuilder.voiceScript({\n topic: validatedTopic,\n emotion,\n duration: validatedDuration,\n });\n\n const parsed = await this.executor.runJson<GeneratedVideoScript>(\n prompt,\n { script: '', visualCues: [], duration: validatedDuration, wordCount: 0, estimatedEngagement: 0 },\n { maxTokens: estimateTokenBudgetForDuration(validatedDuration), temperature: 0.8 },\n );\n\n return buildScriptResult(parsed, validatedDuration);\n }\n}\n","\nimport { PromptBuilder } from '../prompts/PromptBuilder';\nimport { GenerationExecutor } from './GenerationExecutor';\nimport { validateContentBody } from '../../domain/validation/ContentBodyValidator';\nimport { clampConfidenceToValidRange, clampScoreToValidRange } from '../../domain/predicates/ScoreRangeGuard';\nimport type {\n ContentAnalysisRequest,\n ContentAnalysisResult,\n SentimentAnalysisResult,\n} from '../../domain/entities/SentimentAnalysis';\n\nconst DEFAULT_SENTIMENT: SentimentAnalysisResult = {\n sentiment: 'neutral',\n confidence: 0.5,\n emotions: [],\n};\n\nconst DEFAULT_ANALYSIS: ContentAnalysisResult = {\n sentiment: DEFAULT_SENTIMENT,\n keywords: [],\n entities: [],\n suggestedImprovements: [],\n readabilityScore: 50,\n estimatedEngagement: 50,\n};\n\nexport class AnalysisService {\n constructor(private readonly executor: GenerationExecutor) {}\n\n async analyzeSentiment(content: string): Promise<SentimentAnalysisResult> {\n const validated = validateContentBody(content);\n const prompt = PromptBuilder.sentiment(validated);\n\n const result = await this.executor.runJson<SentimentAnalysisResult>(\n prompt,\n DEFAULT_SENTIMENT,\n { maxTokens: 200, temperature: 0.3 },\n );\n\n return {\n ...result,\n confidence: clampConfidenceToValidRange(result.confidence),\n };\n }\n\n async analyzeContent(request: ContentAnalysisRequest): Promise<ContentAnalysisResult> {\n const validated = validateContentBody(request.content);\n const sentimentResult = await this.analyzeSentiment(validated);\n\n const prompt = PromptBuilder.contentAnalysis(validated);\n const parsed = await this.executor.runJson<ContentAnalysisResult>(\n prompt,\n { ...DEFAULT_ANALYSIS, sentiment: sentimentResult },\n { maxTokens: 300, temperature: 0.5 },\n );\n\n return {\n sentiment: sentimentResult,\n keywords: parsed.keywords ?? [],\n entities: parsed.entities ?? [],\n suggestedImprovements: parsed.suggestedImprovements ?? [],\n readabilityScore: clampScoreToValidRange(parsed.readabilityScore),\n estimatedEngagement: clampScoreToValidRange(parsed.estimatedEngagement),\n };\n }\n}\n","\nimport { PromptBuilder } from '../prompts/PromptBuilder';\nimport { GenerationExecutor } from './GenerationExecutor';\nimport { validateContentBody, truncateForSeoPreview } from '../../domain/validation/ContentBodyValidator';\nimport { validateKeywordList } from '../../domain/validation/KeywordListValidator';\nimport { clampScoreToValidRange } from '../../domain/predicates/ScoreRangeGuard';\nimport {\n calculateKeywordDensity,\n countKeywordOccurrences,\n} from '../../domain/calculations/SeoKeywordDensity';\nimport { classifyKeywordProminence, isUnderutilizedKeyword } from '../../domain/predicates/KeywordProminenceClassifier';\nimport type {\n SEOOptimizationRequest,\n SEOOptimizationResult,\n SEOScoreBreakdown,\n KeywordAnalysis,\n} from '../../domain/entities/SEO';\n\nconst DEFAULT_SEO_SCORE: SEOScoreBreakdown = {\n keywordDensity: 50,\n readabilityScore: 50,\n titleOptimization: 50,\n metaDescription: 50,\n headingStructure: 50,\n internalLinking: 50,\n overall: 50,\n};\n\nconst UNDERUTILIZED_SUGGESTION = 'Consider using this keyword more frequently';\n\nexport class SeoService {\n constructor(private readonly executor: GenerationExecutor) {}\n\n async optimizeSEO(request: SEOOptimizationRequest): Promise<SEOOptimizationResult> {\n const content = validateContentBody(request.content);\n const keywords = validateKeywordList(request.keywords);\n\n const prompt = PromptBuilder.seoOptimization(content, keywords);\n const result = await this.executor.runJson<SEOOptimizationResult>(\n prompt,\n {\n optimized: content,\n score: 50,\n suggestions: [],\n addedKeywords: [],\n removedFillerWords: 0,\n readabilityImprovements: [],\n },\n { maxTokens: 1000, temperature: 0.7 },\n );\n\n return {\n ...result,\n score: clampScoreToValidRange(result.score),\n };\n }\n\n async calculateSEOScore(content: string, keywords: string[]): Promise<SEOScoreBreakdown> {\n const validatedContent = validateContentBody(content);\n const validatedKeywords = validateKeywordList(keywords);\n\n const prompt = PromptBuilder.seoOptimization(\n truncateForSeoPreview(validatedContent),\n validatedKeywords,\n );\n const result = await this.executor.runJson<SEOScoreBreakdown>(\n prompt,\n DEFAULT_SEO_SCORE,\n { maxTokens: 200, temperature: 0.3 },\n );\n\n return {\n keywordDensity: clampScoreToValidRange(result.keywordDensity),\n readabilityScore: clampScoreToValidRange(result.readabilityScore),\n titleOptimization: clampScoreToValidRange(result.titleOptimization),\n metaDescription: clampScoreToValidRange(result.metaDescription),\n headingStructure: clampScoreToValidRange(result.headingStructure),\n internalLinking: clampScoreToValidRange(result.internalLinking),\n overall: clampScoreToValidRange(result.overall),\n };\n }\n\n analyzeKeywords(content: string, keywords: string[]): KeywordAnalysis[] {\n const validatedContent = validateContentBody(content);\n const validatedKeywords = validateKeywordList(keywords);\n\n return validatedKeywords.map((keyword) => {\n const count = countKeywordOccurrences(validatedContent, keyword);\n const density = calculateKeywordDensity(validatedContent, keyword);\n return {\n keyword,\n count,\n density,\n prominence: classifyKeywordProminence(density),\n suggestions: isUnderutilizedKeyword(density) ? [UNDERUTILIZED_SUGGESTION] : [],\n };\n });\n }\n}\n","\nimport { PromptBuilder } from '../prompts/PromptBuilder';\nimport { GenerationExecutor } from './GenerationExecutor';\nimport { clampScoreToValidRange, clampConfidenceToValidRange } from '../../domain/predicates/ScoreRangeGuard';\nimport { truncateForAbVariantPreview } from '../../domain/validation/ContentBodyValidator';\nimport {\n calculateImprovementPercentage,\n selectHigherScoreVariantId,\n} from '../../domain/calculations/AbTestImprovementRatio';\nimport { AB_TEST_DEFAULT_CONFIDENCE } from '../../domain/predicates/AbTestConfidence';\nimport type {\n ABTestRequest,\n ABTestPrediction,\n ABTestComparison,\n} from '../../domain/entities/ABTesting';\n\nconst DEFAULT_PREDICTION: ABTestPrediction = {\n variantId: '',\n predictedEngagement: 0,\n predictedCTR: 0,\n predictedConversions: 0,\n confidence: 0,\n reasoning: '',\n strengths: [],\n weaknesses: [],\n suggestions: [],\n};\n\nconst VARIANT_A_ID = 'A';\nconst VARIANT_B_ID = 'B';\nconst FALLBACK_ENGAGEMENT = 50;\nconst DEFAULT_RECOMMENDATIONS: ReadonlyArray<string> = [\n 'Test with larger audience',\n 'Monitor click-through rates',\n];\n\nexport class ABTestService {\n constructor(private readonly executor: GenerationExecutor) {}\n\n async predictABTest(request: ABTestRequest): Promise<ABTestPrediction[]> {\n const predictions: ABTestPrediction[] = [];\n for (const variant of request.variants) {\n const prompt = PromptBuilder.abTestVariant({\n content: truncateForAbVariantPreview(variant.content),\n contentType: variant.contentType,\n tone: variant.tone,\n targetAudience: request.targetAudience,\n platform: request.platform,\n goals: request.goals,\n });\n\n const parsed = await this.executor.runJson<ABTestPrediction>(\n prompt,\n { ...DEFAULT_PREDICTION, variantId: variant.id },\n { maxTokens: 300, temperature: 0.5 },\n );\n\n predictions.push({\n variantId: variant.id,\n predictedEngagement: clampScoreToValidRange(parsed.predictedEngagement),\n predictedCTR: clampScoreToValidRange(parsed.predictedCTR),\n predictedConversions: clampScoreToValidRange(parsed.predictedConversions),\n confidence: clampConfidenceToValidRange(parsed.confidence),\n reasoning: parsed.reasoning ?? '',\n strengths: parsed.strengths ?? [],\n weaknesses: parsed.weaknesses ?? [],\n suggestions: parsed.suggestions ?? [],\n });\n }\n return predictions;\n }\n\n async compareVariants(variantA: string, variantB: string): Promise<ABTestComparison> {\n const predictions = await this.predictABTest({\n variants: [\n { id: VARIANT_A_ID, content: variantA, contentType: 'social', tone: 'casual' },\n { id: VARIANT_B_ID, content: variantB, contentType: 'social', tone: 'casual' },\n ],\n targetAudience: 'general',\n platform: 'twitter',\n goals: ['engagement', 'clicks'],\n });\n\n const scoreA = predictions[0]?.predictedEngagement ?? FALLBACK_ENGAGEMENT;\n const scoreB = predictions[1]?.predictedEngagement ?? FALLBACK_ENGAGEMENT;\n const isTie = scoreA === scoreB;\n const winner = selectHigherScoreVariantId(scoreA, scoreB, VARIANT_A_ID, VARIANT_B_ID);\n const improvement = calculateImprovementPercentage(scoreA, scoreB);\n\n return {\n winner,\n confidence: AB_TEST_DEFAULT_CONFIDENCE,\n improvement: isTie ? '0%' : `+${improvement}% engagement`,\n reasoning: isTie\n ? 'Both variants have equal predicted engagement'\n : winner === VARIANT_A_ID\n ? 'Variant A has more engaging content'\n : 'Variant B has more engaging content',\n recommendations: [...DEFAULT_RECOMMENDATIONS],\n };\n }\n}\n","\nimport { PromptBuilder } from '../prompts/PromptBuilder';\nimport { GenerationExecutor } from './GenerationExecutor';\nimport { validateTopicText } from '../../domain/validation/TopicTextValidator';\nimport { validateContentBody, truncateForBlogPromptPreview } from '../../domain/validation/ContentBodyValidator';\n\nexport class ImagePromptService {\n constructor(private readonly executor: GenerationExecutor) {}\n\n async generateImagePrompt(description: string, style: string): Promise<string> {\n const validated = validateTopicText(description);\n const prompt = PromptBuilder.imagePrompt(validated, style);\n return this.executor.runText(prompt, { maxTokens: 300, temperature: 0.8 });\n }\n\n async generateImagePromptsForBlog(blogContent: string): Promise<string[]> {\n const truncated = truncateForBlogPromptPreview(validateContentBody(blogContent));\n const prompt = PromptBuilder.blogImagePrompts(truncated);\n\n const prompts = await this.executor.runJson<string[]>(prompt, [], {\n maxTokens: 500,\n temperature: 0.8,\n });\n return Array.isArray(prompts) ? prompts : [];\n }\n}\n","\nimport { PromptBuilder } from '../prompts/PromptBuilder';\nimport { GenerationExecutor } from './GenerationExecutor';\nimport { validateTopicText } from '../../domain/validation/TopicTextValidator';\nimport { validateCalendarDays } from '../../domain/validation/CalendarDaysValidator';\nimport { estimateTokenBudgetForCalendarDays } from '../../domain/calculations/SpeechPaceEstimate';\nimport { resolveCalendarEntryDate } from '../../domain/calculations/ContentCalendarDateOffset';\nimport type { ContentCalendarEntry } from '../../domain/entities/ContentGeneration';\nimport type { ContentType, SocialPlatform } from '../../domain/types';\n\ninterface CalendarItem {\n day: number;\n topic: string;\n contentType: ContentType;\n platform: SocialPlatform;\n description: string;\n estimatedEngagement: number;\n priority: 'high' | 'medium' | 'low';\n}\n\nconst toCalendarEntry = (item: CalendarItem): ContentCalendarEntry => ({\n date: resolveCalendarEntryDate(item.day),\n topic: item.topic,\n contentType: item.contentType,\n platform: item.platform,\n description: item.description,\n estimatedEngagement: item.estimatedEngagement,\n priority: item.priority,\n});\n\nexport class ContentCalendarService {\n constructor(private readonly executor: GenerationExecutor) {}\n\n async generateContentCalendar(niche: string, days: number): Promise<ContentCalendarEntry[]> {\n const validatedNiche = validateTopicText(niche);\n const validatedDays = validateCalendarDays(days);\n\n const prompt = PromptBuilder.contentCalendar(validatedNiche, validatedDays);\n const data = await this.executor.runJson<CalendarItem[] | { calendar?: CalendarItem[]; entries?: CalendarItem[] }>(\n prompt,\n [],\n {\n maxTokens: estimateTokenBudgetForCalendarDays(validatedDays),\n temperature: 0.8,\n },\n );\n\n const items = Array.isArray(data)\n ? data\n : Array.isArray((data as { calendar?: CalendarItem[] })?.calendar)\n ? (data as { calendar: CalendarItem[] }).calendar\n : Array.isArray((data as { entries?: CalendarItem[] })?.entries)\n ? (data as { entries: CalendarItem[] }).entries\n : [];\n\n return items.map(toCalendarEntry);\n }\n}\n","\nimport type {\n ImageGenerationRequest,\n VideoGenerationRequest,\n ImageToVideoRequest,\n VideoToVideoRequest,\n GeneratedContent,\n} from '../../domain/config/ProviderConfig';\nimport type { ProviderFactory } from '../../../providers/factory/provider.factory';\nimport { AIError } from '../../domain/errors/AIErrors';\n\nconst wrapProviderError = (operation: string, error: unknown): AIError => {\n const message = error instanceof Error ? error.message : 'Unknown error';\n return new AIError(`${operation} failed: ${message}`, 'PROVIDER_ERROR', error);\n};\n\nconst ensureFactory = (factory: ProviderFactory, operation: string): void => {\n if (factory.getAllProviders().length === 0) {\n throw new AIError(\n `${operation} failed: No providers are registered. ` +\n 'Provide a ProviderConfig with at least one enabled provider when constructing AIContentService.',\n 'PROVIDER_UNAVAILABLE',\n );\n }\n};\n\nexport class MediaGenerationService {\n constructor(private readonly providerFactory: ProviderFactory) {}\n\n generateImage(request: ImageGenerationRequest): Promise<GeneratedContent> {\n ensureFactory(this.providerFactory, 'Image generation');\n return this.providerFactory.generateImage(request).catch((err) => {\n throw wrapProviderError('Image generation', err);\n });\n }\n\n generateVideo(request: VideoGenerationRequest): Promise<GeneratedContent> {\n ensureFactory(this.providerFactory, 'Video generation');\n return this.providerFactory.generateVideo(request).catch((err) => {\n throw wrapProviderError('Video generation', err);\n });\n }\n\n convertImageToVideo(request: ImageToVideoRequest): Promise<GeneratedContent> {\n ensureFactory(this.providerFactory, 'Image-to-video conversion');\n return this.providerFactory.imageToVideo(request).catch((err) => {\n throw wrapProviderError('Image-to-video conversion', err);\n });\n }\n\n transformVideo(request: VideoToVideoRequest): Promise<GeneratedContent> {\n ensureFactory(this.providerFactory, 'Video-to-video transformation');\n return this.providerFactory.videoToVideo(request).catch((err) => {\n throw wrapProviderError('Video-to-video transformation', err);\n });\n }\n}\n","\nfunction repairCommonJsonDefects(text: string): string {\n return (\n text\n .replace(/(:\\s*-?\\d+(?:\\.\\d+)?)\\s*\"/g, '$1')\n .replace(/(:\\s*\"[^\"]*\")\"/g, '$1')\n );\n}\n\nexport function safeJSONParse<T>(text: string, fallback: T, onError?: (context: string) => void): T {\n try {\n return JSON.parse(text) as T;\n } catch (error) {\n try {\n return JSON.parse(repairCommonJsonDefects(text)) as T;\n } catch {\n // fall through to the position-aware error report below\n }\n if (error instanceof SyntaxError) {\n const positionMatch = error.message.match(/position (\\d+)/);\n const position = positionMatch ? parseInt(positionMatch[1], 10) : -1;\n if (position > 0) {\n const context = text.substring(Math.max(0, position - 50), position + 50);\n onError?.(`JSON parse error at position ${position}: \"${context}\"`);\n } else {\n onError?.(`JSON parse error: ${error.message}`);\n }\n }\n return fallback;\n }\n}\n\nexport function extractJSON(text: string): string | null {\n const codeBlockMatch = text.match(/```(?:json)?\\s*([\\s\\S]*?)```/);\n if (codeBlockMatch && codeBlockMatch[1]) {\n const candidate = codeBlockMatch[1].trim();\n if (candidate.startsWith('{') || candidate.startsWith('[')) {\n return candidate;\n }\n }\n\n const objectMatch = text.match(/\\{[\\s\\S]*\\}/);\n if (objectMatch) {\n return objectMatch[0];\n }\n\n const arrayMatch = text.match(/\\[[\\s\\S]*\\]/);\n if (arrayMatch) {\n return arrayMatch[0];\n }\n\n return null;\n}\n\nexport function parseAIResponse<T>(response: string, fallback: T, onError?: (context: string) => void): T {\n const json = extractJSON(response);\n if (!json) {\n onError?.('No JSON payload found in response');\n return fallback;\n }\n\n return safeJSONParse(json, fallback, onError);\n}\n\nexport function isValidJSON(text: string): boolean {\n const trimmed = text.trim();\n if (trimmed.length === 0) return false;\n\n if (\n !(\n (trimmed.startsWith('{') && trimmed.endsWith('}')) ||\n (trimmed.startsWith('[') && trimmed.endsWith(']'))\n )\n ) {\n return false;\n }\n\n try {\n JSON.parse(trimmed);\n return true;\n } catch {\n return false;\n }\n}\n","\nimport { parseAIResponse } from '../../infrastructure/utils/jsonParser';\nimport type { ITextGenerator, TextGenerationOptions } from '../../domain/interfaces/ITextGenerator';\nimport type { GenerationResult, TextRequest } from '../../../core/types';\nimport { AIError } from '../../domain/errors/AIErrors';\nimport { ProviderFactory } from '../../../providers/factory/provider.factory';\n\n/**\n * The single LLM seam for the content services. runJson/runText keep the\n * string facade the nine services were built against; runChat passes a full\n * TextRequest through to the factory and returns the usage-complete\n * GenerationResult.\n */\nexport class GenerationExecutor {\n constructor(private readonly generator: ITextGenerator | ProviderFactory) {}\n\n async runJson<T>(prompt: string, fallback: T, generationOptions: TextGenerationOptions = {}): Promise<T> {\n const response = await this.generator.generateText(prompt, generationOptions);\n return parseAIResponse<T>(response, fallback);\n }\n\n runText(prompt: string, options: TextGenerationOptions = {}): Promise<string> {\n return this.generator.generateText(prompt, options);\n }\n\n /** Usage-complete pass-through; requires a ProviderFactory engine. */\n runChat(request: TextRequest): Promise<GenerationResult> {\n if (!(this.generator instanceof ProviderFactory)) {\n throw new AIError(\n 'runChat requires a ProviderFactory engine — construct AIContentService with a provider config, not a custom ITextGenerator',\n 'PROVIDER_UNAVAILABLE',\n );\n }\n return this.generator.chat(request);\n }\n}\n","\nimport type { IAIContentService } from '../../domain/interfaces/IAIContentService';\nimport type { ITextGenerator } from '../../domain/interfaces/ITextGenerator';\nimport type {\n BlogGenerationRequest,\n GeneratedBlog,\n SocialContentRequest,\n GeneratedSocialContent,\n VideoScriptRequest,\n GeneratedVideoScript,\n ContentCalendarEntry,\n} from '../../domain/entities/ContentGeneration';\nimport type {\n ContentAnalysisRequest,\n ContentAnalysisResult,\n SentimentAnalysisResult,\n} from '../../domain/entities/SentimentAnalysis';\nimport type {\n SEOOptimizationRequest,\n SEOOptimizationResult,\n SEOScoreBreakdown,\n KeywordAnalysis,\n} from '../../domain/entities/SEO';\nimport type {\n ABTestRequest,\n ABTestPrediction,\n ABTestComparison,\n} from '../../domain/entities/ABTesting';\nimport type { SocialPlatform, ContentTone, Emotion } from '../../domain/types';\nimport type {\n ProviderConfig,\n ImageGenerationRequest,\n VideoGenerationRequest,\n ImageToVideoRequest,\n VideoToVideoRequest,\n GeneratedContent,\n} from '../../domain/config/ProviderConfig';\nimport { createAI, type AIProviderConfig } from '../../../providers/factory/create-ai';\nimport { ProviderFactory } from '../../../providers/factory/provider.factory';\nimport { BlogService } from './BlogService';\nimport { SocialService } from './SocialService';\nimport { VideoScriptService } from './VideoScriptService';\nimport { AnalysisService } from './AnalysisService';\nimport { SeoService } from './SeoService';\nimport { ABTestService } from './ABTestService';\nimport { ImagePromptService } from './ImagePromptService';\nimport { ContentCalendarService } from './ContentCalendarService';\nimport { MediaGenerationService } from './ProviderServices';\nimport { GenerationExecutor } from './GenerationExecutor';\n\ninterface ServiceBundle {\n providerFactory: ProviderFactory;\n blogService: BlogService;\n socialService: SocialService;\n videoScriptService: VideoScriptService;\n analysisService: AnalysisService;\n seoService: SeoService;\n abTestService: ABTestService;\n imagePromptService: ImagePromptService;\n contentCalendarService: ContentCalendarService;\n mediaGenerationService: MediaGenerationService;\n}\n\nconst isTextGenerator = (value: unknown): value is ITextGenerator =>\n typeof value === \"object\" &&\n value !== null &&\n typeof (value as ITextGenerator).generateText === \"function\";\n\n/**\n * Accepts the new AIProviderConfig (provider blocks, presence = enabled) or a\n * legacy web-ai-content ProviderConfig (blocks gated by `enabled`) and maps\n * the latter onto the former — one constructor, both worlds.\n */\nfunction toAIProviderConfig(config: AIProviderConfig | ProviderConfig): AIProviderConfig {\n const legacy = config as ProviderConfig;\n const modern = config as AIProviderConfig;\n\n const anthropic =\n modern.anthropic ??\n (legacy.anthropic?.enabled\n ? {\n apiKey: legacy.anthropic.apiKey,\n baseUrl: legacy.anthropic.baseUrl,\n timeoutMs: legacy.anthropic.timeout,\n models: legacy.anthropic.models,\n effort: legacy.anthropic.effort,\n }\n : undefined);\n const groq =\n modern.groq ??\n (legacy.groq?.enabled\n ? {\n apiKey: legacy.groq.apiKey,\n baseUrl: legacy.groq.baseUrl,\n timeoutMs: legacy.groq.timeout,\n // legacy {text, chat} model pins map onto the neutral tier slots\n ...(legacy.groq.models?.text\n ? { models: { balanced: legacy.groq.models.text } }\n : {}),\n }\n : undefined);\n const gemini =\n modern.gemini ?? (legacy.gemini?.enabled ? { ...legacy.gemini } : undefined);\n const fal = modern.fal ?? (legacy.fal?.enabled ? { ...legacy.fal } : undefined);\n const pruna = modern.pruna ?? (legacy.pruna?.enabled ? { ...legacy.pruna } : undefined);\n\n return {\n priority: modern.priority,\n fallbackEnabled: modern.fallbackEnabled,\n defaultTier: modern.defaultTier,\n ...(anthropic ? { anthropic } : {}),\n ...(groq ? { groq } : {}),\n ...(gemini ? { gemini } : {}),\n ...(fal ? { fal } : {}),\n ...(pruna ? { pruna } : {}),\n };\n}\n\nconst buildServices = (\n configOrGenerator: AIProviderConfig | ProviderConfig | ITextGenerator | string,\n model?: string,\n customGenerator?: ITextGenerator,\n): ServiceBundle => {\n if (customGenerator) {\n const executor = new GenerationExecutor(customGenerator);\n const emptyFactory = new ProviderFactory({\n priority: [],\n fallbackEnabled: false,\n });\n return {\n providerFactory: emptyFactory,\n blogService: new BlogService(executor),\n socialService: new SocialService(executor),\n videoScriptService: new VideoScriptService(executor),\n analysisService: new AnalysisService(executor),\n seoService: new SeoService(executor),\n abTestService: new ABTestService(executor),\n imagePromptService: new ImagePromptService(executor),\n contentCalendarService: new ContentCalendarService(executor),\n mediaGenerationService: new MediaGenerationService(emptyFactory),\n };\n }\n\n if (typeof configOrGenerator === 'string') {\n const aiConfig: AIProviderConfig = {\n anthropic: {\n apiKey: configOrGenerator,\n ...(model ? { models: { balanced: model } } : {}),\n },\n };\n const factory = createAI(aiConfig);\n const executor = new GenerationExecutor(factory);\n return {\n providerFactory: factory,\n blogService: new BlogService(executor),\n socialService: new SocialService(executor),\n videoScriptService: new VideoScriptService(executor),\n analysisService: new AnalysisService(executor),\n seoService: new SeoService(executor),\n abTestService: new ABTestService(executor),\n imagePromptService: new ImagePromptService(executor),\n contentCalendarService: new ContentCalendarService(executor),\n mediaGenerationService: new MediaGenerationService(factory),\n };\n }\n\n if (isTextGenerator(configOrGenerator)) {\n const executor = new GenerationExecutor(configOrGenerator);\n const emptyFactory = new ProviderFactory({\n priority: [],\n fallbackEnabled: false,\n });\n return {\n providerFactory: emptyFactory,\n blogService: new BlogService(executor),\n socialService: new SocialService(executor),\n videoScriptService: new VideoScriptService(executor),\n analysisService: new AnalysisService(executor),\n seoService: new SeoService(executor),\n abTestService: new ABTestService(executor),\n imagePromptService: new ImagePromptService(executor),\n contentCalendarService: new ContentCalendarService(executor),\n mediaGenerationService: new MediaGenerationService(emptyFactory),\n };\n }\n\n const factory = createAI(toAIProviderConfig(configOrGenerator));\n const executor = new GenerationExecutor(factory);\n return {\n providerFactory: factory,\n blogService: new BlogService(executor),\n socialService: new SocialService(executor),\n videoScriptService: new VideoScriptService(executor),\n analysisService: new AnalysisService(executor),\n seoService: new SeoService(executor),\n abTestService: new ABTestService(executor),\n imagePromptService: new ImagePromptService(executor),\n contentCalendarService: new ContentCalendarService(executor),\n mediaGenerationService: new MediaGenerationService(factory),\n };\n};\n\nexport class AIContentService implements IAIContentService {\n private readonly providerFactory: ProviderFactory;\n private readonly blogService: BlogService;\n private readonly socialService: SocialService;\n private readonly videoScriptService: VideoScriptService;\n private readonly analysisService: AnalysisService;\n private readonly seoService: SeoService;\n private readonly abTestService: ABTestService;\n private readonly imagePromptService: ImagePromptService;\n private readonly contentCalendarService: ContentCalendarService;\n private readonly mediaGenerationService: MediaGenerationService;\n\n constructor(\n configOrGenerator: AIProviderConfig | ProviderConfig | ITextGenerator | string,\n model?: string,\n textGenerator?: ITextGenerator,\n ) {\n const bundle = buildServices(configOrGenerator, model, textGenerator);\n this.providerFactory = bundle.providerFactory;\n this.blogService = bundle.blogService;\n this.socialService = bundle.socialService;\n this.videoScriptService = bundle.videoScriptService;\n this.analysisService = bundle.analysisService;\n this.seoService = bundle.seoService;\n this.abTestService = bundle.abTestService;\n this.imagePromptService = bundle.imagePromptService;\n this.contentCalendarService = bundle.contentCalendarService;\n this.mediaGenerationService = bundle.mediaGenerationService;\n }\n\n /** The composed factory — chat()/chatStream() with usage, health, fallback. */\n get providers(): ProviderFactory {\n return this.providerFactory;\n }\n\n generateBlogPost(request: BlogGenerationRequest): Promise<GeneratedBlog> {\n return this.blogService.generateBlogPost(request);\n }\n\n generateSocialContent(request: SocialContentRequest): Promise<GeneratedSocialContent> {\n return this.socialService.generateSocialContent(request);\n }\n generateForAllPlatforms(topic: string, tone: ContentTone): Promise<GeneratedSocialContent[]> {\n return this.socialService.generateForAllPlatforms(topic, tone);\n }\n generateHashtags(content: string, count: number): Promise<string[]> {\n return this.socialService.generateHashtags(content, count);\n }\n optimizeHashtags(hashtags: string[], platform: SocialPlatform): Promise<string[]> {\n return Promise.resolve(this.socialService.optimizeHashtags(hashtags, platform));\n }\n\n generateVideoScript(request: VideoScriptRequest): Promise<GeneratedVideoScript> {\n return this.videoScriptService.generateVideoScript(request);\n }\n generateVoiceScript(topic: string, emotion: Emotion, duration: number): Promise<GeneratedVideoScript> {\n return this.videoScriptService.generateVoiceScript(topic, emotion, duration);\n }\n\n generateContentCalendar(niche: string, days: number): Promise<ContentCalendarEntry[]> {\n return this.contentCalendarService.generateContentCalendar(niche, days);\n }\n\n analyzeSentiment(content: string): Promise<SentimentAnalysisResult> {\n return this.analysisService.analyzeSentiment(content);\n }\n analyzeContent(request: ContentAnalysisRequest): Promise<ContentAnalysisResult> {\n return this.analysisService.analyzeContent(request);\n }\n\n optimizeSEO(request: SEOOptimizationRequest): Promise<SEOOptimizationResult> {\n return this.seoService.optimizeSEO(request);\n }\n calculateSEOScore(content: string, keywords: string[]): Promise<SEOScoreBreakdown> {\n return this.seoService.calculateSEOScore(content, keywords);\n }\n analyzeKeywords(content: string, keywords: string[]): Promise<KeywordAnalysis[]> {\n return Promise.resolve(this.seoService.analyzeKeywords(content, keywords));\n }\n\n predictABTest(request: ABTestRequest): Promise<ABTestPrediction[]> {\n return this.abTestService.predictABTest(request);\n }\n compareVariants(variantA: string, variantB: string): Promise<ABTestComparison> {\n return this.abTestService.compareVariants(variantA, variantB);\n }\n\n generateImagePrompt(description: string, style: string): Promise<string> {\n return this.imagePromptService.generateImagePrompt(description, style);\n }\n generateImagePromptsForBlog(blogContent: string): Promise<string[]> {\n return this.imagePromptService.generateImagePromptsForBlog(blogContent);\n }\n\n generateImage(request: ImageGenerationRequest): Promise<GeneratedContent> {\n return this.mediaGenerationService.generateImage(request);\n }\n generateVideo(request: VideoGenerationRequest): Promise<GeneratedContent> {\n return this.mediaGenerationService.generateVideo(request);\n }\n convertImageToVideo(request: ImageToVideoRequest): Promise<GeneratedContent> {\n return this.mediaGenerationService.convertImageToVideo(request);\n }\n transformVideo(request: VideoToVideoRequest): Promise<GeneratedContent> {\n return this.mediaGenerationService.transformVideo(request);\n }\n}\n","\nimport type { WizardStep } from './base.wizard';\nimport type { BlogGenerationRequest, SocialContentRequest, VideoScriptRequest } from '../content/domain/entities/ContentGeneration';\n\nexport type ContentType = 'blog' | 'social' | 'script' | 'news' | 'ebook' | 'podcast';\n\nexport type ContentWizardStep =\n | 'select-type'\n | 'input-topic'\n | 'configure'\n | 'advanced'\n | 'preview'\n | 'generating'\n | 'results';\n\nexport interface ContentWizardData {\n contentType?: ContentType;\n\n topic?: string;\n description?: string;\n\n tone?: 'professional' | 'casual' | 'enthusiastic' | 'humorous' | 'dramatic' | 'educational';\n platform?: 'twitter' | 'linkedin' | 'instagram' | 'threads' | 'tiktok' | 'facebook';\n targetAudience?: string;\n wordCount?: number;\n duration?: number;\n\n keywords?: string[];\n includeImages?: boolean;\n includeCallToAction?: boolean;\n seoOptimization?: boolean;\n language?: string;\n\n generatedContent?: string;\n generatedId?: string;\n}\n\nexport const CONTENT_WIZARD_STEPS: ReadonlyArray<WizardStep<ContentWizardStep>> = [\n {\n id: 'select-type',\n label: 'Select Type',\n icon: 'Layers',\n description: 'Choose the type of content you want to generate',\n validate: (data) => Boolean((data as ContentWizardData).contentType),\n },\n {\n id: 'input-topic',\n label: 'Topic',\n icon: 'Lightbulb',\n description: 'Enter your topic or idea',\n validate: (data) => {\n const topic = (data as ContentWizardData).topic;\n return typeof topic === 'string' && topic.length > 0;\n },\n },\n {\n id: 'configure',\n label: 'Configure',\n icon: 'Settings',\n description: 'Set tone, audience, and platform',\n validate: (data) => {\n const d = data as ContentWizardData;\n return Boolean(d.tone && d.targetAudience);\n },\n },\n {\n id: 'advanced',\n label: 'Advanced',\n icon: 'Sliders',\n description: 'Additional options and optimizations',\n optional: true,\n },\n {\n id: 'preview',\n label: 'Preview',\n icon: 'Eye',\n description: 'Review your settings before generation',\n },\n {\n id: 'generating',\n label: 'Generating',\n icon: 'Sparkles',\n description: 'AI is generating your content',\n },\n {\n id: 'results',\n label: 'Results',\n icon: 'CheckCircle',\n description: 'Your generated content is ready',\n },\n];\n\nexport function buildContentRequest(\n data: ContentWizardData,\n): BlogGenerationRequest | SocialContentRequest | VideoScriptRequest {\n switch (data.contentType) {\n case 'blog':\n return {\n topic: data.topic ?? '',\n blogType: 'tutorial',\n targetKeywords: data.keywords ?? [],\n tone: data.tone ?? 'professional',\n wordCount: data.wordCount ?? 1000,\n targetAudience: data.targetAudience ?? '',\n seoOptimization: data.seoOptimization ?? false,\n includeImages: data.includeImages ?? false,\n includeSchema: false,\n };\n case 'social':\n return {\n topic: data.topic ?? '',\n platform: data.platform ?? 'twitter',\n tone: data.tone ?? 'casual',\n hashtags: true,\n targetAudience: data.targetAudience,\n includeCallToAction: data.includeCallToAction,\n };\n case 'script':\n return {\n topic: data.topic ?? '',\n tone: data.tone ?? 'professional',\n duration: data.duration ?? 60,\n targetAudience: data.targetAudience ?? '',\n includeVisuals: true,\n includeCallToAction: data.includeCallToAction ?? false,\n };\n default:\n throw new Error(`Unsupported content type: ${data.contentType}`);\n }\n}\n","\nimport type { WizardStep } from './base.wizard';\nimport type { ImageGenerationRequest } from '../content/domain/config/ProviderConfig';\n\nexport type ImageWizardStep =\n | 'input-prompt'\n | 'select-style'\n | 'configure'\n | 'advanced'\n | 'preview'\n | 'generating'\n | 'results';\n\nexport interface ImageWizardData {\n prompt?: string;\n\n style?: 'realistic' | 'cartoon' | 'abstract' | 'minimalist' | 'vintage';\n\n format?: 'square' | 'landscape' | 'portrait' | 'story' | 'banner';\n quality?: 'standard' | 'high' | 'ultra';\n quantity?: number;\n\n colorPalette?: string[];\n platform?: 'instagram' | 'youtube' | 'facebook' | 'twitter' | 'general';\n\n generatedImageUrl?: string;\n generatedId?: string;\n}\n\nexport const IMAGE_WIZARD_STEPS: ReadonlyArray<WizardStep<ImageWizardStep>> = [\n {\n id: 'input-prompt',\n label: 'Describe Image',\n icon: 'Image',\n description: 'Describe the image you want to create',\n validate: (data) => {\n const prompt = (data as ImageWizardData).prompt;\n return typeof prompt === 'string' && prompt.length > 0;\n },\n },\n {\n id: 'select-style',\n label: 'Style',\n icon: 'Palette',\n description: 'Choose the artistic style',\n validate: (data) => Boolean((data as ImageWizardData).style),\n },\n {\n id: 'configure',\n label: 'Configure',\n icon: 'Settings',\n description: 'Set format, quality, and quantity',\n validate: (data) => {\n const d = data as ImageWizardData;\n return Boolean(d.format && d.quality);\n },\n },\n {\n id: 'advanced',\n label: 'Advanced',\n icon: 'Sliders',\n description: 'Color palette and platform optimization',\n optional: true,\n },\n { id: 'preview', label: 'Preview', icon: 'Eye', description: 'Review your settings' },\n { id: 'generating', label: 'Generating', icon: 'Sparkles', description: 'AI is creating your image' },\n { id: 'results', label: 'Results', icon: 'Image', description: 'Your generated image is ready' },\n];\n\nexport function buildImageRequest(data: ImageWizardData): ImageGenerationRequest {\n return {\n type: 'image',\n prompt: data.prompt ?? '',\n style: data.style,\n format: data.format,\n quality: data.quality,\n quantity: data.quantity ?? 1,\n };\n}\n","\nimport type { WizardStep } from './base.wizard';\nimport type { VideoGenerationRequest, ImageToVideoRequest, VideoToVideoRequest } from '../content/domain/config/ProviderConfig';\n\nexport type VideoGenerationType = 'text-to-video' | 'image-to-video' | 'video-to-video';\n\nexport type VideoWizardStep =\n | 'select-type'\n | 'input-source'\n | 'configure'\n | 'advanced'\n | 'preview'\n | 'generating'\n | 'results';\n\nexport interface VideoWizardData {\n generationType?: VideoGenerationType;\n\n prompt?: string;\n imageUrl?: string;\n sourceVideoUrl?: string;\n\n duration?: number;\n aspectRatio?: '16:9' | '9:16' | '1:1';\n style?: 'realistic' | 'animated' | 'cinematic' | 'documentary';\n quality?: 'standard' | 'high' | 'ultra';\n\n motion?: 'slow' | 'medium' | 'fast';\n camera?: 'static' | 'pan' | 'zoom' | 'tracking';\n styleTransfer?: 'cinematic' | 'anime' | 'cartoon' | 'vintage';\n enhanceQuality?: boolean;\n\n generatedVideoUrl?: string;\n generatedId?: string;\n}\n\nconst validateSource = (data: Record<string, unknown>): boolean => {\n const d = data as VideoWizardData;\n if (d.generationType === 'text-to-video') {\n return typeof d.prompt === 'string' && d.prompt.length > 0;\n }\n if (d.generationType === 'image-to-video') {\n return typeof d.imageUrl === 'string' && d.imageUrl.length > 0;\n }\n if (d.generationType === 'video-to-video') {\n return typeof d.sourceVideoUrl === 'string' && d.sourceVideoUrl.length > 0\n && typeof d.prompt === 'string' && d.prompt.length > 0;\n }\n return false;\n};\n\nexport const VIDEO_WIZARD_STEPS: ReadonlyArray<WizardStep<VideoWizardStep>> = [\n {\n id: 'select-type',\n label: 'Select Type',\n icon: 'Video',\n description: 'Choose video generation type',\n validate: (data) => Boolean((data as VideoWizardData).generationType),\n },\n {\n id: 'input-source',\n label: 'Source',\n icon: 'FileInput',\n description: 'Provide your source (prompt, image, or video)',\n validate: validateSource,\n },\n {\n id: 'configure',\n label: 'Configure',\n icon: 'Settings',\n description: 'Set duration, aspect ratio, and style',\n validate: (data) => {\n const d = data as VideoWizardData;\n return Boolean(d.duration && d.aspectRatio);\n },\n },\n { id: 'advanced', label: 'Advanced', icon: 'Sliders', description: 'Additional video options', optional: true },\n { id: 'preview', label: 'Preview', icon: 'Eye', description: 'Review your settings' },\n { id: 'generating', label: 'Generating', icon: 'Sparkles', description: 'AI is creating your video' },\n { id: 'results', label: 'Results', icon: 'Video', description: 'Your generated video is ready' },\n];\n\nexport function buildVideoRequest(\n data: VideoWizardData,\n): VideoGenerationRequest | ImageToVideoRequest | VideoToVideoRequest {\n switch (data.generationType) {\n case 'text-to-video':\n return {\n type: 'video',\n prompt: data.prompt ?? '',\n duration: data.duration ?? 5,\n aspectRatio: data.aspectRatio ?? '16:9',\n style: data.style,\n quality: data.quality,\n } as VideoGenerationRequest;\n case 'image-to-video':\n return {\n type: 'video',\n imageUrl: data.imageUrl ?? '',\n prompt: data.prompt,\n duration: data.duration ?? 5,\n motion: data.motion ?? 'medium',\n camera: data.camera ?? 'static',\n } as ImageToVideoRequest;\n case 'video-to-video':\n return {\n type: 'video',\n sourceVideoUrl: data.sourceVideoUrl ?? '',\n prompt: data.prompt ?? '',\n styleTransfer: data.styleTransfer,\n enhanceQuality: data.enhanceQuality,\n } as VideoToVideoRequest;\n default:\n throw new Error(`Unsupported generation type: ${data.generationType}`);\n }\n}\n"]}
1
+ {"version":3,"sources":["../../src/content/domain/types/index.ts","../../src/content/domain/calculations/ContentCreditCost.ts","../../src/content/domain/limits/ImageFormatOptions.ts","../../src/content/domain/calculations/AspectRatioDimensions.ts","../../src/content/domain/predicates/QualityRecommenderByRatio.ts","../../src/content/domain/constants/GenerationConstants.ts","../../src/core/errors/ai-error-types.ts","../../src/core/errors/ai-error.ts","../../src/content/domain/errors/AIErrors.ts","../../src/content/domain/limits/ValidationLimits.ts","../../src/content/domain/limits/SpeechPaceConfig.ts","../../src/content/domain/limits/ProviderTimingConfig.ts","../../src/content/domain/limits/ModelDefaults.ts","../../src/content/domain/limits/RequestQueueConfig.ts","../../src/content/domain/limits/MemoryConfig.ts","../../src/content/domain/calculations/SpeechPaceEstimate.ts","../../src/content/domain/calculations/SeoKeywordDensity.ts","../../src/content/domain/calculations/AbTestImprovementRatio.ts","../../src/content/domain/calculations/RetryBackoffDelay.ts","../../src/content/domain/calculations/ContentCalendarDateOffset.ts","../../src/content/domain/calculations/DefaultModelSelection.ts","../../src/content/domain/predicates/KeywordProminenceClassifier.ts","../../src/content/domain/predicates/HashtagPriorityRanker.ts","../../src/content/domain/predicates/PlatformSpecResolver.ts","../../src/content/domain/predicates/ScoreRangeGuard.ts","../../src/content/domain/predicates/AbTestConfidence.ts","../../src/content/domain/predicates/ProviderCostEstimator.ts","../../src/content/domain/predicates/FalImageRenderingOptions.ts","../../src/content/domain/validation/TopicTextValidator.ts","../../src/content/domain/validation/ContentBodyValidator.ts","../../src/content/domain/validation/KeywordListValidator.ts","../../src/content/domain/validation/DurationSecondsValidator.ts","../../src/content/domain/validation/CalendarDaysValidator.ts","../../src/content/domain/validation/HashtagCountValidator.ts","../../src/content/domain/utils/IdGenerator.ts","../../src/core/errors/groq-error.ts","../../src/core/errors/error-classifier.ts","../../src/core/errors/http-status-classifier.ts","../../src/core/errors/response-error-message-extractor.ts","../../src/core/errors/unified-ai-error.ts","../../src/providers/base/provider.types.ts","../../src/providers/factory/provider.factory.ts","../../src/core/constants/protocol.constants.ts","../../src/core/parsers/sse-lines.ts","../../src/core/parsers/json-content-extractor.ts","../../src/core/parsers/json-response.parser.ts","../../src/core/parsers/structured-prompt.builder.ts","../../src/core/tiers/index.ts","../../src/providers/anthropic/anthropic.constants.ts","../../src/providers/anthropic/anthropic-http.transport.ts","../../src/providers/anthropic/anthropic-request.builder.ts","../../src/providers/anthropic/anthropic-stream.parser.ts","../../src/providers/anthropic/anthropic.provider.ts","../../src/core/calculations/lru-key-selector.ts","../../src/core/calculations/cache-hit-rate.ts","../../src/core/utils/cache-key-builder.ts","../../src/core/utils/cache-manager.ts","../../src/core/calculations/exponential-backoff.ts","../../src/core/constants/identifier.constants.ts","../../src/core/utils/retry.ts","../../src/core/utils/request-queue.util.ts","../../src/core/utils/request-deduplicator.util.ts","../../src/core/utils/api-key-validator.ts","../../src/providers/groq/groq.constants.ts","../../src/providers/groq/groq-request.builder.ts","../../src/providers/groq/groq-config-store.ts","../../src/providers/groq/groq-http-transport.ts","../../src/core/executor/retry-executor.strategy.ts","../../src/core/executor/queue-executor.strategy.ts","../../src/core/executor/dedupe-executor.strategy.ts","../../src/core/executor/composite-executor.strategy.ts","../../src/providers/groq/groq-http-client.ts","../../src/providers/groq/groq-sse.ts","../../src/providers/groq/groq.provider.ts","../../src/providers/base/base.provider.ts","../../src/providers/gemini/gemini.provider.ts","../../src/providers/fal/fal.provider.ts","../../src/providers/pruna/client/core/constants/limits.ts","../../src/providers/pruna/client/core/constants/network.ts","../../src/providers/pruna/client/core/constants/mime-types.ts","../../src/providers/pruna/client/core/errors/cancellation-error.ts","../../src/providers/pruna/client/core/errors/authentication-error.ts","../../src/providers/pruna/client/core/errors/timeout-error.ts","../../src/providers/pruna/client/core/errors/validation-error.ts","../../src/providers/pruna/client/core/utils/base64.ts","../../src/providers/pruna/client/core/utils/mime-detector.ts","../../src/providers/pruna/client/core/utils/api-error-parser.ts","../../src/providers/pruna/client/core/protocol/http-status.ts","../../src/providers/pruna/client/core/protocol/job-status.ts","../../src/providers/pruna/client/core/protocol/abort-signal-classifier.ts","../../src/providers/pruna/client/core/protocol/pruna-url-builder.ts","../../src/providers/pruna/client/core/math/exponential-backoff.ts","../../src/providers/pruna/client/core/utils/uri-resolver.ts","../../src/providers/pruna/client/core/services/pruna-client.service.ts","../../src/providers/pruna/client/core/math/comparison-hash.ts","../../src/providers/pruna/client/core/math/cache-key-derivation.ts","../../src/providers/pruna/client/core/validation/api-key-validator.ts","../../src/providers/pruna/client/core/validation/image-source-validator.ts","../../src/providers/pruna/client/core/validation/aspect-ratio-validator.ts","../../src/providers/pruna/client/core/validation/resolution-validator.ts","../../src/providers/pruna/client/core/validation/duration-validator.ts","../../src/providers/pruna/client/core/validation/prompt-validator.ts","../../src/providers/pruna/client/core/validation/seed-validator.ts","../../src/providers/pruna/client/core/protocol/input-type-guard.ts","../../src/providers/pruna/client/core/utils/request-deduplicator.ts","../../src/providers/pruna/client/generation/builders/text-to-image.builder.ts","../../src/providers/pruna/client/generation/builders/image-to-image.builder.ts","../../src/providers/pruna/client/generation/builders/image-to-video.builder.ts","../../src/providers/pruna/client/generation/builders/model-input-builder.ts","../../src/providers/pruna/client/generation/builders/builder-factory.ts","../../src/providers/pruna/client/generation/services/generation.service.ts","../../src/providers/pruna/pruna-generate.ts","../../src/providers/pruna/pruna.provider.ts","../../src/core/sse/tool-call-accumulator.ts","../../src/providers/adapters/openai-compatible.adapter.ts","../../src/providers/openai-compatible/openai-compatible.provider.ts","../../src/providers/workers-ai/workers-ai.entities.ts","../../src/providers/workers-ai/workers-ai.text.ts","../../src/providers/workers-ai/workers-ai.provider.ts","../../src/providers/factory/create-ai.ts","../../src/content/application/prompts/PromptBuilder.ts","../../src/content/application/services/BlogService.ts","../../src/content/infrastructure/utils/requestQueue.ts","../../src/content/application/services/SocialService.ts","../../src/content/application/services/VideoScriptService.ts","../../src/content/application/services/AnalysisService.ts","../../src/content/application/services/SeoService.ts","../../src/content/application/services/ABTestService.ts","../../src/content/application/services/ImagePromptService.ts","../../src/content/application/services/ContentCalendarService.ts","../../src/content/application/services/ProviderServices.ts","../../src/content/infrastructure/utils/jsonParser.ts","../../src/content/application/services/GenerationExecutor.ts","../../src/content/application/services/AIContentService.ts","../../src/wizard/content.wizard.ts","../../src/wizard/image.wizard.ts","../../src/wizard/video.wizard.ts"],"names":["AIErrorType","retryManager","findLastIndex","ValidationError","calculateExponentialBackoff","RequestDeduplicator","STRUCTURED_TEMPERATURE","RequestPriority","RequestQueue","repairCommonJsonDefects","executor","factory"],"mappings":"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","file":"index.cjs","sourcesContent":["\nexport type SocialPlatform = 'twitter' | 'linkedin' | 'instagram' | 'threads' | 'tiktok' | 'facebook';\n\nexport type ContentTone = 'professional' | 'casual' | 'enthusiastic' | 'humorous' | 'dramatic' | 'educational' | 'inspirational';\n\nexport type ContentType = 'blog' | 'video' | 'social' | 'email' | 'advertisement' | 'caption' | 'script';\n\nexport type Emotion = 'happy' | 'excited' | 'calm' | 'sad' | 'angry' | 'surprised' | 'fearful' | 'disgusted' | 'neutral';\n\nexport type Sentiment = 'positive' | 'neutral' | 'negative';\n\nexport type BlogType = 'tutorial' | 'listicle' | 'review' | 'opinion' | 'howto';\n\nexport interface PlatformSpecs {\n maxLength: number;\n style: string;\n emojiSupport: boolean;\n hashtagSupport: boolean;\n imageSupport: boolean;\n videoSupport: boolean;\n maxHashtags: number;\n}\n\nexport const PLATFORM_SPECS: Record<SocialPlatform, PlatformSpecs> = {\n twitter: {\n maxLength: 280,\n style: 'concise, engaging, thread-friendly',\n emojiSupport: true,\n hashtagSupport: true,\n imageSupport: true,\n videoSupport: true,\n maxHashtags: 5,\n },\n linkedin: {\n maxLength: 3000,\n style: 'professional, insightful, industry-focused',\n emojiSupport: true,\n hashtagSupport: true,\n imageSupport: true,\n videoSupport: true,\n maxHashtags: 5,\n },\n instagram: {\n maxLength: 2200,\n style: 'visual, engaging, emoji-rich',\n emojiSupport: true,\n hashtagSupport: true,\n imageSupport: true,\n videoSupport: true,\n maxHashtags: 30,\n },\n threads: {\n maxLength: 500,\n style: 'conversational, community-driven',\n emojiSupport: true,\n hashtagSupport: true,\n imageSupport: true,\n videoSupport: true,\n maxHashtags: 5,\n },\n tiktok: {\n maxLength: 150,\n style: 'catchy, trending, short-form',\n emojiSupport: true,\n hashtagSupport: true,\n imageSupport: false,\n videoSupport: true,\n maxHashtags: 5,\n },\n facebook: {\n maxLength: 63206,\n style: 'conversational, engaging, shareable',\n emojiSupport: true,\n hashtagSupport: true,\n imageSupport: true,\n videoSupport: true,\n maxHashtags: 5,\n },\n};\n","\nimport type { GenerationType } from '../types/GenerationTypes';\nimport type { ImageQuality, VideoQuality } from '../limits/ImageFormatOptions';\n\nexport type QualityTier = 'standard' | 'hd' | '4k';\n\nexport const CREDIT_COSTS: Readonly<Record<GenerationType, Readonly<Record<QualityTier, number>>>> = {\n 'text-to-image': { standard: 1, hd: 2, '4k': 4 },\n 'image-to-image': { standard: 1, hd: 2, '4k': 4 },\n 'image-to-video': { standard: 3, hd: 5, '4k': 8 },\n 'text-to-video': { standard: 5, hd: 8, '4k': 12 },\n} as const;\n\nexport const DEFAULT_CREDIT_COST: number = 0;\n\nexport type AnyQuality = QualityTier | ImageQuality | VideoQuality;\n\nexport function toQualityTier(quality: AnyQuality | undefined): QualityTier {\n if (quality === '4k') return '4k';\n if (quality === 'hd' || quality === '1080p') return 'hd';\n return 'standard';\n}\n\nexport function calculateContentCreditCost(\n type: GenerationType,\n quality: AnyQuality = 'standard',\n): number {\n const tierCosts = CREDIT_COSTS[type];\n if (!tierCosts) return DEFAULT_CREDIT_COST;\n return tierCosts[toQualityTier(quality)] ?? tierCosts.standard;\n}\n","\nexport type AspectRatio = '1:1' | '16:9' | '9:16' | '4:3' | '3:4';\nexport type ImageQuality = 'standard' | 'hd' | '4k';\nexport type VideoQuality = '720p' | '1080p' | '4k';\nexport type MotionStrength = 'slow' | 'medium' | 'fast';\nexport type ImageStyle = 'realistic' | 'artistic' | 'anime' | 'cinematic' | 'vintage' | 'fantasy' | 'minimalist' | 'abstract';\n\nexport interface AspectRatioOption {\n value: AspectRatio;\n label: string;\n width: number;\n height: number;\n}\n\nexport interface ImageQualityOption {\n value: ImageQuality;\n label: string;\n description: string;\n resolution: string;\n}\n\nexport interface VideoQualityOption {\n value: VideoQuality;\n label: string;\n resolution: string;\n}\n\nexport interface MotionOption {\n value: MotionStrength;\n label: string;\n description: string;\n}\n\nexport interface StylePreset {\n value: ImageStyle;\n label: string;\n promptFragment: string;\n}\n\nexport const ASPECT_RATIO_OPTIONS: ReadonlyArray<AspectRatioOption> = [\n { value: '1:1', label: 'Square', width: 1024, height: 1024 },\n { value: '16:9', label: 'Landscape', width: 1920, height: 1080 },\n { value: '9:16', label: 'Portrait', width: 1080, height: 1920 },\n { value: '4:3', label: 'Standard', width: 1440, height: 1080 },\n { value: '3:4', label: 'Tall', width: 1080, height: 1440 },\n] as const;\n\nexport const IMAGE_QUALITY_OPTIONS: ReadonlyArray<ImageQualityOption> = [\n { value: 'standard', label: 'Standard', description: '1024x1024, good quality', resolution: '1024x1024' },\n { value: 'hd', label: 'HD', description: '1920x1080, high quality', resolution: '1920x1080' },\n { value: '4k', label: '4K', description: '3840x2160, ultra quality', resolution: '3840x2160' },\n] as const;\n\nexport const VIDEO_QUALITY_OPTIONS: ReadonlyArray<VideoQualityOption> = [\n { value: '720p', label: '720p HD', resolution: '1280x720' },\n { value: '1080p', label: '1080p Full HD', resolution: '1920x1080' },\n { value: '4k', label: '4K Ultra HD', resolution: '3840x2160' },\n] as const;\n\nexport const VIDEO_DURATION_OPTIONS_SECONDS: ReadonlyArray<number> = [2, 3, 4, 5, 6, 7, 8, 9, 10] as const;\n\nexport const MOTION_OPTIONS: ReadonlyArray<MotionOption> = [\n { value: 'slow', label: 'Slow', description: 'Gentle movement' },\n { value: 'medium', label: 'Medium', description: 'Balanced motion' },\n { value: 'fast', label: 'Fast', description: 'Dynamic movement' },\n] as const;\n\nexport const STYLE_PRESETS: ReadonlyArray<StylePreset> = [\n { value: 'realistic', label: 'Realistic', promptFragment: 'realistic, photograph, detailed' },\n { value: 'artistic', label: 'Artistic', promptFragment: 'artistic, painting, creative' },\n { value: 'anime', label: 'Anime', promptFragment: 'anime style, manga, vibrant colors' },\n { value: 'cinematic', label: 'Cinematic', promptFragment: 'cinematic, movie scene, dramatic lighting' },\n { value: 'vintage', label: 'Vintage', promptFragment: 'vintage, retro, film grain' },\n { value: 'fantasy', label: 'Fantasy', promptFragment: 'fantasy, magical, ethereal' },\n { value: 'minimalist', label: 'Minimalist', promptFragment: 'minimalist, clean, simple' },\n { value: 'abstract', label: 'Abstract', promptFragment: 'abstract, geometric, artistic' },\n] as const;\n","\nimport { ASPECT_RATIO_OPTIONS, type AspectRatio } from '../limits/ImageFormatOptions';\n\nconst FALLBACK_DIMENSIONS = { width: 1024, height: 1024 } as const;\n\nexport function resolveDimensionsForAspectRatio(\n ratio: AspectRatio,\n): { width: number; height: number } {\n const match = ASPECT_RATIO_OPTIONS.find((option) => option.value === ratio);\n return match ? { width: match.width, height: match.height } : FALLBACK_DIMENSIONS;\n}\n","\nimport type { AspectRatio, ImageQuality, VideoQuality } from '../limits/ImageFormatOptions';\n\nconst WIDE_RATIOS: ReadonlySet<AspectRatio> = new Set(['16:9', '4:3']);\n\nexport function recommendQualityForAspectRatio(\n ratio: AspectRatio,\n): ImageQuality | VideoQuality {\n return WIDE_RATIOS.has(ratio) ? 'hd' : 'standard';\n}\n","\nimport {\n ASPECT_RATIO_OPTIONS,\n IMAGE_QUALITY_OPTIONS,\n VIDEO_QUALITY_OPTIONS,\n VIDEO_DURATION_OPTIONS_SECONDS,\n MOTION_OPTIONS,\n STYLE_PRESETS,\n} from '../limits/ImageFormatOptions';\nimport {\n resolveDimensionsForAspectRatio,\n} from '../calculations/AspectRatioDimensions';\nimport { recommendQualityForAspectRatio } from '../predicates/QualityRecommenderByRatio';\n\nexport const ASPECT_RATIO_VALUES = ASPECT_RATIO_OPTIONS.map((o) => o.value);\nexport const IMAGE_QUALITY_VALUES = IMAGE_QUALITY_OPTIONS.map((o) => o.value);\nexport const VIDEO_QUALITY_VALUES = VIDEO_QUALITY_OPTIONS.map((o) => o.value);\n\nexport const VIDEO_DURATION_OPTIONS = VIDEO_DURATION_OPTIONS_SECONDS;\n\nexport { MOTION_OPTIONS, STYLE_PRESETS };\n\nexport const getDimensionsForAspectRatio = resolveDimensionsForAspectRatio;\n\nexport const getRecommendedQuality = recommendQualityForAspectRatio;\n","\nexport enum AIErrorType {\n INVALID_API_KEY = \"INVALID_API_KEY\",\n MISSING_CONFIG = \"MISSING_CONFIG\",\n NETWORK_ERROR = \"NETWORK_ERROR\",\n ABORT_ERROR = \"ABORT_ERROR\",\n RATE_LIMIT_ERROR = \"RATE_LIMIT_ERROR\",\n SERVER_ERROR = \"SERVER_ERROR\",\n CLIENT_ERROR = \"CLIENT_ERROR\",\n UNKNOWN_ERROR = \"UNKNOWN_ERROR\",\n}\n\nexport const USER_FRIENDLY_ERROR_MESSAGES: Readonly<Record<AIErrorType, string>> = {\n [AIErrorType.INVALID_API_KEY]: \"Please check your API key and try again.\",\n [AIErrorType.MISSING_CONFIG]: \"The provider is not configured. Please create a provider with createAI first.\",\n [AIErrorType.NETWORK_ERROR]: \"Network error. Please check your connection and try again.\",\n [AIErrorType.ABORT_ERROR]: \"Request was cancelled.\",\n [AIErrorType.RATE_LIMIT_ERROR]: \"You've reached the rate limit. Please wait a moment and try again.\",\n [AIErrorType.SERVER_ERROR]: \"The AI service is temporarily unavailable. Please try again later.\",\n [AIErrorType.CLIENT_ERROR]: \"The request was invalid. Please check your input and try again.\",\n [AIErrorType.UNKNOWN_ERROR]: \"An unexpected error occurred. Please try again.\",\n};\n","\nimport { AIErrorType } from \"./ai-error-types\";\n\nexport interface AIErrorMetadata {\n readonly status?: number;\n readonly url?: string;\n readonly [key: string]: unknown;\n}\n\nconst KNOWN_ERROR_TYPES = new Set<string>(Object.values(AIErrorType));\n\nfunction mapCodeToType(code: string): AIErrorType {\n switch (code) {\n case \"VALIDATION_ERROR\":\n case \"CLIENT_ERROR\":\n return AIErrorType.CLIENT_ERROR;\n case \"INVALID_API_KEY\":\n return AIErrorType.INVALID_API_KEY;\n case \"MISSING_CONFIG\":\n case \"PROVIDER_UNAVAILABLE\":\n return AIErrorType.MISSING_CONFIG;\n case \"PROVIDER_QUOTA_EXHAUSTED\":\n case \"RATE_LIMIT_ERROR\":\n return AIErrorType.RATE_LIMIT_ERROR;\n case \"NETWORK_ERROR\":\n case \"TIMEOUT\":\n return AIErrorType.NETWORK_ERROR;\n case \"ABORT_ERROR\":\n case \"ABORTED\":\n return AIErrorType.ABORT_ERROR;\n case \"SERVER_ERROR\":\n case \"PROVIDER_ERROR\":\n case \"NO_RESULT\":\n return AIErrorType.SERVER_ERROR;\n default:\n return AIErrorType.UNKNOWN_ERROR;\n }\n}\n\nfunction mapMessageToCode(message: string, fallback: string = \"UNKNOWN\"): string {\n const lower = message.toLowerCase();\n if (lower.includes(\"validation\")) return \"VALIDATION_ERROR\";\n if (lower.includes(\"quota\")) return \"PROVIDER_QUOTA_EXHAUSTED\";\n if (lower.includes(\"unavailable\")) return \"PROVIDER_UNAVAILABLE\";\n if (lower.includes(\"timeout\") || lower.includes(\"aborted\")) {\n return lower.includes(\"aborted\") ? \"ABORTED\" : \"TIMEOUT\";\n }\n if (lower.includes(\"parse\") || lower.includes(\"json\")) return \"PARSE_ERROR\";\n if (lower.includes(\"no result\")) return \"NO_RESULT\";\n if (lower.includes(\"network\") || lower.includes(\"fetch\")) return \"NETWORK_ERROR\";\n return fallback;\n}\n\nexport class AIError extends Error {\n public readonly type: AIErrorType;\n public readonly code: string;\n public readonly cause?: unknown;\n public readonly metadata: AIErrorMetadata;\n\n constructor(\n typeOrMessage: AIErrorType | string,\n messageOrCode?: string,\n cause?: unknown,\n metadata: AIErrorMetadata = {},\n ) {\n let effectiveType: AIErrorType;\n let effectiveMessage: string;\n let effectiveCode: string;\n\n if (KNOWN_ERROR_TYPES.has(typeOrMessage)) {\n effectiveType = typeOrMessage as AIErrorType;\n effectiveMessage = messageOrCode ?? \"\";\n effectiveCode = effectiveType;\n } else {\n effectiveMessage = typeOrMessage;\n effectiveCode = messageOrCode ?? \"UNKNOWN\";\n effectiveType = mapCodeToType(effectiveCode);\n }\n\n super(effectiveMessage);\n this.name = \"AIError\";\n this.type = effectiveType;\n this.code = effectiveCode;\n this.cause = cause;\n this.metadata = metadata;\n }\n\n static from(error: unknown, fallbackCode: string = \"UNKNOWN\"): AIError {\n if (error instanceof AIError) return error;\n if (error instanceof Error) {\n const code = mapMessageToCode(error.message, fallbackCode);\n return new AIError(error.message, code, error);\n }\n return new AIError(String(error), fallbackCode, error);\n }\n\n override toString(): string {\n const statusPart =\n typeof this.metadata.status === \"number\" ? ` (HTTP ${this.metadata.status})` : \"\";\n return `${this.name} [${this.type}]: ${this.message}${statusPart}`;\n }\n\n toJSON(): {\n name: string;\n type: AIErrorType;\n code: string;\n message: string;\n metadata: AIErrorMetadata;\n } {\n return {\n name: this.name,\n type: this.type,\n code: this.code,\n message: this.message,\n metadata: this.metadata,\n };\n }\n}\n","\nimport { AIError } from \"../../../core/errors/ai-error\";\n\nexport type AIErrorCode =\n | 'VALIDATION_ERROR'\n | 'PROVIDER_UNAVAILABLE'\n | 'PROVIDER_QUOTA_EXHAUSTED'\n | 'PROVIDER_ERROR'\n | 'NETWORK_ERROR'\n | 'TIMEOUT'\n | 'ABORTED'\n | 'PARSE_ERROR'\n | 'NO_RESULT'\n | 'UNKNOWN';\n\nexport { AIError };\n\nexport class ValidationError extends AIError {\n constructor(message: string) {\n super(message, 'VALIDATION_ERROR');\n this.name = 'ValidationError';\n }\n}\n\nexport class ProviderUnavailableError extends AIError {\n constructor(providerId: string) {\n super(`Provider ${providerId} is not available`, 'PROVIDER_UNAVAILABLE');\n this.name = 'ProviderUnavailableError';\n }\n}\n\nexport class ProviderQuotaExhaustedError extends AIError {\n constructor(providerId: string) {\n super(`Provider ${providerId} quota exhausted`, 'PROVIDER_QUOTA_EXHAUSTED');\n this.name = 'ProviderQuotaExhaustedError';\n }\n}\n","\nexport const ValidationLimits = {\n TOPIC: {\n MIN: 1,\n MAX: 500,\n },\n CONTENT: {\n MIN: 1,\n MAX: 10_000,\n },\n KEYWORD: {\n MAX_COUNT: 20,\n MAX_LENGTH: 50,\n },\n DURATION_SECONDS: {\n MIN: 10,\n MAX: 600,\n },\n CALENDAR_DAYS: {\n MIN: 1,\n MAX: 90,\n },\n HASHTAG_COUNT: {\n MIN: 1,\n MAX: 50,\n },\n SEO_CONTENT_PREVIEW: 500,\n BLOG_PROMPT_PREVIEW: 1_000,\n AB_VARIANT_CONTENT_PREVIEW: 200,\n} as const;\n\nexport type ValidationLimitsConfig = typeof ValidationLimits;\n","\nexport const SpeechPaceConfig = {\n WORDS_PER_SECOND: 2.5,\n\n TOKENS_PER_SECOND: 10,\n\n JSON_TOKEN_OVERHEAD: 500,\n\n TOKENS_PER_CALENDAR_DAY: 150,\n} as const;\n","\nexport const ProviderTimingConfig = {\n DEFAULT_TIMEOUT_MS: 30_000,\n DEFAULT_RETRY_ATTEMPTS: 3,\n\n FAL_TIMEOUT_MS: 120_000,\n FAL_RETRY_ATTEMPTS: 2,\n\n GEMINI_TIMEOUT_MS: 60_000,\n GEMINI_RETRY_ATTEMPTS: 3,\n\n GROQ_TIMEOUT_MS: 30_000,\n GROQ_RETRY_ATTEMPTS: 3,\n\n HEALTH_CHECK_TTL_MS: 5 * 60 * 1000,\n\n RETRY_BACKOFF_BASE_MS: 1_000,\n} as const;\n","\nexport const ModelDefaults = {\n GROQ_TEXT: 'llama-3.1-8b-instant',\n GROQ_CHAT: 'llama-3.1-8b-instant',\n FAL_IMAGE: 'fal-ai/flux/schnell',\n FAL_VIDEO: 'fal-ai/hunyuan-video/1',\n FAL_IMAGE_TO_VIDEO: 'fal-ai/fast-animatediff/image-to-video',\n GEMINI_TEXT: 'gemini-2.0-flash',\n GEMINI_IMAGE: 'imagen-4.0-generate-001',\n PRUNA_IMAGE: 'p-image',\n PRUNA_IMAGE_EDIT: 'p-image-edit',\n PRUNA_VIDEO: 'p-video',\n} as const;\n\nexport const TextModelDefaults = {\n TEXT_MODEL: 'claude-sonnet-4-20250514',\n MAX_TOKENS: 4_096,\n DEFAULT_TEMPERATURE: 0.7,\n DEFAULT_TOP_P: 0.9,\n} as const;\n","\nexport const RequestQueueConfig = {\n MAX_CONCURRENT: 3,\n MAX_QUEUE_SIZE: 50,\n DEFAULT_TIMEOUT_MS: 30_000,\n RETRY_DELAY_MS: 1_000,\n\n RATE_LIMIT: {\n ENABLED: true,\n WINDOW_MS: 60_000,\n MAX_REQUESTS_PER_WINDOW: 100,\n },\n\n POLL_INTERVAL_MS: 100,\n} as const;\n","\nexport const MemoryConfig = {\n MANAGER: {\n MAX_SIZE_BYTES: 50 * 1024 * 1024,\n CLEANUP_THRESHOLD_RATIO: 0.8,\n RETENTION_RATIO: 0.5,\n },\n POOL: {\n DEFAULT_MAX_SIZE: 100,\n },\n EXPIRING_CACHE: {\n DEFAULT_TTL_MS: 60_000,\n CLEANUP_INTERVAL_MS: 60_000,\n },\n} as const;\n","\nimport { SpeechPaceConfig } from '../limits/SpeechPaceConfig';\n\nexport function estimateWordCountForDuration(durationSeconds: number): number {\n return Math.floor(durationSeconds * SpeechPaceConfig.WORDS_PER_SECOND);\n}\n\nexport function estimateTokenBudgetForDuration(durationSeconds: number): number {\n return durationSeconds * SpeechPaceConfig.TOKENS_PER_SECOND + SpeechPaceConfig.JSON_TOKEN_OVERHEAD;\n}\n\nexport function estimateTokenBudgetForCalendarDays(days: number): number {\n return days * SpeechPaceConfig.TOKENS_PER_CALENDAR_DAY + SpeechPaceConfig.JSON_TOKEN_OVERHEAD;\n}\n","\nexport function countKeywordOccurrences(content: string, keyword: string): number {\n if (!keyword) return 0;\n const escaped = keyword.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n const matches = content.match(new RegExp(escaped, 'gi'));\n return matches ? matches.length : 0;\n}\n\nexport function countWordsInContent(content: string): number {\n const tokens = content.split(/\\s+/).filter(Boolean);\n return tokens.length || 1;\n}\n\nexport function calculateKeywordDensity(content: string, keyword: string): number {\n const totalWords = countWordsInContent(content);\n const occurrences = countKeywordOccurrences(content, keyword);\n return (occurrences / totalWords) * 100;\n}\n","\nexport function calculateImprovementPercentage(scoreA: number, scoreB: number): string {\n const higher = Math.max(scoreA, scoreB);\n const lower = Math.min(scoreA, scoreB);\n if (lower <= 0) {\n return '100';\n }\n const delta = ((higher / lower) - 1) * 100;\n return Math.abs(delta).toFixed(0);\n}\n\nexport function selectHigherScoreVariantId(\n scoreA: number,\n scoreB: number,\n idA: string = 'A',\n idB: string = 'B',\n): string {\n return scoreA > scoreB ? idA : idB;\n}\n","\nimport { ProviderTimingConfig } from '../limits/ProviderTimingConfig';\n\nexport function calculateRetryBackoffDelayMs(attemptIndex: number): number {\n return ProviderTimingConfig.RETRY_BACKOFF_BASE_MS * Math.pow(2, attemptIndex);\n}\n","\nconst ONE_DAY_MS = 24 * 60 * 60 * 1000;\n\nexport function resolveCalendarEntryDate(dayIndex: number, baseTimestamp: number = Date.now()): Date {\n return new Date(baseTimestamp + (dayIndex - 1) * ONE_DAY_MS);\n}\n","\nimport type { GenerationType } from '../types/GenerationTypes';\nimport { ModelDefaults } from '../limits/ModelDefaults';\n\nexport function resolveDefaultPrunaModel(generationType: GenerationType): string {\n switch (generationType) {\n case 'image-to-image':\n return ModelDefaults.PRUNA_IMAGE_EDIT;\n case 'image-to-video':\n return ModelDefaults.PRUNA_VIDEO;\n case 'text-to-image':\n return ModelDefaults.PRUNA_IMAGE;\n case 'text-to-video':\n return ModelDefaults.PRUNA_VIDEO;\n }\n}\n","\nexport type KeywordProminence = 'high' | 'medium' | 'low';\n\nconst HIGH_DENSITY_THRESHOLD = 2;\nconst MEDIUM_DENSITY_THRESHOLD = 1;\n\nexport function classifyKeywordProminence(densityPercent: number): KeywordProminence {\n if (densityPercent > HIGH_DENSITY_THRESHOLD) return 'high';\n if (densityPercent > MEDIUM_DENSITY_THRESHOLD) return 'medium';\n return 'low';\n}\n\nexport function isUnderutilizedKeyword(densityPercent: number): boolean {\n return densityPercent < 1;\n}\n","\nimport type { SocialPlatform } from '../types';\nimport { PLATFORM_SPECS } from '../types';\n\nexport const DEFAULT_HASHTAG_BUDGET: number = Number.MAX_SAFE_INTEGER;\n\nexport function resolveHashtagBudget(platform: SocialPlatform): number {\n return PLATFORM_SPECS[platform]?.maxHashtags ?? DEFAULT_HASHTAG_BUDGET;\n}\n\nexport function rankAndTrimHashtags(hashtags: ReadonlyArray<string>, budget: number): string[] {\n if (hashtags.length <= budget) return [...hashtags];\n return [...hashtags].sort((a, b) => b.length - a.length).slice(0, budget);\n}\n","\nimport type { PlatformSpecs, SocialPlatform } from '../types';\nimport { PLATFORM_SPECS } from '../types';\n\nconst FALLBACK_SPEC: PlatformSpecs = {\n maxLength: 280,\n style: 'concise, engaging, audience-friendly',\n emojiSupport: true,\n hashtagSupport: true,\n imageSupport: true,\n videoSupport: true,\n maxHashtags: 5,\n};\n\nexport function resolvePlatformSpec(platform: SocialPlatform): PlatformSpecs {\n return PLATFORM_SPECS[platform] ?? FALLBACK_SPEC;\n}\n\nexport function resolveMaxContentLength(platform: SocialPlatform, override?: number): number {\n return override ?? resolvePlatformSpec(platform).maxLength;\n}\n","\nconst SCORE_MIN = 0;\nconst SCORE_MAX = 100;\nconst SCORE_FALLBACK = 50;\n\nconst CONFIDENCE_MIN = 0;\nconst CONFIDENCE_MAX = 1;\nconst CONFIDENCE_FALLBACK = 0.5;\n\nexport function clampScoreToValidRange(score: number, fallback: number = SCORE_FALLBACK): number {\n if (!Number.isFinite(score)) return fallback;\n return Math.max(SCORE_MIN, Math.min(SCORE_MAX, score));\n}\n\nexport function clampConfidenceToValidRange(\n confidence: number,\n fallback: number = CONFIDENCE_FALLBACK,\n): number {\n if (!Number.isFinite(confidence)) return fallback;\n return Math.max(CONFIDENCE_MIN, Math.min(CONFIDENCE_MAX, confidence));\n}\n","\nexport const AB_TEST_DEFAULT_CONFIDENCE: number = 0.7;\n","\nimport type { ImageGenerationRequest, TextGenerationRequest, VideoGenerationRequest } from '../config/ProviderConfig';\n\nconst FAL_FIXED_COST = 1;\nconst GROQ_FREE_TIER_COST = 0;\nconst GEMINI_IMAGE_COST = 0.02;\nconst GEMINI_TEXT_PER_1K_CHARS_COST = 0.0001;\nconst PRUNA_FIXED_COST = 1;\nconst UNKNOWN_PROVIDER_COST = 0;\n\nexport function estimateGroqGenerationCost(\n _request?: TextGenerationRequest | ImageGenerationRequest | VideoGenerationRequest,\n): number {\n return GROQ_FREE_TIER_COST;\n}\n\nexport function estimateFalGenerationCost(\n _request?: ImageGenerationRequest | VideoGenerationRequest,\n): number {\n return FAL_FIXED_COST;\n}\n\nexport function estimateGeminiGenerationCost(\n request: TextGenerationRequest | ImageGenerationRequest,\n): number {\n if (request.type === 'image') return GEMINI_IMAGE_COST;\n return GEMINI_TEXT_PER_1K_CHARS_COST;\n}\n\nexport function estimatePrunaGenerationCost(): number {\n return PRUNA_FIXED_COST;\n}\n\nexport function estimateUnknownProviderCost(): number {\n return UNKNOWN_PROVIDER_COST;\n}\n","\nconst FAL_FORMAT_TO_IMAGE_SIZE: Readonly<Record<string, string>> = {\n square: 'square_hd',\n landscape: 'landscape_16_9',\n portrait: 'portrait_9_16',\n story: 'portrait_9_16',\n banner: 'landscape_16_9',\n};\n\nconst FAL_DEFAULT_IMAGE_SIZE = 'square_hd';\n\nconst FAL_QUALITY_TO_STEPS: Readonly<Record<string, number>> = {\n standard: 4,\n high: 6,\n ultra: 8,\n};\n\nconst FAL_DEFAULT_QUALITY_STEPS = 6;\n\nexport function resolveFalImageSize(format?: string): string {\n if (!format) return FAL_DEFAULT_IMAGE_SIZE;\n return FAL_FORMAT_TO_IMAGE_SIZE[format] ?? FAL_DEFAULT_IMAGE_SIZE;\n}\n\nexport function resolveFalInferenceSteps(quality?: string): number {\n if (!quality) return FAL_DEFAULT_QUALITY_STEPS;\n return FAL_QUALITY_TO_STEPS[quality] ?? FAL_DEFAULT_QUALITY_STEPS;\n}\n","\nimport { ValidationLimits } from '../limits/ValidationLimits';\nimport { ValidationError } from '../errors/AIErrors';\n\nexport function validateTopicText(topic: string): string {\n if (typeof topic !== 'string' || topic.trim().length < ValidationLimits.TOPIC.MIN) {\n throw new ValidationError('Topic cannot be empty');\n }\n const trimmed = topic.trim();\n if (trimmed.length > ValidationLimits.TOPIC.MAX) {\n throw new ValidationError(`Topic exceeds maximum length of ${ValidationLimits.TOPIC.MAX} characters`);\n }\n return trimmed;\n}\n","\nimport { ValidationLimits } from '../limits/ValidationLimits';\nimport { ValidationError } from '../errors/AIErrors';\n\nexport function validateContentBody(content: string): string {\n if (typeof content !== 'string' || content.trim().length < ValidationLimits.CONTENT.MIN) {\n throw new ValidationError('Content cannot be empty');\n }\n const trimmed = content.trim();\n if (trimmed.length > ValidationLimits.CONTENT.MAX) {\n throw new ValidationError(`Content exceeds maximum length of ${ValidationLimits.CONTENT.MAX} characters`);\n }\n return trimmed;\n}\n\nexport function truncateForSeoPreview(content: string): string {\n return content.substring(0, ValidationLimits.SEO_CONTENT_PREVIEW);\n}\n\nexport function truncateForBlogPromptPreview(content: string): string {\n return content.substring(0, ValidationLimits.BLOG_PROMPT_PREVIEW);\n}\n\nexport function truncateForAbVariantPreview(content: string): string {\n return content.substring(0, ValidationLimits.AB_VARIANT_CONTENT_PREVIEW);\n}\n","\nimport { ValidationLimits } from '../limits/ValidationLimits';\nimport { ValidationError } from '../errors/AIErrors';\n\nexport function validateKeywordList(keywords: unknown): string[] {\n if (!Array.isArray(keywords)) {\n throw new ValidationError('Keywords must be an array');\n }\n if (keywords.length > ValidationLimits.KEYWORD.MAX_COUNT) {\n throw new ValidationError(`Cannot process more than ${ValidationLimits.KEYWORD.MAX_COUNT} keywords`);\n }\n return keywords\n .filter((k): k is string => typeof k === 'string' && k.trim().length > 0)\n .map((keyword) => {\n const trimmed = keyword.trim();\n if (trimmed.length > ValidationLimits.KEYWORD.MAX_LENGTH) {\n const preview = trimmed.substring(0, 20);\n throw new ValidationError(\n `Keyword \"${preview}...\" exceeds maximum length of ${ValidationLimits.KEYWORD.MAX_LENGTH} characters`,\n );\n }\n return trimmed;\n });\n}\n","\nimport { ValidationLimits } from '../limits/ValidationLimits';\nimport { ValidationError } from '../errors/AIErrors';\n\nexport function validateDurationSeconds(duration: number): number {\n if (!Number.isFinite(duration)) {\n throw new ValidationError(\n `Duration must be between ${ValidationLimits.DURATION_SECONDS.MIN} and ${ValidationLimits.DURATION_SECONDS.MAX} seconds`,\n );\n }\n if (duration < ValidationLimits.DURATION_SECONDS.MIN || duration > ValidationLimits.DURATION_SECONDS.MAX) {\n throw new ValidationError(\n `Duration must be between ${ValidationLimits.DURATION_SECONDS.MIN} and ${ValidationLimits.DURATION_SECONDS.MAX} seconds`,\n );\n }\n return duration;\n}\n","\nimport { ValidationLimits } from '../limits/ValidationLimits';\nimport { ValidationError } from '../errors/AIErrors';\n\nexport function validateCalendarDays(days: number): number {\n if (!Number.isFinite(days)) {\n throw new ValidationError(\n `Days must be between ${ValidationLimits.CALENDAR_DAYS.MIN} and ${ValidationLimits.CALENDAR_DAYS.MAX}`,\n );\n }\n if (days < ValidationLimits.CALENDAR_DAYS.MIN || days > ValidationLimits.CALENDAR_DAYS.MAX) {\n throw new ValidationError(\n `Days must be between ${ValidationLimits.CALENDAR_DAYS.MIN} and ${ValidationLimits.CALENDAR_DAYS.MAX}`,\n );\n }\n return days;\n}\n","\nimport { ValidationLimits } from '../limits/ValidationLimits';\nimport { ValidationError } from '../errors/AIErrors';\n\nexport function validateHashtagCount(count: number): number {\n if (!Number.isFinite(count)) {\n throw new ValidationError(\n `Hashtag count must be between ${ValidationLimits.HASHTAG_COUNT.MIN} and ${ValidationLimits.HASHTAG_COUNT.MAX}`,\n );\n }\n if (count < ValidationLimits.HASHTAG_COUNT.MIN || count > ValidationLimits.HASHTAG_COUNT.MAX) {\n throw new ValidationError(\n `Hashtag count must be between ${ValidationLimits.HASHTAG_COUNT.MIN} and ${ValidationLimits.HASHTAG_COUNT.MAX}`,\n );\n }\n return Math.floor(count);\n}\n","\nexport function generateId(prefix?: string): string {\n const id =\n typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function'\n ? crypto.randomUUID()\n : `${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 11)}`;\n\n return prefix ? `${prefix}-${id}` : id;\n}\n","import { AIError, type AIErrorMetadata } from \"./ai-error\";\nimport { AIErrorType } from \"./ai-error-types\";\n\nexport type GroqErrorMetadata = AIErrorMetadata;\nexport { AIErrorType as GroqErrorType };\n\n/**\n * Drop-in backwards-compatible GroqError extending core AIError.\n * Ensures `err instanceof GroqError` and `err instanceof AIError` both evaluate to true.\n */\nexport class GroqError extends AIError {\n constructor(\n type: AIErrorType,\n message: string,\n cause?: Error,\n metadata: GroqErrorMetadata = {},\n ) {\n super(type, message, cause, metadata);\n this.name = \"GroqError\";\n }\n}\n","\nimport { AIErrorType } from \"./ai-error-types\";\n\nconst DEFAULT_RETRYABLE_TYPES: ReadonlySet<AIErrorType> = new Set([\n AIErrorType.NETWORK_ERROR,\n AIErrorType.RATE_LIMIT_ERROR,\n AIErrorType.SERVER_ERROR,\n]);\n\nconst DEFAULT_AUTH_TYPES: ReadonlySet<AIErrorType> = new Set([\n AIErrorType.INVALID_API_KEY,\n]);\n\nexport interface ErrorClassificationRule {\n readonly retryable: ReadonlySet<AIErrorType>;\n readonly auth: ReadonlySet<AIErrorType>;\n}\n\nexport const DEFAULT_ERROR_CLASSIFICATION_RULE: ErrorClassificationRule = {\n retryable: DEFAULT_RETRYABLE_TYPES,\n auth: DEFAULT_AUTH_TYPES,\n};\n\nexport function isRetryableErrorType(\n type: AIErrorType,\n rule: ErrorClassificationRule = DEFAULT_ERROR_CLASSIFICATION_RULE,\n): boolean {\n return rule.retryable.has(type);\n}\n\nexport function isAuthErrorType(\n type: AIErrorType,\n rule: ErrorClassificationRule = DEFAULT_ERROR_CLASSIFICATION_RULE,\n): boolean {\n return rule.auth.has(type);\n}\n","\nimport { AIErrorType } from \"./ai-error-types\";\n\nexport interface HttpStatusClassificationRule {\n readonly unauthorizedStatuses: ReadonlySet<number>;\n readonly rateLimitedStatus: number;\n readonly serverErrorThreshold: number;\n readonly clientErrorThreshold: number;\n}\n\nexport const DEFAULT_HTTP_STATUS_RULE: HttpStatusClassificationRule = {\n unauthorizedStatuses: new Set([401, 403]),\n rateLimitedStatus: 429,\n serverErrorThreshold: 500,\n clientErrorThreshold: 400,\n};\n\nexport function classifyHttpStatus(\n status: number,\n rule: HttpStatusClassificationRule = DEFAULT_HTTP_STATUS_RULE,\n): AIErrorType {\n if (rule.unauthorizedStatuses.has(status)) return AIErrorType.INVALID_API_KEY;\n if (status === rule.rateLimitedStatus) return AIErrorType.RATE_LIMIT_ERROR;\n if (status >= rule.serverErrorThreshold) return AIErrorType.SERVER_ERROR;\n if (status >= rule.clientErrorThreshold) return AIErrorType.CLIENT_ERROR;\n return AIErrorType.UNKNOWN_ERROR;\n}\n","\nimport { AIErrorType } from \"./ai-error-types\";\n\nexport interface AIErrorBody {\n readonly error?: { readonly message?: string };\n readonly message?: string;\n}\n\nexport function extractErrorMessageFromJsonBody(body: unknown): string | null {\n if (!body || typeof body !== \"object\") return null;\n const candidate = body as AIErrorBody;\n const message = candidate.error?.message ?? candidate.message;\n if (typeof message === \"string\" && message.length > 0) return message;\n return null;\n}\n\nexport function buildHttpStatusFallback(status: number, statusText: string): string {\n const trimmedStatusText = statusText.trim();\n if (trimmedStatusText.length > 0) {\n return `HTTP ${status}: ${trimmedStatusText}`;\n }\n return `HTTP ${status}`;\n}\n\nexport async function extractErrorMessageFromResponse(response: Response): Promise<string> {\n const body: unknown = await response.json().catch(() => null);\n const fromBody = extractErrorMessageFromJsonBody(body);\n if (fromBody) return fromBody;\n return buildHttpStatusFallback(response.status, response.statusText);\n}\n\nexport function describeAIErrorType(type: AIErrorType): string {\n return `AIError[${type}]`;\n}\n","export type AiErrorCode =\n | 'invalid_key'\n | 'missing_key'\n | 'rate_limited'\n | 'capacity'\n | 'timeout'\n | 'invalid_request'\n | 'model_unavailable'\n | 'upstream_error'\n | 'network'\n | 'cancelled';\n\nexport const STATUS_TO_CODE: Readonly<Record<number, AiErrorCode>> = {\n 400: 'invalid_request',\n 401: 'invalid_key',\n 403: 'invalid_key',\n 404: 'model_unavailable',\n 413: 'invalid_request',\n 422: 'invalid_request',\n 429: 'rate_limited',\n 500: 'upstream_error',\n 502: 'upstream_error',\n 503: 'capacity',\n 504: 'timeout',\n};\n\nexport const CODE_MESSAGES: Readonly<Record<AiErrorCode, string>> = {\n invalid_key: 'The provider rejected the configured API key.',\n missing_key: 'The provider is not configured with an API key.',\n rate_limited: 'The provider rate limit was reached. Try again shortly.',\n capacity: 'The provider is temporarily at capacity. Try again shortly.',\n timeout: 'The model took too long to respond.',\n invalid_request: 'The request was rejected by the provider.',\n model_unavailable: 'The requested model is not available.',\n upstream_error: 'The provider returned an unexpected error.',\n network: 'Could not reach the provider.',\n cancelled: 'Generation was cancelled.',\n};\n\nexport class AiError extends Error {\n readonly code: AiErrorCode;\n\n constructor(code: AiErrorCode, message?: string) {\n super(message ?? CODE_MESSAGES[code]);\n this.name = 'AiError';\n this.code = code;\n }\n\n get userMessage(): string {\n return this.message;\n }\n}\n\nexport function aiErrorMessage(code: AiErrorCode): string {\n return CODE_MESSAGES[code];\n}\n\nexport interface ProviderErrorShape {\n readonly type?: string;\n readonly code?: string;\n}\n\nfunction isApiKeyRejection(provider: ProviderErrorShape): boolean {\n if (provider.code === 'invalid_api_key') return true;\n return provider.type === undefined;\n}\n\nexport function errorFromStatus(\n status: number,\n detail?: string,\n provider?: ProviderErrorShape,\n): AiError {\n let code = STATUS_TO_CODE[status] ?? 'upstream_error';\n if (status === 403 && provider && !isApiKeyRejection(provider)) {\n code = 'model_unavailable';\n }\n return new AiError(code, detail ? `${CODE_MESSAGES[code]} (${detail})` : undefined);\n}\n\nexport function errorFromUnknown(err: unknown): AiError {\n if (err instanceof AiError) return err;\n if (err instanceof Error) {\n if (err.name === 'TimeoutError' || err.name === 'AbortError') {\n return new AiError('timeout');\n }\n if (err.name === 'TypeError') {\n return new AiError('network');\n }\n return new AiError('upstream_error', err.message);\n }\n return new AiError('upstream_error');\n}\n","\nimport type {\n GenerationResult,\n ProviderHealth,\n StreamCallbacks,\n StructuredGeneration,\n StructuredTextRequest,\n TextRequest,\n TextTier,\n} from \"../../core/types\";\nimport type {\n GeneratedContent,\n ImageGenerationRequest,\n ImageToVideoRequest,\n TextGenerationRequest,\n VideoGenerationRequest,\n VideoToVideoRequest,\n} from \"../../content/domain/config/ProviderConfig\";\n\n/**\n * What a provider can serve. Replaces the old single `'multimodal'` type flag:\n * a provider declares exactly the capabilities it implements, and the factory\n * walks providers by capability when routing or failing over.\n */\nexport type ProviderCapability = \"text\" | \"image\" | \"video\";\n\n/** Cost estimation input — any generation request shape the fleet knows. */\nexport type CostEstimateRequest =\n | TextGenerationRequest\n | ImageGenerationRequest\n | VideoGenerationRequest;\n\nexport interface IProviderBase {\n readonly id: string;\n readonly name: string;\n readonly capabilities: ReadonlyArray<ProviderCapability>;\n healthCheck(): Promise<ProviderHealth>;\n estimateCost(request: CostEstimateRequest): Promise<number>;\n}\n\n/**\n * A provider that can turn conversations into text. This is the surface the\n * factory's `chat`/`chatStream` walk; model choice per quality tier is the\n * provider's own business (each maps neutral tiers onto its catalogue).\n */\nexport interface ITextProvider extends IProviderBase {\n generate(request: TextRequest): Promise<GenerationResult>;\n generateStructured<T>(request: StructuredTextRequest): Promise<StructuredGeneration<T>>;\n stream(request: TextRequest, callbacks: StreamCallbacks): Promise<GenerationResult>;\n resolveModel(tier: TextTier): string;\n}\n\n/**\n * A provider that generates media. Kept as B's media surface — image/video\n * request and result shapes are already provider-neutral.\n */\nexport interface IMediaProvider extends IProviderBase {\n generateImage(request: ImageGenerationRequest): Promise<GeneratedContent>;\n generateVideo(request: VideoGenerationRequest): Promise<GeneratedContent>;\n imageToVideo(request: ImageToVideoRequest): Promise<GeneratedContent>;\n videoToVideo(request: VideoToVideoRequest): Promise<GeneratedContent>;\n}\n\nexport type AnyProvider = ITextProvider | IMediaProvider;\nexport type IAIProvider = AnyProvider;\n\nexport function isTextProvider(provider: AnyProvider): provider is ITextProvider {\n return provider.capabilities.includes(\"text\");\n}\n\nexport function isMediaProvider(provider: AnyProvider): provider is IMediaProvider {\n return provider.capabilities.includes(\"image\") || provider.capabilities.includes(\"video\");\n}\n","\nimport type {\n GenerationResult,\n ProviderHealth,\n StreamCallbacks,\n StructuredGeneration,\n StructuredTextRequest,\n TextRequest,\n TextTier,\n} from \"../../core/types\";\nimport { AIError, AIErrorType } from \"../../core/errors\";\nimport type {\n AnyProvider,\n IMediaProvider,\n ITextProvider,\n ProviderCapability,\n} from \"../base/provider.types\";\nimport { isTextProvider } from \"../base/provider.types\";\nimport type {\n GeneratedContent,\n ImageGenerationRequest,\n ImageToVideoRequest,\n VideoGenerationRequest,\n VideoToVideoRequest,\n} from \"../../content/domain/config/ProviderConfig\";\nimport type {\n ITextGenerator,\n TextGenerationOptions,\n} from \"../../content/domain/interfaces/ITextGenerator\";\nimport { ProviderTimingConfig } from \"../../content/domain/limits/ProviderTimingConfig\";\n\nexport interface ProviderFactoryConfig {\n /** Provider ids in preference order; unlisted providers follow in registration order. */\n priority?: ReadonlyArray<string>;\n fallbackEnabled?: boolean;\n /** Tier used when a request names neither a model nor a tier. */\n defaultTier?: TextTier;\n}\n\ninterface HealthCheckCache {\n health: ProviderHealth;\n timestamp: number;\n}\n\n/**\n * Composition-aware registry and router. Replaces both ancestors at once:\n * B's ProviderFactory (health TTL cache, priority fallback walk, media\n * dispatch) and A's singleton configureProvider (via createAI). Adds the\n * provider-neutral `chat`/`chatStream` text surface with full usage\n * propagation, and keeps B's ITextGenerator string facade so the ported\n * content services compile unchanged.\n */\nexport class ProviderFactory implements ITextGenerator {\n private readonly providers = new Map<string, AnyProvider>();\n private readonly healthCache = new Map<string, HealthCheckCache>();\n private readonly priority: ReadonlyArray<string>;\n private readonly fallbackEnabled: boolean;\n readonly defaultTier: TextTier;\n\n constructor(config: ProviderFactoryConfig = {}) {\n this.priority = config.priority ?? [];\n this.fallbackEnabled = config.fallbackEnabled ?? true;\n this.defaultTier = config.defaultTier ?? \"balanced\";\n }\n\n register(provider: AnyProvider): void {\n this.providers.set(provider.id, provider);\n }\n\n getProvider(id: string): AnyProvider | undefined {\n return this.providers.get(id);\n }\n\n getAllProviders(): AnyProvider[] {\n return Array.from(this.providers.values());\n }\n\n getByCapability(capability: ProviderCapability): AnyProvider[] {\n return this.getAllProviders().filter((provider) =>\n provider.capabilities.includes(capability),\n );\n }\n\n getTextProviders(): ITextProvider[] {\n return this.getAllProviders().filter(isTextProvider);\n }\n\n hasTextProvider(): boolean {\n return this.getByCapability(\"text\").length > 0;\n }\n\n /* ---------- neutral text surface ---------- */\n\n /**\n * Single-chat entry point: resolves a healthy text provider by priority,\n * injects the default tier when the request names neither model nor tier,\n * and walks the fallback chain on failure. Providers map tiers onto their\n * own models, so switching Groq→Anthropic is a config change.\n */\n async chat(request: TextRequest): Promise<GenerationResult> {\n const effective: TextRequest =\n request.model || request.tier ? request : { ...request, tier: this.defaultTier };\n return this.executeWithFallback(\"text\", (provider) =>\n (provider as ITextProvider).generate(effective),\n );\n }\n\n async chatStream(\n request: TextRequest,\n callbacks: StreamCallbacks,\n ): Promise<GenerationResult> {\n const effective: TextRequest =\n request.model || request.tier ? request : { ...request, tier: this.defaultTier };\n\n let lastError: unknown;\n // onError is withheld until every provider has failed — a successful\n // fallback would otherwise have already reported a spurious error.\n const attemptCallbacks: StreamCallbacks = {\n onChunk: callbacks.onChunk,\n onComplete: callbacks.onComplete,\n };\n\n const providers = this.getByCapability(\"text\");\n if (providers.length === 0) {\n throw this.noProviderError(\"text\");\n }\n\n const ordered = this.orderByPriority(providers);\n for (const provider of ordered) {\n if (!this.isProviderHealthy(provider.id)) continue;\n try {\n return await (provider as ITextProvider).stream(effective, attemptCallbacks);\n } catch (error) {\n lastError = error;\n this.markDegraded(provider.id);\n if (!this.fallbackEnabled) {\n callbacks.onError?.(error instanceof Error ? error : new Error(String(error)));\n throw error;\n }\n }\n }\n\n const failure = new AIError(\n AIErrorType.SERVER_ERROR,\n `All providers failed for capability 'text'`,\n lastError instanceof Error ? lastError : undefined,\n );\n callbacks.onError?.(lastError instanceof Error ? lastError : failure);\n throw failure;\n }\n\n /** AsyncGenerator adapter over chatStream — A's familiar consumption shape. */\n async *streamText(request: TextRequest): AsyncGenerator<string> {\n const queue: string[] = [];\n let wake: (() => void) | null = null;\n let finished = false;\n let failure: unknown;\n\n const controller = new AbortController();\n const onAbort = () => controller.abort();\n request.signal?.addEventListener(\"abort\", onAbort);\n const effectiveRequest = { ...request, signal: controller.signal };\n\n const notify = (): void => {\n const resolve = wake;\n wake = null;\n resolve?.();\n };\n\n const completion = this.chatStream(effectiveRequest, {\n onChunk: (chunk) => {\n queue.push(chunk);\n notify();\n },\n }).then(\n () => {\n finished = true;\n notify();\n },\n (error) => {\n failure = error;\n finished = true;\n notify();\n },\n );\n\n try {\n while (!finished || queue.length > 0) {\n if (queue.length === 0 && !finished) {\n await new Promise<void>((resolve) => {\n wake = resolve;\n });\n }\n while (queue.length > 0) {\n yield queue.shift() as string;\n }\n if (failure) throw failure;\n }\n await completion;\n } finally {\n controller.abort();\n request.signal?.removeEventListener(\"abort\", onAbort);\n }\n }\n\n async generateJson<T>(\n request: StructuredTextRequest,\n ): Promise<StructuredGeneration<T>> {\n const effective: StructuredTextRequest =\n request.model || request.tier ? request : { ...request, tier: this.defaultTier };\n return this.executeWithFallback(\"text\", (provider) =>\n (provider as ITextProvider).generateStructured<T>(effective),\n );\n }\n\n /* ---------- content-layer string facade (ITextGenerator) ---------- */\n\n async generateText(prompt: string, options: TextGenerationOptions = {}): Promise<string> {\n const result = await this.chat({\n messages: [{ role: \"user\", content: prompt }],\n model: options.model,\n maxTokens: options.maxTokens,\n temperature: options.temperature,\n topP: options.topP,\n });\n return result.text;\n }\n\n generateTextStream(prompt: string, options: TextGenerationOptions = {}): AsyncGenerator<string> {\n return this.streamText({\n messages: [{ role: \"user\", content: prompt }],\n model: options.model,\n maxTokens: options.maxTokens,\n temperature: options.temperature,\n topP: options.topP,\n });\n }\n\n /* ---------- media surface ---------- */\n\n async generateImage(request: ImageGenerationRequest): Promise<GeneratedContent> {\n return this.executeWithFallback(\"image\", (provider) =>\n (provider as IMediaProvider).generateImage(request),\n );\n }\n\n async generateVideo(request: VideoGenerationRequest): Promise<GeneratedContent> {\n return this.executeWithFallback(\"video\", (provider) =>\n (provider as IMediaProvider).generateVideo(request),\n );\n }\n\n async imageToVideo(request: ImageToVideoRequest): Promise<GeneratedContent> {\n return this.executeWithFallback(\"video\", (provider) =>\n (provider as IMediaProvider).imageToVideo(request),\n );\n }\n\n async videoToVideo(request: VideoToVideoRequest): Promise<GeneratedContent> {\n return this.executeWithFallback(\"video\", (provider) =>\n (provider as IMediaProvider).videoToVideo(request),\n );\n }\n\n /* ---------- health ---------- */\n\n async checkProviderHealth(providerId: string, forceRefresh = false): Promise<ProviderHealth> {\n const provider = this.providers.get(providerId);\n if (!provider) {\n return \"unavailable\";\n }\n\n const cached = this.healthCache.get(providerId);\n const now = Date.now();\n const ttl = ProviderTimingConfig.HEALTH_CHECK_TTL_MS;\n\n if (!forceRefresh && cached && now - cached.timestamp < ttl) {\n return cached.health;\n }\n\n try {\n const health = await provider.healthCheck();\n this.healthCache.set(providerId, { health, timestamp: now });\n return health;\n } catch {\n this.healthCache.set(providerId, { health: \"unavailable\", timestamp: now });\n return \"unavailable\";\n }\n }\n\n isProviderHealthy(providerId: string): boolean {\n const cached = this.healthCache.get(providerId);\n if (!cached) {\n return true;\n }\n return cached.health === \"healthy\" || cached.health === \"degraded\";\n }\n\n async refreshAllHealth(): Promise<void> {\n await Promise.all(\n Array.from(this.providers.keys()).map((id) => this.checkProviderHealth(id)),\n );\n }\n\n /* ---------- internals ---------- */\n\n private async executeWithFallback<T>(\n capability: ProviderCapability,\n fn: (provider: AnyProvider) => Promise<T>,\n ): Promise<T> {\n const providers = this.getByCapability(capability);\n if (providers.length === 0) {\n throw this.noProviderError(capability);\n }\n\n let lastError: unknown;\n for (const provider of this.orderByPriority(providers)) {\n if (!this.isProviderHealthy(provider.id)) {\n continue;\n }\n\n try {\n return await fn(provider);\n } catch (error) {\n lastError = error;\n this.markDegraded(provider.id);\n if (!this.fallbackEnabled) {\n throw error;\n }\n }\n }\n\n throw new AIError(\n AIErrorType.SERVER_ERROR,\n `All providers failed for capability '${capability}'`,\n lastError instanceof Error ? lastError : undefined,\n );\n }\n\n private orderByPriority(providers: AnyProvider[]): AnyProvider[] {\n if (this.priority.length === 0) {\n return providers;\n }\n const ordered: AnyProvider[] = [];\n for (const providerId of this.priority) {\n const provider = providers.find((p) => p.id === providerId);\n if (provider) ordered.push(provider);\n }\n for (const provider of providers) {\n if (!this.priority.includes(provider.id)) {\n ordered.push(provider);\n }\n }\n return ordered;\n }\n\n private markDegraded(providerId: string): void {\n const cached = this.healthCache.get(providerId);\n if (cached) {\n this.healthCache.set(providerId, { health: \"degraded\", timestamp: cached.timestamp });\n }\n }\n\n private noProviderError(capability: ProviderCapability): AIError {\n return new AIError(\n AIErrorType.MISSING_CONFIG,\n `No provider registered for capability '${capability}' — create one with createAI() and include its config block`,\n );\n }\n}\n\nexport function createProviderFactory(config?: ProviderFactoryConfig): ProviderFactory {\n return new ProviderFactory(config);\n}\n","export const SSE_PREFIX = \"data: \" as const;\nexport const SSE_DONE_MARKER = \"[DONE]\" as const;\n\nexport const JSON_CODE_BLOCK_PATTERN = /```(?:json)?\\s*\\n?([\\s\\S]*?)\\n?```/;\nexport const JSON_OBJECT_PATTERN = /\\{[\\s\\S]*\\}/;\nexport const JSON_ARRAY_PATTERN = /\\[[\\s\\S]*\\]/;\n","import { SSE_DONE_MARKER, SSE_PREFIX } from \"../constants/protocol.constants\";\n\nexport function isSseDataLine(line: string): boolean {\n return line.startsWith(SSE_PREFIX) || line.startsWith(\"data:\");\n}\n\nexport function extractSseDataPayload(line: string): string {\n if (line.startsWith(SSE_PREFIX)) {\n return line.slice(SSE_PREFIX.length);\n }\n if (line.startsWith(\"data:\")) {\n return line.slice(5);\n }\n return line;\n}\n\nexport function isSseDoneMarker(payload: string): boolean {\n return payload === SSE_DONE_MARKER;\n}\n\nexport function splitSseLines(rawChunk: string): ReadonlyArray<string> {\n return rawChunk.split(\"\\n\").map((l) => l.trim()).filter((l) => l.length > 0);\n}\n\nexport interface NormalizedSseChunk {\n readonly payload: string;\n readonly isDone: boolean;\n}\n\nexport function normalizeSseChunk(rawChunk: string): ReadonlyArray<NormalizedSseChunk> {\n const lines = splitSseLines(rawChunk);\n const result: NormalizedSseChunk[] = [];\n for (const line of lines) {\n if (!isSseDataLine(line)) continue;\n const payload = extractSseDataPayload(line);\n result.push({ payload, isDone: isSseDoneMarker(payload) });\n }\n return result;\n}\n","\nimport {\n JSON_ARRAY_PATTERN,\n JSON_CODE_BLOCK_PATTERN,\n JSON_OBJECT_PATTERN,\n} from \"../constants/protocol.constants\";\n\nexport function extractJsonFromCodeFence(content: string): string | null {\n const match = content.match(JSON_CODE_BLOCK_PATTERN);\n if (match && match[1]) return match[1].trim();\n return null;\n}\n\nexport function extractJsonObject(content: string): string | null {\n const match = content.match(JSON_OBJECT_PATTERN);\n if (match && match[0]) return match[0];\n return null;\n}\n\nexport function extractJsonArray(content: string): string | null {\n const match = content.match(JSON_ARRAY_PATTERN);\n if (match && match[0]) return match[0];\n return null;\n}\n\nexport function repairCommonJsonDefects(text: string): string {\n return text\n .replace(/(:\\s*-?\\d+(?:\\.\\d+)?)\\s*\"/g, \"$1\")\n .replace(/(:\\s*\"[^\"]*\")\"/g, \"$1\");\n}\n\nexport function extractJsonCandidate(content: string): string {\n const fromFence = extractJsonFromCodeFence(content);\n if (fromFence) return fromFence;\n\n const objectIndex = content.indexOf(\"{\");\n const arrayIndex = content.indexOf(\"[\");\n\n if (objectIndex !== -1 && (arrayIndex === -1 || objectIndex < arrayIndex)) {\n const obj = extractJsonObject(content);\n if (obj) return obj;\n } else if (arrayIndex !== -1) {\n const arr = extractJsonArray(content);\n if (arr) return arr;\n }\n\n return content.trim();\n}\n","\nimport { AIError } from \"../errors/ai-error\";\nimport { AIErrorType } from \"../errors/ai-error-types\";\nimport { extractJsonCandidate, repairCommonJsonDefects } from \"./json-content-extractor\";\n\nexport class JsonResponseParser {\n parse<T>(rawContent: string): T {\n const candidate = extractJsonCandidate(rawContent);\n try {\n return JSON.parse(candidate) as T;\n } catch {\n try {\n return JSON.parse(repairCommonJsonDefects(candidate)) as T;\n } catch (error) {\n throw new AIError(\n AIErrorType.UNKNOWN_ERROR,\n \"Failed to parse structured response as JSON\",\n error instanceof Error ? error : undefined,\n { rawContent },\n );\n }\n }\n }\n}\n","\nexport class StructuredPromptBuilder {\n private schema: Record<string, unknown> | undefined;\n private request: string;\n\n constructor(request: string) {\n this.request = request;\n }\n\n static for(request: string): StructuredPromptBuilder {\n return new StructuredPromptBuilder(request);\n }\n\n withSchema(schema: Record<string, unknown> | undefined): this {\n this.schema = schema;\n return this;\n }\n\n build(): string {\n const schemaSection = this.schema\n ? `Expected JSON schema:\\n${JSON.stringify(this.schema, null, 2)}\\n\\n`\n : \"\";\n\n return (\n \"Please generate a JSON response for the following request.\\n\\n\" +\n schemaSection +\n `Request:\\n${this.request}\\n\\n` +\n \"Respond only with valid JSON, formatted as:\\n```json\\n{...}\\n```\"\n );\n }\n}\n","import type { TextTier } from \"../types\";\n\n/**\n * Per-provider default model per tier. Config can override any slot; an\n * explicit `model` on a request overrides everything. This table is the knob\n * that turns \"switch from Claude to Groq\" into a config edit.\n */\nexport type TierModelMap = Readonly<Partial<Record<TextTier, string>>>;\n\nexport const TEXT_TIERS: ReadonlyArray<TextTier> = [\"fast\", \"balanced\", \"powerful\"];\n\nexport function isTextTier(value: unknown): value is TextTier {\n return typeof value === \"string\" && (TEXT_TIERS as readonly string[]).includes(value);\n}\n\nexport function resolveModel(\n tiers: TierModelMap,\n tier: TextTier,\n providerId: string,\n): string {\n const model = tiers[tier] ?? tiers.balanced;\n if (!model) {\n throw new Error(\n `${providerId} has no model configured for tier \"${tier}\" — pass an explicit model or configure the tier map`,\n );\n }\n return model;\n}\n\nexport function mergeTierOverrides(\n defaults: TierModelMap,\n overrides?: TierModelMap,\n): TierModelMap {\n if (!overrides) return defaults;\n return { ...defaults, ...overrides };\n}\n","\nimport type { TierModelMap } from \"../../core/tiers\";\n\nexport const ANTHROPIC_MODELS = {\n OPUS_5_5: \"claude-opus-5-5\",\n SONNET_5_5: \"claude-sonnet-5-5\",\n HAIKU_5_5: \"claude-haiku-5-5\",\n} as const;\n\n/**\n * Neutral tier → Claude model. fast = Haiku for cheap high-volume turns,\n * balanced = Sonnet for everyday quality, powerful = Opus for the heavy\n * lifting. Override per instance via `models` in provider config.\n */\nexport const ANTHROPIC_TIERS: TierModelMap = {\n fast: ANTHROPIC_MODELS.HAIKU_5_5,\n balanced: ANTHROPIC_MODELS.SONNET_5_5,\n powerful: ANTHROPIC_MODELS.OPUS_5_5,\n};\n\n/**\n * Single bump point for the wire protocol version. Every request sends this\n * as the `anthropic-version` header; the shapes in anthropic.entities.ts are\n * pinned to it.\n */\nexport const ANTHROPIC_API_VERSION = \"2026-10-21\" as const;\n\n/** The Messages API requires max_tokens on every request. */\nexport const ANTHROPIC_DEFAULT_MAX_TOKENS = 16000;\n\nexport const ANTHROPIC_BASE_URL = \"https://api.anthropic.com\" as const;\nexport const ANTHROPIC_MESSAGES_PATH = \"/v1/messages\" as const;\nexport const ANTHROPIC_MODELS_PATH = \"/v1/models\" as const;\n\nexport const ANTHROPIC_TIMEOUTS = {\n DEFAULT: 60000,\n STREAMING: 120000,\n} as const;\n\nexport const ANTHROPIC_HEADERS = {\n CONTENT_TYPE: \"Content-Type\",\n APPLICATION_JSON: \"application/json\",\n API_KEY: \"x-api-key\",\n VERSION: \"anthropic-version\",\n} as const;\n\n/**\n * Default reasoning effort per model family. Opus and Haiku default to\n * medium; Sonnet benefits from high. Requests can override via\n * `output_config.effort` — the builder applies these defaults only when the\n * request says nothing.\n */\nexport const ANTHROPIC_DEFAULT_EFFORT = {\n [ANTHROPIC_MODELS.OPUS_5_5]: \"medium\",\n [ANTHROPIC_MODELS.SONNET_5_5]: \"high\",\n [ANTHROPIC_MODELS.HAIKU_5_5]: \"medium\",\n} as const;\n\nexport type AnthropicEffort = \"low\" | \"medium\" | \"high\";\n","\nimport type {\n AnthropicErrorResponse,\n AnthropicMessagesRequest,\n AnthropicMessagesResponse,\n AnthropicProviderConfig,\n} from \"./anthropic.entities\";\nimport { AIError, type AIErrorMetadata, AIErrorType } from \"../../core/errors\";\nimport { classifyHttpStatus, extractErrorMessageFromResponse } from \"../../core/errors\";\nimport {\n ANTHROPIC_BASE_URL,\n ANTHROPIC_HEADERS,\n ANTHROPIC_MESSAGES_PATH,\n ANTHROPIC_MODELS_PATH,\n ANTHROPIC_API_VERSION,\n ANTHROPIC_TIMEOUTS,\n} from \"./anthropic.constants\";\n\nexport interface StreamRequestOptions {\n readonly signal?: AbortSignal;\n}\n\n/**\n * Raw HTTP transport for the Anthropic Messages API (anthropic-version\n * 2026-10-21). Auth is `x-api-key` — NOT a Bearer header. All failures leave\n * here as core AIError with the neutral taxonomy (401→INVALID_API_KEY,\n * 429→RATE_LIMIT, ≥500→SERVER, network TypeError→NETWORK, abort→ABORT).\n */\nexport class AnthropicHttpTransport {\n constructor(private readonly config: AnthropicProviderConfig) {}\n\n async postMessages(\n request: AnthropicMessagesRequest,\n options: StreamRequestOptions = {},\n ): Promise<AnthropicMessagesResponse> {\n const url = `${this.baseUrl()}${ANTHROPIC_MESSAGES_PATH}`;\n const timeout = this.config.timeoutMs ?? ANTHROPIC_TIMEOUTS.DEFAULT;\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeout);\n const onExternalAbort = (): void => controller.abort();\n options.signal?.addEventListener(\"abort\", onExternalAbort);\n\n try {\n const response = await fetch(url, {\n method: \"POST\",\n headers: this.buildHeaders(),\n body: JSON.stringify({ ...request, stream: false }),\n signal: controller.signal,\n });\n\n if (!response.ok) await this.throwFromErrorResponse(response);\n\n return (await response.json()) as AnthropicMessagesResponse;\n } catch (error) {\n throw this.normalizeError(error);\n } finally {\n clearTimeout(timeoutId);\n options.signal?.removeEventListener(\"abort\", onExternalAbort);\n }\n }\n\n async streamMessages(\n request: AnthropicMessagesRequest,\n options: StreamRequestOptions = {},\n ): Promise<ReadableStream<Uint8Array>> {\n const url = `${this.baseUrl()}${ANTHROPIC_MESSAGES_PATH}`;\n const timeout = this.config.timeoutMs ?? ANTHROPIC_TIMEOUTS.STREAMING;\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeout);\n const onExternalAbort = (): void => controller.abort();\n options.signal?.addEventListener(\"abort\", onExternalAbort);\n\n try {\n const response = await fetch(url, {\n method: \"POST\",\n headers: this.buildHeaders(),\n body: JSON.stringify({ ...request, stream: true }),\n signal: controller.signal,\n });\n\n if (!response.ok) await this.throwFromErrorResponse(response);\n\n if (!response.body) {\n throw new AIError(AIErrorType.NETWORK_ERROR, \"Response body is null\");\n }\n\n return response.body;\n } catch (error) {\n options.signal?.removeEventListener(\"abort\", onExternalAbort);\n throw this.normalizeError(error);\n } finally {\n clearTimeout(timeoutId);\n }\n }\n\n async listModels(): Promise<Response> {\n const url = `${this.baseUrl()}${ANTHROPIC_MODELS_PATH}`;\n return fetch(url, {\n method: \"GET\",\n headers: this.buildHeaders(),\n });\n }\n\n private baseUrl(): string {\n return this.config.baseUrl ?? ANTHROPIC_BASE_URL;\n }\n\n private buildHeaders(): HeadersInit {\n return {\n [ANTHROPIC_HEADERS.CONTENT_TYPE]: ANTHROPIC_HEADERS.APPLICATION_JSON,\n [ANTHROPIC_HEADERS.API_KEY]: this.config.apiKey,\n [ANTHROPIC_HEADERS.VERSION]: ANTHROPIC_API_VERSION,\n };\n }\n\n private async throwFromErrorResponse(response: Response): Promise<never> {\n const errorMessage = await extractErrorMessageFromResponse(response);\n const metadata: AIErrorMetadata = {\n status: response.status,\n url: response.url,\n };\n throw new AIError(\n classifyHttpStatus(response.status),\n errorMessage,\n undefined,\n metadata,\n );\n }\n\n private normalizeError(error: unknown): AIError {\n if (error instanceof AIError) return error;\n\n if (error instanceof Error) {\n if (error.name === \"AbortError\") {\n return new AIError(\n AIErrorType.ABORT_ERROR,\n \"Request was aborted by the client\",\n error,\n );\n }\n if (error.name === \"TypeError\" && error.message.toLowerCase().includes(\"network\")) {\n return new AIError(\n AIErrorType.NETWORK_ERROR,\n \"Network error: Unable to connect to the AI service\",\n error,\n );\n }\n }\n\n return new AIError(\n AIErrorType.UNKNOWN_ERROR,\n error instanceof Error ? error.message : \"Unknown error occurred\",\n error instanceof Error ? error : undefined,\n );\n }\n}\n\n/** Shape guard for tests and error extraction. */\nexport type { AnthropicErrorResponse };\n","\nimport type { TextRequest } from \"../../core/types\";\nimport { ANTHROPIC_DEFAULT_EFFORT, ANTHROPIC_DEFAULT_MAX_TOKENS } from \"./anthropic.constants\";\nimport type {\n AnthropicEffort,\n} from \"./anthropic.constants\";\nimport type {\n AnthropicMessage,\n AnthropicMessagesRequest,\n} from \"./anthropic.entities\";\n\n/**\n * Builds Messages API requests from neutral TextRequests.\n *\n * Wire rules enforced here (anthropic-version 2026-10-21):\n * - `max_tokens` is always set — the API rejects requests without it.\n * - temperature/top_p are NEVER emitted. This API version rejects them with\n * a 400 even when copied straight from the request; they stay hints on\n * TextRequest for providers that still honor sampling.\n * - `systemPrompt` maps to the top-level `system` slot, not an in-band message.\n * - `thinking` is omitted — adaptive thinking is the API's default.\n * - `output_config.effort` defaults per model (opus/haiku medium, sonnet high)\n * unless the caller pinned one on provider config.\n */\nexport class AnthropicRequestBuilder {\n private readonly model: string;\n private messages: AnthropicMessage[] = [];\n private systemPrompt: string | undefined;\n private maxTokens: number = ANTHROPIC_DEFAULT_MAX_TOKENS;\n private effort: AnthropicEffort | undefined;\n private stopSequences: string[] | undefined;\n private streamEnabled = false;\n\n constructor(model: string) {\n this.model = model;\n }\n\n static for(model: string): AnthropicRequestBuilder {\n return new AnthropicRequestBuilder(model);\n }\n\n withRequest(request: TextRequest): this {\n this.messages = toAnthropicMessages(request.messages);\n this.systemPrompt = request.systemPrompt;\n if (request.maxTokens !== undefined) this.maxTokens = request.maxTokens;\n if (request.stopSequences !== undefined && request.stopSequences.length > 0) {\n this.stopSequences = [...request.stopSequences];\n }\n return this;\n }\n\n withEffort(effort: AnthropicEffort | undefined): this {\n this.effort = effort;\n return this;\n }\n\n withStream(stream: boolean): this {\n this.streamEnabled = stream;\n return this;\n }\n\n withSystemPromptOverride(systemPrompt: string | undefined): this {\n this.systemPrompt = systemPrompt;\n return this;\n }\n\n withMessagesOverride(messages: AnthropicMessage[]): this {\n this.messages = messages;\n return this;\n }\n\n build(): AnthropicMessagesRequest {\n const request: {\n model: string;\n messages: AnthropicMessage[];\n max_tokens: number;\n system?: string;\n output_config?: { effort: AnthropicEffort };\n stop_sequences?: string[];\n stream?: boolean;\n } = {\n model: this.model,\n messages: this.messages,\n max_tokens: this.maxTokens,\n output_config: {\n effort: this.effort ?? defaultEffortForModel(this.model),\n },\n };\n\n if (this.systemPrompt !== undefined && this.systemPrompt.length > 0) {\n request.system = this.systemPrompt;\n }\n if (this.stopSequences !== undefined) {\n request.stop_sequences = this.stopSequences;\n }\n if (this.streamEnabled) {\n request.stream = true;\n }\n\n return request as AnthropicMessagesRequest;\n }\n}\n\n/**\n * Maps neutral messages to the wire format. System messages have no in-band\n * slot on this API — they are folded into the top-level system prompt, which\n * the caller sets separately.\n */\nexport function toAnthropicMessages(\n messages: ReadonlyArray<{ role: \"system\" | \"user\" | \"assistant\"; content: string }>,\n): AnthropicMessage[] {\n return messages\n .filter((message) => message.role !== \"system\" && message.content.length > 0)\n .map((message) => ({\n role: message.role as AnthropicMessageRole,\n content: message.content,\n }));\n}\n\ntype AnthropicMessageRole = \"user\" | \"assistant\";\n\nexport function defaultEffortForModel(model: string): AnthropicEffort {\n return ANTHROPIC_DEFAULT_EFFORT[model as keyof typeof ANTHROPIC_DEFAULT_EFFORT] ?? \"medium\";\n}\n\n/** Exported for the builder's max_tokens guarantee in tests. */\nexport const BUILDER_DEFAULT_MAX_TOKENS = ANTHROPIC_DEFAULT_MAX_TOKENS;\n","\nimport type { FinishReason, StreamCallbacks } from \"../../core/types\";\nimport { AIError, AIErrorType } from \"../../core/errors\";\nimport { extractSseDataPayload, isSseDataLine } from \"../../core/parsers\";\nimport type {\n AnthropicStopReason,\n AnthropicStreamEvent,\n} from \"./anthropic.entities\";\n\nexport function mapAnthropicStopReason(\n reason: AnthropicStopReason | null | undefined,\n): FinishReason | undefined {\n if (reason === \"end_turn\") return \"stop\";\n if (reason === \"stop_sequence\") return \"stop\";\n if (reason === \"max_tokens\") return \"length\";\n if (reason === \"refusal\") return \"refusal\";\n return undefined;\n}\n\nexport interface AnthropicStreamOutcome {\n readonly text: string;\n readonly model: string | null;\n readonly inputTokens: number | undefined;\n readonly outputTokens: number | undefined;\n readonly finishReason: FinishReason | undefined;\n}\n\n/**\n * Line-buffered SSE consumer for Anthropic stream events. Only `data:` lines\n * carry payloads (each JSON payload self-describes via `type`); `event:`\n * lines are ignored as decoration. Harvests the model from message_start,\n * output tokens + stop reason from message_delta, and input tokens from the\n * message_start usage block, so the final GenerationResult matches the\n * non-streaming shape.\n */\nexport async function consumeAnthropicStream(\n stream: ReadableStream<Uint8Array>,\n callbacks: Pick<StreamCallbacks, \"onChunk\">,\n): Promise<AnthropicStreamOutcome> {\n const reader = stream.getReader();\n const decoder = new TextDecoder();\n const chunks: string[] = [];\n let buffer = \"\";\n let model: string | null = null;\n let inputTokens: number | undefined;\n let outputTokens: number | undefined;\n let finishReason: FinishReason | undefined;\n\n const consumeLine = (rawLine: string): void => {\n const line = rawLine.endsWith(\"\\r\") ? rawLine.slice(0, -1) : rawLine;\n const trimmed = line.trim();\n if (trimmed.length === 0 || !isSseDataLine(trimmed)) return;\n const payload = extractSseDataPayload(trimmed);\n\n let event: AnthropicStreamEvent;\n try {\n event = JSON.parse(payload) as AnthropicStreamEvent;\n } catch {\n return;\n }\n\n switch (event.type) {\n case \"message_start\":\n model = event.message.model;\n if (event.message.usage?.input_tokens !== undefined) {\n inputTokens = event.message.usage.input_tokens;\n }\n break;\n case \"content_block_delta\":\n if (typeof event.delta.text === \"string\" && event.delta.text.length > 0) {\n chunks.push(event.delta.text);\n callbacks.onChunk?.(event.delta.text);\n }\n break;\n case \"message_delta\":\n if (event.delta?.stop_reason !== undefined && event.delta.stop_reason !== null) {\n finishReason = mapAnthropicStopReason(event.delta.stop_reason);\n }\n if (event.usage?.output_tokens !== undefined) {\n outputTokens = event.usage.output_tokens;\n }\n break;\n case \"message_stop\":\n break;\n case \"error\": {\n const errType = event.error.type;\n const mappedType =\n errType === \"rate_limit_error\"\n ? AIErrorType.RATE_LIMIT_ERROR\n : errType === \"authentication_error\"\n ? AIErrorType.INVALID_API_KEY\n : errType === \"invalid_request_error\"\n ? AIErrorType.CLIENT_ERROR\n : AIErrorType.SERVER_ERROR;\n throw new AIError(\n mappedType,\n event.error.message || \"Anthropic stream failed mid-flight\",\n );\n }\n default:\n break;\n }\n };\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop() ?? \"\";\n for (const line of lines) consumeLine(line);\n }\n\n buffer += decoder.decode();\n if (buffer.length > 0) consumeLine(buffer);\n } catch (error) {\n if (error instanceof AIError) throw error;\n throw new AIError(\n AIErrorType.NETWORK_ERROR,\n \"Stream was interrupted\",\n error instanceof Error ? error : undefined,\n );\n } finally {\n reader.releaseLock();\n }\n\n return {\n text: chunks.join(\"\"),\n model,\n inputTokens,\n outputTokens,\n finishReason,\n };\n}\n\n/** Fixture helper for tests: builds the SSE wire framing for one event. */\nexport function sseFrame(event: unknown): string {\n return `data: ${JSON.stringify(event)}\\n\\n`;\n}\n","\nimport type {\n GenerationResult,\n ProviderHealth,\n StreamCallbacks,\n StructuredGeneration,\n StructuredTextRequest,\n TextRequest,\n TextTier,\n} from \"../../core/types\";\nimport { AIError, AIErrorType } from \"../../core/errors\";\nimport { JsonResponseParser, StructuredPromptBuilder } from \"../../core/parsers\";\nimport { mergeTierOverrides, resolveModel, type TierModelMap } from \"../../core/tiers\";\nimport type { ITextProvider } from \"../base/provider.types\";\nimport { AnthropicHttpTransport } from \"./anthropic-http.transport\";\nimport { AnthropicRequestBuilder } from \"./anthropic-request.builder\";\nimport { consumeAnthropicStream, mapAnthropicStopReason } from \"./anthropic-stream.parser\";\nimport { ANTHROPIC_TIERS } from \"./anthropic.constants\";\nimport type {\n AnthropicContentBlock,\n AnthropicMessagesResponse,\n AnthropicProviderConfig,\n AnthropicUsage,\n} from \"./anthropic.entities\";\n\n/**\n * Graceful stand-in when the model refuses: surfaced as a flagged\n * GenerationResult rather than an exception, so chat UIs can render it.\n */\nconst REFUSAL_FALLBACK_TEXT =\n \"I'm not able to help with that request. Could you rephrase or ask something else?\";\n\n/**\n * Anthropic provider over raw fetch — no SDK dependency, Workers-safe.\n * Implements the neutral ITextProvider surface with tier-based model\n * resolution and full token-usage propagation.\n */\nexport class AnthropicProvider implements ITextProvider {\n readonly id = \"anthropic\";\n readonly name = \"Anthropic\";\n readonly capabilities = [\"text\"] as const;\n\n private readonly transport: AnthropicHttpTransport;\n private readonly tiers: TierModelMap;\n private readonly jsonParser = new JsonResponseParser();\n\n constructor(readonly config: AnthropicProviderConfig) {\n this.transport = new AnthropicHttpTransport(config);\n this.tiers = mergeTierOverrides(ANTHROPIC_TIERS, config.models);\n }\n\n resolveModel(tier: TextTier): string {\n return resolveModel(this.tiers, tier, this.id);\n }\n\n async healthCheck(): Promise<ProviderHealth> {\n if (!this.config.apiKey) return \"unavailable\";\n try {\n const response = await this.transport.listModels();\n if (response.ok) return \"healthy\";\n if (response.status === 401 || response.status === 403) return \"unavailable\";\n return \"degraded\";\n } catch {\n return \"unavailable\";\n }\n }\n\n async estimateCost(): Promise<number> {\n return 0;\n }\n\n async generate(request: TextRequest): Promise<GenerationResult> {\n const model = request.model ?? this.resolveModel(request.tier ?? \"balanced\");\n const wireRequest = new AnthropicRequestBuilder(model)\n .withRequest(request)\n .withEffort(this.config.effort)\n .build();\n\n const response = await this.transport.postMessages(wireRequest, {\n signal: request.signal,\n });\n\n return this.toGenerationResult(response, model);\n }\n\n async generateStructured<T>(\n request: StructuredTextRequest,\n ): Promise<StructuredGeneration<T>> {\n const model = request.model ?? this.resolveModel(request.tier ?? \"balanced\");\n\n const messages = [...request.messages];\n const lastUserIndex = findLastIndex(messages, (m) => m.role === \"user\");\n if (lastUserIndex === -1) {\n throw new AIError(\n AIErrorType.UNKNOWN_ERROR,\n \"generateStructured requires at least one user message\",\n );\n }\n\n const structuredPrompt = new StructuredPromptBuilder(\n messages[lastUserIndex]?.content ?? \"\",\n )\n .withSchema(request.schema)\n .build();\n messages[lastUserIndex] = { role: \"user\", content: structuredPrompt };\n\n const wireRequest = new AnthropicRequestBuilder(model)\n .withRequest({ ...request, messages })\n .withEffort(this.config.effort)\n .build();\n\n const response = await this.transport.postMessages(wireRequest, {\n signal: request.signal,\n });\n\n const result = this.toGenerationResult(response, model);\n return { value: this.jsonParser.parse<T>(result.text), result };\n }\n\n async stream(\n request: TextRequest,\n callbacks: StreamCallbacks,\n ): Promise<GenerationResult> {\n const model = request.model ?? this.resolveModel(request.tier ?? \"balanced\");\n const wireRequest = new AnthropicRequestBuilder(model)\n .withRequest(request)\n .withEffort(this.config.effort)\n .withStream(true)\n .build();\n\n const streamBody = await this.transport.streamMessages(wireRequest, {\n signal: request.signal,\n });\n\n try {\n const outcome = await consumeAnthropicStream(streamBody, callbacks);\n const text =\n outcome.text.length > 0 ? outcome.text : refusalTextFor(outcome.finishReason);\n const result: GenerationResult = {\n text,\n usage: {\n inputTokens: outcome.inputTokens ?? 0,\n outputTokens: outcome.outputTokens ?? 0,\n },\n model: outcome.model ?? model,\n providerId: this.id,\n finishReason: outcome.finishReason,\n };\n callbacks.onComplete?.(result);\n return result;\n } catch (error) {\n callbacks.onError?.(error instanceof Error ? error : new Error(String(error)));\n throw error;\n }\n }\n\n private toGenerationResult(\n response: AnthropicMessagesResponse,\n fallbackModel: string,\n ): GenerationResult {\n const text = extractText(response.content);\n const finishReason = mapAnthropicStopReason(response.stop_reason);\n\n if (text.length === 0) {\n // A refusal arrives as an empty completion with stop_reason\n // 'refusal' — return a flagged fallback line instead of throwing,\n // per API guidance. Any other empty completion is a server fault.\n if (finishReason === \"refusal\") {\n return {\n text: REFUSAL_FALLBACK_TEXT,\n usage: mapAnthropicUsage(response.usage),\n model: response.model || fallbackModel,\n providerId: this.id,\n finishReason,\n };\n }\n throw new AIError(\n AIErrorType.SERVER_ERROR,\n \"No content generated from Anthropic API\",\n undefined,\n { model: response.model || fallbackModel, stopReason: response.stop_reason ?? undefined },\n );\n }\n\n return {\n text,\n usage: mapAnthropicUsage(response.usage),\n model: response.model || fallbackModel,\n providerId: this.id,\n finishReason,\n };\n }\n}\n\nfunction extractText(blocks: ReadonlyArray<AnthropicContentBlock>): string {\n return blocks\n .filter((block) => block.type === \"text\")\n .map((block) => block.text)\n .join(\"\");\n}\n\nfunction refusalTextFor(finishReason: string | undefined): string {\n return finishReason === \"refusal\" ? REFUSAL_FALLBACK_TEXT : \"\";\n}\n\nfunction mapAnthropicUsage(usage: AnthropicUsage | undefined) {\n if (!usage) return undefined;\n return {\n inputTokens: usage.input_tokens,\n outputTokens: usage.output_tokens,\n };\n}\n\nfunction findLastIndex<T>(items: ReadonlyArray<T>, predicate: (item: T) => boolean): number {\n for (let i = items.length - 1; i >= 0; i--) {\n const item = items[i];\n if (item !== undefined && predicate(item)) return i;\n }\n return -1;\n}\n","\nexport interface AccessTimestamped {\n readonly lastAccess: number;\n}\n\nexport function selectLeastRecentlyUsedKey<K, V extends AccessTimestamped>(\n entries: ReadonlyMap<K, V>,\n): K | null {\n let oldestKey: K | null = null;\n let oldestAccess = Number.POSITIVE_INFINITY;\n\n for (const [key, entry] of entries.entries()) {\n if (entry.lastAccess < oldestAccess) {\n oldestAccess = entry.lastAccess;\n oldestKey = key;\n }\n }\n\n return oldestKey;\n}\n","\nexport interface AccessCounted {\n readonly accessCount: number;\n}\n\nexport function calculateCacheHitRate(\n entries: ReadonlyArray<AccessCounted>,\n): number {\n if (entries.length === 0) return 0;\n const totalAccess = entries.reduce((sum, e) => sum + e.accessCount, 0);\n return totalAccess / entries.length;\n}\n","\nexport function buildCacheKey(params: Readonly<Record<string, unknown>>): string {\n const sortedKeys = Object.keys(params).sort();\n const sortedParams: Record<string, unknown> = {};\n for (const key of sortedKeys) {\n sortedParams[key] = params[key];\n }\n return JSON.stringify(sortedParams);\n}\n","\nimport { selectLeastRecentlyUsedKey } from \"../calculations/lru-key-selector\";\nimport { calculateCacheHitRate } from \"../calculations/cache-hit-rate\";\nimport { buildCacheKey } from \"./cache-key-builder\";\n\ninterface CacheEntry<T> {\n readonly value: T;\n readonly timestamp: number;\n accessCount: number;\n lastAccess: number;\n}\n\nexport interface CacheOptions {\n readonly maxSize?: number;\n readonly ttl?: number;\n}\n\nconst DEFAULT_CACHE_MAX_SIZE = 100;\nconst DEFAULT_CACHE_TTL_MS = 300_000;\n\nexport class CacheManager {\n private readonly cache = new Map<string, CacheEntry<unknown>>();\n private readonly maxSize: number;\n private readonly ttl: number;\n\n constructor(options: CacheOptions = {}) {\n this.maxSize = options.maxSize ?? DEFAULT_CACHE_MAX_SIZE;\n this.ttl = options.ttl ?? DEFAULT_CACHE_TTL_MS;\n }\n\n get<T>(key: string): T | null {\n const entry = this.cache.get(key);\n if (!entry) return null;\n if (this.isExpired(entry)) {\n this.cache.delete(key);\n return null;\n }\n entry.accessCount += 1;\n entry.lastAccess = Date.now();\n return entry.value as T;\n }\n\n set<T>(key: string, value: T): void {\n if (this.cache.size >= this.maxSize && !this.cache.has(key)) {\n const lruKey = selectLeastRecentlyUsedKey(this.cache);\n if (lruKey !== null) this.cache.delete(lruKey);\n }\n this.cache.set(key, {\n value,\n timestamp: Date.now(),\n accessCount: 1,\n lastAccess: Date.now(),\n });\n }\n\n has(key: string): boolean {\n const entry = this.cache.get(key);\n return entry !== undefined && !this.isExpired(entry);\n }\n\n delete(key: string): boolean {\n return this.cache.delete(key);\n }\n\n clear(): void {\n this.cache.clear();\n }\n\n generateKey(params: Readonly<Record<string, unknown>>): string {\n return buildCacheKey(params);\n }\n\n getStats(): CacheStats {\n const now = Date.now();\n const entries = Array.from(this.cache.entries()).map(([key, entry]) => ({\n key,\n accessCount: entry.accessCount,\n ageMs: now - entry.timestamp,\n }));\n const hitRate = calculateCacheHitRate(\n Array.from(this.cache.values()).map((e) => ({ accessCount: e.accessCount })),\n );\n return {\n size: this.cache.size,\n maxSize: this.maxSize,\n hitRate,\n entries,\n };\n }\n\n private isExpired(entry: CacheEntry<unknown>): boolean {\n return Date.now() - entry.timestamp > this.ttl;\n }\n}\n\nexport interface CacheStats {\n readonly size: number;\n readonly maxSize: number;\n readonly hitRate: number;\n readonly entries: ReadonlyArray<{\n readonly key: string;\n readonly accessCount: number;\n readonly ageMs: number;\n }>;\n}\n\nexport const cacheManager = new CacheManager();\n","\nexport interface ExponentialBackoffParams {\n readonly attempt: number;\n readonly initialDelay: number;\n readonly maxDelay: number;\n readonly backoffMultiplier: number;\n readonly jitterFactor: number;\n readonly random?: () => number;\n}\n\nexport function calculateExponentialBackoff(params: ExponentialBackoffParams): number {\n const {\n attempt,\n initialDelay,\n maxDelay,\n backoffMultiplier,\n jitterFactor,\n random = Math.random,\n } = params;\n\n const base = initialDelay * Math.pow(backoffMultiplier, Math.max(0, attempt - 1));\n const capped = Math.min(base, maxDelay);\n const jitterMultiplier = random() * 2 - 1;\n const jitter = capped * jitterFactor * jitterMultiplier;\n\n return Math.max(0, capped + jitter);\n}\n","\nexport const MESSAGE_ID_PREFIX = \"msg-\" as const;\nexport const CHAT_MESSAGE_ID_SUFFIX_LENGTH = 9;\nexport const CACHE_KEY_TYPE_COMPLETION = \"completion\" as const;\nexport const CACHE_KEY_TYPE_CHAT = \"chat\" as const;\nexport const CACHE_KEY_TYPE_RESPONSE = \"response\" as const;\nexport const SYSTEM_PROMPT_CACHE_PREFIX = \"system-prompt\" as const;\n\nexport const USER_ROLE = \"user\" as const;\nexport const ASSISTANT_ROLE = \"assistant\" as const;\nexport const SYSTEM_ROLE = \"system\" as const;\n\nexport const QUEUE_PRIORITY_USER_REQUEST = 10;\nexport const DEFAULT_RETRY_MAX_ATTEMPTS = 3;\nexport const DEFAULT_RETRY_INITIAL_DELAY_MS = 1000;\nexport const DEFAULT_RETRY_MAX_DELAY_MS = 10000;\nexport const DEFAULT_RETRY_BACKOFF_MULTIPLIER = 2;\nexport const DEFAULT_RETRY_JITTER_FACTOR = 0.1;\n","\nimport { AIError } from \"../errors/ai-error\";\nimport { calculateExponentialBackoff } from \"../calculations/exponential-backoff\";\nimport {\n isRetryableErrorType,\n DEFAULT_ERROR_CLASSIFICATION_RULE,\n} from \"../errors/error-classifier\";\nimport {\n DEFAULT_RETRY_MAX_ATTEMPTS,\n DEFAULT_RETRY_INITIAL_DELAY_MS,\n DEFAULT_RETRY_MAX_DELAY_MS,\n DEFAULT_RETRY_BACKOFF_MULTIPLIER,\n DEFAULT_RETRY_JITTER_FACTOR,\n} from \"../constants/identifier.constants\";\n\nexport interface RetryOptions {\n readonly maxAttempts?: number;\n readonly initialDelay?: number;\n readonly maxDelay?: number;\n readonly backoffMultiplier?: number;\n readonly jitterFactor?: number;\n readonly shouldRetry?: (error: Error) => boolean;\n}\n\nconst RETRYABLE_MESSAGE_KEYWORDS: ReadonlyArray<string> = [\n \"network\",\n \"timeout\",\n \"econnrefused\",\n \"enotfound\",\n \"etimedout\",\n];\n\nexport class RetryManager {\n private readonly defaults: Required<\n Pick<RetryOptions, \"maxAttempts\" | \"initialDelay\" | \"maxDelay\" | \"backoffMultiplier\" | \"jitterFactor\">\n >;\n\n constructor() {\n this.defaults = {\n maxAttempts: DEFAULT_RETRY_MAX_ATTEMPTS,\n initialDelay: DEFAULT_RETRY_INITIAL_DELAY_MS,\n maxDelay: DEFAULT_RETRY_MAX_DELAY_MS,\n backoffMultiplier: DEFAULT_RETRY_BACKOFF_MULTIPLIER,\n jitterFactor: DEFAULT_RETRY_JITTER_FACTOR,\n };\n }\n\n async execute<T>(fn: () => Promise<T>, options: RetryOptions = {}): Promise<T> {\n const maxAttempts = options.maxAttempts ?? this.defaults.maxAttempts;\n let lastError: Error | undefined;\n\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n try {\n return await fn();\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error));\n\n if (attempt >= maxAttempts || !this.shouldRetry(lastError, options)) {\n throw lastError;\n }\n\n const delay = calculateExponentialBackoff({\n attempt,\n initialDelay: options.initialDelay ?? this.defaults.initialDelay,\n maxDelay: options.maxDelay ?? this.defaults.maxDelay,\n backoffMultiplier: options.backoffMultiplier ?? this.defaults.backoffMultiplier,\n jitterFactor: options.jitterFactor ?? this.defaults.jitterFactor,\n });\n await this.delay(delay);\n }\n }\n\n throw lastError ?? new Error(\"Retry loop exited without result\");\n }\n\n private shouldRetry(error: Error, options: RetryOptions): boolean {\n if (options.shouldRetry) return options.shouldRetry(error);\n\n if (error instanceof AIError) {\n return isRetryableErrorType(error.type, DEFAULT_ERROR_CLASSIFICATION_RULE);\n }\n\n const lower = error.message.toLowerCase();\n return RETRYABLE_MESSAGE_KEYWORDS.some((kw) => lower.includes(kw));\n }\n\n private delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n}\n\nexport const retryManager = new RetryManager();\n\nexport async function withRetry<T>(fn: () => Promise<T>, options?: RetryOptions): Promise<T> {\n return retryManager.execute(fn, options);\n}\n","\ninterface QueuedRequest<T> {\n readonly id: string;\n readonly priority: number;\n readonly requestFn: () => Promise<T>;\n readonly resolve: (value: T) => void;\n readonly reject: (reason: unknown) => void;\n readonly timestamp: number;\n}\n\nexport interface QueueOptions {\n readonly maxConcurrent?: number;\n readonly defaultPriority?: number;\n readonly requestTimeout?: number;\n}\n\nconst DEFAULT_MAX_CONCURRENT = 3;\nconst DEFAULT_PRIORITY = 0;\nconst DEFAULT_REQUEST_TIMEOUT_MS = 30_000;\n\nexport class RequestQueue {\n private queue: QueuedRequest<unknown>[] = [];\n private readonly activeRequests = new Set<string>();\n private readonly maxConcurrent: number;\n private readonly defaultPriority: number;\n private readonly requestTimeout: number;\n private requestIdCounter = 0;\n\n constructor(options: QueueOptions = {}) {\n this.maxConcurrent = options.maxConcurrent ?? DEFAULT_MAX_CONCURRENT;\n this.defaultPriority = options.defaultPriority ?? DEFAULT_PRIORITY;\n this.requestTimeout = options.requestTimeout ?? DEFAULT_REQUEST_TIMEOUT_MS;\n }\n\n add<T>(requestFn: () => Promise<T>, priority?: number): Promise<T> {\n return new Promise((resolve, reject) => {\n const id = `req-${++this.requestIdCounter}`;\n const queuedRequest: QueuedRequest<T> = {\n id,\n priority: priority ?? this.defaultPriority,\n requestFn,\n resolve: resolve as (value: unknown) => void,\n reject,\n timestamp: Date.now(),\n };\n\n this.queue.push(queuedRequest as QueuedRequest<unknown>);\n this.sortQueue();\n this.process();\n });\n }\n\n cancelAll(): void {\n for (const request of this.queue) {\n request.reject(new Error(\"Request was cancelled\"));\n }\n this.queue = [];\n }\n\n private sortQueue(): void {\n this.queue.sort((a, b) => {\n if (a.priority !== b.priority) {\n return b.priority - a.priority;\n }\n return a.timestamp - b.timestamp;\n });\n }\n\n private process(): void {\n while (this.queue.length > 0 && this.activeRequests.size < this.maxConcurrent) {\n const request = this.queue.shift();\n if (!request) break;\n this.executeRequest(request);\n }\n }\n\n private executeRequest<T>(request: QueuedRequest<T>): void {\n this.activeRequests.add(request.id);\n\n const timeoutId = setTimeout(() => {\n this.activeRequests.delete(request.id);\n request.reject(new Error(`Request ${request.id} timed out`));\n this.process();\n }, this.requestTimeout);\n\n request.requestFn()\n .then((result) => {\n clearTimeout(timeoutId);\n request.resolve(result);\n })\n .catch((error: unknown) => {\n clearTimeout(timeoutId);\n request.reject(error);\n })\n .finally(() => {\n this.activeRequests.delete(request.id);\n this.process();\n });\n }\n}\n\nexport const requestQueue = new RequestQueue();\n","\ninterface PendingRequest<T> {\n readonly promise: Promise<T>;\n readonly timestamp: number;\n}\n\nconst DEFAULT_DEDUPE_TTL_MS = 30_000;\n\nexport class RequestDeduplicator {\n private readonly pendingRequests = new Map<string, PendingRequest<unknown>>();\n private readonly ttl: number;\n\n constructor(ttl: number = DEFAULT_DEDUPE_TTL_MS) {\n this.ttl = ttl;\n }\n\n execute<T>(key: string, requestFn: () => Promise<T>): Promise<T> {\n this.cleanup();\n\n const existing = this.pendingRequests.get(key);\n if (existing) {\n return existing.promise as Promise<T>;\n }\n\n const promise = requestFn();\n this.pendingRequests.set(key, {\n promise,\n timestamp: Date.now(),\n });\n\n // The cleanup chain must swallow its own rejection: callers handle the\n // original `promise`, and an unhandled `.finally` derivative would crash\n // hosts that treat unhandled rejections as fatal (Workers, vitest).\n promise\n .catch(() => undefined)\n .then(() => {\n this.pendingRequests.delete(key);\n });\n\n return promise;\n }\n\n cancelAll(): void {\n this.pendingRequests.clear();\n }\n\n private cleanup(): void {\n const now = Date.now();\n for (const [key, request] of this.pendingRequests.entries()) {\n if (now - request.timestamp > this.ttl) {\n this.pendingRequests.delete(key);\n }\n }\n }\n}\n\nexport const requestDeduplicator = new RequestDeduplicator();\n","\nexport interface ApiKeyValidationRule {\n readonly minLength: number;\n}\n\nexport const DEFAULT_API_KEY_RULE: ApiKeyValidationRule = {\n minLength: 10,\n};\n\nexport function isValidApiKey(\n apiKey: string | undefined | null,\n rule: ApiKeyValidationRule = DEFAULT_API_KEY_RULE,\n): apiKey is string {\n if (!apiKey) return false;\n return apiKey.trim().length >= rule.minLength;\n}\n\nexport function validateApiKey(\n apiKey: string | undefined | null,\n rule: ApiKeyValidationRule = DEFAULT_API_KEY_RULE,\n): { valid: boolean; reason?: string } {\n if (!apiKey) {\n return { valid: false, reason: \"API key is required\" };\n }\n const trimmed = apiKey.trim();\n if (trimmed.length === 0) {\n return { valid: false, reason: \"API key cannot be empty\" };\n }\n if (trimmed.length < rule.minLength) {\n return {\n valid: false,\n reason: `API key must be at least ${rule.minLength} characters`,\n };\n }\n return { valid: true };\n}\n","\nimport type { TierModelMap } from \"../../core/tiers\";\n\nexport const GROQ_MODELS = {\n LLAMA_3_1_8B_INSTANT: \"llama-3.1-8b-instant\",\n LLAMA_3_3_70B_VERSATILE: \"llama-3.3-70b-versatile\",\n LLAMA_3_1_70B_VERSATILE: \"llama-3.1-70b-versatile\",\n GPT_OSS_20B: \"openai/gpt-oss-20b\",\n GPT_OSS_120B: \"openai/gpt-oss-120b\",\n MIXTRAL_8X7B: \"mixtral-8x7b-32768\",\n GEMMA_2_9B: \"gemma2-9b-it\",\n LLAMA_4_SCOUT_17B: \"meta-llama/llama-4-scout-17b-16e-instruct\",\n KIMI_K2_INSTRUCT: \"moonshotai/kimi-k2-instruct\",\n QWEN3_32B: \"qwen/qwen3-32b\",\n} as const;\n\n/**\n * Neutral tier → Groq model. fast = 8b instant for cheap high-volume turns,\n * balanced = 70b versatile for everyday quality, powerful = gpt-oss-120b for\n * the heavy lifting. Override per instance via `models` in provider config.\n */\nexport const GROQ_TIERS: TierModelMap = {\n fast: GROQ_MODELS.LLAMA_3_1_8B_INSTANT,\n balanced: GROQ_MODELS.LLAMA_3_3_70B_VERSATILE,\n powerful: GROQ_MODELS.GPT_OSS_120B,\n};\n\nexport const DEFAULT_GENERATION_CONFIG = {\n temperature: 0.7,\n maxTokens: 1024,\n topP: 1.0,\n} as const;\n\nexport const DEFAULT_MODELS = {\n TEXT: GROQ_MODELS.LLAMA_3_1_8B_INSTANT,\n FAST: GROQ_MODELS.LLAMA_3_1_8B_INSTANT,\n EXPERIMENTAL: GROQ_MODELS.GPT_OSS_20B,\n} as const;\n\nexport const GROQ_BASE_URL = \"https://api.groq.com/openai/v1\" as const;\nexport const DEFAULT_BASE_URL = GROQ_BASE_URL;\n\nexport const CHAT_COMPLETIONS_PATH = \"/chat/completions\" as const;\nexport const API_ENDPOINTS = {\n CHAT: CHAT_COMPLETIONS_PATH,\n} as const;\n\nexport const GROQ_TIMEOUTS = {\n DEFAULT: 30000,\n STREAMING: 60000,\n} as const;\nexport const TIMEOUTS = GROQ_TIMEOUTS;\n\nexport const HTTP_HEADERS = {\n CONTENT_TYPE: \"Content-Type\",\n APPLICATION_JSON: \"application/json\",\n AUTHORIZATION: \"Authorization\",\n BEARER_PREFIX: \"Bearer \",\n} as const;\n","\nimport type {\n GroqChatRequest,\n GroqGenerationConfig,\n GroqMessage,\n GroqReasoningEffort,\n} from \"./groq.entities\";\nimport { DEFAULT_GENERATION_CONFIG } from \"./groq.constants\";\n\ninterface MutableRequest {\n model: string;\n messages: GroqMessage[];\n temperature?: number;\n max_tokens?: number;\n top_p?: number;\n n?: number;\n stop?: string[];\n frequency_penalty?: number;\n presence_penalty?: number;\n reasoning_effort?: GroqReasoningEffort;\n stream?: boolean;\n}\n\nexport class GroqChatRequestBuilder {\n private readonly model: string;\n private messages: GroqMessage[] = [];\n private generationConfig: GroqGenerationConfig = {};\n private streamEnabled = false;\n private jsonResponse = false;\n\n constructor(model: string) {\n this.model = model;\n }\n\n static for(model: string): GroqChatRequestBuilder {\n return new GroqChatRequestBuilder(model);\n }\n\n withMessages(messages: ReadonlyArray<GroqMessage>): this {\n this.messages = [...messages];\n return this;\n }\n\n withConfig(config: GroqGenerationConfig | undefined): this {\n this.generationConfig = config ? { ...config } : {};\n return this;\n }\n\n withStream(stream: boolean): this {\n this.streamEnabled = stream;\n return this;\n }\n\n withJsonResponse(enabled: boolean): this {\n this.jsonResponse = enabled;\n return this;\n }\n\n build(): GroqChatRequest {\n const cfg = this.generationConfig;\n const request: MutableRequest = {\n model: this.model,\n messages: this.messages,\n temperature: cfg.temperature ?? DEFAULT_GENERATION_CONFIG.temperature,\n max_tokens: cfg.maxTokens ?? DEFAULT_GENERATION_CONFIG.maxTokens,\n top_p: cfg.topP ?? DEFAULT_GENERATION_CONFIG.topP,\n };\n\n if (cfg.n !== undefined) request.n = cfg.n;\n if (cfg.stop !== undefined) request.stop = cfg.stop;\n if (cfg.frequencyPenalty !== undefined) request.frequency_penalty = cfg.frequencyPenalty;\n if (cfg.presencePenalty !== undefined) request.presence_penalty = cfg.presencePenalty;\n if (cfg.reasoningEffort !== undefined) request.reasoning_effort = cfg.reasoningEffort;\n if (this.jsonResponse) {\n (request as { response_format?: { type: string } }).response_format = { type: \"json_object\" };\n }\n if (this.streamEnabled) request.stream = true;\n\n return request as GroqChatRequest;\n }\n}\n","import type { GroqProviderConfig } from \"./groq.entities\";\nimport { GroqError, GroqErrorType } from \"../../core/errors/groq-error\";\nimport { DEFAULT_BASE_URL, TIMEOUTS } from \"./groq.constants\";\nimport { validateApiKey } from \"../../core/utils/api-key-validator\";\n\nexport class GroqConfigStore {\n private config: GroqProviderConfig | null = null;\n\n initialize(config: GroqProviderConfig): GroqProviderConfig {\n const validation = validateApiKey(config.apiKey, { minLength: 1 });\n if (!validation.valid) {\n throw new GroqError(GroqErrorType.INVALID_API_KEY, validation.reason ?? \"Invalid API key\");\n }\n\n const normalized: GroqProviderConfig = {\n apiKey: config.apiKey.trim(),\n baseUrl: config.baseUrl ?? DEFAULT_BASE_URL,\n timeoutMs: config.timeoutMs ?? TIMEOUTS.DEFAULT,\n ...(config.models !== undefined ? { models: config.models } : {}),\n ...(config.textModel !== undefined ? { textModel: config.textModel } : {}),\n };\n\n this.config = normalized;\n return normalized;\n }\n\n get(): GroqProviderConfig {\n if (!this.config) {\n throw new GroqError(\n GroqErrorType.MISSING_CONFIG,\n \"Client not initialized. Call configureProvider first.\",\n );\n }\n return this.config;\n }\n\n getOrNull(): GroqProviderConfig | null {\n return this.config;\n }\n\n isInitialized(): boolean {\n return this.config !== null;\n }\n\n setApiKey(apiKey: string): void {\n const current = this.get();\n const validation = validateApiKey(apiKey, { minLength: 1 });\n if (!validation.valid) {\n throw new GroqError(GroqErrorType.INVALID_API_KEY, validation.reason ?? \"Invalid API key\");\n }\n this.config = { ...current, apiKey: apiKey.trim() };\n }\n\n reset(): void {\n this.config = null;\n }\n}\n","\nimport type { GroqChatRequest, GroqChatResponse, StreamRequestOptions } from \"./groq.entities\";\nimport { AIError, type AIErrorMetadata } from \"../../core/errors\";\nimport { AIErrorType } from \"../../core/errors\";\nimport { classifyHttpStatus, extractErrorMessageFromResponse } from \"../../core/errors\";\nimport {\n CHAT_COMPLETIONS_PATH,\n GROQ_BASE_URL,\n GROQ_TIMEOUTS,\n HTTP_HEADERS,\n} from \"./groq.constants\";\nimport type { GroqProviderConfig } from \"./groq.entities\";\nimport type { GroqConfigStore } from \"./groq-config-store\";\n\n/**\n * Raw HTTP transport for Groq's OpenAI-compatible chat/completions endpoint.\n * All failures leave here as core AIError with the right AIErrorType —\n * callers up the stack only ever see the neutral taxonomy.\n */\nexport class GroqHttpTransport {\n private readonly pendingAbortControllers = new Set<AbortController>();\n\n constructor(private readonly configSource: GroqProviderConfig | GroqConfigStore) {}\n\n private getConfig(): GroqProviderConfig {\n if (\"get\" in this.configSource && typeof this.configSource.get === \"function\") {\n return this.configSource.get();\n }\n return this.configSource as GroqProviderConfig;\n }\n\n cancelPendingRequests(): void {\n for (const controller of this.pendingAbortControllers) {\n controller.abort();\n }\n this.pendingAbortControllers.clear();\n }\n\n async postChatCompletion(request: GroqChatRequest): Promise<GroqChatResponse> {\n return this.request<GroqChatResponse>(CHAT_COMPLETIONS_PATH, {\n ...request,\n stream: false,\n });\n }\n\n async streamChatCompletion(\n request: GroqChatRequest,\n options: StreamRequestOptions = {},\n ): Promise<ReadableStream<Uint8Array>> {\n const url = `${this.baseUrl()}${CHAT_COMPLETIONS_PATH}`;\n const timeout = this.getConfig().timeoutMs ?? GROQ_TIMEOUTS.STREAMING;\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeout);\n const onExternalAbort = (): void => controller.abort();\n options.signal?.addEventListener(\"abort\", onExternalAbort);\n this.pendingAbortControllers.add(controller);\n\n try {\n const response = await fetch(url, {\n method: \"POST\",\n headers: this.buildHeaders(),\n body: JSON.stringify({ ...request, stream: true }),\n signal: controller.signal,\n });\n\n if (!response.ok) await this.throwFromErrorResponse(response);\n\n if (!response.body) {\n throw new AIError(AIErrorType.NETWORK_ERROR, \"Response body is null\");\n }\n\n return response.body;\n } catch (error) {\n options.signal?.removeEventListener(\"abort\", onExternalAbort);\n throw this.normalizeError(error);\n } finally {\n clearTimeout(timeoutId);\n this.pendingAbortControllers.delete(controller);\n }\n }\n\n private baseUrl(): string {\n return this.getConfig().baseUrl ?? GROQ_BASE_URL;\n }\n\n private async request<T>(endpoint: string, body: unknown): Promise<T> {\n const url = `${this.baseUrl()}${endpoint}`;\n const timeout = this.getConfig().timeoutMs ?? GROQ_TIMEOUTS.DEFAULT;\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeout);\n this.pendingAbortControllers.add(controller);\n\n try {\n const response = await fetch(url, {\n method: \"POST\",\n headers: this.buildHeaders(),\n body: JSON.stringify(body),\n signal: controller.signal,\n });\n\n if (!response.ok) await this.throwFromErrorResponse(response);\n\n return (await response.json()) as T;\n } catch (error) {\n throw this.normalizeError(error);\n } finally {\n clearTimeout(timeoutId);\n this.pendingAbortControllers.delete(controller);\n }\n }\n\n private buildHeaders(): HeadersInit {\n return {\n [HTTP_HEADERS.CONTENT_TYPE]: HTTP_HEADERS.APPLICATION_JSON,\n [HTTP_HEADERS.AUTHORIZATION]: `${HTTP_HEADERS.BEARER_PREFIX}${this.getConfig().apiKey}`,\n };\n }\n\n private async throwFromErrorResponse(response: Response): Promise<never> {\n const errorMessage = await extractErrorMessageFromResponse(response);\n const metadata: AIErrorMetadata = {\n status: response.status,\n url: response.url,\n };\n throw new AIError(\n classifyHttpStatus(response.status),\n errorMessage,\n undefined,\n metadata,\n );\n }\n\n private normalizeError(error: unknown): AIError {\n if (error instanceof AIError) return error;\n\n if (error instanceof Error) {\n if (error.name === \"AbortError\") {\n return new AIError(\n AIErrorType.ABORT_ERROR,\n \"Request was aborted by the client\",\n error,\n );\n }\n if (error.name === \"TypeError\" && error.message.toLowerCase().includes(\"network\")) {\n return new AIError(\n AIErrorType.NETWORK_ERROR,\n \"Network error: Unable to connect to the AI service\",\n error,\n );\n }\n }\n\n return new AIError(\n AIErrorType.UNKNOWN_ERROR,\n error instanceof Error ? error.message : \"Unknown error occurred\",\n error instanceof Error ? error : undefined,\n );\n }\n}\n","\nimport type { IRequestExecutor } from \"./request-executor.strategy\";\nimport { RetryManager, RetryOptions } from \"../utils/retry\";\n\nexport class RetryExecutor<TArgs extends unknown[], TResult>\n implements IRequestExecutor<TArgs, TResult>\n{\n constructor(\n private readonly retryManager: RetryManager,\n private readonly options?: RetryOptions,\n ) {}\n\n execute(fn: (...args: TArgs) => Promise<TResult>, ...args: TArgs): Promise<TResult> {\n return this.retryManager.execute(() => fn(...args), this.options);\n }\n}\n","\nimport type { IRequestExecutor } from \"./request-executor.strategy\";\nimport { RequestQueue } from \"../utils/request-queue.util\";\n\nexport class QueueExecutor<TArgs extends unknown[], TResult>\n implements IRequestExecutor<TArgs, TResult>\n{\n constructor(\n private readonly queue: RequestQueue,\n private readonly priority: number,\n ) {}\n\n execute(fn: (...args: TArgs) => Promise<TResult>, ...args: TArgs): Promise<TResult> {\n return this.queue.add(() => fn(...args), this.priority);\n }\n}\n","\nimport type { IRequestExecutor } from \"./request-executor.strategy\";\nimport type { RequestDeduplicator } from \"../utils/request-deduplicator.util\";\n\nexport type KeyGenerator<TArgs extends unknown[]> = (...args: TArgs) => string;\n\nexport interface DedupeExecutorOptions<TArgs extends unknown[]> {\n readonly generateKey: KeyGenerator<TArgs>;\n}\n\nexport class DedupeExecutor<TArgs extends unknown[], TResult>\n implements IRequestExecutor<TArgs, TResult>\n{\n constructor(\n private readonly deduplicator: RequestDeduplicator,\n private readonly options: DedupeExecutorOptions<TArgs>,\n ) {}\n\n execute(fn: (...args: TArgs) => Promise<TResult>, ...args: TArgs): Promise<TResult> {\n const key = this.options.generateKey(...args);\n return this.deduplicator.execute(key, () => fn(...args));\n }\n}\n","\nimport type { IRequestExecutor } from \"./request-executor.strategy\";\n\ntype AnyExecutor = IRequestExecutor<unknown[], unknown>;\n\nexport class CompositeExecutor<TArgs extends unknown[], TResult>\n implements IRequestExecutor<TArgs, TResult>\n{\n private readonly executors: ReadonlyArray<AnyExecutor>;\n\n constructor(executors: ReadonlyArray<IRequestExecutor<TArgs, TResult>>) {\n this.executors = executors as unknown as ReadonlyArray<AnyExecutor>;\n }\n\n execute(fn: (...args: TArgs) => Promise<TResult>, ...args: TArgs): Promise<TResult> {\n const composed = this.compress(fn as unknown as (...a: unknown[]) => Promise<unknown>);\n return composed(...args) as Promise<TResult>;\n }\n\n private compress(fn: (...args: unknown[]) => Promise<unknown>): (...args: unknown[]) => Promise<unknown> {\n return this.executors.reduceRight(\n (innerFn, executor) => (...a: unknown[]) => executor.execute(innerFn, ...a),\n fn,\n );\n }\n}\n","\nimport type { GroqChatRequest, GroqChatResponse, GroqProviderConfig, StreamRequestOptions } from \"./groq.entities\";\nimport type { IRequestExecutor } from \"../../core/executor\";\nimport { GroqConfigStore } from \"./groq-config-store\";\nimport { GroqHttpTransport } from \"./groq-http-transport\";\nimport { RequestDeduplicator } from \"../../core/utils\";\nimport { RequestQueue } from \"../../core/utils\";\nimport { RetryManager } from \"../../core/utils\";\nimport {\n CompositeExecutor,\n DedupeExecutor,\n QueueExecutor,\n RetryExecutor,\n} from \"../../core/executor\";\nimport { QUEUE_PRIORITY_USER_REQUEST } from \"../../core/constants/identifier.constants\";\n\nexport interface GroqHttpClientDeps {\n readonly configStore?: GroqConfigStore;\n readonly transport?: GroqHttpTransport;\n readonly retryManager?: RetryManager;\n readonly queue?: RequestQueue;\n readonly deduplicator?: RequestDeduplicator;\n}\n\n/**\n * Groq HTTP client with the ported strategy stack: identical concurrent\n * requests are deduplicated, transient failures retried with backoff, and\n * everything is funneled through a priority queue.\n *\n * Supports both standalone initialization `new GroqHttpClient(config)`\n * and deferred initialization `const c = new GroqHttpClient(); c.initialize(config)`.\n */\nexport class GroqHttpClient {\n private readonly configStore: GroqConfigStore;\n private readonly transport: GroqHttpTransport;\n private readonly executor: IRequestExecutor<[GroqChatRequest], GroqChatResponse>;\n\n constructor(\n configOrDeps?: GroqProviderConfig | GroqHttpClientDeps,\n maybeDeps: GroqHttpClientDeps = {},\n ) {\n const isConfig =\n typeof configOrDeps === \"object\" &&\n configOrDeps !== null &&\n \"apiKey\" in configOrDeps &&\n typeof (configOrDeps as GroqProviderConfig).apiKey === \"string\";\n\n const deps = isConfig ? maybeDeps : (configOrDeps as GroqHttpClientDeps | undefined) ?? {};\n\n this.configStore = deps.configStore ?? new GroqConfigStore();\n if (isConfig) {\n this.configStore.initialize(configOrDeps as GroqProviderConfig);\n }\n\n this.transport = deps.transport ?? new GroqHttpTransport(this.configStore);\n\n const retryManager = deps.retryManager ?? new RetryManager();\n const queue = deps.queue ?? new RequestQueue();\n const deduplicator = deps.deduplicator ?? new RequestDeduplicator();\n\n this.executor = new CompositeExecutor<[GroqChatRequest], GroqChatResponse>([\n new DedupeExecutor<[GroqChatRequest], GroqChatResponse>(deduplicator, {\n generateKey: (request) =>\n deduplicatorKey(request, this.configStore.isInitialized() ? this.configStore.get().apiKey : \"\"),\n }),\n new RetryExecutor<[GroqChatRequest], GroqChatResponse>(retryManager),\n new QueueExecutor<[GroqChatRequest], GroqChatResponse>(queue, QUEUE_PRIORITY_USER_REQUEST),\n ]);\n }\n\n initialize(config: GroqProviderConfig): void {\n this.configStore.initialize(config);\n }\n\n isInitialized(): boolean {\n return this.configStore.isInitialized();\n }\n\n getApiKey(): string {\n return this.configStore.get().apiKey;\n }\n\n setApiKey(apiKey: string): void {\n this.configStore.setApiKey(apiKey);\n }\n\n cancelPendingRequests(): void {\n this.transport.cancelPendingRequests();\n }\n\n postChatCompletion(request: GroqChatRequest): Promise<GroqChatResponse> {\n return this.executor.execute(\n (req) => this.transport.postChatCompletion(req),\n request,\n );\n }\n\n streamChatCompletion(\n request: GroqChatRequest,\n options?: StreamRequestOptions,\n ): Promise<ReadableStream<Uint8Array>> {\n return this.transport.streamChatCompletion(request, options);\n }\n\n reset(): void {\n this.transport.cancelPendingRequests();\n this.configStore.reset();\n }\n}\n\nfunction deduplicatorKey(request: GroqChatRequest, apiKey: string): string {\n const { model, messages, stream: _stream, ...rest } = request;\n const stable = JSON.stringify({\n apiKey,\n model,\n messages: messages.map((m) => ({ role: m.role, content: m.content })),\n ...rest,\n });\n return stable;\n}\n","\nimport type { FinishReason, StreamCallbacks, TokenUsage } from \"../../core/types\";\nimport { AIError, AIErrorType } from \"../../core/errors\";\nimport { extractSseDataPayload, isSseDataLine, isSseDoneMarker } from \"../../core/parsers\";\nimport type { GroqChatChunk, GroqErrorResponse, GroqUsage } from \"./groq.entities\";\n\n/**\n * Extracts the displayable text delta from one Groq SSE `data:` payload.\n * Returns null for role-only chunks, finish-only chunks, and unparseable\n * payloads — the generic line machinery skips nulls.\n */\nexport function extractContentFromSsePayload(payload: string): string | null {\n try {\n const parsed = JSON.parse(payload) as GroqChatChunk;\n const delta = parsed.choices?.[0]?.delta?.content;\n return typeof delta === \"string\" && delta.length > 0 ? delta : null;\n } catch {\n return null;\n }\n}\n\nexport function mapGroqFinishReason(reason: string | null | undefined): FinishReason | undefined {\n if (reason === \"stop\") return \"stop\";\n if (reason === \"length\") return \"length\";\n if (reason === \"content_filter\") return \"content_filter\";\n return undefined;\n}\n\nexport function mapGroqUsage(usage: GroqUsage | undefined): TokenUsage | undefined {\n if (!usage) return undefined;\n return {\n inputTokens: usage.prompt_tokens,\n outputTokens: usage.completion_tokens,\n totalTokens: usage.total_tokens,\n };\n}\n\nexport interface GroqStreamOutcome {\n readonly text: string;\n readonly model: string | null;\n readonly finishReason: FinishReason | undefined;\n readonly usage: TokenUsage | undefined;\n}\n\n/**\n * Consumes a Groq SSE body: forwards text deltas through `callbacks.onChunk`\n * and harvests model/finish_reason/usage from the surrounding chunks so the\n * resulting GenerationResult is as complete as the non-streaming one.\n */\nexport async function consumeGroqStream(\n stream: ReadableStream<Uint8Array>,\n callbacks: Pick<StreamCallbacks, \"onChunk\">,\n): Promise<GroqStreamOutcome> {\n const reader = stream.getReader();\n const decoder = new TextDecoder();\n const chunks: string[] = [];\n let buffer = \"\";\n let model: string | null = null;\n let finishReason: FinishReason | undefined;\n let usage: TokenUsage | undefined;\n\n const consumeLine = (rawLine: string): void => {\n const line = rawLine.endsWith(\"\\r\") ? rawLine.slice(0, -1) : rawLine;\n const trimmed = line.trim();\n if (trimmed.length === 0 || !isSseDataLine(trimmed)) return;\n const payload = extractSseDataPayload(trimmed);\n if (isSseDoneMarker(payload)) return;\n\n let chunk: GroqChatChunk;\n try {\n chunk = JSON.parse(payload) as GroqChatChunk;\n } catch {\n return;\n }\n\n const errorBody = (chunk as unknown as GroqErrorResponse).error;\n if (errorBody) {\n throw new AIError(\n errorBody.message?.toLowerCase().includes(\"rate limit\")\n ? AIErrorType.RATE_LIMIT_ERROR\n : AIErrorType.SERVER_ERROR,\n errorBody.message || \"Groq stream failed mid-flight\",\n );\n }\n\n if (chunk.model) model = chunk.model;\n\n const choice = chunk.choices?.[0];\n const delta = choice?.delta?.content;\n if (typeof delta === \"string\" && delta.length > 0) {\n chunks.push(delta);\n callbacks.onChunk?.(delta);\n }\n if (choice?.finish_reason) {\n finishReason = mapGroqFinishReason(choice.finish_reason);\n }\n const tailUsage = chunk.x_groq?.usage;\n if (tailUsage) {\n usage = mapGroqUsage(tailUsage);\n }\n };\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop() ?? \"\";\n for (const line of lines) consumeLine(line);\n }\n\n buffer += decoder.decode();\n if (buffer.length > 0) consumeLine(buffer);\n } catch (error) {\n if (error instanceof AIError) throw error;\n throw new AIError(\n AIErrorType.NETWORK_ERROR,\n \"Stream was interrupted\",\n error instanceof Error ? error : undefined,\n );\n } finally {\n reader.releaseLock();\n }\n\n return { text: chunks.join(\"\"), model, finishReason, usage };\n}\n","\nimport type {\n GenerationResult,\n ProviderHealth,\n StreamCallbacks,\n StructuredGeneration,\n StructuredTextRequest,\n TextRequest,\n TextTier,\n ChatMessage,\n} from \"../../core/types\";\nimport { AIError, AIErrorType } from \"../../core/errors\";\nimport { CacheManager } from \"../../core/utils\";\nimport { JsonResponseParser, StructuredPromptBuilder } from \"../../core/parsers\";\nimport { mergeTierOverrides, resolveModel, type TierModelMap } from \"../../core/tiers\";\nimport type { ITextProvider } from \"../base/provider.types\";\nimport { GroqChatRequestBuilder } from \"./groq-request.builder\";\nimport { GroqHttpClient } from \"./groq-http-client\";\nimport { GROQ_TIERS } from \"./groq.constants\";\nimport {\n consumeGroqStream,\n mapGroqFinishReason,\n mapGroqUsage,\n} from \"./groq-sse\";\nimport type {\n GroqChatRequest,\n GroqGenerationConfig,\n GroqMessage,\n GroqProviderConfig,\n} from \"./groq.entities\";\n\n/** Cache key layout version — bumped when the cached value shape changes. */\nconst CACHE_LAYOUT_VERSION = 2;\nconst STRUCTURED_TEMPERATURE = 0.1;\n\n/**\n * Groq provider over the ported machinery (dedupe/retry/queue pipeline,\n * LRU+TTL response cache). Implements the neutral ITextProvider surface:\n * tier-based model resolution, GenerationResult with token usage, and\n * callback-based streaming.\n */\nexport class GroqProvider implements ITextProvider {\n readonly id = \"groq\";\n readonly name = \"Groq\";\n readonly capabilities = [\"text\"] as const;\n\n private readonly client: GroqHttpClient;\n private readonly tiers: TierModelMap;\n private readonly cache = new CacheManager();\n private readonly jsonParser = new JsonResponseParser();\n\n constructor(readonly config: GroqProviderConfig) {\n this.client = new GroqHttpClient(config);\n this.tiers = mergeTierOverrides(GROQ_TIERS, config.models);\n }\n\n resolveModel(tier: TextTier): string {\n return resolveModel(this.tiers, tier, this.id);\n }\n\n async healthCheck(): Promise<ProviderHealth> {\n return this.config.apiKey ? \"healthy\" : \"unavailable\";\n }\n\n async estimateCost(): Promise<number> {\n return 0;\n }\n\n async generate(request: TextRequest): Promise<GenerationResult> {\n const model = request.model ?? this.resolveModel(request.tier ?? \"balanced\");\n const cacheKey = this.cache.generateKey({\n v: CACHE_LAYOUT_VERSION,\n provider: this.id,\n op: \"generate\",\n model,\n messages: request.messages,\n systemPrompt: request.systemPrompt ?? null,\n temperature: request.temperature ?? null,\n maxTokens: request.maxTokens ?? null,\n topP: request.topP ?? null,\n });\n\n const cached = this.cache.get<GenerationResult>(cacheKey);\n if (cached) return cached;\n\n const response = await this.client.postChatCompletion(\n this.buildWireRequest(model, request),\n );\n\n const choice = response.choices?.[0];\n const text = choice?.message?.content ?? \"\";\n if (text.length === 0) {\n throw new AIError(\n AIErrorType.SERVER_ERROR,\n \"No content generated from Groq API\",\n undefined,\n { model },\n );\n }\n\n const result: GenerationResult = {\n text,\n usage: mapGroqUsage(response.usage),\n model: response.model || model,\n providerId: this.id,\n finishReason: mapGroqFinishReason(choice?.finish_reason),\n };\n this.cache.set(cacheKey, result);\n return result;\n }\n\n async generateStructured<T>(\n request: StructuredTextRequest,\n ): Promise<StructuredGeneration<T>> {\n const model = request.model ?? this.resolveModel(request.tier ?? \"balanced\");\n\n const messages = toGroqMessages(request.messages, request.systemPrompt);\n const lastUserIndex = findLastIndex(messages, (m) => m.role === \"user\");\n if (lastUserIndex === -1) {\n throw new AIError(\n AIErrorType.UNKNOWN_ERROR,\n \"generateStructured requires at least one user message\",\n );\n }\n\n const structuredPrompt = new StructuredPromptBuilder(\n messages[lastUserIndex]?.content ?? \"\",\n )\n .withSchema(request.schema)\n .build();\n messages[lastUserIndex] = { role: \"user\", content: structuredPrompt };\n\n const wireRequest = GroqChatRequestBuilder.for(model)\n .withMessages(messages)\n .withConfig(this.generationConfig(request, STRUCTURED_TEMPERATURE))\n .withJsonResponse(true)\n .build();\n\n const response = await this.client.postChatCompletion(wireRequest);\n const choice = response.choices?.[0];\n const text = choice?.message?.content ?? \"\";\n if (text.length === 0) {\n throw new AIError(\n AIErrorType.SERVER_ERROR,\n \"No content generated from Groq API\",\n undefined,\n { model },\n );\n }\n\n return {\n value: this.jsonParser.parse<T>(text),\n result: {\n text,\n usage: mapGroqUsage(response.usage),\n model: response.model || model,\n providerId: this.id,\n finishReason: mapGroqFinishReason(choice?.finish_reason),\n },\n };\n }\n\n async stream(\n request: TextRequest,\n callbacks: StreamCallbacks,\n ): Promise<GenerationResult> {\n const model = request.model ?? this.resolveModel(request.tier ?? \"balanced\");\n const streamBody = await this.client.streamChatCompletion(\n this.buildWireRequest(model, request),\n { signal: request.signal },\n );\n\n try {\n const outcome = await consumeGroqStream(streamBody, callbacks);\n if (outcome.text.length === 0) {\n throw new AIError(\n AIErrorType.SERVER_ERROR,\n \"No content generated from Groq API\",\n undefined,\n { model },\n );\n }\n const result: GenerationResult = {\n text: outcome.text,\n usage: outcome.usage,\n model: outcome.model ?? model,\n providerId: this.id,\n finishReason: outcome.finishReason,\n };\n callbacks.onComplete?.(result);\n return result;\n } catch (error) {\n callbacks.onError?.(error instanceof Error ? error : new Error(String(error)));\n throw error;\n }\n }\n\n getCacheStats() {\n return this.cache.getStats();\n }\n\n clearCache() {\n this.cache.clear();\n }\n\n cancelPendingRequests() {\n this.client.cancelPendingRequests();\n }\n\n private buildWireRequest(model: string, request: TextRequest): GroqChatRequest {\n return GroqChatRequestBuilder.for(model)\n .withMessages(toGroqMessages(request.messages, request.systemPrompt))\n .withConfig(this.generationConfig(request))\n .build();\n }\n\n private generationConfig(\n request: TextRequest,\n temperatureOverride?: number,\n ): GroqGenerationConfig {\n return {\n ...(request.temperature !== undefined\n ? { temperature: request.temperature }\n : {}),\n ...(temperatureOverride !== undefined\n ? { temperature: temperatureOverride }\n : {}),\n ...(request.maxTokens !== undefined ? { maxTokens: request.maxTokens } : {}),\n ...(request.topP !== undefined ? { topP: request.topP } : {}),\n ...(request.stopSequences !== undefined && request.stopSequences.length > 0\n ? { stop: [...request.stopSequences] }\n : {}),\n };\n }\n}\n\n/** Maps neutral messages to Groq's wire format; systemPrompt becomes the leading system message. */\nexport function toGroqMessages(\n messages: ReadonlyArray<ChatMessage>,\n systemPrompt?: string,\n): GroqMessage[] {\n const wire: GroqMessage[] = [];\n if (systemPrompt && systemPrompt.length > 0) {\n wire.push({ role: \"system\", content: systemPrompt });\n }\n for (const message of messages) {\n if (message.role === \"system\") {\n wire.push({ role: \"system\", content: message.content });\n continue;\n }\n wire.push({ role: message.role, content: message.content });\n }\n return wire;\n}\n\nexport function createGroqProvider(config: GroqProviderConfig): GroqProvider {\n return new GroqProvider(config);\n}\n\nfunction findLastIndex<T>(items: ReadonlyArray<T>, predicate: (item: T) => boolean): number {\n for (let i = items.length - 1; i >= 0; i--) {\n const item = items[i];\n if (item !== undefined && predicate(item)) return i;\n }\n return -1;\n}\n","\nimport type { ProviderHealth } from \"../../core/types\";\nimport { AIError } from \"../../content/domain/errors/AIErrors\";\nimport { ProviderTimingConfig } from \"../../content/domain/limits/ProviderTimingConfig\";\nimport { calculateRetryBackoffDelayMs } from \"../../content/domain/calculations/RetryBackoffDelay\";\nimport type { CostEstimateRequest } from \"./provider.types\";\n\nexport interface BaseProviderConfig {\n apiKey: string;\n baseUrl?: string;\n timeout?: number;\n retryAttempts?: number;\n}\n\n/**\n * Convenience base for providers that talk raw fetch (gemini/fal/pruna style):\n * timeout-bounded fetch plus a simple retry loop. The Groq and Anthropic\n * providers bring their own transport machinery and do not extend this.\n */\nexport abstract class BaseProvider {\n protected config: BaseProviderConfig;\n\n constructor(config: BaseProviderConfig) {\n this.config = config;\n }\n\n async healthCheck(): Promise<ProviderHealth> {\n if (!this.config.apiKey) {\n return \"unavailable\";\n }\n return \"healthy\";\n }\n\n async estimateCost(_request: CostEstimateRequest): Promise<number> {\n return 0;\n }\n\n protected async fetchWithTimeout(url: string, options: RequestInit, timeout?: number): Promise<Response> {\n const effectiveTimeout = timeout ?? this.config.timeout ?? ProviderTimingConfig.DEFAULT_TIMEOUT_MS;\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), effectiveTimeout);\n\n try {\n const response = await fetch(url, {\n ...options,\n signal: controller.signal,\n });\n clearTimeout(timeoutId);\n return response;\n } catch (error) {\n clearTimeout(timeoutId);\n throw error;\n }\n }\n\n protected async withRetry<T>(fn: () => Promise<T>, maxAttempts?: number): Promise<T> {\n const attempts = maxAttempts ?? this.config.retryAttempts ?? ProviderTimingConfig.DEFAULT_RETRY_ATTEMPTS;\n let lastError: Error | undefined;\n\n for (let i = 0; i < attempts; i++) {\n try {\n return await fn();\n } catch (error) {\n lastError = error as Error;\n if (i < attempts - 1) {\n await new Promise(resolve => setTimeout(resolve, calculateRetryBackoffDelayMs(i)));\n }\n }\n }\n\n throw lastError || new Error(\"Retry attempts exhausted\");\n }\n}\n\nexport { BaseProvider as BaseAIProvider };\n\nexport class ProviderError extends AIError {\n constructor(\n message: string,\n public readonly providerId: string,\n originalError?: unknown\n ) {\n super(message, \"PROVIDER_ERROR\", originalError);\n this.name = \"ProviderError\";\n }\n}\n","\nimport { BaseProvider } from '../base/base.provider';\nimport type { GeneratedContent } from '../../content/domain/config/ProviderConfig';\nimport type {\n GenerationResult,\n ProviderHealth,\n StreamCallbacks,\n StructuredGeneration,\n StructuredTextRequest,\n TextRequest,\n TextTier,\n ChatMessage,\n} from '../../core/types';\nimport {\n AIError,\n AIErrorType,\n classifyHttpStatus,\n extractErrorMessageFromResponse,\n} from '../../core/errors';\nimport { JsonResponseParser, StructuredPromptBuilder } from '../../core/parsers';\nimport { mergeTierOverrides, resolveModel, type TierModelMap } from '../../core/tiers';\nimport type {\n CostEstimateRequest,\n IMediaProvider,\n ITextProvider,\n} from '../base/provider.types';\nimport { ProviderTimingConfig } from '../../content/domain/limits/ProviderTimingConfig';\nimport { estimateGeminiGenerationCost } from '../../content/domain/predicates/ProviderCostEstimator';\nimport { ModelDefaults } from '../../content/domain/limits/ModelDefaults';\nimport type {\n GeminiConfig,\n ImageGenerationRequest,\n ImageToVideoRequest,\n VideoGenerationRequest,\n VideoToVideoRequest,\n} from '../../content/domain/config/ProviderConfig';\n\ninterface GeminiResponse {\n candidates: Array<{\n content: {\n parts: Array<{\n text?: string;\n inlineData?: {\n data: string;\n mimeType: string;\n };\n }>;\n };\n finishReason: string;\n }>;\n usageMetadata?: {\n promptTokenCount: number;\n candidatesTokenCount: number;\n totalTokenCount: number;\n };\n}\n\nexport const GEMINI_TIERS: TierModelMap = {\n fast: 'gemini-2.0-flash-lite',\n balanced: ModelDefaults.GEMINI_TEXT,\n powerful: 'gemini-2.5-pro',\n};\n\n/**\n * Gemini provider — text via generateContent (multi-turn aware, system\n * instruction in the proper slot) plus inline image generation. Video is not\n * supported by this surface and throws with a clear message.\n */\nexport class GeminiProvider extends BaseProvider implements ITextProvider, IMediaProvider {\n readonly id = 'gemini';\n readonly name = 'Google Gemini';\n readonly capabilities = ['text', 'image'] as const;\n\n private models: { text: string; image: string; video?: string };\n private readonly tiers: TierModelMap;\n private readonly jsonParser = new JsonResponseParser();\n\n constructor(config: GeminiConfig) {\n super({\n apiKey: config.apiKey,\n baseUrl: config.baseUrl || 'https://generativelanguage.googleapis.com/v1beta',\n timeout: config.timeout || ProviderTimingConfig.GEMINI_TIMEOUT_MS,\n retryAttempts: config.retryAttempts || ProviderTimingConfig.GEMINI_RETRY_ATTEMPTS,\n });\n\n this.models = {\n text: ModelDefaults.GEMINI_TEXT,\n image: ModelDefaults.GEMINI_IMAGE,\n };\n if (config.models) {\n this.models = { ...this.models, ...config.models };\n }\n this.tiers = mergeTierOverrides(\n GEMINI_TIERS,\n config.models ? { balanced: config.models.text } : undefined,\n );\n }\n\n resolveModel(tier: TextTier): string {\n return resolveModel(this.tiers, tier, this.id);\n }\n\n async healthCheck(): Promise<ProviderHealth> {\n try {\n if (!this.config.apiKey) {\n return 'unavailable';\n }\n\n const response = await this.fetchWithTimeout(\n `${this.config.baseUrl}/models`,\n {\n method: 'GET',\n headers: this.authHeaders(),\n }\n );\n\n if (response.ok) return 'healthy';\n if (response.status === 401 || response.status === 403) return 'unavailable';\n return 'degraded';\n } catch {\n return 'unavailable';\n }\n }\n\n async estimateCost(request: CostEstimateRequest): Promise<number> {\n return estimateGeminiGenerationCost(request as Parameters<typeof estimateGeminiGenerationCost>[0]);\n }\n\n async generate(request: TextRequest): Promise<GenerationResult> {\n try {\n const model = request.model ?? this.resolveModel(request.tier ?? 'balanced');\n const systemMessages = request.messages.filter((m) => m.role === 'system');\n const systemPrompt =\n request.systemPrompt && request.systemPrompt.length > 0\n ? request.systemPrompt\n : systemMessages.length > 0\n ? systemMessages.map((m) => m.content).join('\\n')\n : undefined;\n\n const response = await this.withRetry(async () => {\n return await this.fetchWithTimeout(\n `${this.config.baseUrl}/models/${model}:generateContent`,\n {\n method: 'POST',\n headers: this.authHeaders(),\n body: JSON.stringify({\n systemInstruction:\n systemPrompt && systemPrompt.length > 0\n ? { parts: [{ text: systemPrompt }] }\n : undefined,\n contents: toGeminiContents(request.messages),\n generationConfig: {\n temperature: request.temperature ?? 0.7,\n maxOutputTokens: request.maxTokens ?? 2048,\n topP: request.topP ?? 0.9,\n },\n }),\n }\n );\n });\n\n if (!response.ok) {\n const message = await extractErrorMessageFromResponse(response);\n throw new AIError(\n classifyHttpStatus(response.status),\n `Gemini API error (${response.status}): ${message}`,\n undefined,\n { status: response.status, model },\n );\n }\n\n const data: GeminiResponse = await response.json();\n const text = data.candidates?.[0]?.content?.parts\n ?.map((part) => part.text ?? '')\n .join('') ?? '';\n if (text.length === 0) {\n throw new AIError(AIErrorType.SERVER_ERROR, 'No content generated from Gemini API', undefined, { model });\n }\n\n return {\n text,\n usage: data.usageMetadata\n ? {\n inputTokens: data.usageMetadata.promptTokenCount,\n outputTokens: data.usageMetadata.candidatesTokenCount,\n totalTokens: data.usageMetadata.totalTokenCount,\n }\n : undefined,\n model,\n providerId: this.id,\n finishReason: mapGeminiFinishReason(data.candidates?.[0]?.finishReason),\n };\n } catch (error) {\n if (error instanceof AIError) throw error;\n throw new AIError(\n AIErrorType.UNKNOWN_ERROR,\n `Gemini text generation failed: ${error instanceof Error ? error.message : 'Unknown error'}`,\n error instanceof Error ? error : undefined,\n );\n }\n }\n\n async generateStructured<T>(\n request: StructuredTextRequest,\n ): Promise<StructuredGeneration<T>> {\n const messages = [...request.messages];\n const lastUserIndex = findLastIndex(messages, (m) => m.role === 'user');\n if (lastUserIndex === -1) {\n throw new AIError(\n AIErrorType.UNKNOWN_ERROR,\n 'generateStructured requires at least one user message',\n );\n }\n messages[lastUserIndex] = {\n role: 'user',\n content: new StructuredPromptBuilder(messages[lastUserIndex]?.content ?? '')\n .withSchema(request.schema)\n .build(),\n };\n\n const result = await this.generate({ ...request, messages, temperature: 0.1 });\n return { value: this.jsonParser.parse<T>(result.text), result };\n }\n\n async stream(request: TextRequest, callbacks: StreamCallbacks): Promise<GenerationResult> {\n // Gemini text streaming arrives as a single buffered payload on this\n // surface — emit it as one chunk so callers keep one code path.\n const result = await this.generate(request);\n callbacks.onChunk?.(result.text);\n callbacks.onComplete?.(result);\n return result;\n }\n\n async generateImage(request: ImageGenerationRequest): Promise<GeneratedContent> {\n try {\n const response = await this.withRetry(async () => {\n return await this.fetchWithTimeout(\n `${this.config.baseUrl}/models/${this.models.image}:generateContent`,\n {\n method: 'POST',\n headers: this.authHeaders(),\n body: JSON.stringify({\n contents: [{\n parts: [{\n text: this.buildImagePrompt(request)\n }]\n }],\n }),\n }\n );\n });\n\n if (!response.ok) {\n const message = await extractErrorMessageFromResponse(response);\n throw new AIError(\n classifyHttpStatus(response.status),\n `Gemini image generation error (${response.status}): ${message}`,\n undefined,\n { status: response.status },\n );\n }\n\n const data: GeminiResponse = await response.json();\n\n const imageData = data.candidates?.[0]?.content?.parts?.[0]?.inlineData;\n if (!imageData) {\n throw new AIError(AIErrorType.SERVER_ERROR, 'No image data in Gemini response');\n }\n\n const url = `data:${imageData.mimeType};base64,${imageData.data}`;\n\n return {\n id: Date.now().toString(),\n type: 'image',\n url,\n metadata: {\n provider: 'gemini',\n model: this.models.image,\n mimeType: imageData.mimeType,\n },\n createdAt: new Date().toISOString(),\n };\n } catch (error) {\n throw new Error(`Gemini image generation failed: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n }\n\n async generateVideo(_request: VideoGenerationRequest): Promise<GeneratedContent> {\n throw new Error('Gemini provider does not support video generation');\n }\n\n async imageToVideo(_request: ImageToVideoRequest): Promise<GeneratedContent> {\n throw new Error('Gemini provider does not support image-to-video conversion');\n }\n\n async videoToVideo(_request: VideoToVideoRequest): Promise<GeneratedContent> {\n throw new Error('Gemini provider does not support video-to-video conversion');\n }\n\n private authHeaders(): Record<string, string> {\n return {\n 'Content-Type': 'application/json',\n 'x-goog-api-key': this.config.apiKey,\n };\n }\n\n private buildImagePrompt(request: ImageGenerationRequest): string {\n let prompt = request.prompt;\n\n if (request.style) {\n const styles: Record<string, string> = {\n realistic: 'photorealistic, highly detailed, 8k resolution',\n cartoon: 'cartoon style, colorful, animated',\n abstract: 'abstract art, modern, artistic',\n minimalist: 'minimalist, clean, simple',\n vintage: 'vintage style, retro, classic',\n };\n prompt += `, ${styles[request.style]}`;\n }\n\n if (request.quality === 'ultra') {\n prompt += ', ultra high quality, masterpiece';\n }\n\n return prompt;\n }\n}\n\n/** Maps neutral messages to Gemini contents; assistant becomes 'model'. */\nexport function toGeminiContents(messages: ReadonlyArray<ChatMessage>): Array<{\n role: 'user' | 'model';\n parts: Array<{ text: string }>;\n}> {\n return messages\n .filter((message) => message.role !== 'system' && message.content.length > 0)\n .map((message) => ({\n role: message.role === 'assistant' ? ('model' as const) : ('user' as const),\n parts: [{ text: message.content }],\n }));\n}\n\nfunction mapGeminiFinishReason(reason: string | undefined) {\n if (reason === 'STOP') return 'stop' as const;\n if (reason === 'MAX_TOKENS') return 'length' as const;\n if (reason === 'SAFETY' || reason === 'PROHIBITED_CONTENT') return 'content_filter' as const;\n return undefined;\n}\n\nfunction findLastIndex<T>(items: ReadonlyArray<T>, predicate: (item: T) => boolean): number {\n for (let i = items.length - 1; i >= 0; i--) {\n const item = items[i];\n if (item !== undefined && predicate(item)) return i;\n }\n return -1;\n}\n\nexport function createGeminiProvider(config: GeminiConfig): GeminiProvider {\n return new GeminiProvider(config);\n}\n","\nimport { BaseProvider } from '../base/base.provider';\nimport type { GeneratedContent } from '../../content/domain/config/ProviderConfig';\nimport type { ProviderHealth } from '../../core/types';\nimport type { CostEstimateRequest, IMediaProvider } from '../base/provider.types';\nimport { ProviderTimingConfig } from '../../content/domain/limits/ProviderTimingConfig';\nimport { ModelDefaults } from '../../content/domain/limits/ModelDefaults';\nimport { estimateFalGenerationCost, resolveFalImageSize, resolveFalInferenceSteps } from '../../content/domain/predicates';\nimport type {\n FalConfig,\n ImageGenerationRequest,\n VideoGenerationRequest,\n ImageToVideoRequest,\n VideoToVideoRequest,\n} from '../../content/domain/config/ProviderConfig';\n\ninterface FalResult {\n images?: Array<{ url: string }>;\n video?: { url: string };\n error?: string;\n}\n\n/** Media-only provider: fal.ai for image and video generation. */\nexport class FalProvider extends BaseProvider implements IMediaProvider {\n readonly id = 'fal';\n readonly name = 'FAL';\n readonly capabilities = ['image', 'video'] as const;\n\n private models: { image: string; video: string; imageToVideo: string };\n\n constructor(config: FalConfig) {\n super({\n apiKey: config.apiKey,\n baseUrl: config.baseUrl || 'https://queue.fal.run',\n timeout: config.timeout || ProviderTimingConfig.FAL_TIMEOUT_MS,\n retryAttempts: config.retryAttempts || ProviderTimingConfig.FAL_RETRY_ATTEMPTS,\n });\n\n this.models = {\n image: ModelDefaults.FAL_IMAGE,\n video: ModelDefaults.FAL_VIDEO,\n imageToVideo: ModelDefaults.FAL_IMAGE_TO_VIDEO,\n };\n if (config.models) {\n this.models = { ...this.models, ...config.models };\n }\n }\n\n async healthCheck(): Promise<ProviderHealth> {\n try {\n if (!this.config.apiKey) {\n return 'unavailable';\n }\n\n const response = await this.fetchWithTimeout(\n `${this.config.baseUrl}/fal-ai/flux/schnell/status`,\n {\n method: 'HEAD',\n headers: {\n 'Authorization': `Key ${this.config.apiKey}`,\n },\n }\n );\n\n return response.ok ? 'healthy' : 'degraded';\n } catch {\n return 'unavailable';\n }\n }\n\n async estimateCost(request: CostEstimateRequest): Promise<number> {\n return estimateFalGenerationCost(\n request as Parameters<typeof estimateFalGenerationCost>[0],\n );\n }\n\n async generateImage(request: ImageGenerationRequest): Promise<GeneratedContent> {\n try {\n const response = await this.withRetry(async () => {\n return await this.fetchWithTimeout(\n `${this.config.baseUrl}/${this.models.image}`,\n {\n method: 'POST',\n headers: {\n 'Authorization': `Key ${this.config.apiKey}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n prompt: request.prompt,\n image_size: resolveFalImageSize(request.format),\n num_inference_steps: resolveFalInferenceSteps(request.quality),\n num_images: request.quantity || 1,\n }),\n }\n );\n });\n\n if (!response.ok) {\n throw new Error(`FAL API error: ${response.statusText}`);\n }\n\n const data: FalResult = await response.json();\n\n if (data.error) {\n throw new Error(data.error);\n }\n\n return {\n id: Date.now().toString(),\n type: 'image',\n url: data.images?.[0]?.url,\n metadata: {\n provider: 'fal',\n model: this.models.image,\n },\n createdAt: new Date().toISOString(),\n };\n } catch (error) {\n throw new Error(`FAL image generation failed: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n }\n\n async generateVideo(request: VideoGenerationRequest): Promise<GeneratedContent> {\n try {\n const response = await this.withRetry(async () => {\n return await this.fetchWithTimeout(\n `${this.config.baseUrl}/${this.models.video}`,\n {\n method: 'POST',\n headers: {\n 'Authorization': `Key ${this.config.apiKey}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n prompt: request.prompt,\n aspect_ratio: request.aspectRatio || '16:9',\n }),\n }\n );\n });\n\n if (!response.ok) {\n throw new Error(`FAL API error: ${response.statusText}`);\n }\n\n const data: FalResult = await response.json();\n\n if (data.error) {\n throw new Error(data.error);\n }\n\n return {\n id: Date.now().toString(),\n type: 'video',\n url: data.video?.url,\n metadata: {\n provider: 'fal',\n model: this.models.video,\n },\n createdAt: new Date().toISOString(),\n };\n } catch (error) {\n throw new Error(`FAL video generation failed: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n }\n\n async imageToVideo(request: ImageToVideoRequest): Promise<GeneratedContent> {\n try {\n const response = await this.withRetry(async () => {\n return await this.fetchWithTimeout(\n `${this.config.baseUrl}/${this.models.imageToVideo}`,\n {\n method: 'POST',\n headers: {\n 'Authorization': `Key ${this.config.apiKey}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n image_url: request.imageUrl,\n motion: request.motion || 'medium',\n prompt: request.prompt,\n }),\n }\n );\n });\n\n if (!response.ok) {\n throw new Error(`FAL API error: ${response.statusText}`);\n }\n\n const data: FalResult = await response.json();\n\n if (data.error) {\n throw new Error(data.error);\n }\n\n return {\n id: Date.now().toString(),\n type: 'video',\n url: data.video?.url,\n metadata: {\n provider: 'fal',\n model: this.models.imageToVideo,\n },\n createdAt: new Date().toISOString(),\n };\n } catch (error) {\n throw new Error(`FAL image-to-video failed: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n }\n\n async videoToVideo(_request: VideoToVideoRequest): Promise<GeneratedContent> {\n throw new Error('FAL provider does not support video-to-video conversion');\n }\n}\n\nexport function createFalProvider(config: FalConfig): FalProvider {\n return new FalProvider(config);\n}\n","\nimport type { PrunaAspectRatio, PrunaResolution } from '../entities/types';\n\nexport const DEFAULT_ASPECT_RATIO: PrunaAspectRatio = '16:9';\n\nexport const P_VIDEO_DEFAULTS = {\n duration: 5,\n resolution: '720p' as PrunaResolution,\n fps: 24,\n draft: false,\n promptUpsampling: true,\n} as const;\n\nexport const POLL_DEFAULTS = {\n intervalMs: 3_000,\n maxAttempts: 120,\n maxIntervalMs: 10_000,\n backoffBase: 1.5,\n jitterPercent: 0.1,\n} as const;\n\nexport const DEFAULT_DEDUPLICATOR_TTL_MS = 30_000;\n\nexport const DEDUPLICATOR_CLEANUP_GRACE_MS = 100;\n\nexport const DEFAULT_CACHE_TTL_MS = 5 * 60 * 1000;\n\nexport const DEFAULT_CACHE_MAX_SIZE = 50;\n\nexport const PERFORMANCE_RETAINED_SAMPLES = 100;\n","\nexport const HTTPS_PREFIX = 'https://';\nexport const HTTP_PREFIX = 'http://';\nexport const BASE64_MARKER = 'base64,';\n\nexport const PRUNA_BASE_URL = 'https://api.pruna.ai';\n\nexport const PRUNA_PREDICTIONS_URL = `${PRUNA_BASE_URL}/v1/predictions`;\n\nexport const PRUNA_FILES_URL = `${PRUNA_BASE_URL}/v1/files`;\n\nexport const AUTH_FAILURE_STATUSES: readonly number[] = [401, 403] as const;\n\nexport const MIN_API_KEY_LENGTH = 1;\n\nexport const MAX_API_KEY_LENGTH = 256;\n","\nexport const MIME_PNG = 'image/png';\nexport const MIME_JPEG = 'image/jpeg';\nexport const MIME_WEBP = 'image/webp';\n\nexport const DEFAULT_IMAGE_MIME = MIME_PNG;\n\nexport const MIME_FILE_EXTENSION: Readonly<Record<string, string>> = {\n [MIME_PNG]: 'png',\n [MIME_JPEG]: 'jpg',\n [MIME_WEBP]: 'webp',\n};\n\nexport const IMAGE_SIGNATURES = {\n PNG: [0x89, 0x50],\n JPEG: [0xff, 0xd8],\n WEBP_RIFF: [0x52, 0x49],\n} as const;\n","\nexport const CANCELLATION_MESSAGE = 'Request cancelled by user';\n\nexport class CancellationError extends Error {\n constructor(message: string = CANCELLATION_MESSAGE) {\n super(message);\n this.name = 'CancellationError';\n }\n}\n\nexport function isCancellationError(value: unknown): value is CancellationError {\n return value instanceof CancellationError;\n}\n","\nexport const AUTHENTICATION_MESSAGE = 'Authentication failed. Please check your API key.';\n\nexport class AuthenticationError extends Error {\n constructor(message: string = AUTHENTICATION_MESSAGE) {\n super(message);\n this.name = 'AuthenticationError';\n }\n}\n","\nexport const TIMEOUT_MESSAGE = 'Generation timed out. Maximum polling attempts reached.';\n\nexport class TimeoutError extends Error {\n constructor(message: string = TIMEOUT_MESSAGE) {\n super(message);\n this.name = 'TimeoutError';\n }\n}\n","\nexport interface ValidationErrorContext {\n field: string;\n reason: string;\n receivedValue?: unknown;\n}\n\nexport class ValidationError extends Error {\n readonly field: string;\n readonly reason: string;\n readonly receivedValue: unknown;\n\n constructor(context: ValidationErrorContext) {\n super(`Invalid ${context.field}: ${context.reason}`);\n this.name = 'ValidationError';\n this.field = context.field;\n this.reason = context.reason;\n this.receivedValue = context.receivedValue;\n }\n}\n\nexport function isValidationError(value: unknown): value is ValidationError {\n return value instanceof ValidationError;\n}\n","\ninterface BufferLike {\n from: (data: string, encoding: string) => {\n buffer: ArrayBuffer;\n byteOffset: number;\n byteLength: number;\n };\n}\n\ninterface GlobalWithBuffer {\n Buffer?: BufferLike;\n}\n\nconst globalScope = globalThis as unknown as GlobalWithBuffer;\nconst hasBuffer = typeof globalScope.Buffer?.from === 'function';\n\nexport function base64ToBytes(raw: string): Uint8Array {\n if (hasBuffer) {\n const bufferFactory = globalScope.Buffer;\n if (!bufferFactory) {\n throw new Error('Buffer unavailable despite detection flag');\n }\n const buf = bufferFactory.from(raw, 'base64');\n return new Uint8Array(buf.buffer, buf.byteOffset, buf.byteLength);\n }\n\n const decoded = atob(raw);\n return Uint8Array.from(decoded, char => char.charCodeAt(0));\n}\n","\nimport { IMAGE_SIGNATURES, DEFAULT_IMAGE_MIME, MIME_PNG, MIME_JPEG, MIME_WEBP } from '../constants/mime-types';\n\nconst MIN_SIGNATURE_BYTES = 2;\n\nfunction matchesSignature(bytes: Uint8Array, signature: readonly number[]): boolean {\n if (bytes.length < signature.length) return false;\n return signature.every((value, index) => bytes[index] === value);\n}\n\nexport function detectImageMime(bytes: Uint8Array): string {\n if (bytes.length < MIN_SIGNATURE_BYTES) return DEFAULT_IMAGE_MIME;\n\n if (matchesSignature(bytes, IMAGE_SIGNATURES.PNG)) return MIME_PNG;\n if (matchesSignature(bytes, IMAGE_SIGNATURES.JPEG)) return MIME_JPEG;\n if (matchesSignature(bytes, IMAGE_SIGNATURES.WEBP_RIFF)) return MIME_WEBP;\n return DEFAULT_IMAGE_MIME;\n}\n","\nexport interface ApiErrorPayload {\n message?: string;\n}\n\nexport interface PrunaApiError extends Error {\n statusCode: number;\n}\n\nexport async function parseApiError(\n response: Response,\n fallback: string,\n): Promise<PrunaApiError> {\n const payload = await response\n .json()\n .catch(() => ({ message: response.statusText })) as ApiErrorPayload;\n\n const message = payload.message ?? `${fallback}: ${response.status}`;\n const error = new Error(message) as PrunaApiError;\n error.statusCode = response.status;\n return error;\n}\n","\nimport { AUTH_FAILURE_STATUSES } from '../constants/network';\n\nexport function isAuthFailureStatus(status: number): boolean {\n return (AUTH_FAILURE_STATUSES as readonly number[]).includes(status);\n}\n\nexport function isTransientServerError(status: number): boolean {\n return status >= 500 && status < 600;\n}\n\nexport function isClientError(status: number): boolean {\n return status >= 400 && status < 500 && !isAuthFailureStatus(status);\n}\n","\nimport type { PrunaJobStatus } from '../entities/types';\n\nexport const TERMINAL_SUCCESS_STATUSES: readonly PrunaJobStatus[] = ['succeeded', 'completed'] as const;\nexport const TERMINAL_FAILURE_STATUSES: readonly PrunaJobStatus[] = ['failed'] as const;\nexport const IN_FLIGHT_STATUSES: readonly PrunaJobStatus[] = ['processing', 'starting'] as const;\n\nexport function isTerminalSuccessStatus(status: PrunaJobStatus | undefined): boolean {\n if (!status) return false;\n return (TERMINAL_SUCCESS_STATUSES as readonly string[]).includes(status);\n}\n\nexport function isTerminalFailureStatus(status: PrunaJobStatus | undefined): boolean {\n if (!status) return false;\n return (TERMINAL_FAILURE_STATUSES as readonly string[]).includes(status);\n}\n\nexport function isInFlightStatus(status: PrunaJobStatus | undefined): boolean {\n return !isTerminalStatus(status);\n}\n\nexport function isTerminalStatus(status: PrunaJobStatus | undefined): boolean {\n return isTerminalSuccessStatus(status) || isTerminalFailureStatus(status);\n}\n","\nexport function isAbortError(err: unknown): boolean {\n if (err instanceof DOMException && err.code === DOMException.ABORT_ERR) return true;\n if (err instanceof Error && err.name === 'AbortError') return true;\n return false;\n}\n\nexport function isAbortSignal(signal: unknown): signal is AbortSignal {\n return signal instanceof AbortSignal;\n}\n\nexport function isSignalAborted(signal: AbortSignal | undefined): boolean {\n return signal?.aborted === true;\n}\n","\nimport { PRUNA_BASE_URL, PRUNA_FILES_URL } from '../constants/network';\nimport { HTTPS_PREFIX, HTTP_PREFIX } from '../constants/network';\n\nexport function isAbsoluteHttpUrl(value: string): boolean {\n return value.startsWith(HTTPS_PREFIX) || value.startsWith(HTTP_PREFIX);\n}\n\nexport function isHttpsUrl(value: string): boolean {\n return value.startsWith(HTTPS_PREFIX);\n}\n\nexport function buildPrunaApiUrl(pathOrUrl: string): string {\n if (isAbsoluteHttpUrl(pathOrUrl)) return pathOrUrl;\n return `${PRUNA_BASE_URL}${pathOrUrl}`;\n}\n\nexport function buildFileUrlById(fileId: string): string {\n return `${PRUNA_FILES_URL}/${fileId}`;\n}\n","\nimport { POLL_DEFAULTS } from '../constants/limits';\n\nexport interface BackoffInputs {\n attempt: number;\n baseIntervalMs: number;\n maxIntervalMs?: number;\n jitterPercent?: number;\n growthBase?: number;\n}\n\nexport function calculateExponentialBackoff(inputs: BackoffInputs): number {\n const {\n attempt,\n baseIntervalMs,\n maxIntervalMs = POLL_DEFAULTS.maxIntervalMs,\n jitterPercent = POLL_DEFAULTS.jitterPercent,\n growthBase = POLL_DEFAULTS.backoffBase,\n } = inputs;\n\n const safeAttempt = Math.max(0, attempt);\n const safeBase = Math.max(0, baseIntervalMs);\n const exponentialDelay = Math.min(safeBase * Math.pow(growthBase, safeAttempt), maxIntervalMs);\n const jitter = exponentialDelay * jitterPercent * Math.random();\n return exponentialDelay + jitter;\n}\n","\nimport { PRUNA_BASE_URL, BASE64_MARKER } from '../constants';\nimport type { PrunaPredictionResponse } from '../entities/types';\nimport { isTerminalSuccessStatus } from '../protocol/job-status';\nimport { isHttpsUrl } from '../protocol/pruna-url-builder';\n\ninterface UrlOutput {\n url: string;\n}\n\ntype PredictionOutput =\n | string\n | UrlOutput\n | readonly string[]\n | null\n | undefined;\n\nconst uriCache = new WeakMap<PrunaPredictionResponse, string | null>();\n\nexport function stripBase64Prefix(image: string): string {\n if (isHttpsUrl(image)) return image;\n const base64Index = image.indexOf(BASE64_MARKER);\n return base64Index !== -1 ? image.slice(base64Index + BASE64_MARKER.length) : image;\n}\n\nfunction readOutput(output: PredictionOutput): string | null {\n if (typeof output === 'string') return output;\n if (Array.isArray(output) && output.length > 0) return output[0] ?? null;\n if (output !== null && typeof output === 'object' && 'url' in output) {\n return output.url;\n }\n return null;\n}\n\nexport function extractUri(data: PrunaPredictionResponse): string | null {\n const cached = uriCache.get(data);\n if (cached !== undefined) return cached;\n\n if (!isTerminalSuccessStatus(data.status)) {\n uriCache.set(data, null);\n return null;\n }\n\n const result =\n data.generation_url ??\n readOutput(data.output as PredictionOutput) ??\n data.video_url ??\n data.data ??\n null;\n\n uriCache.set(data, result);\n return result;\n}\n\nexport function resolveUri(uri: string): string {\n return uri.startsWith('/') ? `${PRUNA_BASE_URL}${uri}` : uri;\n}\n","\nimport type {\n PrunaModelId,\n PrunaPredictionResponse,\n PrunaFileUploadResponse,\n GenerationStage,\n} from '../entities/types';\nimport {\n PRUNA_FILES_URL,\n PRUNA_PREDICTIONS_URL,\n HTTP_PREFIX,\n POLL_DEFAULTS,\n MIME_FILE_EXTENSION,\n} from '../constants';\nimport { base64ToBytes } from '../utils/base64';\nimport { detectImageMime } from '../utils/mime-detector';\nimport { parseApiError } from '../utils/api-error-parser';\nimport { CancellationError } from '../errors/cancellation-error';\nimport { AuthenticationError } from '../errors/authentication-error';\nimport { TimeoutError } from '../errors/timeout-error';\nimport { isAuthFailureStatus } from '../protocol/http-status';\nimport { isTerminalSuccessStatus, isTerminalFailureStatus } from '../protocol/job-status';\nimport { isAbortError } from '../protocol/abort-signal-classifier';\nimport {\n buildPrunaApiUrl,\n buildFileUrlById,\n isHttpsUrl,\n isAbsoluteHttpUrl,\n} from '../protocol/pruna-url-builder';\nimport { calculateExponentialBackoff } from '../math/exponential-backoff';\nimport { extractUri, resolveUri, stripBase64Prefix } from '../utils/uri-resolver';\n\ninterface UploadInit {\n method: 'POST';\n headers: Record<string, string>;\n body: FormData;\n}\n\nfunction buildFileExtension(mime: string): string {\n return MIME_FILE_EXTENSION[mime] ?? 'bin';\n}\n\n\nexport async function uploadImage(\n base64OrUrl: string,\n apiKey: string,\n onProgress?: (stage: GenerationStage) => void,\n): Promise<string> {\n if (isHttpsUrl(base64OrUrl)) return base64OrUrl;\n if (base64OrUrl.startsWith(HTTP_PREFIX)) {\n throw new Error('Only HTTPS URLs are supported for security.');\n }\n\n onProgress?.('uploading');\n\n const raw = stripBase64Prefix(base64OrUrl);\n\n let bytes: Uint8Array;\n try {\n bytes = base64ToBytes(raw);\n } catch {\n throw new Error('Invalid image format. Provide base64 or a valid HTTPS URL.');\n }\n\n const mime = detectImageMime(bytes);\n const buffer = bytes.buffer.slice(\n bytes.byteOffset,\n bytes.byteOffset + bytes.byteLength,\n ) as ArrayBuffer;\n const blob = new Blob([buffer], { type: mime });\n const formData = new FormData();\n formData.append('content', blob, `upload.${buildFileExtension(mime)}`);\n\n const res = await fetch(PRUNA_FILES_URL, {\n method: 'POST',\n headers: { apikey: apiKey },\n body: formData,\n } satisfies UploadInit as RequestInit);\n\n if (!res.ok) {\n throw await parseApiError(res, 'File upload error');\n }\n\n const data: PrunaFileUploadResponse = await res.json();\n return data.urls?.get ?? buildFileUrlById(data.id ?? '');\n}\n\n\nexport async function submitPrediction(\n model: PrunaModelId,\n input: Record<string, unknown>,\n apiKey: string,\n signal?: AbortSignal,\n onProgress?: (stage: GenerationStage) => void,\n): Promise<PrunaPredictionResponse> {\n onProgress?.('predicting');\n\n const res = await fetch(PRUNA_PREDICTIONS_URL, {\n method: 'POST',\n headers: {\n apikey: apiKey,\n Model: model,\n 'Try-Sync': 'true',\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ input }),\n signal,\n });\n\n if (!res.ok) {\n throw await parseApiError(res, 'API error');\n }\n\n return res.json();\n}\n\n\nexport class GenerationFailedError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'GenerationFailedError';\n }\n}\n\ninterface PollAttemptResult {\n outcome: 'succeeded' | 'continue' | 'transient-failure';\n uri?: string;\n}\n\nasync function attemptPoll(fullUrl: string, apiKey: string, signal: AbortSignal): Promise<PollAttemptResult> {\n let res: Response;\n try {\n res = await fetch(fullUrl, { headers: { apikey: apiKey }, signal });\n } catch (err) {\n if (isAbortError(err)) throw new CancellationError();\n return { outcome: 'transient-failure' };\n }\n\n if (!res.ok) {\n if (isAuthFailureStatus(res.status)) throw new AuthenticationError();\n return { outcome: 'transient-failure' };\n }\n\n let data: PrunaPredictionResponse;\n try {\n data = await res.json();\n } catch {\n return { outcome: 'transient-failure' };\n }\n\n if (isTerminalSuccessStatus(data.status)) {\n const uri = extractUri(data);\n if (uri) return { outcome: 'succeeded', uri: resolveUri(uri) };\n return { outcome: 'transient-failure' };\n }\n\n if (isTerminalFailureStatus(data.status)) {\n throw new GenerationFailedError(data.error ?? 'Generation failed during processing.');\n }\n\n return { outcome: 'continue' };\n}\n\nexport async function pollForResult(\n pollUrl: string,\n apiKey: string,\n maxAttempts: number = POLL_DEFAULTS.maxAttempts,\n intervalMs: number = POLL_DEFAULTS.intervalMs,\n signal?: AbortSignal,\n onProgress?: (stage: GenerationStage, attempt: number) => void,\n): Promise<string> {\n const fullUrl = isAbsoluteHttpUrl(pollUrl) ? pollUrl : buildPrunaApiUrl(pollUrl);\n const controller = new AbortController();\n const onExternalAbort = (): void => controller.abort();\n signal?.addEventListener('abort', onExternalAbort);\n\n try {\n for (let i = 0; i < maxAttempts; i++) {\n if (signal?.aborted) throw new CancellationError();\n\n const delay = calculateExponentialBackoff({ attempt: i, baseIntervalMs: intervalMs });\n await new Promise<void>(resolve => setTimeout(resolve, delay));\n\n if (signal?.aborted) throw new CancellationError();\n\n onProgress?.('polling', i + 1);\n\n const result = await attemptPoll(fullUrl, apiKey, controller.signal);\n if (result.outcome === 'succeeded' && result.uri) {\n return result.uri;\n }\n }\n\n throw new TimeoutError();\n } finally {\n signal?.removeEventListener('abort', onExternalAbort);\n controller.abort();\n }\n}\n","\nfunction sortKeysDeep(value: unknown): unknown {\n if (Array.isArray(value)) {\n return value.map(sortKeysDeep);\n }\n if (value !== null && typeof value === 'object') {\n const record = value as Record<string, unknown>;\n return Object.keys(record)\n .sort()\n .reduce<Record<string, unknown>>((acc, key) => {\n acc[key] = sortKeysDeep(record[key]);\n return acc;\n }, {});\n }\n return value;\n}\n\nexport function hashValue(value: unknown): string {\n if (value === null || typeof value !== 'object') {\n return String(value);\n }\n\n try {\n return JSON.stringify(sortKeysDeep(value));\n } catch {\n return String(value);\n }\n}\n\nexport function compositeHash(...values: unknown[]): string {\n return values.map(hashValue).join('|');\n}\n","\nimport { compositeHash, hashValue } from './comparison-hash';\n\nexport interface RequestSignature {\n method: string;\n url: string;\n body?: Record<string, unknown>;\n}\n\nexport function deriveRequestDeduplicationKey(signature: RequestSignature): string {\n const bodyHash = signature.body ? hashValue(signature.body) : '';\n return `${signature.method}:${signature.url}:${bodyHash}`;\n}\n\nexport function deriveGenerationCacheKey(apiKey: string, input: Record<string, unknown>): string {\n return `${apiKey}:${compositeHash(input)}`;\n}\n","\nimport { MAX_API_KEY_LENGTH, MIN_API_KEY_LENGTH } from '../constants/network';\nimport { ValidationError } from '../errors/validation-error';\n\nexport function assertValidApiKey(apiKey: unknown): asserts apiKey is string {\n if (typeof apiKey !== 'string') {\n throw new ValidationError({\n field: 'apiKey',\n reason: 'must be a string',\n receivedValue: typeof apiKey,\n });\n }\n if (apiKey.length < MIN_API_KEY_LENGTH) {\n throw new ValidationError({\n field: 'apiKey',\n reason: 'must not be empty',\n receivedValue: apiKey,\n });\n }\n if (apiKey.length > MAX_API_KEY_LENGTH) {\n throw new ValidationError({\n field: 'apiKey',\n reason: `exceeds maximum length of ${MAX_API_KEY_LENGTH}`,\n receivedValue: apiKey.length,\n });\n }\n}\n","\nimport { BASE64_MARKER, HTTP_PREFIX, HTTPS_PREFIX } from '../constants/network';\nimport { ValidationError } from '../errors/validation-error';\n\nexport type ImageSourceKind = 'https-url' | 'http-url' | 'base64' | 'unknown';\n\nexport function classifyImageSource(source: string): ImageSourceKind {\n if (source.startsWith(HTTPS_PREFIX)) return 'https-url';\n if (source.startsWith(HTTP_PREFIX)) return 'http-url';\n if (source.includes(BASE64_MARKER) || /^[A-Za-z0-9+/=]+$/.test(source)) return 'base64';\n return 'unknown';\n}\n\nexport function assertSecureImageSource(image: unknown, fieldName: string = 'image'): asserts image is string {\n if (typeof image !== 'string') {\n throw new ValidationError({\n field: fieldName,\n reason: 'must be a string',\n receivedValue: typeof image,\n });\n }\n const kind = classifyImageSource(image);\n if (kind === 'http-url') {\n throw new ValidationError({\n field: fieldName,\n reason: 'HTTP URLs are not supported; use HTTPS or a base64 data URI',\n receivedValue: image,\n });\n }\n if (kind === 'unknown') {\n throw new ValidationError({\n field: fieldName,\n reason: 'must be an HTTPS URL or a base64 data URI',\n receivedValue: typeof image,\n });\n }\n}\n","\nimport type { PrunaAspectRatio } from '../entities/types';\nimport { ValidationError } from '../errors/validation-error';\n\nexport const SUPPORTED_ASPECT_RATIOS: readonly PrunaAspectRatio[] = [\n '16:9',\n '9:16',\n '1:1',\n '4:3',\n '3:4',\n '3:2',\n '2:3',\n] as const;\n\nexport function isSupportedAspectRatio(value: unknown): value is PrunaAspectRatio {\n return typeof value === 'string'\n && (SUPPORTED_ASPECT_RATIOS as readonly string[]).includes(value);\n}\n\nexport function assertValidAspectRatio(\n value: unknown,\n fieldName: string = 'aspect_ratio',\n): asserts value is PrunaAspectRatio {\n if (value === undefined || value === null) return;\n if (!isSupportedAspectRatio(value)) {\n throw new ValidationError({\n field: fieldName,\n reason: `must be one of ${SUPPORTED_ASPECT_RATIOS.join(', ')}`,\n receivedValue: value,\n });\n }\n}\n","\nimport type { PrunaResolution } from '../entities/types';\nimport { ValidationError } from '../errors/validation-error';\n\nexport const SUPPORTED_RESOLUTIONS: readonly PrunaResolution[] = ['720p', '1080p'] as const;\n\nexport function isSupportedResolution(value: unknown): value is PrunaResolution {\n return typeof value === 'string'\n && (SUPPORTED_RESOLUTIONS as readonly string[]).includes(value);\n}\n\nexport function assertValidResolution(\n value: unknown,\n fieldName: string = 'resolution',\n): asserts value is PrunaResolution {\n if (value === undefined || value === null) return;\n if (!isSupportedResolution(value)) {\n throw new ValidationError({\n field: fieldName,\n reason: `must be one of ${SUPPORTED_RESOLUTIONS.join(', ')}`,\n receivedValue: value,\n });\n }\n}\n","\nimport { ValidationError } from '../errors/validation-error';\n\nexport const MIN_VIDEO_DURATION_SECONDS = 1;\nexport const MAX_VIDEO_DURATION_SECONDS = 30;\n\nexport function isValidDuration(value: unknown): value is number {\n return typeof value === 'number'\n && Number.isFinite(value)\n && value >= MIN_VIDEO_DURATION_SECONDS\n && value <= MAX_VIDEO_DURATION_SECONDS\n && Number.isInteger(value);\n}\n\nexport function assertValidDuration(\n value: unknown,\n fieldName: string = 'duration',\n): asserts value is number {\n if (value === undefined || value === null) return;\n if (!isValidDuration(value)) {\n throw new ValidationError({\n field: fieldName,\n reason: `must be an integer between ${MIN_VIDEO_DURATION_SECONDS} and ${MAX_VIDEO_DURATION_SECONDS} seconds`,\n receivedValue: value,\n });\n }\n}\n","\nimport { ValidationError } from '../errors/validation-error';\n\nexport const MIN_PROMPT_LENGTH = 1;\nexport const MAX_PROMPT_LENGTH = 4000;\n\nexport function isValidPrompt(value: unknown): value is string {\n return typeof value === 'string'\n && value.length >= MIN_PROMPT_LENGTH\n && value.length <= MAX_PROMPT_LENGTH\n && value.trim().length > 0;\n}\n\nexport function assertValidPrompt(\n value: unknown,\n fieldName: string = 'prompt',\n): asserts value is string {\n if (typeof value !== 'string') {\n throw new ValidationError({\n field: fieldName,\n reason: 'must be a string',\n receivedValue: typeof value,\n });\n }\n if (value.trim().length < MIN_PROMPT_LENGTH) {\n throw new ValidationError({\n field: fieldName,\n reason: 'must not be empty or whitespace-only',\n receivedValue: value,\n });\n }\n if (value.length > MAX_PROMPT_LENGTH) {\n throw new ValidationError({\n field: fieldName,\n reason: `exceeds maximum length of ${MAX_PROMPT_LENGTH} characters`,\n receivedValue: value.length,\n });\n }\n}\n","\nimport { ValidationError } from '../errors/validation-error';\n\nexport const MIN_SEED = -2_147_483_648;\nexport const MAX_SEED = 2_147_483_647;\n\nexport function isValidSeed(value: unknown): value is number {\n return typeof value === 'number'\n && Number.isFinite(value)\n && Number.isInteger(value)\n && value >= MIN_SEED\n && value <= MAX_SEED;\n}\n\nexport function assertValidSeed(\n value: unknown,\n fieldName: string = 'seed',\n): asserts value is number {\n if (value === undefined || value === null) return;\n if (!isValidSeed(value)) {\n throw new ValidationError({\n field: fieldName,\n reason: `must be an integer in [${MIN_SEED}, ${MAX_SEED}]`,\n receivedValue: value,\n });\n }\n}\n","\nimport type {\n PrunaInput,\n TextToImageInput,\n ImageToImageInput,\n ImageToVideoInput,\n TextToVideoInput,\n} from '../entities/types';\n\nexport function isTextToImageInput(input: PrunaInput): input is TextToImageInput {\n return input.model === 'p-image';\n}\n\nexport function isImageToImageInput(input: PrunaInput): input is ImageToImageInput {\n return input.model === 'p-image-edit';\n}\n\nexport function isImageToVideoInput(input: PrunaInput): input is ImageToVideoInput {\n return input.model === 'p-video';\n}\n\nexport function isImageGenerationModel(model: PrunaInput['model']): boolean {\n return model === 'p-image' || model === 'p-image-edit';\n}\n\nexport function isVideoGenerationModel(model: PrunaInput['model']): boolean {\n return model === 'p-video';\n}\n\nexport function isTextToVideoPipeline(input: unknown): input is TextToVideoInput {\n return typeof input === 'object'\n && input !== null\n && 'prompt' in input\n && !('model' in input);\n}\n","\nimport { DEFAULT_DEDUPLICATOR_TTL_MS, DEDUPLICATOR_CLEANUP_GRACE_MS } from '../constants/limits';\nimport { deriveRequestDeduplicationKey } from '../math/cache-key-derivation';\nimport type { RequestSignature } from '../math/cache-key-derivation';\n\ninterface PendingRequest {\n promise: Promise<unknown>;\n timestamp: number;\n}\n\nexport class RequestDeduplicator {\n private readonly pendingRequests = new Map<string, PendingRequest>();\n private readonly ttl: number;\n\n constructor(ttl: number = DEFAULT_DEDUPLICATOR_TTL_MS) {\n this.ttl = ttl;\n }\n\n execute<T>(key: string, fn: () => Promise<T>): Promise<T> {\n const existing = this.pendingRequests.get(key);\n if (existing) {\n if (Date.now() - existing.timestamp < this.ttl) {\n return existing.promise as Promise<T>;\n }\n this.pendingRequests.delete(key);\n }\n\n const promise = fn().finally(() => {\n setTimeout(() => {\n this.pendingRequests.delete(key);\n }, DEDUPLICATOR_CLEANUP_GRACE_MS);\n });\n\n this.pendingRequests.set(key, { promise, timestamp: Date.now() });\n return promise;\n }\n\n clear(): void {\n this.pendingRequests.clear();\n }\n\n size(): number {\n this.purgeExpired();\n return this.pendingRequests.size;\n }\n\n private purgeExpired(): void {\n const now = Date.now();\n for (const [key, value] of this.pendingRequests) {\n if (now - value.timestamp >= this.ttl) {\n this.pendingRequests.delete(key);\n }\n }\n }\n}\n\nexport const globalDeduplicator = new RequestDeduplicator();\n\nexport function createDeduplicationKey(\n method: string,\n url: string,\n body?: Record<string, unknown>,\n): string {\n const signature: RequestSignature = { method, url, body };\n return deriveRequestDeduplicationKey(signature);\n}\n","\nimport { DEFAULT_ASPECT_RATIO } from '../../core/constants';\nimport type { TextToImageInput } from '../../core/entities/types';\nimport type {\n ModelInputBuilder,\n ModelInputBuildContext,\n} from './model-input-builder';\n\nexport class TextToImageInputBuilder implements ModelInputBuilder<TextToImageInput> {\n readonly model = 'p-image' as const;\n\n build(\n input: TextToImageInput,\n _context: ModelInputBuildContext,\n ): Promise<Record<string, unknown>> {\n const payload: Record<string, unknown> = {\n prompt: input.prompt,\n aspect_ratio: input.aspect_ratio ?? DEFAULT_ASPECT_RATIO,\n };\n\n if (input.seed !== undefined) {\n payload.seed = input.seed;\n }\n\n return Promise.resolve(payload);\n }\n}\n","\nimport { DEFAULT_ASPECT_RATIO } from '../../core/constants';\nimport type { ImageToImageInput } from '../../core/entities/types';\nimport { stripBase64Prefix } from '../../core/utils/uri-resolver';\nimport type {\n ModelInputBuilder,\n ModelInputBuildContext,\n} from './model-input-builder';\n\nexport class ImageToImageInputBuilder implements ModelInputBuilder<ImageToImageInput> {\n readonly model = 'p-image-edit' as const;\n\n build(\n input: ImageToImageInput,\n _context: ModelInputBuildContext,\n ): Promise<Record<string, unknown>> {\n const payload: Record<string, unknown> = {\n images: [stripBase64Prefix(input.image)],\n prompt: input.prompt,\n aspect_ratio: input.aspect_ratio ?? DEFAULT_ASPECT_RATIO,\n };\n\n if (input.seed !== undefined) {\n payload.seed = input.seed;\n }\n\n return Promise.resolve(payload);\n }\n}\n","\nimport { DEFAULT_ASPECT_RATIO, P_VIDEO_DEFAULTS } from '../../core/constants';\nimport type { ImageToVideoInput } from '../../core/entities/types';\nimport { CancellationError } from '../../core/errors/cancellation-error';\nimport { uploadImage } from '../../core/services/pruna-client.service';\nimport type {\n ModelInputBuilder,\n ModelInputBuildContext,\n} from './model-input-builder';\n\nexport class ImageToVideoInputBuilder implements ModelInputBuilder<ImageToVideoInput> {\n readonly model = 'p-video' as const;\n\n async build(\n input: ImageToVideoInput,\n context: ModelInputBuildContext,\n ): Promise<Record<string, unknown>> {\n if (context.signal?.aborted) {\n throw new CancellationError();\n }\n\n const fileUrl = await uploadImage(\n input.image,\n context.apiKey,\n context.onProgress,\n );\n\n return {\n image: fileUrl,\n prompt: input.prompt,\n duration: input.duration ?? P_VIDEO_DEFAULTS.duration,\n resolution: input.resolution ?? P_VIDEO_DEFAULTS.resolution,\n fps: P_VIDEO_DEFAULTS.fps,\n draft: input.draft ?? P_VIDEO_DEFAULTS.draft,\n aspect_ratio: input.aspect_ratio ?? DEFAULT_ASPECT_RATIO,\n prompt_upsampling: P_VIDEO_DEFAULTS.promptUpsampling,\n };\n }\n}\n","\nimport type {\n PrunaInput,\n GenerateOptions,\n} from '../../core/entities/types';\nimport { isCancellationError } from '../../core/errors/cancellation-error';\n\nexport interface ModelInputBuildContext {\n apiKey: string;\n signal?: AbortSignal;\n onProgress?: GenerateOptions['onProgress'];\n}\n\nexport interface ModelInputBuilder<T extends PrunaInput = PrunaInput> {\n readonly model: T['model'];\n build(input: T, context: ModelInputBuildContext): Promise<Record<string, unknown>>;\n}\n\nexport class ModelInputBuilderRegistry {\n private readonly builders = new Map<PrunaInput['model'], ModelInputBuilder>();\n\n register(builder: ModelInputBuilder): this {\n this.builders.set(builder.model, builder);\n return this;\n }\n\n resolve(model: PrunaInput['model']): ModelInputBuilder {\n const builder = this.builders.get(model);\n if (!builder) {\n throw new Error(`No input builder registered for model: ${model}`);\n }\n return builder;\n }\n}\n\nexport { isCancellationError };\n","\nimport type { PrunaInput } from '../../core/entities/types';\nimport { TextToImageInputBuilder } from './text-to-image.builder';\nimport { ImageToImageInputBuilder } from './image-to-image.builder';\nimport { ImageToVideoInputBuilder } from './image-to-video.builder';\nimport { ModelInputBuilderRegistry } from './model-input-builder';\n\nexport function createDefaultBuilderRegistry(): ModelInputBuilderRegistry {\n return new ModelInputBuilderRegistry()\n .register(new TextToImageInputBuilder())\n .register(new ImageToImageInputBuilder())\n .register(new ImageToVideoInputBuilder());\n}\n\nexport type AnyModelInputBuilder =\n | TextToImageInputBuilder\n | ImageToImageInputBuilder\n | ImageToVideoInputBuilder;\n\nexport type { PrunaInput };\n","\nimport type {\n PrunaInput,\n PrunaResult,\n TextToVideoInput,\n GenerateOptions,\n} from '../../core/entities/types';\nimport { DEFAULT_ASPECT_RATIO, P_VIDEO_DEFAULTS, POLL_DEFAULTS } from '../../core/constants';\nimport { submitPrediction, pollForResult } from '../../core/services/pruna-client.service';\nimport { extractUri, resolveUri } from '../../core/utils/uri-resolver';\nimport { globalDeduplicator } from '../../core/utils/request-deduplicator';\nimport { assertValidApiKey } from '../../core/validation/api-key-validator';\nimport { assertValidAspectRatio } from '../../core/validation/aspect-ratio-validator';\nimport { assertValidDuration } from '../../core/validation/duration-validator';\nimport { assertValidResolution } from '../../core/validation/resolution-validator';\nimport { assertSecureImageSource } from '../../core/validation/image-source-validator';\nimport { assertValidPrompt } from '../../core/validation/prompt-validator';\nimport { assertValidSeed } from '../../core/validation/seed-validator';\nimport {\n isTextToImageInput,\n isImageToImageInput,\n isImageToVideoInput,\n} from '../../core/protocol/input-type-guard';\nimport { isTerminalSuccessStatus } from '../../core/protocol/job-status';\nimport { deriveGenerationCacheKey } from '../../core/math/cache-key-derivation';\nimport { createDefaultBuilderRegistry } from '../builders/builder-factory';\nimport type { ModelInputBuilderRegistry } from '../builders/model-input-builder';\n\nconst builderRegistry: ModelInputBuilderRegistry = createDefaultBuilderRegistry();\n\nfunction validateGenerateInput(input: PrunaInput): void {\n assertValidPrompt(input.prompt, `${input.model}.prompt`);\n assertValidAspectRatio(input.aspect_ratio, `${input.model}.aspect_ratio`);\n\n if (isTextToImageInput(input)) {\n assertValidSeed(input.seed, `${input.model}.seed`);\n } else if (isImageToImageInput(input)) {\n assertSecureImageSource(input.image, `${input.model}.image`);\n assertValidSeed(input.seed, `${input.model}.seed`);\n } else if (isImageToVideoInput(input)) {\n assertSecureImageSource(input.image, `${input.model}.image`);\n assertValidDuration(input.duration, `${input.model}.duration`);\n assertValidResolution(input.resolution, `${input.model}.resolution`);\n }\n}\n\nexport async function generate(\n apiKey: string,\n input: PrunaInput,\n options: GenerateOptions & { useCache?: boolean } = {},\n): Promise<PrunaResult> {\n assertValidApiKey(apiKey);\n validateGenerateInput(input);\n\n const { signal, onProgress, useCache = true } = options;\n\n if (useCache) {\n const cacheKey = deriveGenerationCacheKey(apiKey, input as unknown as Record<string, unknown>);\n return globalDeduplicator.execute(cacheKey, () =>\n generateInternal(apiKey, input, { signal, onProgress }),\n );\n }\n\n return generateInternal(apiKey, input, { signal, onProgress });\n}\n\nasync function generateInternal(\n apiKey: string,\n input: PrunaInput,\n options: GenerateOptions,\n): Promise<PrunaResult> {\n const { signal, onProgress } = options;\n const builder = builderRegistry.resolve(input.model);\n const modelInput = await builder.build(input, { apiKey, signal, onProgress });\n\n const response = await submitPrediction(input.model, modelInput, apiKey, signal, onProgress);\n\n const syncUri = extractUri(response);\n if (syncUri) {\n return { url: resolveUri(syncUri), model: input.model };\n }\n\n const pollUrl = response.get_url ?? response.status_url;\n if (!pollUrl) {\n throw new Error('Pruna API returned no result and no polling URL.');\n }\n\n const url = await pollForResult(\n pollUrl,\n apiKey,\n POLL_DEFAULTS.maxAttempts,\n POLL_DEFAULTS.intervalMs,\n signal,\n onProgress,\n );\n\n return { url, model: input.model };\n}\n\nexport async function generateImageThenVideo(\n apiKey: string,\n input: TextToVideoInput,\n options: GenerateOptions = {},\n): Promise<PrunaResult> {\n assertValidApiKey(apiKey);\n assertValidPrompt(input.prompt, 'text-to-video.prompt');\n assertValidAspectRatio(input.aspect_ratio, 'text-to-video.aspect_ratio');\n assertValidDuration(input.duration, 'text-to-video.duration');\n assertValidResolution(input.resolution, 'text-to-video.resolution');\n\n const { signal, onProgress } = options;\n const aspectRatio = input.aspect_ratio ?? DEFAULT_ASPECT_RATIO;\n\n onProgress?.('predicting', 1);\n const imageResult = await generate(\n apiKey,\n { model: 'p-image', prompt: input.prompt, aspect_ratio: aspectRatio },\n { signal },\n );\n\n onProgress?.('predicting', 2);\n return generate(\n apiKey,\n {\n model: 'p-video',\n prompt: input.prompt,\n image: imageResult.url,\n duration: input.duration ?? P_VIDEO_DEFAULTS.duration,\n resolution: input.resolution ?? P_VIDEO_DEFAULTS.resolution,\n aspect_ratio: aspectRatio,\n draft: input.draft ?? P_VIDEO_DEFAULTS.draft,\n },\n { signal, onProgress },\n );\n}\n\nexport { isTerminalSuccessStatus };\n","import type {\n PrunaInput,\n GenerationStage,\n PrunaModelId,\n PrunaAspectRatio,\n PrunaResolution,\n} from './client';\nimport { generate, generateImageThenVideo } from './client';\n\nexport interface PrunaRequest {\n model?: string;\n image?: string;\n prompt?: string;\n quality?: string;\n duration?: number;\n aspectRatio?: string;\n aspect_ratio?: string;\n motion?: number | string;\n resolution?: string;\n seed?: number;\n [key: string]: unknown;\n}\n\nexport interface PrunaProgressStage {\n stage: 'uploading' | 'processing' | 'polling' | 'predicting';\n result?: { url: string; model?: string };\n error?: Error;\n}\n\nexport interface PrunaCore {\n generate?: typeof generate;\n generateImageThenVideo?: typeof generateImageThenVideo;\n}\n\nexport async function* generateWithPruna(\n request: PrunaRequest,\n apiKey: string,\n signal?: AbortSignal,\n onProgress?: (stage: PrunaProgressStage['stage'], attempt?: number) => void,\n): AsyncGenerator<PrunaProgressStage> {\n const stages: PrunaProgressStage[] = [];\n let notify: (() => void) | null = null;\n let done = false;\n\n const wake = (): void => {\n const fn = notify;\n if (fn) {\n notify = null;\n fn();\n }\n };\n\n const handleProgress = (stage: GenerationStage) => {\n stages.push({ stage });\n onProgress?.(stage);\n wake();\n };\n\n const promise = (async () => {\n try {\n const model =\n (request.model as PrunaModelId | undefined) ??\n (request.image ? 'p-image-edit' : 'p-image');\n\n if (model === 'p-video' && !request.image && request.prompt) {\n // Text to video pipeline\n const videoRes = await generateImageThenVideo(\n apiKey,\n {\n prompt: request.prompt,\n duration: request.duration ?? 5,\n aspect_ratio: (request.aspectRatio ?? request.aspect_ratio ?? '16:9') as PrunaAspectRatio,\n },\n { signal, onProgress: handleProgress },\n );\n stages.push({\n stage: 'polling',\n result: { url: videoRes.url, model: 'p-video' },\n });\n return;\n }\n\n const input = {\n model,\n prompt: (request.prompt as string) ?? '',\n aspect_ratio: (request.aspectRatio ?? request.aspect_ratio ?? '1:1') as PrunaAspectRatio,\n ...(request.image ? { image: request.image as string } : {}),\n ...(request.duration ? { duration: request.duration as number } : {}),\n ...(request.resolution ? { resolution: request.resolution as PrunaResolution } : {}),\n ...(request.seed !== undefined ? { seed: request.seed as number } : {}),\n } as PrunaInput;\n\n const res = await generate(apiKey, input, {\n signal,\n onProgress: handleProgress,\n });\n\n stages.push({\n stage: 'polling',\n result: { url: res.url, model: res.model },\n });\n } catch (err) {\n stages.push({\n stage: 'processing',\n error: err instanceof Error ? err : new Error(String(err)),\n });\n } finally {\n done = true;\n wake();\n }\n })();\n\n while (!done || stages.length > 0) {\n if (stages.length === 0 && !done) {\n await new Promise<void>((resolve) => {\n notify = resolve;\n });\n notify = null;\n }\n while (stages.length > 0) {\n const nextStage = stages.shift();\n if (!nextStage) continue;\n yield nextStage;\n if (nextStage.error) {\n throw nextStage.error;\n }\n }\n }\n\n await promise;\n}\n","\nimport type {\n GeneratedContent,\n PrunaConfig,\n ImageGenerationRequest,\n VideoGenerationRequest,\n ImageToVideoRequest,\n VideoToVideoRequest,\n} from '../../content/domain/config/ProviderConfig';\nimport type { ProviderHealth } from '../../core/types';\nimport type { CostEstimateRequest, IMediaProvider } from '../base/provider.types';\nimport { AIError, AIErrorType } from '../../core/errors';\nimport { generateWithPruna } from './pruna-generate';\nexport { generateWithPruna } from './pruna-generate';\nexport type {\n PrunaRequest,\n PrunaProgressStage,\n PrunaCore,\n} from './pruna-generate';\n\n/**\n * Pruna media provider: supports text-to-image, text-to-video, and\n * image-to-video generation through the @umituz/pruna-provider client.\n */\nexport class PrunaProvider implements IMediaProvider {\n readonly id = 'pruna';\n readonly name = 'Pruna AI';\n readonly capabilities = ['image', 'video'] as const;\n\n constructor(readonly config: PrunaConfig) {}\n\n async healthCheck(): Promise<ProviderHealth> {\n return this.config.apiKey ? 'healthy' : 'unavailable';\n }\n\n async estimateCost(_request: CostEstimateRequest): Promise<number> {\n return 1;\n }\n\n async generateImage(request: ImageGenerationRequest): Promise<GeneratedContent> {\n let finalUrl: string | undefined;\n const model = this.config.models?.textToImage;\n for await (const stage of generateWithPruna(\n { prompt: request.prompt, model, quality: request.quality },\n this.config.apiKey,\n )) {\n if (stage.error) throw stage.error;\n if (stage.result?.url) finalUrl = stage.result.url;\n }\n if (!finalUrl) {\n throw new AIError(AIErrorType.SERVER_ERROR, 'No image generated by Pruna AI');\n }\n return {\n id: Date.now().toString(),\n type: 'image',\n url: finalUrl,\n metadata: { provider: this.id, model: model ?? 'p-image' },\n createdAt: new Date().toISOString(),\n };\n }\n\n async generateVideo(request: VideoGenerationRequest): Promise<GeneratedContent> {\n let finalUrl: string | undefined;\n const model = this.config.models?.textToVideo;\n for await (const stage of generateWithPruna(\n { prompt: request.prompt, model, duration: request.duration, aspectRatio: request.aspectRatio },\n this.config.apiKey,\n )) {\n if (stage.error) throw stage.error;\n if (stage.result?.url) finalUrl = stage.result.url;\n }\n if (!finalUrl) {\n throw new AIError(AIErrorType.SERVER_ERROR, 'No video generated by Pruna AI');\n }\n return {\n id: Date.now().toString(),\n type: 'video',\n url: finalUrl,\n metadata: { provider: this.id, model: model ?? 'p-video' },\n createdAt: new Date().toISOString(),\n };\n }\n\n async imageToVideo(request: ImageToVideoRequest): Promise<GeneratedContent> {\n let finalUrl: string | undefined;\n for await (const stage of generateWithPruna(\n { image: request.imageUrl, prompt: request.prompt, duration: request.duration, motion: request.motion },\n this.config.apiKey,\n )) {\n if (stage.error) throw stage.error;\n if (stage.result?.url) finalUrl = stage.result.url;\n }\n if (!finalUrl) {\n throw new AIError(AIErrorType.SERVER_ERROR, 'No video generated from image by Pruna AI');\n }\n return {\n id: Date.now().toString(),\n type: 'video',\n url: finalUrl,\n metadata: { provider: this.id, model: 'p-image-to-video' },\n createdAt: new Date().toISOString(),\n };\n }\n\n async videoToVideo(_request: VideoToVideoRequest): Promise<GeneratedContent> {\n throw new AIError(AIErrorType.CLIENT_ERROR, 'Pruna AI provider does not support video-to-video conversion');\n }\n}\n\nexport function createPrunaProvider(config: PrunaConfig): PrunaProvider {\n return new PrunaProvider(config);\n}\n","export interface WireToolCallDelta {\n readonly index?: number;\n readonly id?: string;\n readonly function?: { readonly name?: string; readonly arguments?: string };\n}\n\nexport interface AssistantToolCall {\n readonly id: string;\n readonly name: string;\n readonly arguments: string;\n}\n\nexport class ToolCallAccumulator {\n private readonly slots = new Map<number, { id: string; name: string; args: string }>();\n\n push(delta: WireToolCallDelta): void {\n const index = delta.index ?? 0;\n const slot = this.slots.get(index) ?? { id: '', name: '', args: '' };\n if (delta.id) slot.id = delta.id;\n if (delta.function?.name) slot.name = delta.function.name;\n if (delta.function?.arguments) slot.args += delta.function.arguments;\n this.slots.set(index, slot);\n }\n\n finish(): AssistantToolCall[] {\n return Array.from(this.slots.entries())\n .sort(([a], [b]) => a - b)\n .map(([, slot]) => ({\n id: slot.id,\n name: slot.name,\n arguments: slot.args,\n }))\n .filter((call) => call.id.length > 0 || call.name.length > 0);\n }\n}\n","import { ToolCallAccumulator, type WireToolCallDelta } from '../../core/sse/tool-call-accumulator';\nimport { errorFromStatus, errorFromUnknown } from '../../core/errors/unified-ai-error';\nimport type {\n AdapterChatMessage,\n AdapterConfig,\n AdapterRequest,\n ChatAdapter,\n ProviderEvent,\n RequestImage,\n} from './adapter.types';\n\ninterface WireDelta {\n readonly content?: string;\n readonly reasoning?: string;\n readonly tool_calls?: readonly WireToolCallDelta[];\n}\n\ninterface WireChunk {\n readonly choices?: readonly { readonly delta?: WireDelta }[];\n readonly usage?: {\n readonly prompt_tokens?: number;\n readonly completion_tokens?: number;\n readonly completion_tokens_details?: { readonly reasoning_tokens?: number };\n };\n}\n\ntype WireContentPart =\n | { readonly type: 'text'; readonly text: string }\n | { readonly type: 'image_url'; readonly image_url: { readonly url: string } };\n\ntype WireMessage =\n | { readonly role: 'system' | 'assistant'; readonly content: string; readonly tool_calls?: unknown }\n | { readonly role: 'user'; readonly content: string | readonly WireContentPart[] }\n | { readonly role: 'tool'; readonly content: string; readonly tool_call_id: string };\n\nfunction toWireMessage(message: AdapterChatMessage): WireMessage {\n if (message.role === 'tool') {\n return { role: 'tool', content: message.content, tool_call_id: message.toolCallId ?? '' };\n }\n if (message.role === 'assistant' && message.toolCalls && message.toolCalls.length > 0) {\n return {\n role: 'assistant',\n content: message.content,\n tool_calls: message.toolCalls.map((call) => ({\n id: call.id,\n type: 'function',\n function: { name: call.name, arguments: call.arguments },\n })),\n };\n }\n if (message.role === 'user') return { role: 'user', content: message.content };\n return { role: message.role as 'system' | 'assistant', content: message.content };\n}\n\nfunction mergeImages(messages: readonly WireMessage[], images: readonly RequestImage[]): WireMessage[] {\n if (images.length === 0) return [...messages];\n const parts: WireContentPart[] = images.map((image) => ({\n type: 'image_url',\n image_url: { url: `data:${image.mimeType};base64,${image.dataBase64}` },\n }));\n for (let index = messages.length - 1; index >= 0; index -= 1) {\n const message = messages[index];\n if (!message || message.role !== 'user') continue;\n const textParts: readonly WireContentPart[] =\n typeof message.content === 'string'\n ? message.content.length > 0\n ? [{ type: 'text', text: message.content }]\n : []\n : message.content;\n return [\n ...messages.slice(0, index),\n { role: 'user', content: [...textParts, ...parts] },\n ...messages.slice(index + 1),\n ];\n }\n return [...messages, { role: 'user', content: [...parts] }];\n}\n\ninterface WireError {\n readonly message?: string;\n readonly type?: string;\n readonly code?: string;\n}\n\nasync function extractErrorDetail(response: Response): Promise<WireError | undefined> {\n try {\n const body = (await response.json()) as { readonly error?: WireError };\n return body.error;\n } catch {\n return undefined;\n }\n}\n\nasync function* parseSseEvent(\n rawEvent: string,\n toolCallAccumulator: ToolCallAccumulator,\n): AsyncIterable<ProviderEvent> {\n for (const line of rawEvent.split('\\n')) {\n if (!line.startsWith('data:')) continue;\n const payload = line.slice(5).trim();\n if (payload.length === 0 || payload === '[DONE]') continue;\n\n let chunk: WireChunk;\n try {\n chunk = JSON.parse(payload) as WireChunk;\n } catch {\n continue;\n }\n\n const delta = chunk.choices?.[0]?.delta;\n if (delta?.reasoning) {\n yield { type: 'delta', channel: 'reasoning', text: delta.reasoning };\n }\n if (delta?.content) {\n yield { type: 'delta', channel: 'answer', text: delta.content };\n }\n if (delta?.tool_calls) {\n for (const toolCallDelta of delta.tool_calls) toolCallAccumulator.push(toolCallDelta);\n }\n if (chunk.usage) {\n yield {\n type: 'usage',\n usage: {\n inputTokens: chunk.usage.prompt_tokens ?? 0,\n outputTokens: chunk.usage.completion_tokens ?? 0,\n reasoningTokens: chunk.usage.completion_tokens_details?.reasoning_tokens,\n },\n };\n }\n }\n}\n\nasync function* parseSseStream(body: ReadableStream<Uint8Array>): AsyncIterable<ProviderEvent> {\n const reader = body.getReader();\n const decoder = new TextDecoder();\n const toolCallAccumulator = new ToolCallAccumulator();\n let buffer = '';\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n buffer += decoder.decode(value, { stream: true });\n\n let separator = buffer.indexOf('\\n\\n');\n while (separator !== -1) {\n const rawEvent = buffer.slice(0, separator);\n buffer = buffer.slice(separator + 2);\n separator = buffer.indexOf('\\n\\n');\n yield* parseSseEvent(rawEvent, toolCallAccumulator);\n }\n }\n } catch (err) {\n throw errorFromUnknown(err);\n } finally {\n reader.releaseLock();\n }\n\n const calls = toolCallAccumulator.finish();\n if (calls.length > 0) yield { type: 'tool_calls', calls };\n}\n\nexport function createOpenAiCompatibleAdapter(config: AdapterConfig): ChatAdapter {\n if (!config.baseUrl && !config.endpointUrl) {\n throw new Error('createOpenAiCompatibleAdapter requires baseUrl or endpointUrl');\n }\n const endpoint = config.endpointUrl ?? `${config.baseUrl}/chat/completions`;\n\n return {\n async *stream(req: AdapterRequest): AsyncIterable<ProviderEvent> {\n const timeout = AbortSignal.timeout(config.timeoutMs);\n const signal = req.signal ? AbortSignal.any([req.signal, timeout]) : timeout;\n\n let response: Response;\n try {\n response = await fetch(endpoint, {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${config.apiKey}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n model: req.externalModelId,\n messages: mergeImages(req.messages.map(toWireMessage), req.images ?? []),\n temperature: req.temperature,\n max_completion_tokens: req.maxOutputTokens,\n top_p: req.topP,\n stream: true,\n stream_options: { include_usage: true },\n ...(req.tools && req.tools.length > 0\n ? {\n tools: req.tools.map((tool) => ({ type: 'function', function: tool })),\n tool_choice: 'auto',\n }\n : {}),\n }),\n signal,\n });\n } catch (err) {\n throw errorFromUnknown(err);\n }\n\n if (!response.ok || !response.body) {\n const detail = await extractErrorDetail(response);\n throw errorFromStatus(response.status, detail?.message, detail);\n }\n\n yield* parseSseStream(response.body);\n },\n };\n}\n","import type {\n GenerationResult,\n ProviderHealth,\n StreamCallbacks,\n StructuredGeneration,\n StructuredTextRequest,\n TextRequest,\n TextTier,\n TokenUsage,\n ChatMessage,\n} from \"../../core/types\";\nimport { AIError, AIErrorType } from \"../../core/errors\";\nimport { JsonResponseParser, StructuredPromptBuilder } from \"../../core/parsers\";\nimport { mergeTierOverrides, resolveModel, type TierModelMap } from \"../../core/tiers\";\nimport type { ITextProvider } from \"../base/provider.types\";\nimport { createOpenAiCompatibleAdapter } from \"../adapters/openai-compatible.adapter\";\nimport type {\n AdapterChatMessage,\n AdapterRequest,\n ChatAdapter,\n} from \"../adapters/adapter.types\";\nimport type { OpenAiCompatibleProviderConfig } from \"./openai-compatible.entities\";\n\nconst DEFAULT_TIMEOUT_MS = 30_000;\nconst STRUCTURED_TEMPERATURE = 0.1;\n\n/**\n * Generic OpenAI-compatible text provider — the factory-registered face of\n * the existing `createOpenAiCompatibleAdapter`. Speaks the wire every\n * OpenAI-shaped endpoint speaks, which makes it the one block an app needs\n * when its model access arrives through a gateway URL instead of a named\n * vendor key.\n */\nexport class OpenAiCompatibleProvider implements ITextProvider {\n readonly id = \"openai-compatible\";\n readonly name = \"OpenAI-compatible\";\n readonly capabilities = [\"text\"] as const;\n\n private readonly adapter: ChatAdapter;\n private readonly tiers: TierModelMap;\n private readonly jsonParser = new JsonResponseParser();\n\n constructor(readonly config: OpenAiCompatibleProviderConfig) {\n if (!config.baseUrl && !config.endpointUrl) {\n throw new AIError(\n AIErrorType.MISSING_CONFIG,\n \"OpenAiCompatibleProvider requires baseUrl or endpointUrl\",\n );\n }\n this.adapter = createOpenAiCompatibleAdapter({\n baseUrl: config.baseUrl,\n endpointUrl: config.endpointUrl,\n apiKey: config.apiKey,\n timeoutMs: config.timeoutMs ?? DEFAULT_TIMEOUT_MS,\n });\n this.tiers = mergeTierOverrides(\n config.model ? { fast: config.model, balanced: config.model, powerful: config.model } : {},\n config.models,\n );\n }\n\n resolveModel(tier: TextTier): string {\n return resolveModel(this.tiers, tier, this.id);\n }\n\n async healthCheck(): Promise<ProviderHealth> {\n return this.config.apiKey && (this.config.baseUrl || this.config.endpointUrl)\n ? \"healthy\"\n : \"unavailable\";\n }\n\n async estimateCost(): Promise<number> {\n return 0;\n }\n\n async generate(request: TextRequest): Promise<GenerationResult> {\n const model = this.modelFor(request);\n const outcome = await this.consume(this.toAdapterRequest(model, request));\n if (outcome.text.length === 0) {\n throw this.noContentError(model);\n }\n return {\n text: outcome.text,\n usage: outcome.usage,\n model,\n providerId: this.id,\n finishReason: \"stop\",\n };\n }\n\n async generateStructured<T>(\n request: StructuredTextRequest,\n ): Promise<StructuredGeneration<T>> {\n const model = this.modelFor(request);\n\n const messages = this.toWireMessages(request.messages, request.systemPrompt);\n const lastUserIndex = findLastIndex(messages, (m) => m.role === \"user\");\n if (lastUserIndex === -1) {\n throw new AIError(\n AIErrorType.UNKNOWN_ERROR,\n \"generateStructured requires at least one user message\",\n );\n }\n\n const structuredPrompt = new StructuredPromptBuilder(\n messages[lastUserIndex]?.content ?? \"\",\n )\n .withSchema(request.schema)\n .build();\n messages[lastUserIndex] = { role: \"user\", content: structuredPrompt };\n\n const outcome = await this.consume({\n externalModelId: model,\n messages,\n temperature: STRUCTURED_TEMPERATURE,\n signal: request.signal,\n });\n if (outcome.text.length === 0) {\n throw this.noContentError(model);\n }\n\n return {\n value: this.jsonParser.parse<T>(outcome.text),\n result: {\n text: outcome.text,\n usage: outcome.usage,\n model,\n providerId: this.id,\n finishReason: \"stop\",\n },\n };\n }\n\n async stream(\n request: TextRequest,\n callbacks: StreamCallbacks,\n ): Promise<GenerationResult> {\n const model = this.modelFor(request);\n\n try {\n const outcome = await this.consume(this.toAdapterRequest(model, request), (text) => {\n callbacks.onChunk?.(text);\n });\n if (outcome.text.length === 0) {\n throw this.noContentError(model);\n }\n const result: GenerationResult = {\n text: outcome.text,\n usage: outcome.usage,\n model,\n providerId: this.id,\n finishReason: \"stop\",\n };\n callbacks.onComplete?.(result);\n return result;\n } catch (error) {\n callbacks.onError?.(error instanceof Error ? error : new Error(String(error)));\n throw error;\n }\n }\n\n /* ---------- internals ---------- */\n\n /** Drain one adapter stream to its end. `onChunk`, when given, sees answer\n * deltas as they arrive — the streaming surface is this same drain. */\n private async consume(\n req: AdapterRequest,\n onChunk?: (text: string) => void,\n ): Promise<{ readonly text: string; readonly usage?: TokenUsage }> {\n let text = \"\";\n let usage: TokenUsage | undefined;\n for await (const event of this.adapter.stream(req)) {\n if (event.type === \"delta\" && event.channel === \"answer\") {\n text += event.text;\n onChunk?.(event.text);\n } else if (event.type === \"usage\") {\n usage = event.usage;\n }\n }\n return { text, usage };\n }\n\n private modelFor(request: TextRequest): string {\n return request.model ?? this.resolveModel(request.tier ?? \"balanced\");\n }\n\n private noContentError(model: string): AIError {\n return new AIError(\n AIErrorType.SERVER_ERROR,\n \"No content generated from the OpenAI-compatible endpoint\",\n undefined,\n { model },\n );\n }\n\n private toAdapterRequest(model: string, request: TextRequest): AdapterRequest {\n return {\n externalModelId: model,\n messages: this.toWireMessages(request.messages, request.systemPrompt),\n ...(request.temperature !== undefined ? { temperature: request.temperature } : {}),\n ...(request.maxTokens !== undefined ? { maxOutputTokens: request.maxTokens } : {}),\n ...(request.topP !== undefined ? { topP: request.topP } : {}),\n ...(request.signal ? { signal: request.signal } : {}),\n };\n }\n\n /** Neutral messages onto the adapter's shape; systemPrompt becomes the\n * leading system message (in-band, the OpenAI way). */\n private toWireMessages(\n messages: ReadonlyArray<ChatMessage>,\n systemPrompt?: string,\n ): AdapterChatMessage[] {\n const wire: AdapterChatMessage[] = [];\n if (systemPrompt && systemPrompt.length > 0) {\n wire.push({ role: \"system\", content: systemPrompt });\n }\n for (const message of messages) {\n wire.push({ role: message.role, content: message.content });\n }\n return wire;\n }\n}\n\nexport function createOpenAiCompatibleProvider(\n config: OpenAiCompatibleProviderConfig,\n): OpenAiCompatibleProvider {\n return new OpenAiCompatibleProvider(config);\n}\n\nfunction findLastIndex<T>(\n items: ReadonlyArray<T>,\n predicate: (item: T) => boolean,\n): number {\n for (let index = items.length - 1; index >= 0; index -= 1) {\n if (predicate(items[index] as T)) return index;\n }\n return -1;\n}\n","\nimport type { TextTier } from '../../core/types';\n\n/**\n * Structural types for Cloudflare Workers AI — no @cloudflare/workers-types\n * dependency, exactly like the apps that consume this package. A binding is\n * \"anything with run(model, input)\"; the env is \"anything that may carry an\n * optional AI binding\", so `{ AI?: ... }` app envs satisfy it as-is.\n */\nexport interface WorkersAIBinding {\n run(model: string, input: Record<string, unknown>): Promise<unknown>;\n}\n\nexport interface WorkersAIEnv {\n AI?: WorkersAIBinding;\n}\n\n/** Chat message shape the Workers AI text models speak (OpenAI convention). */\nexport interface WorkersAIMessage {\n role: 'system' | 'user' | 'assistant';\n content: string;\n}\n\n/** Error carrying the provider status when one exists (route → HTTP code). */\nexport class WorkersAIError extends Error {\n readonly status?: number;\n constructor(message: string, status?: number) {\n super(message);\n this.name = 'WorkersAIError';\n this.status = status;\n }\n}\n\n/** Constructor config for the class-based provider (createAI wiring). */\nexport interface WorkersAIProviderConfig {\n /** The `env.AI` binding — its presence IS the enabled flag (no apiKey). */\n binding: WorkersAIBinding;\n /** Per-tier model overrides; defaults live in WORKERS_AI_TIERS. */\n models?: Partial<Record<TextTier, string>>;\n}\n","\nimport type { ChatMessage } from '../../core/types';\nimport { WorkersAIError, type WorkersAIEnv, type WorkersAIMessage } from './workers-ai.entities';\n\n/**\n * Workers AI text client over the `env.AI` binding — non-streaming run()\n * plus the streaming twin, both hardened against the deployment quirks the\n * production ports (storyora STYLORA lane) documented:\n *\n * 1. The fp8-fast deployments answer in BOTH shapes — the documented\n * legacy `{response}` mirror AND an OpenAI chat.completion body — and\n * the mirror has been observed MISSING on a second sequential call in\n * one invocation. Read either shape, legacy first.\n * 2. Streaming answers as SSE frames (`data: {\"response\": \"…\"} …\n * data: [DONE]`); a JSON payload can split across chunk boundaries, so\n * the parser pushes an unparseable line back and waits for more bytes.\n */\n\n/** Speed-optimized 70b instruct — the default. If p95 latency hurts, drop\n * to \"@cf/meta/llama-3.1-8b-instruct-fp8-fast\" (one line). */\nexport const WORKERS_AI_LLM_MODEL = '@cf/meta/llama-3.3-70b-instruct-fp8-fast';\n\nconst WORKERS_AI_TEXT_TIMEOUT_MS = 25_000;\n\nexport interface WorkersAITextOptions {\n maxTokens?: number;\n temperature?: number;\n /** Explicit model id — wins over the default. */\n model?: string;\n}\n\n/** The text lane is live only when the AI binding was injected. */\nexport function workersAIConfigured(env: WorkersAIEnv): boolean {\n return typeof env.AI?.run === 'function';\n}\n\n/** Guarded binding accessor — narrows away the optional for call sites. */\nfunction requireAi(env: WorkersAIEnv): NonNullable<WorkersAIEnv['AI']> {\n const ai = env.AI;\n if (!ai || typeof ai.run !== 'function') throw new WorkersAIError('Workers AI is not configured');\n return ai;\n}\n\n/** One provider call with a timeout — resolves the non-streaming text by\n * reading both documented response shapes. Throws WorkersAIError on any\n * failure, including an empty reply. */\nexport async function runWorkersAIText(\n env: WorkersAIEnv,\n messages: ReadonlyArray<ChatMessage | WorkersAIMessage>,\n opts: WorkersAITextOptions = {},\n): Promise<string> {\n const ai = requireAi(env);\n const model = opts.model ?? WORKERS_AI_LLM_MODEL;\n let result: unknown;\n try {\n result = await Promise.race([\n ai.run(model, {\n messages: messages.map((m) => ({ role: m.role, content: m.content })),\n max_tokens: opts.maxTokens ?? 900,\n temperature: opts.temperature ?? 0.7,\n }),\n new Promise<never>((_, reject) =>\n setTimeout(() => reject(new WorkersAIError('Workers AI timed out')), WORKERS_AI_TEXT_TIMEOUT_MS),\n ),\n ]);\n } catch (err) {\n throw err instanceof WorkersAIError\n ? err\n : new WorkersAIError(err instanceof Error ? err.message : 'Workers AI request failed');\n }\n const response = (result ?? {}) as {\n response?: unknown;\n choices?: Array<{ message?: { content?: unknown } }>;\n };\n // Legacy {response} mirror first, OpenAI chat.completion body second —\n // see the module notes for why the order is load-bearing.\n let text: unknown = response.response;\n if (typeof text !== 'string' || text.length === 0) {\n text = response.choices?.[0]?.message?.content;\n }\n if (typeof text !== 'string' || text.length === 0) {\n throw new WorkersAIError('Workers AI returned no text');\n }\n return text;\n}\n\n/**\n * Streaming twin — yields incremental tokens off the provider's SSE stream.\n * Frame parsing mirrors typical client-side SSE readers (buffered lines, \\r\n * trimming, comment skip) so both ends tolerate the same wire quirks.\n */\nexport async function* streamWorkersAIText(\n env: WorkersAIEnv,\n messages: ReadonlyArray<ChatMessage | WorkersAIMessage>,\n opts: WorkersAITextOptions = {},\n): AsyncGenerator<string> {\n const ai = requireAi(env);\n const model = opts.model ?? WORKERS_AI_LLM_MODEL;\n let body: unknown;\n try {\n body = await Promise.race([\n ai.run(model, {\n messages: messages.map((m) => ({ role: m.role, content: m.content })),\n stream: true,\n max_tokens: opts.maxTokens ?? 600,\n temperature: opts.temperature ?? 0.7,\n }),\n new Promise<never>((_, reject) =>\n setTimeout(() => reject(new WorkersAIError('Workers AI timed out')), WORKERS_AI_TEXT_TIMEOUT_MS),\n ),\n ]);\n } catch (err) {\n throw err instanceof WorkersAIError\n ? err\n : new WorkersAIError(err instanceof Error ? err.message : 'Workers AI request failed');\n }\n const stream = body as { getReader?: () => ReadableStreamDefaultReader<Uint8Array> } | ReadableStream;\n const getReader =\n typeof stream === 'object' && stream !== null && 'getReader' in stream && typeof stream.getReader === 'function'\n ? stream.getReader\n : undefined;\n if (!getReader) throw new WorkersAIError('Workers AI stream was not readable');\n\n const reader = (getReader as () => ReadableStreamDefaultReader<Uint8Array>).call(stream);\n const decoder = new TextDecoder();\n let buffer = '';\n try {\n for (;;) {\n const { done, value } = await reader.read();\n if (done) break;\n buffer += decoder.decode(value, { stream: true });\n let newlineAt: number;\n while ((newlineAt = buffer.indexOf('\\n')) !== -1) {\n let line = buffer.slice(0, newlineAt);\n buffer = buffer.slice(newlineAt + 1);\n if (line.endsWith('\\r')) line = line.slice(0, -1);\n if (line.startsWith(':') || line.trim() === '') continue;\n if (!line.startsWith('data: ')) continue;\n const payload = line.slice(6).trim();\n if (payload === '[DONE]') return;\n try {\n const parsed = JSON.parse(payload) as { response?: unknown };\n if (typeof parsed.response === 'string' && parsed.response.length > 0) yield parsed.response;\n } catch {\n // Partial JSON split across chunks — push back and wait for more.\n buffer = `${line}\\n${buffer}`;\n break;\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n}\n","\nimport type {\n GenerationResult,\n ProviderHealth,\n StreamCallbacks,\n StructuredGeneration,\n StructuredTextRequest,\n TextRequest,\n TextTier,\n} from '../../core/types';\nimport { AIError, AIErrorType } from '../../core/errors';\nimport { JsonResponseParser, StructuredPromptBuilder } from '../../core/parsers';\nimport { mergeTierOverrides, resolveModel, type TierModelMap } from '../../core/tiers';\nimport type { CostEstimateRequest, ITextProvider } from '../base/provider.types';\nimport { WorkersAIError, type WorkersAIProviderConfig } from './workers-ai.entities';\nimport { runWorkersAIText, streamWorkersAIText, WORKERS_AI_LLM_MODEL } from './workers-ai.text';\n\n/**\n * Tier defaults for the Workers AI catalogue. `fast` drops to the 8b\n * fp8-fast deployment; `balanced` and `powerful` share the 70b model —\n * it is the top instruct text model the catalogue offers today, so a\n * `powerful` request is served honestly rather than failing the tier walk.\n */\nexport const WORKERS_AI_TIERS: TierModelMap = {\n fast: '@cf/meta/llama-3.1-8b-instruct-fp8-fast',\n balanced: WORKERS_AI_LLM_MODEL,\n powerful: WORKERS_AI_LLM_MODEL,\n};\n\n/**\n * Cloudflare Workers AI text provider over the `env.AI` binding. There is\n * no apiKey and no fetch — the binding IS the transport, so this provider\n * skips BaseProvider's fetch machinery (like the transport-owning Groq and\n * Anthropic providers do) and implements IProviderBase directly.\n *\n * `createAI({ workersAI: { binding: env.AI } })` registers it when the\n * binding is present; an absent binding never registers, so unconfigured\n * deployments fail over down the priority walk instead of erroring.\n */\nexport class WorkersAIProvider implements ITextProvider {\n readonly id = 'workers-ai';\n readonly name = 'Cloudflare Workers AI';\n readonly capabilities = ['text'] as const;\n\n private readonly binding: WorkersAIProviderConfig['binding'];\n private readonly tiers: TierModelMap;\n private readonly jsonParser = new JsonResponseParser();\n\n constructor(config: WorkersAIProviderConfig) {\n this.binding = config.binding;\n this.tiers = mergeTierOverrides(WORKERS_AI_TIERS, config.models);\n }\n\n resolveModel(tier: TextTier): string {\n return resolveModel(this.tiers, tier, this.id);\n }\n\n async healthCheck(): Promise<ProviderHealth> {\n return typeof this.binding?.run === 'function' ? 'healthy' : 'unavailable';\n }\n\n /** Workers AI is allocation-priced (neurons per deployment), not per\n * request — there is no per-call cost to estimate. */\n async estimateCost(_request: CostEstimateRequest): Promise<number> {\n return 0;\n }\n\n async generate(request: TextRequest): Promise<GenerationResult> {\n const model = request.model ?? this.resolveModel(request.tier ?? 'balanced');\n const messages = withSystemPrompt(request);\n\n try {\n const text = await runWorkersAIText(\n { AI: this.binding },\n messages,\n {\n model,\n maxTokens: request.maxTokens,\n temperature: request.temperature,\n },\n );\n return { text, model, providerId: this.id, finishReason: 'stop' };\n } catch (error) {\n throw toAIError(error);\n }\n }\n\n async generateStructured<T>(request: StructuredTextRequest): Promise<StructuredGeneration<T>> {\n const messages = [...request.messages];\n const lastUserIndex = findLastIndex(messages, (m) => m.role === 'user');\n if (lastUserIndex === -1) {\n throw new AIError(AIErrorType.UNKNOWN_ERROR, 'generateStructured requires at least one user message');\n }\n messages[lastUserIndex] = {\n role: 'user',\n content: new StructuredPromptBuilder(messages[lastUserIndex]?.content ?? '')\n .withSchema(request.schema)\n .build(),\n };\n\n const result = await this.generate({ ...request, messages, temperature: 0.1 });\n return { value: this.jsonParser.parse<T>(result.text), result };\n }\n\n async stream(request: TextRequest, callbacks: StreamCallbacks): Promise<GenerationResult> {\n const model = request.model ?? this.resolveModel(request.tier ?? 'balanced');\n const messages = withSystemPrompt(request);\n\n let text = '';\n try {\n for await (const chunk of streamWorkersAIText({ AI: this.binding }, messages, {\n model,\n maxTokens: request.maxTokens,\n temperature: request.temperature,\n })) {\n text += chunk;\n callbacks.onChunk?.(chunk);\n }\n } catch (error) {\n const aiError = toAIError(error);\n callbacks.onError?.(aiError);\n throw aiError;\n }\n const result: GenerationResult = { text, model, providerId: this.id, finishReason: 'stop' };\n callbacks.onComplete?.(result);\n return result;\n }\n}\n\n/** Top-level systemPrompt wins over in-band system roles; absent → messages\n * pass through untouched (llama-3 works with or without a system turn). */\nfunction withSystemPrompt(request: TextRequest): ReadonlyArray<{ role: 'system' | 'user' | 'assistant'; content: string }> {\n if (request.systemPrompt && request.systemPrompt.length > 0) {\n return [\n { role: 'system', content: request.systemPrompt },\n ...request.messages.filter((m) => m.role !== 'system'),\n ];\n }\n return request.messages;\n}\n\nfunction toAIError(error: unknown): AIError {\n if (error instanceof AIError) return error;\n const message = error instanceof Error ? error.message : 'Workers AI request failed';\n const type = error instanceof WorkersAIError && error.message.includes('not configured')\n ? AIErrorType.INVALID_API_KEY\n : AIErrorType.SERVER_ERROR;\n return new AIError(type, message, error instanceof Error ? error : undefined);\n}\n\nfunction findLastIndex<T>(items: ReadonlyArray<T>, predicate: (item: T) => boolean): number {\n for (let i = items.length - 1; i >= 0; i--) {\n const item = items[i];\n if (item !== undefined && predicate(item)) return i;\n }\n return -1;\n}\n\nexport function createWorkersAIProvider(config: WorkersAIProviderConfig): WorkersAIProvider {\n return new WorkersAIProvider(config);\n}\n","\nimport type { TextTier } from \"../../core/types\";\nimport { ProviderFactory } from \"./provider.factory\";\nimport { AnthropicProvider } from \"../anthropic/anthropic.provider\";\nimport type { AnthropicProviderConfig } from \"../anthropic/anthropic.entities\";\nimport { GroqProvider } from \"../groq/groq.provider\";\nimport type { GroqProviderConfig } from \"../groq/groq.entities\";\nimport { GeminiProvider } from \"../gemini/gemini.provider\";\nimport { FalProvider } from \"../fal/fal.provider\";\nimport { PrunaProvider } from \"../pruna/pruna.provider\";\nimport { OpenAiCompatibleProvider } from \"../openai-compatible/openai-compatible.provider\";\nimport type { OpenAiCompatibleProviderConfig } from \"../openai-compatible/openai-compatible.entities\";\nimport { WorkersAIProvider } from \"../workers-ai/workers-ai.provider\";\nimport type { WorkersAIProviderConfig } from \"../workers-ai/workers-ai.entities\";\nimport type {\n FalConfig,\n GeminiConfig,\n PrunaConfig,\n} from \"../../content/domain/config/ProviderConfig\";\n\n/**\n * Composition root for the whole package — replaces the old\n * `configureProvider()` singleton. A provider block's presence means the\n * provider is enabled; presence of its apiKey is what actually registers it.\n * `priority` decides who serves first; the fallback walk handles the rest.\n *\n * ```ts\n * const ai = createAI({\n * priority: ['anthropic', 'groq'],\n * defaultTier: 'balanced',\n * anthropic: { apiKey: env.ANTHROPIC_API_KEY },\n * groq: { apiKey: env.GROQ_API_KEY },\n * });\n * const { text, usage } = await ai.chat({ messages, systemPrompt });\n * ```\n */\nexport interface AIProviderConfig {\n /** Provider ids in preference order for every capability. */\n priority?: ReadonlyArray<string>;\n fallbackEnabled?: boolean;\n /** Tier used when a request names neither model nor tier. Default 'balanced'. */\n defaultTier?: TextTier;\n\n anthropic?: AnthropicProviderConfig;\n groq?: GroqProviderConfig;\n gemini?: Omit<GeminiConfig, \"enabled\">;\n fal?: Omit<FalConfig, \"enabled\">;\n pruna?: Omit<PrunaConfig, \"enabled\">;\n /** Any OpenAI-compatible endpoint (OpenAI, OpenRouter, vLLM, LiteLLM,\n * Cloudflare AI Gateway) addressed by URL — the gateway shape apps\n * deploy behind instead of a named vendor key. */\n openaiCompatible?: Omit<OpenAiCompatibleProviderConfig, \"apiKey\"> & { apiKey?: string };\n /** Cloudflare Workers AI over the `env.AI` binding — no apiKey; the\n * binding's presence IS the enabled flag (free-tier text lane). */\n workersAI?: WorkersAIProviderConfig;\n}\n\nexport function createAI(config: AIProviderConfig = {}): ProviderFactory {\n const factory = new ProviderFactory({\n priority: config.priority,\n fallbackEnabled: config.fallbackEnabled,\n defaultTier: config.defaultTier,\n });\n\n if (config.anthropic?.apiKey) {\n factory.register(new AnthropicProvider(config.anthropic));\n }\n if (config.groq?.apiKey) {\n factory.register(new GroqProvider(config.groq));\n }\n if (config.gemini?.apiKey) {\n factory.register(new GeminiProvider({ ...config.gemini, enabled: true } as GeminiConfig));\n }\n if (config.fal?.apiKey) {\n factory.register(new FalProvider({ ...config.fal, enabled: true } as FalConfig));\n }\n if (config.pruna?.apiKey) {\n factory.register(new PrunaProvider({ ...config.pruna, enabled: true } as PrunaConfig));\n }\n const openaiCompatible = config.openaiCompatible;\n if (\n openaiCompatible?.apiKey &&\n (openaiCompatible.baseUrl || openaiCompatible.endpointUrl)\n ) {\n factory.register(\n new OpenAiCompatibleProvider({ ...openaiCompatible, apiKey: openaiCompatible.apiKey }),\n );\n }\n if (config.workersAI?.binding) {\n factory.register(new WorkersAIProvider(config.workersAI));\n }\n\n return factory;\n}\n","\nimport { estimateWordCountForDuration, estimateTokenBudgetForDuration } from '../../domain/calculations/SpeechPaceEstimate';\n\nexport class PromptBuilder {\n static blogPost(input: {\n topic: string;\n blogType: string;\n keywords: string[];\n tone: string;\n targetAudience: string;\n wordCount: number;\n language?: string;\n seoOptimization: boolean;\n includeSchema: boolean;\n includeImages: boolean;\n }): string {\n return `\nAs an expert SEO Content Strategist and Copywriter, generate a high-quality, comprehensive blog post.\n\nTOPIC: ${input.topic}\nTYPE: ${input.blogType}\nKEYWORDS: ${input.keywords.join(', ')}\nTONE: ${input.tone}\nTARGET AUDIENCE: ${input.targetAudience}\nWORD COUNT: ${input.wordCount}\nLANGUAGE: ${input.language || 'English'}\n\nOPTIMIZATION REQUIREMENTS:\n- SEO Optimization: ${input.seoOptimization ? 'ON (Include semantic keywords, LSI, and proper H1-H3 structure)' : 'OFF'}\n- Include Schema Markup: ${input.includeSchema ? 'ON (Generate JSON-LD for this blog type)' : 'OFF'}\n- Image Suggestions: ${input.includeImages ? 'ON (Provide DALL-E/Midjourney style prompts for contextually relevant images)' : 'OFF'}\n\nRESPONSE FORMAT (STRICT JSON ONLY):\n{\n \"title\": \"Compelling, Click-worthy Title\",\n \"content\": \"Full markdown-formatted blog content with headers\",\n \"metaDescription\": \"SEO-optimized description (150-160 chars)\",\n \"seoScore\": 0-100,\n \"readabilityScore\": 0-100,\n \"keywords\": [\"list\", \"of\", \"optimized\", \"keywords\"],\n \"performance\": {\n \"readingTime\": minutes (number),\n \"shareability\": 0-10 (number),\n \"seoRank\": 0-10 (number)\n },\n \"schemaMarkup\": \"JSON-LD string (if requested)\",\n \"imagePrompts\": [\"Prompt 1\", \"Prompt 2\"] (if requested)\n}\n`;\n }\n\n static socialPost(input: {\n topic: string;\n platform: string;\n tone: string;\n style: string;\n maxLength: number;\n includeHashtags: boolean;\n includeCallToAction: boolean;\n }): string {\n return `\nWrite a ${input.tone} social media post about: ${input.topic}\n\nPlatform: ${input.platform}\nStyle: ${input.style}\nMaximum length: ${input.maxLength} characters\n${input.includeHashtags ? 'Include relevant hashtags' : 'No hashtags'}\n${input.includeCallToAction ? 'Include a call-to-action' : ''}\n\nRequirements:\n- Platform-optimized formatting\n- Engaging hook in first sentence\n- Natural, conversational tone\n- Platform-appropriate emoji usage\n\nGenerate the post in JSON format:\n{\n \"content\": \"The post content\",\n \"hashtags\": [\"hashtag1\", \"hashtag2\"],\n \"emojis\": [\"emoji1\", \"emoji2\"],\n \"estimatedEngagement\": 0-100\n}\n`;\n }\n\n static videoScript(input: {\n topic: string;\n tone: string;\n duration: number;\n targetAudience: string;\n includeVisuals: boolean;\n includeCallToAction: boolean;\n }): string {\n return `\nCreate a ${input.tone} video script about: ${input.topic}\n\nDuration: ${input.duration} seconds\nTarget Audience: ${input.targetAudience}\nInclude Visual Cues: ${input.includeVisuals ? 'Yes' : 'No'}\nInclude CTA: ${input.includeCallToAction ? 'Yes' : 'No'}\n\nApproximate word count: ${estimateWordCountForDuration(input.duration)} words\n\nGenerate in JSON format:\n{\n \"script\": \"Full script with dialogue and narration\",\n \"visualCues\": [\"Visual cue 1\", \"Visual cue 2\"],\n \"callToAction\": \"Call to action text (if requested)\",\n \"estimatedEngagement\": 0-100\n}\n`;\n }\n\n static voiceScript(input: {\n topic: string;\n emotion: string;\n duration: number;\n }): string {\n return `\nCreate a ${input.emotion} voice script about: ${input.topic}\n\nDuration: ${input.duration} seconds\nEmotion: ${input.emotion}\n\nThe script should:\n- Evoke the specified emotion\n- Be suitable for voice recording with emotion control\n- Include natural speech patterns\n- Have appropriate pacing for the emotion\n- Include emotional cues in brackets where needed\n\nApproximate word count: ${estimateWordCountForDuration(input.duration)} words\n\nGenerate in JSON format:\n{\n \"script\": \"Full script with emotional cues\",\n \"visualCues\": [\"Visual cue 1\", \"Visual cue 2\"],\n \"estimatedEngagement\": 0-100\n}\n`;\n }\n\n static contentCalendar(niche: string, days: number): string {\n return `\nGenerate a ${days}-day content calendar for: ${niche}\n\nFor each day, provide:\n- Topic\n- Content type (blog, video, social, email, caption, script)\n- Best platform for this content\n- Brief description\n- Estimated engagement (0-100)\n- Priority level (high, medium, low)\n\nFormat as JSON array:\n[\n {\n \"day\": 1,\n \"topic\": \"...\",\n \"contentType\": \"blog|video|social|email|caption|script\",\n \"platform\": \"twitter|linkedin|instagram|threads|tiktok|facebook\",\n \"description\": \"...\",\n \"estimatedEngagement\": 0-100,\n \"priority\": \"high|medium|low\"\n }\n]\n\nRequirements:\n- Mix of content types across platforms\n- Platform-appropriate suggestions\n- Engaging, varied topics\n- Realistic posting schedule\n`;\n }\n\n static sentiment(content: string): string {\n return `\nAnalyze the sentiment of this social media post:\n\n\"${content}\"\n\nProvide analysis in JSON format:\n{\n \"sentiment\": \"positive|neutral|negative\",\n \"confidence\": 0-1,\n \"emotions\": [\n {\"emotion\": \"happy|excited|calm|sad|angry|surprised|fearful|disgusted|neutral\", \"score\": 0-1}\n ]\n}\n\nReturn only the JSON:\n`;\n }\n\n static contentAnalysis(content: string): string {\n return `\nAnalyze this content:\n\n\"${content}\"\n\nProvide analysis in JSON format:\n{\n \"keywords\": [\"keyword1\", \"keyword2\", ...],\n \"entities\": [\"entity1\", \"entity2\", ...],\n \"suggestedImprovements\": [\"suggestion1\", ...],\n \"readabilityScore\": 0-100,\n \"estimatedEngagement\": 0-100\n}\n\nReturn only the JSON:\n`;\n }\n\n static seoOptimization(content: string, keywords: string[]): string {\n return `\nOptimize this content for SEO:\n\nContent: \"${content}\"\nKeywords: ${keywords.join(', ')}\n\nTasks:\n1. Incorporate keywords naturally\n2. Improve engagement potential\n3. Add relevant call-to-action if appropriate\n4. Optimize for readability\n5. Enhance heading structure\n\nReturn JSON:\n{\n \"optimized\": \"...\",\n \"score\": 0-100,\n \"suggestions\": [\"suggestion1\", ...],\n \"addedKeywords\": [\"keyword1\", ...],\n \"removedFillerWords\": number,\n \"readabilityImprovements\": [\"improvement1\", ...],\n \"metaDescription\": \"SEO-optimized meta description\",\n \"titleSuggestions\": [\"title1\", ...]\n}\n\nReturn only the JSON:\n`;\n }\n\n static seoScore(content: string, keywords: string[]): string {\n return `\nCalculate SEO score for this content:\n\nContent: \"${content}\"\nKeywords: ${keywords.join(', ')}\n\nProvide breakdown in JSON:\n{\n \"keywordDensity\": 0-100,\n \"readabilityScore\": 0-100,\n \"titleOptimization\": 0-100,\n \"metaDescription\": 0-100,\n \"headingStructure\": 0-100,\n \"internalLinking\": 0-100,\n \"overall\": 0-100\n}\n\nReturn only the JSON:\n`;\n }\n\n static abTestVariant(input: {\n content: string;\n contentType: string;\n tone: string;\n targetAudience: string;\n platform: string;\n goals: string[];\n }): string {\n return `\nPredict performance for this content variant:\n\nContent: \"${input.content}\"\nContent Type: ${input.contentType}\nTone: ${input.tone}\nTarget Audience: ${input.targetAudience}\nPlatform: ${input.platform}\nGoals: ${input.goals.join(', ')}\n\nProvide prediction in JSON:\n{\n \"predictedEngagement\": 0-100,\n \"predictedCTR\": 0-100,\n \"predictedConversions\": 0-100,\n \"confidence\": 0-1,\n \"reasoning\": \"...\",\n \"strengths\": [\"strength1\", ...],\n \"weaknesses\": [\"weakness1\", ...],\n \"suggestions\": [\"suggestion1\", ...]\n}\n\nReturn only the JSON:\n`;\n }\n\n static hashtags(content: string, count: number): string {\n return `\nGenerate ${count} relevant hashtags for this content:\n\n\"${content}\"\n\nRequirements:\n- Mix of popular and niche hashtags\n- Industry-specific when possible\n- Trending if relevant\n- No duplicated words\n- Format: #hashtag (one per line)\n\nReturn only the hashtags:\n`;\n }\n\n static imagePrompt(description: string, style: string): string {\n return `\nGenerate a detailed AI image generation prompt for:\n\nDescription: ${description}\nStyle: ${style || 'realistic'}\n\nCreate a detailed, descriptive prompt that includes:\n- Subject details\n- Mood and atmosphere\n- Lighting\n- Composition\n- Art style reference\n- Technical specifications (aspect ratio, quality)\n\nThe prompt should be optimized for models like Midjourney, DALL-E, or Stable Diffusion.\n\nGenerate the prompt:\n`;\n }\n\n static blogImagePrompts(blogContent: string): string {\n return `\nAnalyze this blog content and generate 3-5 detailed image prompts for illustrative images:\n\nBlog Content: \"${blogContent}\"\n\nFor each image prompt, provide:\n- Subject description\n- Mood and atmosphere\n- Style reference\n- Composition details\n- Technical specs\n\nReturn as JSON array:\n[\"prompt1\", \"prompt2\", \"prompt3\", ...]\n\nReturn only the JSON:\n`;\n }\n\n static maxTokensForDuration(durationSeconds: number): number {\n return estimateTokenBudgetForDuration(durationSeconds);\n }\n}\n","\nimport { PromptBuilder } from '../prompts/PromptBuilder';\nimport { GenerationExecutor } from './GenerationExecutor';\nimport { validateTopicText } from '../../domain/validation/TopicTextValidator';\nimport { validateKeywordList } from '../../domain/validation/KeywordListValidator';\nimport { generateId } from '../../domain/utils/IdGenerator';\nimport type { BlogGenerationRequest, GeneratedBlog } from '../../domain/entities/ContentGeneration';\n\nexport class BlogService {\n constructor(private readonly executor: GenerationExecutor) {}\n\n async generateBlogPost(request: BlogGenerationRequest): Promise<GeneratedBlog> {\n const topic = validateTopicText(request.topic);\n const keywords = validateKeywordList(request.targetKeywords);\n\n const prompt = PromptBuilder.blogPost({\n topic,\n blogType: request.blogType,\n keywords,\n tone: request.tone,\n targetAudience: request.targetAudience,\n wordCount: request.wordCount,\n language: request.language,\n seoOptimization: request.seoOptimization,\n includeSchema: request.includeSchema,\n includeImages: request.includeImages,\n });\n\n const parsed = await this.executor.runJson<Record<string, unknown>>(\n prompt,\n {},\n { maxTokens: request.wordCount * 2, temperature: 0.7 },\n );\n\n return {\n id: generateId('blog'),\n ...(parsed as Partial<GeneratedBlog>),\n blogType: request.blogType,\n tone: request.tone,\n wordCount: request.wordCount,\n createdAt: new Date().toISOString(),\n } as GeneratedBlog;\n }\n}\n","\nimport { RequestQueueConfig } from '../../domain/limits/RequestQueueConfig';\nimport { generateId } from '../../domain/utils/IdGenerator';\n\nexport enum RequestPriority {\n LOW = 0,\n NORMAL = 1,\n HIGH = 2,\n URGENT = 3,\n}\n\ninterface QueuedRequest<T> {\n id: string;\n priority: RequestPriority;\n timestamp: number;\n fn: (signal: AbortSignal) => Promise<T>;\n resolve: (value: T) => void;\n reject: (error: Error) => void;\n retries: number;\n maxRetries: number;\n}\n\nexport interface QueueConfig {\n maxConcurrent: number;\n maxQueueSize: number;\n defaultTimeout: number;\n retryDelay: number;\n enableRateLimit: boolean;\n rateLimitWindow: number;\n rateLimitMaxRequests: number;\n}\n\nconst DEFAULT_CONFIG: QueueConfig = {\n maxConcurrent: RequestQueueConfig.MAX_CONCURRENT,\n maxQueueSize: RequestQueueConfig.MAX_QUEUE_SIZE,\n defaultTimeout: RequestQueueConfig.DEFAULT_TIMEOUT_MS,\n retryDelay: RequestQueueConfig.RETRY_DELAY_MS,\n enableRateLimit: RequestQueueConfig.RATE_LIMIT.ENABLED,\n rateLimitWindow: RequestQueueConfig.RATE_LIMIT.WINDOW_MS,\n rateLimitMaxRequests: RequestQueueConfig.RATE_LIMIT.MAX_REQUESTS_PER_WINDOW,\n};\n\nexport class RequestQueue {\n private queue: QueuedRequest<unknown>[] = [];\n private running = new Set<string>();\n private config: QueueConfig;\n private requestHistory: number[] = [];\n private isProcessing = false;\n\n constructor(config: Partial<QueueConfig> = {}) {\n this.config = { ...DEFAULT_CONFIG, ...config };\n }\n\n async add<T>(\n fn: (signal: AbortSignal) => Promise<T>,\n priority = RequestPriority.NORMAL,\n maxRetries = 3\n ): Promise<T> {\n if (this.queue.length >= this.config.maxQueueSize) {\n throw new Error('Queue is full');\n }\n\n return new Promise((resolve, reject) => {\n const request: QueuedRequest<T> = {\n id: generateId('req'),\n priority,\n timestamp: Date.now(),\n fn,\n resolve: resolve as (value: unknown) => void,\n reject,\n retries: 0,\n maxRetries,\n };\n\n this.queue.push(request as QueuedRequest<unknown>);\n this.sortQueue();\n\n if (!this.isProcessing) {\n this.process();\n }\n });\n }\n\n private sortQueue(): void {\n this.queue.sort((a, b) => {\n if (a.priority !== b.priority) {\n return b.priority - a.priority;\n }\n return a.timestamp - b.timestamp;\n });\n }\n\n private async process(): Promise<void> {\n if (this.isProcessing) return;\n this.isProcessing = true;\n\n while (this.queue.length > 0 || this.running.size > 0) {\n while (\n this.queue.length > 0 &&\n this.running.size < this.config.maxConcurrent\n ) {\n if (this.config.enableRateLimit && !this.canMakeRequest()) {\n break;\n }\n\n const request = this.queue.shift();\n if (!request) break;\n\n this.running.add(request.id);\n this.executeRequest(request);\n }\n\n await new Promise(resolve => setTimeout(resolve, RequestQueueConfig.POLL_INTERVAL_MS));\n }\n\n this.isProcessing = false;\n }\n\n private canMakeRequest(): boolean {\n const now = Date.now();\n const windowStart = now - this.config.rateLimitWindow;\n\n this.requestHistory = this.requestHistory.filter(\n timestamp => timestamp > windowStart\n );\n\n return this.requestHistory.length < this.config.rateLimitMaxRequests;\n }\n\n private async executeRequest<T>(request: QueuedRequest<T>): Promise<void> {\n try {\n if (this.config.enableRateLimit) {\n this.requestHistory.push(Date.now());\n }\n\n const result = await this.withTimeout(\n request.fn,\n this.config.defaultTimeout\n );\n\n request.resolve(result);\n } catch (error) {\n if (request.retries < request.maxRetries) {\n request.retries++;\n const delay = this.config.retryDelay * request.retries;\n setTimeout(() => {\n this.queue.unshift(request as QueuedRequest<unknown>);\n this.sortQueue();\n }, delay);\n } else {\n request.reject(error as Error);\n }\n } finally {\n this.running.delete(request.id);\n }\n }\n\n private async withTimeout<T>(\n fn: (signal: AbortSignal) => Promise<T>,\n timeout: number\n ): Promise<T> {\n const controller = new AbortController();\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n const timeoutPromise = new Promise<never>((_, reject) => {\n timeoutId = setTimeout(() => {\n controller.abort();\n reject(new Error('Request timeout'));\n }, timeout);\n });\n\n try {\n const result = await Promise.race([fn(controller.signal), timeoutPromise]);\n return result;\n } finally {\n if (timeoutId) clearTimeout(timeoutId);\n }\n }\n\n getStats(): {\n queued: number;\n running: number;\n rateLimitRemaining: number;\n } {\n return {\n queued: this.queue.length,\n running: this.running.size,\n rateLimitRemaining: this.config.enableRateLimit\n ? this.config.rateLimitMaxRequests -\n this.requestHistory.filter(\n timestamp => Date.now() - timestamp < this.config.rateLimitWindow\n ).length\n : Infinity,\n };\n }\n\n clear(): void {\n for (const request of this.queue) {\n request.reject(new Error('Queue cleared'));\n }\n this.queue = [];\n }\n\n async drain(): Promise<void> {\n while (this.running.size > 0) {\n await new Promise(resolve => setTimeout(resolve, RequestQueueConfig.POLL_INTERVAL_MS));\n }\n }\n}\n\nexport async function batchRequest<T>(\n requests: Array<() => Promise<T>>,\n options: {\n concurrency?: number;\n stopOnError?: boolean;\n } = {}\n): Promise<T[]> {\n const {\n concurrency = 3,\n stopOnError = false,\n } = options;\n\n const results: T[] = [];\n const errors: Error[] = [];\n\n for (let i = 0; i < requests.length; i += concurrency) {\n const batch = requests.slice(i, i + concurrency);\n const batchResults = await Promise.allSettled(\n batch.map(fn => fn())\n );\n\n for (const result of batchResults) {\n if (result.status === 'fulfilled') {\n results.push(result.value);\n } else {\n errors.push(result.reason);\n if (stopOnError) {\n throw new Error(\n `Batch request failed: ${errors[0]?.message}`\n );\n }\n }\n }\n }\n\n if (errors.length > 0 && !stopOnError) {\n console.warn(`${errors.length} requests failed in batch`);\n }\n\n return results;\n}\n","\nimport { PromptBuilder } from '../prompts/PromptBuilder';\nimport { GenerationExecutor } from './GenerationExecutor';\nimport { batchRequest } from '../../infrastructure/utils/requestQueue';\nimport { validateTopicText } from '../../domain/validation/TopicTextValidator';\nimport { validateHashtagCount } from '../../domain/validation/HashtagCountValidator';\nimport {\n resolvePlatformSpec,\n resolveMaxContentLength,\n rankAndTrimHashtags,\n resolveHashtagBudget,\n} from '../../domain/predicates';\nimport type {\n SocialContentRequest,\n GeneratedSocialContent,\n} from '../../domain/entities/ContentGeneration';\nimport type { ContentTone, SocialPlatform } from '../../domain/types';\n\nconst MULTI_PLATFORMS: ReadonlyArray<SocialPlatform> = [\n 'twitter',\n 'linkedin',\n 'instagram',\n 'threads',\n 'tiktok',\n];\n\nconst DEFAULT_SOCIAL_RESULT: GeneratedSocialContent = {\n content: '',\n platform: 'twitter',\n hashtags: [],\n emojis: [],\n characterCount: 0,\n estimatedEngagement: 0,\n};\n\nexport class SocialService {\n constructor(private readonly executor: GenerationExecutor) {}\n\n async generateSocialContent(request: SocialContentRequest): Promise<GeneratedSocialContent> {\n const topic = validateTopicText(request.topic);\n const spec = resolvePlatformSpec(request.platform);\n const maxLength = resolveMaxContentLength(request.platform, request.maxLength);\n\n const prompt = PromptBuilder.socialPost({\n topic,\n platform: request.platform,\n tone: request.tone,\n style: spec.style,\n maxLength,\n includeHashtags: request.hashtags !== false,\n includeCallToAction: Boolean(request.includeCallToAction),\n });\n\n const parsed = await this.executor.runJson<GeneratedSocialContent>(\n prompt,\n { ...DEFAULT_SOCIAL_RESULT, platform: request.platform },\n { maxTokens: 500, temperature: 0.8 },\n );\n\n return {\n ...parsed,\n platform: request.platform,\n characterCount: parsed.content?.length ?? 0,\n };\n }\n\n async generateForAllPlatforms(topic: string, tone: ContentTone): Promise<GeneratedSocialContent[]> {\n const requests = MULTI_PLATFORMS.map((platform) => () =>\n this.generateSocialContent({ topic, platform, tone }),\n );\n\n try {\n return await batchRequest(requests, { concurrency: 2, stopOnError: false });\n } catch (error) {\n console.warn('Batch execution failed, falling back to sequential:', error);\n const results: GeneratedSocialContent[] = [];\n for (const platform of MULTI_PLATFORMS) {\n try {\n results.push(await this.generateSocialContent({ topic, platform, tone }));\n } catch (err) {\n console.error(`Failed to generate for ${platform}:`, err);\n }\n }\n return results;\n }\n }\n\n async generateHashtags(content: string, count: number): Promise<string[]> {\n const validated = validateHashtagCount(count);\n const prompt = PromptBuilder.hashtags(content, validated);\n const response = await this.executor.runText(prompt, { maxTokens: 200, temperature: 0.7 });\n const hashtags = response.match(/#[\\w-]+/g) || [];\n return hashtags.slice(0, validated);\n }\n\n optimizeHashtags(hashtags: string[], platform: SocialPlatform): string[] {\n const budget = resolveHashtagBudget(platform);\n return rankAndTrimHashtags(hashtags, budget);\n }\n}\n","\nimport { PromptBuilder } from '../prompts/PromptBuilder';\nimport { GenerationExecutor } from './GenerationExecutor';\nimport { validateTopicText } from '../../domain/validation/TopicTextValidator';\nimport { validateDurationSeconds } from '../../domain/validation/DurationSecondsValidator';\nimport { estimateTokenBudgetForDuration } from '../../domain/calculations/SpeechPaceEstimate';\nimport type {\n VideoScriptRequest,\n GeneratedVideoScript,\n} from '../../domain/entities/ContentGeneration';\nimport type { Emotion } from '../../domain/types';\n\nconst buildScriptResult = (\n parsed: Partial<GeneratedVideoScript>,\n duration: number,\n): GeneratedVideoScript => {\n const script = parsed.script ?? '';\n if (!script) {\n throw new Error('AI response missing script field');\n }\n const wordCount = script.trim().length === 0 ? 0 : script.trim().split(/\\s+/).length;\n return {\n ...parsed,\n script,\n duration,\n wordCount,\n } as GeneratedVideoScript;\n};\n\nexport class VideoScriptService {\n constructor(private readonly executor: GenerationExecutor) {}\n\n async generateVideoScript(request: VideoScriptRequest): Promise<GeneratedVideoScript> {\n const topic = validateTopicText(request.topic);\n const duration = validateDurationSeconds(request.duration);\n\n const prompt = PromptBuilder.videoScript({\n topic,\n tone: request.tone,\n duration,\n targetAudience: request.targetAudience,\n includeVisuals: request.includeVisuals,\n includeCallToAction: request.includeCallToAction,\n });\n\n const parsed = await this.executor.runJson<GeneratedVideoScript>(\n prompt,\n { script: '', visualCues: [], duration, wordCount: 0, estimatedEngagement: 0 },\n { maxTokens: estimateTokenBudgetForDuration(duration), temperature: 0.8 },\n );\n\n return buildScriptResult(parsed, duration);\n }\n\n async generateVoiceScript(topic: string, emotion: Emotion, duration: number): Promise<GeneratedVideoScript> {\n const validatedTopic = validateTopicText(topic);\n const validatedDuration = validateDurationSeconds(duration);\n\n const prompt = PromptBuilder.voiceScript({\n topic: validatedTopic,\n emotion,\n duration: validatedDuration,\n });\n\n const parsed = await this.executor.runJson<GeneratedVideoScript>(\n prompt,\n { script: '', visualCues: [], duration: validatedDuration, wordCount: 0, estimatedEngagement: 0 },\n { maxTokens: estimateTokenBudgetForDuration(validatedDuration), temperature: 0.8 },\n );\n\n return buildScriptResult(parsed, validatedDuration);\n }\n}\n","\nimport { PromptBuilder } from '../prompts/PromptBuilder';\nimport { GenerationExecutor } from './GenerationExecutor';\nimport { validateContentBody } from '../../domain/validation/ContentBodyValidator';\nimport { clampConfidenceToValidRange, clampScoreToValidRange } from '../../domain/predicates/ScoreRangeGuard';\nimport type {\n ContentAnalysisRequest,\n ContentAnalysisResult,\n SentimentAnalysisResult,\n} from '../../domain/entities/SentimentAnalysis';\n\nconst DEFAULT_SENTIMENT: SentimentAnalysisResult = {\n sentiment: 'neutral',\n confidence: 0.5,\n emotions: [],\n};\n\nconst DEFAULT_ANALYSIS: ContentAnalysisResult = {\n sentiment: DEFAULT_SENTIMENT,\n keywords: [],\n entities: [],\n suggestedImprovements: [],\n readabilityScore: 50,\n estimatedEngagement: 50,\n};\n\nexport class AnalysisService {\n constructor(private readonly executor: GenerationExecutor) {}\n\n async analyzeSentiment(content: string): Promise<SentimentAnalysisResult> {\n const validated = validateContentBody(content);\n const prompt = PromptBuilder.sentiment(validated);\n\n const result = await this.executor.runJson<SentimentAnalysisResult>(\n prompt,\n DEFAULT_SENTIMENT,\n { maxTokens: 200, temperature: 0.3 },\n );\n\n return {\n ...result,\n confidence: clampConfidenceToValidRange(result.confidence),\n };\n }\n\n async analyzeContent(request: ContentAnalysisRequest): Promise<ContentAnalysisResult> {\n const validated = validateContentBody(request.content);\n const sentimentResult = await this.analyzeSentiment(validated);\n\n const prompt = PromptBuilder.contentAnalysis(validated);\n const parsed = await this.executor.runJson<ContentAnalysisResult>(\n prompt,\n { ...DEFAULT_ANALYSIS, sentiment: sentimentResult },\n { maxTokens: 300, temperature: 0.5 },\n );\n\n return {\n sentiment: sentimentResult,\n keywords: parsed.keywords ?? [],\n entities: parsed.entities ?? [],\n suggestedImprovements: parsed.suggestedImprovements ?? [],\n readabilityScore: clampScoreToValidRange(parsed.readabilityScore),\n estimatedEngagement: clampScoreToValidRange(parsed.estimatedEngagement),\n };\n }\n}\n","\nimport { PromptBuilder } from '../prompts/PromptBuilder';\nimport { GenerationExecutor } from './GenerationExecutor';\nimport { validateContentBody, truncateForSeoPreview } from '../../domain/validation/ContentBodyValidator';\nimport { validateKeywordList } from '../../domain/validation/KeywordListValidator';\nimport { clampScoreToValidRange } from '../../domain/predicates/ScoreRangeGuard';\nimport {\n calculateKeywordDensity,\n countKeywordOccurrences,\n} from '../../domain/calculations/SeoKeywordDensity';\nimport { classifyKeywordProminence, isUnderutilizedKeyword } from '../../domain/predicates/KeywordProminenceClassifier';\nimport type {\n SEOOptimizationRequest,\n SEOOptimizationResult,\n SEOScoreBreakdown,\n KeywordAnalysis,\n} from '../../domain/entities/SEO';\n\nconst DEFAULT_SEO_SCORE: SEOScoreBreakdown = {\n keywordDensity: 50,\n readabilityScore: 50,\n titleOptimization: 50,\n metaDescription: 50,\n headingStructure: 50,\n internalLinking: 50,\n overall: 50,\n};\n\nconst UNDERUTILIZED_SUGGESTION = 'Consider using this keyword more frequently';\n\nexport class SeoService {\n constructor(private readonly executor: GenerationExecutor) {}\n\n async optimizeSEO(request: SEOOptimizationRequest): Promise<SEOOptimizationResult> {\n const content = validateContentBody(request.content);\n const keywords = validateKeywordList(request.keywords);\n\n const prompt = PromptBuilder.seoOptimization(content, keywords);\n const result = await this.executor.runJson<SEOOptimizationResult>(\n prompt,\n {\n optimized: content,\n score: 50,\n suggestions: [],\n addedKeywords: [],\n removedFillerWords: 0,\n readabilityImprovements: [],\n },\n { maxTokens: 1000, temperature: 0.7 },\n );\n\n return {\n ...result,\n score: clampScoreToValidRange(result.score),\n };\n }\n\n async calculateSEOScore(content: string, keywords: string[]): Promise<SEOScoreBreakdown> {\n const validatedContent = validateContentBody(content);\n const validatedKeywords = validateKeywordList(keywords);\n\n const prompt = PromptBuilder.seoOptimization(\n truncateForSeoPreview(validatedContent),\n validatedKeywords,\n );\n const result = await this.executor.runJson<SEOScoreBreakdown>(\n prompt,\n DEFAULT_SEO_SCORE,\n { maxTokens: 200, temperature: 0.3 },\n );\n\n return {\n keywordDensity: clampScoreToValidRange(result.keywordDensity),\n readabilityScore: clampScoreToValidRange(result.readabilityScore),\n titleOptimization: clampScoreToValidRange(result.titleOptimization),\n metaDescription: clampScoreToValidRange(result.metaDescription),\n headingStructure: clampScoreToValidRange(result.headingStructure),\n internalLinking: clampScoreToValidRange(result.internalLinking),\n overall: clampScoreToValidRange(result.overall),\n };\n }\n\n analyzeKeywords(content: string, keywords: string[]): KeywordAnalysis[] {\n const validatedContent = validateContentBody(content);\n const validatedKeywords = validateKeywordList(keywords);\n\n return validatedKeywords.map((keyword) => {\n const count = countKeywordOccurrences(validatedContent, keyword);\n const density = calculateKeywordDensity(validatedContent, keyword);\n return {\n keyword,\n count,\n density,\n prominence: classifyKeywordProminence(density),\n suggestions: isUnderutilizedKeyword(density) ? [UNDERUTILIZED_SUGGESTION] : [],\n };\n });\n }\n}\n","\nimport { PromptBuilder } from '../prompts/PromptBuilder';\nimport { GenerationExecutor } from './GenerationExecutor';\nimport { clampScoreToValidRange, clampConfidenceToValidRange } from '../../domain/predicates/ScoreRangeGuard';\nimport { truncateForAbVariantPreview } from '../../domain/validation/ContentBodyValidator';\nimport {\n calculateImprovementPercentage,\n selectHigherScoreVariantId,\n} from '../../domain/calculations/AbTestImprovementRatio';\nimport { AB_TEST_DEFAULT_CONFIDENCE } from '../../domain/predicates/AbTestConfidence';\nimport type {\n ABTestRequest,\n ABTestPrediction,\n ABTestComparison,\n} from '../../domain/entities/ABTesting';\n\nconst DEFAULT_PREDICTION: ABTestPrediction = {\n variantId: '',\n predictedEngagement: 0,\n predictedCTR: 0,\n predictedConversions: 0,\n confidence: 0,\n reasoning: '',\n strengths: [],\n weaknesses: [],\n suggestions: [],\n};\n\nconst VARIANT_A_ID = 'A';\nconst VARIANT_B_ID = 'B';\nconst FALLBACK_ENGAGEMENT = 50;\nconst DEFAULT_RECOMMENDATIONS: ReadonlyArray<string> = [\n 'Test with larger audience',\n 'Monitor click-through rates',\n];\n\nexport class ABTestService {\n constructor(private readonly executor: GenerationExecutor) {}\n\n async predictABTest(request: ABTestRequest): Promise<ABTestPrediction[]> {\n const predictions: ABTestPrediction[] = [];\n for (const variant of request.variants) {\n const prompt = PromptBuilder.abTestVariant({\n content: truncateForAbVariantPreview(variant.content),\n contentType: variant.contentType,\n tone: variant.tone,\n targetAudience: request.targetAudience,\n platform: request.platform,\n goals: request.goals,\n });\n\n const parsed = await this.executor.runJson<ABTestPrediction>(\n prompt,\n { ...DEFAULT_PREDICTION, variantId: variant.id },\n { maxTokens: 300, temperature: 0.5 },\n );\n\n predictions.push({\n variantId: variant.id,\n predictedEngagement: clampScoreToValidRange(parsed.predictedEngagement),\n predictedCTR: clampScoreToValidRange(parsed.predictedCTR),\n predictedConversions: clampScoreToValidRange(parsed.predictedConversions),\n confidence: clampConfidenceToValidRange(parsed.confidence),\n reasoning: parsed.reasoning ?? '',\n strengths: parsed.strengths ?? [],\n weaknesses: parsed.weaknesses ?? [],\n suggestions: parsed.suggestions ?? [],\n });\n }\n return predictions;\n }\n\n async compareVariants(variantA: string, variantB: string): Promise<ABTestComparison> {\n const predictions = await this.predictABTest({\n variants: [\n { id: VARIANT_A_ID, content: variantA, contentType: 'social', tone: 'casual' },\n { id: VARIANT_B_ID, content: variantB, contentType: 'social', tone: 'casual' },\n ],\n targetAudience: 'general',\n platform: 'twitter',\n goals: ['engagement', 'clicks'],\n });\n\n const scoreA = predictions[0]?.predictedEngagement ?? FALLBACK_ENGAGEMENT;\n const scoreB = predictions[1]?.predictedEngagement ?? FALLBACK_ENGAGEMENT;\n const isTie = scoreA === scoreB;\n const winner = selectHigherScoreVariantId(scoreA, scoreB, VARIANT_A_ID, VARIANT_B_ID);\n const improvement = calculateImprovementPercentage(scoreA, scoreB);\n\n return {\n winner,\n confidence: AB_TEST_DEFAULT_CONFIDENCE,\n improvement: isTie ? '0%' : `+${improvement}% engagement`,\n reasoning: isTie\n ? 'Both variants have equal predicted engagement'\n : winner === VARIANT_A_ID\n ? 'Variant A has more engaging content'\n : 'Variant B has more engaging content',\n recommendations: [...DEFAULT_RECOMMENDATIONS],\n };\n }\n}\n","\nimport { PromptBuilder } from '../prompts/PromptBuilder';\nimport { GenerationExecutor } from './GenerationExecutor';\nimport { validateTopicText } from '../../domain/validation/TopicTextValidator';\nimport { validateContentBody, truncateForBlogPromptPreview } from '../../domain/validation/ContentBodyValidator';\n\nexport class ImagePromptService {\n constructor(private readonly executor: GenerationExecutor) {}\n\n async generateImagePrompt(description: string, style: string): Promise<string> {\n const validated = validateTopicText(description);\n const prompt = PromptBuilder.imagePrompt(validated, style);\n return this.executor.runText(prompt, { maxTokens: 300, temperature: 0.8 });\n }\n\n async generateImagePromptsForBlog(blogContent: string): Promise<string[]> {\n const truncated = truncateForBlogPromptPreview(validateContentBody(blogContent));\n const prompt = PromptBuilder.blogImagePrompts(truncated);\n\n const prompts = await this.executor.runJson<string[]>(prompt, [], {\n maxTokens: 500,\n temperature: 0.8,\n });\n return Array.isArray(prompts) ? prompts : [];\n }\n}\n","\nimport { PromptBuilder } from '../prompts/PromptBuilder';\nimport { GenerationExecutor } from './GenerationExecutor';\nimport { validateTopicText } from '../../domain/validation/TopicTextValidator';\nimport { validateCalendarDays } from '../../domain/validation/CalendarDaysValidator';\nimport { estimateTokenBudgetForCalendarDays } from '../../domain/calculations/SpeechPaceEstimate';\nimport { resolveCalendarEntryDate } from '../../domain/calculations/ContentCalendarDateOffset';\nimport type { ContentCalendarEntry } from '../../domain/entities/ContentGeneration';\nimport type { ContentType, SocialPlatform } from '../../domain/types';\n\ninterface CalendarItem {\n day: number;\n topic: string;\n contentType: ContentType;\n platform: SocialPlatform;\n description: string;\n estimatedEngagement: number;\n priority: 'high' | 'medium' | 'low';\n}\n\nconst toCalendarEntry = (item: CalendarItem): ContentCalendarEntry => ({\n date: resolveCalendarEntryDate(item.day),\n topic: item.topic,\n contentType: item.contentType,\n platform: item.platform,\n description: item.description,\n estimatedEngagement: item.estimatedEngagement,\n priority: item.priority,\n});\n\nexport class ContentCalendarService {\n constructor(private readonly executor: GenerationExecutor) {}\n\n async generateContentCalendar(niche: string, days: number): Promise<ContentCalendarEntry[]> {\n const validatedNiche = validateTopicText(niche);\n const validatedDays = validateCalendarDays(days);\n\n const prompt = PromptBuilder.contentCalendar(validatedNiche, validatedDays);\n const data = await this.executor.runJson<CalendarItem[] | { calendar?: CalendarItem[]; entries?: CalendarItem[] }>(\n prompt,\n [],\n {\n maxTokens: estimateTokenBudgetForCalendarDays(validatedDays),\n temperature: 0.8,\n },\n );\n\n const items = Array.isArray(data)\n ? data\n : Array.isArray((data as { calendar?: CalendarItem[] })?.calendar)\n ? (data as { calendar: CalendarItem[] }).calendar\n : Array.isArray((data as { entries?: CalendarItem[] })?.entries)\n ? (data as { entries: CalendarItem[] }).entries\n : [];\n\n return items.map(toCalendarEntry);\n }\n}\n","\nimport type {\n ImageGenerationRequest,\n VideoGenerationRequest,\n ImageToVideoRequest,\n VideoToVideoRequest,\n GeneratedContent,\n} from '../../domain/config/ProviderConfig';\nimport type { ProviderFactory } from '../../../providers/factory/provider.factory';\nimport { AIError } from '../../domain/errors/AIErrors';\n\nconst wrapProviderError = (operation: string, error: unknown): AIError => {\n const message = error instanceof Error ? error.message : 'Unknown error';\n return new AIError(`${operation} failed: ${message}`, 'PROVIDER_ERROR', error);\n};\n\nconst ensureFactory = (factory: ProviderFactory, operation: string): void => {\n if (factory.getAllProviders().length === 0) {\n throw new AIError(\n `${operation} failed: No providers are registered. ` +\n 'Provide a ProviderConfig with at least one enabled provider when constructing AIContentService.',\n 'PROVIDER_UNAVAILABLE',\n );\n }\n};\n\nexport class MediaGenerationService {\n constructor(private readonly providerFactory: ProviderFactory) {}\n\n generateImage(request: ImageGenerationRequest): Promise<GeneratedContent> {\n ensureFactory(this.providerFactory, 'Image generation');\n return this.providerFactory.generateImage(request).catch((err) => {\n throw wrapProviderError('Image generation', err);\n });\n }\n\n generateVideo(request: VideoGenerationRequest): Promise<GeneratedContent> {\n ensureFactory(this.providerFactory, 'Video generation');\n return this.providerFactory.generateVideo(request).catch((err) => {\n throw wrapProviderError('Video generation', err);\n });\n }\n\n convertImageToVideo(request: ImageToVideoRequest): Promise<GeneratedContent> {\n ensureFactory(this.providerFactory, 'Image-to-video conversion');\n return this.providerFactory.imageToVideo(request).catch((err) => {\n throw wrapProviderError('Image-to-video conversion', err);\n });\n }\n\n transformVideo(request: VideoToVideoRequest): Promise<GeneratedContent> {\n ensureFactory(this.providerFactory, 'Video-to-video transformation');\n return this.providerFactory.videoToVideo(request).catch((err) => {\n throw wrapProviderError('Video-to-video transformation', err);\n });\n }\n}\n","\nfunction repairCommonJsonDefects(text: string): string {\n return (\n text\n .replace(/(:\\s*-?\\d+(?:\\.\\d+)?)\\s*\"/g, '$1')\n .replace(/(:\\s*\"[^\"]*\")\"/g, '$1')\n );\n}\n\nexport function safeJSONParse<T>(text: string, fallback: T, onError?: (context: string) => void): T {\n try {\n return JSON.parse(text) as T;\n } catch (error) {\n try {\n return JSON.parse(repairCommonJsonDefects(text)) as T;\n } catch {\n // fall through to the position-aware error report below\n }\n if (error instanceof SyntaxError) {\n const positionMatch = error.message.match(/position (\\d+)/);\n const position = positionMatch ? parseInt(positionMatch[1] ?? '', 10) : -1;\n if (position > 0) {\n const context = text.substring(Math.max(0, position - 50), position + 50);\n onError?.(`JSON parse error at position ${position}: \"${context}\"`);\n } else {\n onError?.(`JSON parse error: ${error.message}`);\n }\n }\n return fallback;\n }\n}\n\nexport function extractJSON(text: string): string | null {\n const codeBlockMatch = text.match(/```(?:json)?\\s*([\\s\\S]*?)```/);\n if (codeBlockMatch && codeBlockMatch[1]) {\n const candidate = codeBlockMatch[1].trim();\n if (candidate.startsWith('{') || candidate.startsWith('[')) {\n return candidate;\n }\n }\n\n const objectMatch = text.match(/\\{[\\s\\S]*\\}/);\n if (objectMatch) {\n return objectMatch[0];\n }\n\n const arrayMatch = text.match(/\\[[\\s\\S]*\\]/);\n if (arrayMatch) {\n return arrayMatch[0];\n }\n\n return null;\n}\n\nexport function parseAIResponse<T>(response: string, fallback: T, onError?: (context: string) => void): T {\n const json = extractJSON(response);\n if (!json) {\n onError?.('No JSON payload found in response');\n return fallback;\n }\n\n return safeJSONParse(json, fallback, onError);\n}\n\nexport function isValidJSON(text: string): boolean {\n const trimmed = text.trim();\n if (trimmed.length === 0) return false;\n\n if (\n !(\n (trimmed.startsWith('{') && trimmed.endsWith('}')) ||\n (trimmed.startsWith('[') && trimmed.endsWith(']'))\n )\n ) {\n return false;\n }\n\n try {\n JSON.parse(trimmed);\n return true;\n } catch {\n return false;\n }\n}\n","\nimport { parseAIResponse } from '../../infrastructure/utils/jsonParser';\nimport type { ITextGenerator, TextGenerationOptions } from '../../domain/interfaces/ITextGenerator';\nimport type { GenerationResult, TextRequest } from '../../../core/types';\nimport { AIError } from '../../domain/errors/AIErrors';\nimport { ProviderFactory } from '../../../providers/factory/provider.factory';\n\n/**\n * The single LLM seam for the content services. runJson/runText keep the\n * string facade the nine services were built against; runChat passes a full\n * TextRequest through to the factory and returns the usage-complete\n * GenerationResult.\n */\nexport class GenerationExecutor {\n constructor(private readonly generator: ITextGenerator | ProviderFactory) {}\n\n async runJson<T>(prompt: string, fallback: T, generationOptions: TextGenerationOptions = {}): Promise<T> {\n const response = await this.generator.generateText(prompt, generationOptions);\n return parseAIResponse<T>(response, fallback);\n }\n\n runText(prompt: string, options: TextGenerationOptions = {}): Promise<string> {\n return this.generator.generateText(prompt, options);\n }\n\n /** Usage-complete pass-through; requires a ProviderFactory engine. */\n runChat(request: TextRequest): Promise<GenerationResult> {\n if (!(this.generator instanceof ProviderFactory)) {\n throw new AIError(\n 'runChat requires a ProviderFactory engine — construct AIContentService with a provider config, not a custom ITextGenerator',\n 'PROVIDER_UNAVAILABLE',\n );\n }\n return this.generator.chat(request);\n }\n}\n","\nimport type { IAIContentService } from '../../domain/interfaces/IAIContentService';\nimport type { ITextGenerator } from '../../domain/interfaces/ITextGenerator';\nimport type {\n BlogGenerationRequest,\n GeneratedBlog,\n SocialContentRequest,\n GeneratedSocialContent,\n VideoScriptRequest,\n GeneratedVideoScript,\n ContentCalendarEntry,\n} from '../../domain/entities/ContentGeneration';\nimport type {\n ContentAnalysisRequest,\n ContentAnalysisResult,\n SentimentAnalysisResult,\n} from '../../domain/entities/SentimentAnalysis';\nimport type {\n SEOOptimizationRequest,\n SEOOptimizationResult,\n SEOScoreBreakdown,\n KeywordAnalysis,\n} from '../../domain/entities/SEO';\nimport type {\n ABTestRequest,\n ABTestPrediction,\n ABTestComparison,\n} from '../../domain/entities/ABTesting';\nimport type { SocialPlatform, ContentTone, Emotion } from '../../domain/types';\nimport type {\n ProviderConfig,\n ImageGenerationRequest,\n VideoGenerationRequest,\n ImageToVideoRequest,\n VideoToVideoRequest,\n GeneratedContent,\n} from '../../domain/config/ProviderConfig';\nimport { createAI, type AIProviderConfig } from '../../../providers/factory/create-ai';\nimport { ProviderFactory } from '../../../providers/factory/provider.factory';\nimport { BlogService } from './BlogService';\nimport { SocialService } from './SocialService';\nimport { VideoScriptService } from './VideoScriptService';\nimport { AnalysisService } from './AnalysisService';\nimport { SeoService } from './SeoService';\nimport { ABTestService } from './ABTestService';\nimport { ImagePromptService } from './ImagePromptService';\nimport { ContentCalendarService } from './ContentCalendarService';\nimport { MediaGenerationService } from './ProviderServices';\nimport { GenerationExecutor } from './GenerationExecutor';\n\ninterface ServiceBundle {\n providerFactory: ProviderFactory;\n blogService: BlogService;\n socialService: SocialService;\n videoScriptService: VideoScriptService;\n analysisService: AnalysisService;\n seoService: SeoService;\n abTestService: ABTestService;\n imagePromptService: ImagePromptService;\n contentCalendarService: ContentCalendarService;\n mediaGenerationService: MediaGenerationService;\n}\n\nconst isTextGenerator = (value: unknown): value is ITextGenerator =>\n typeof value === \"object\" &&\n value !== null &&\n typeof (value as ITextGenerator).generateText === \"function\";\n\n/**\n * Accepts the new AIProviderConfig (provider blocks, presence = enabled) or a\n * legacy web-ai-content ProviderConfig (blocks gated by `enabled`) and maps\n * the latter onto the former — one constructor, both worlds.\n */\nfunction toAIProviderConfig(config: AIProviderConfig | ProviderConfig): AIProviderConfig {\n const legacy = config as ProviderConfig;\n const modern = config as AIProviderConfig;\n\n const anthropic =\n modern.anthropic ??\n (legacy.anthropic?.enabled\n ? {\n apiKey: legacy.anthropic.apiKey,\n baseUrl: legacy.anthropic.baseUrl,\n timeoutMs: legacy.anthropic.timeout,\n models: legacy.anthropic.models,\n effort: legacy.anthropic.effort,\n }\n : undefined);\n const groq =\n modern.groq ??\n (legacy.groq?.enabled\n ? {\n apiKey: legacy.groq.apiKey,\n baseUrl: legacy.groq.baseUrl,\n timeoutMs: legacy.groq.timeout,\n // legacy {text, chat} model pins map onto the neutral tier slots\n ...(legacy.groq.models?.text\n ? { models: { balanced: legacy.groq.models.text } }\n : {}),\n }\n : undefined);\n const gemini =\n modern.gemini ?? (legacy.gemini?.enabled ? { ...legacy.gemini } : undefined);\n const fal = modern.fal ?? (legacy.fal?.enabled ? { ...legacy.fal } : undefined);\n const pruna = modern.pruna ?? (legacy.pruna?.enabled ? { ...legacy.pruna } : undefined);\n\n return {\n priority: modern.priority,\n fallbackEnabled: modern.fallbackEnabled,\n defaultTier: modern.defaultTier,\n ...(anthropic ? { anthropic } : {}),\n ...(groq ? { groq } : {}),\n ...(gemini ? { gemini } : {}),\n ...(fal ? { fal } : {}),\n ...(pruna ? { pruna } : {}),\n };\n}\n\nconst buildServices = (\n configOrGenerator: AIProviderConfig | ProviderConfig | ITextGenerator | string,\n model?: string,\n customGenerator?: ITextGenerator,\n): ServiceBundle => {\n if (customGenerator) {\n const executor = new GenerationExecutor(customGenerator);\n const emptyFactory = new ProviderFactory({\n priority: [],\n fallbackEnabled: false,\n });\n return {\n providerFactory: emptyFactory,\n blogService: new BlogService(executor),\n socialService: new SocialService(executor),\n videoScriptService: new VideoScriptService(executor),\n analysisService: new AnalysisService(executor),\n seoService: new SeoService(executor),\n abTestService: new ABTestService(executor),\n imagePromptService: new ImagePromptService(executor),\n contentCalendarService: new ContentCalendarService(executor),\n mediaGenerationService: new MediaGenerationService(emptyFactory),\n };\n }\n\n if (typeof configOrGenerator === 'string') {\n const aiConfig: AIProviderConfig = {\n anthropic: {\n apiKey: configOrGenerator,\n ...(model ? { models: { balanced: model } } : {}),\n },\n };\n const factory = createAI(aiConfig);\n const executor = new GenerationExecutor(factory);\n return {\n providerFactory: factory,\n blogService: new BlogService(executor),\n socialService: new SocialService(executor),\n videoScriptService: new VideoScriptService(executor),\n analysisService: new AnalysisService(executor),\n seoService: new SeoService(executor),\n abTestService: new ABTestService(executor),\n imagePromptService: new ImagePromptService(executor),\n contentCalendarService: new ContentCalendarService(executor),\n mediaGenerationService: new MediaGenerationService(factory),\n };\n }\n\n if (isTextGenerator(configOrGenerator)) {\n const executor = new GenerationExecutor(configOrGenerator);\n const emptyFactory = new ProviderFactory({\n priority: [],\n fallbackEnabled: false,\n });\n return {\n providerFactory: emptyFactory,\n blogService: new BlogService(executor),\n socialService: new SocialService(executor),\n videoScriptService: new VideoScriptService(executor),\n analysisService: new AnalysisService(executor),\n seoService: new SeoService(executor),\n abTestService: new ABTestService(executor),\n imagePromptService: new ImagePromptService(executor),\n contentCalendarService: new ContentCalendarService(executor),\n mediaGenerationService: new MediaGenerationService(emptyFactory),\n };\n }\n\n const factory = createAI(toAIProviderConfig(configOrGenerator));\n const executor = new GenerationExecutor(factory);\n return {\n providerFactory: factory,\n blogService: new BlogService(executor),\n socialService: new SocialService(executor),\n videoScriptService: new VideoScriptService(executor),\n analysisService: new AnalysisService(executor),\n seoService: new SeoService(executor),\n abTestService: new ABTestService(executor),\n imagePromptService: new ImagePromptService(executor),\n contentCalendarService: new ContentCalendarService(executor),\n mediaGenerationService: new MediaGenerationService(factory),\n };\n};\n\nexport class AIContentService implements IAIContentService {\n private readonly providerFactory: ProviderFactory;\n private readonly blogService: BlogService;\n private readonly socialService: SocialService;\n private readonly videoScriptService: VideoScriptService;\n private readonly analysisService: AnalysisService;\n private readonly seoService: SeoService;\n private readonly abTestService: ABTestService;\n private readonly imagePromptService: ImagePromptService;\n private readonly contentCalendarService: ContentCalendarService;\n private readonly mediaGenerationService: MediaGenerationService;\n\n constructor(\n configOrGenerator: AIProviderConfig | ProviderConfig | ITextGenerator | string,\n model?: string,\n textGenerator?: ITextGenerator,\n ) {\n const bundle = buildServices(configOrGenerator, model, textGenerator);\n this.providerFactory = bundle.providerFactory;\n this.blogService = bundle.blogService;\n this.socialService = bundle.socialService;\n this.videoScriptService = bundle.videoScriptService;\n this.analysisService = bundle.analysisService;\n this.seoService = bundle.seoService;\n this.abTestService = bundle.abTestService;\n this.imagePromptService = bundle.imagePromptService;\n this.contentCalendarService = bundle.contentCalendarService;\n this.mediaGenerationService = bundle.mediaGenerationService;\n }\n\n /** The composed factory — chat()/chatStream() with usage, health, fallback. */\n get providers(): ProviderFactory {\n return this.providerFactory;\n }\n\n generateBlogPost(request: BlogGenerationRequest): Promise<GeneratedBlog> {\n return this.blogService.generateBlogPost(request);\n }\n\n generateSocialContent(request: SocialContentRequest): Promise<GeneratedSocialContent> {\n return this.socialService.generateSocialContent(request);\n }\n generateForAllPlatforms(topic: string, tone: ContentTone): Promise<GeneratedSocialContent[]> {\n return this.socialService.generateForAllPlatforms(topic, tone);\n }\n generateHashtags(content: string, count: number): Promise<string[]> {\n return this.socialService.generateHashtags(content, count);\n }\n optimizeHashtags(hashtags: string[], platform: SocialPlatform): Promise<string[]> {\n return Promise.resolve(this.socialService.optimizeHashtags(hashtags, platform));\n }\n\n generateVideoScript(request: VideoScriptRequest): Promise<GeneratedVideoScript> {\n return this.videoScriptService.generateVideoScript(request);\n }\n generateVoiceScript(topic: string, emotion: Emotion, duration: number): Promise<GeneratedVideoScript> {\n return this.videoScriptService.generateVoiceScript(topic, emotion, duration);\n }\n\n generateContentCalendar(niche: string, days: number): Promise<ContentCalendarEntry[]> {\n return this.contentCalendarService.generateContentCalendar(niche, days);\n }\n\n analyzeSentiment(content: string): Promise<SentimentAnalysisResult> {\n return this.analysisService.analyzeSentiment(content);\n }\n analyzeContent(request: ContentAnalysisRequest): Promise<ContentAnalysisResult> {\n return this.analysisService.analyzeContent(request);\n }\n\n optimizeSEO(request: SEOOptimizationRequest): Promise<SEOOptimizationResult> {\n return this.seoService.optimizeSEO(request);\n }\n calculateSEOScore(content: string, keywords: string[]): Promise<SEOScoreBreakdown> {\n return this.seoService.calculateSEOScore(content, keywords);\n }\n analyzeKeywords(content: string, keywords: string[]): Promise<KeywordAnalysis[]> {\n return Promise.resolve(this.seoService.analyzeKeywords(content, keywords));\n }\n\n predictABTest(request: ABTestRequest): Promise<ABTestPrediction[]> {\n return this.abTestService.predictABTest(request);\n }\n compareVariants(variantA: string, variantB: string): Promise<ABTestComparison> {\n return this.abTestService.compareVariants(variantA, variantB);\n }\n\n generateImagePrompt(description: string, style: string): Promise<string> {\n return this.imagePromptService.generateImagePrompt(description, style);\n }\n generateImagePromptsForBlog(blogContent: string): Promise<string[]> {\n return this.imagePromptService.generateImagePromptsForBlog(blogContent);\n }\n\n generateImage(request: ImageGenerationRequest): Promise<GeneratedContent> {\n return this.mediaGenerationService.generateImage(request);\n }\n generateVideo(request: VideoGenerationRequest): Promise<GeneratedContent> {\n return this.mediaGenerationService.generateVideo(request);\n }\n convertImageToVideo(request: ImageToVideoRequest): Promise<GeneratedContent> {\n return this.mediaGenerationService.convertImageToVideo(request);\n }\n transformVideo(request: VideoToVideoRequest): Promise<GeneratedContent> {\n return this.mediaGenerationService.transformVideo(request);\n }\n}\n","\nimport type { WizardStep } from './base.wizard';\nimport type { BlogGenerationRequest, SocialContentRequest, VideoScriptRequest } from '../content/domain/entities/ContentGeneration';\n\nexport type ContentType = 'blog' | 'social' | 'script' | 'news' | 'ebook' | 'podcast';\n\nexport type ContentWizardStep =\n | 'select-type'\n | 'input-topic'\n | 'configure'\n | 'advanced'\n | 'preview'\n | 'generating'\n | 'results';\n\nexport interface ContentWizardData {\n contentType?: ContentType;\n\n topic?: string;\n description?: string;\n\n tone?: 'professional' | 'casual' | 'enthusiastic' | 'humorous' | 'dramatic' | 'educational';\n platform?: 'twitter' | 'linkedin' | 'instagram' | 'threads' | 'tiktok' | 'facebook';\n targetAudience?: string;\n wordCount?: number;\n duration?: number;\n\n keywords?: string[];\n includeImages?: boolean;\n includeCallToAction?: boolean;\n seoOptimization?: boolean;\n language?: string;\n\n generatedContent?: string;\n generatedId?: string;\n}\n\nexport const CONTENT_WIZARD_STEPS: ReadonlyArray<WizardStep<ContentWizardStep>> = [\n {\n id: 'select-type',\n label: 'Select Type',\n icon: 'Layers',\n description: 'Choose the type of content you want to generate',\n validate: (data) => Boolean((data as ContentWizardData).contentType),\n },\n {\n id: 'input-topic',\n label: 'Topic',\n icon: 'Lightbulb',\n description: 'Enter your topic or idea',\n validate: (data) => {\n const topic = (data as ContentWizardData).topic;\n return typeof topic === 'string' && topic.length > 0;\n },\n },\n {\n id: 'configure',\n label: 'Configure',\n icon: 'Settings',\n description: 'Set tone, audience, and platform',\n validate: (data) => {\n const d = data as ContentWizardData;\n return Boolean(d.tone && d.targetAudience);\n },\n },\n {\n id: 'advanced',\n label: 'Advanced',\n icon: 'Sliders',\n description: 'Additional options and optimizations',\n optional: true,\n },\n {\n id: 'preview',\n label: 'Preview',\n icon: 'Eye',\n description: 'Review your settings before generation',\n },\n {\n id: 'generating',\n label: 'Generating',\n icon: 'Sparkles',\n description: 'AI is generating your content',\n },\n {\n id: 'results',\n label: 'Results',\n icon: 'CheckCircle',\n description: 'Your generated content is ready',\n },\n];\n\nexport function buildContentRequest(\n data: ContentWizardData,\n): BlogGenerationRequest | SocialContentRequest | VideoScriptRequest {\n switch (data.contentType) {\n case 'blog':\n return {\n topic: data.topic ?? '',\n blogType: 'tutorial',\n targetKeywords: data.keywords ?? [],\n tone: data.tone ?? 'professional',\n wordCount: data.wordCount ?? 1000,\n targetAudience: data.targetAudience ?? '',\n seoOptimization: data.seoOptimization ?? false,\n includeImages: data.includeImages ?? false,\n includeSchema: false,\n };\n case 'social':\n return {\n topic: data.topic ?? '',\n platform: data.platform ?? 'twitter',\n tone: data.tone ?? 'casual',\n hashtags: true,\n targetAudience: data.targetAudience,\n includeCallToAction: data.includeCallToAction,\n };\n case 'script':\n return {\n topic: data.topic ?? '',\n tone: data.tone ?? 'professional',\n duration: data.duration ?? 60,\n targetAudience: data.targetAudience ?? '',\n includeVisuals: true,\n includeCallToAction: data.includeCallToAction ?? false,\n };\n default:\n throw new Error(`Unsupported content type: ${data.contentType}`);\n }\n}\n","\nimport type { WizardStep } from './base.wizard';\nimport type { ImageGenerationRequest } from '../content/domain/config/ProviderConfig';\n\nexport type ImageWizardStep =\n | 'input-prompt'\n | 'select-style'\n | 'configure'\n | 'advanced'\n | 'preview'\n | 'generating'\n | 'results';\n\nexport interface ImageWizardData {\n prompt?: string;\n\n style?: 'realistic' | 'cartoon' | 'abstract' | 'minimalist' | 'vintage';\n\n format?: 'square' | 'landscape' | 'portrait' | 'story' | 'banner';\n quality?: 'standard' | 'high' | 'ultra';\n quantity?: number;\n\n colorPalette?: string[];\n platform?: 'instagram' | 'youtube' | 'facebook' | 'twitter' | 'general';\n\n generatedImageUrl?: string;\n generatedId?: string;\n}\n\nexport const IMAGE_WIZARD_STEPS: ReadonlyArray<WizardStep<ImageWizardStep>> = [\n {\n id: 'input-prompt',\n label: 'Describe Image',\n icon: 'Image',\n description: 'Describe the image you want to create',\n validate: (data) => {\n const prompt = (data as ImageWizardData).prompt;\n return typeof prompt === 'string' && prompt.length > 0;\n },\n },\n {\n id: 'select-style',\n label: 'Style',\n icon: 'Palette',\n description: 'Choose the artistic style',\n validate: (data) => Boolean((data as ImageWizardData).style),\n },\n {\n id: 'configure',\n label: 'Configure',\n icon: 'Settings',\n description: 'Set format, quality, and quantity',\n validate: (data) => {\n const d = data as ImageWizardData;\n return Boolean(d.format && d.quality);\n },\n },\n {\n id: 'advanced',\n label: 'Advanced',\n icon: 'Sliders',\n description: 'Color palette and platform optimization',\n optional: true,\n },\n { id: 'preview', label: 'Preview', icon: 'Eye', description: 'Review your settings' },\n { id: 'generating', label: 'Generating', icon: 'Sparkles', description: 'AI is creating your image' },\n { id: 'results', label: 'Results', icon: 'Image', description: 'Your generated image is ready' },\n];\n\nexport function buildImageRequest(data: ImageWizardData): ImageGenerationRequest {\n return {\n type: 'image',\n prompt: data.prompt ?? '',\n style: data.style,\n format: data.format,\n quality: data.quality,\n quantity: data.quantity ?? 1,\n };\n}\n","\nimport type { WizardStep } from './base.wizard';\nimport type { VideoGenerationRequest, ImageToVideoRequest, VideoToVideoRequest } from '../content/domain/config/ProviderConfig';\n\nexport type VideoGenerationType = 'text-to-video' | 'image-to-video' | 'video-to-video';\n\nexport type VideoWizardStep =\n | 'select-type'\n | 'input-source'\n | 'configure'\n | 'advanced'\n | 'preview'\n | 'generating'\n | 'results';\n\nexport interface VideoWizardData {\n generationType?: VideoGenerationType;\n\n prompt?: string;\n imageUrl?: string;\n sourceVideoUrl?: string;\n\n duration?: number;\n aspectRatio?: '16:9' | '9:16' | '1:1';\n style?: 'realistic' | 'animated' | 'cinematic' | 'documentary';\n quality?: 'standard' | 'high' | 'ultra';\n\n motion?: 'slow' | 'medium' | 'fast';\n camera?: 'static' | 'pan' | 'zoom' | 'tracking';\n styleTransfer?: 'cinematic' | 'anime' | 'cartoon' | 'vintage';\n enhanceQuality?: boolean;\n\n generatedVideoUrl?: string;\n generatedId?: string;\n}\n\nconst validateSource = (data: Record<string, unknown>): boolean => {\n const d = data as VideoWizardData;\n if (d.generationType === 'text-to-video') {\n return typeof d.prompt === 'string' && d.prompt.length > 0;\n }\n if (d.generationType === 'image-to-video') {\n return typeof d.imageUrl === 'string' && d.imageUrl.length > 0;\n }\n if (d.generationType === 'video-to-video') {\n return typeof d.sourceVideoUrl === 'string' && d.sourceVideoUrl.length > 0\n && typeof d.prompt === 'string' && d.prompt.length > 0;\n }\n return false;\n};\n\nexport const VIDEO_WIZARD_STEPS: ReadonlyArray<WizardStep<VideoWizardStep>> = [\n {\n id: 'select-type',\n label: 'Select Type',\n icon: 'Video',\n description: 'Choose video generation type',\n validate: (data) => Boolean((data as VideoWizardData).generationType),\n },\n {\n id: 'input-source',\n label: 'Source',\n icon: 'FileInput',\n description: 'Provide your source (prompt, image, or video)',\n validate: validateSource,\n },\n {\n id: 'configure',\n label: 'Configure',\n icon: 'Settings',\n description: 'Set duration, aspect ratio, and style',\n validate: (data) => {\n const d = data as VideoWizardData;\n return Boolean(d.duration && d.aspectRatio);\n },\n },\n { id: 'advanced', label: 'Advanced', icon: 'Sliders', description: 'Additional video options', optional: true },\n { id: 'preview', label: 'Preview', icon: 'Eye', description: 'Review your settings' },\n { id: 'generating', label: 'Generating', icon: 'Sparkles', description: 'AI is creating your video' },\n { id: 'results', label: 'Results', icon: 'Video', description: 'Your generated video is ready' },\n];\n\nexport function buildVideoRequest(\n data: VideoWizardData,\n): VideoGenerationRequest | ImageToVideoRequest | VideoToVideoRequest {\n switch (data.generationType) {\n case 'text-to-video':\n return {\n type: 'video',\n prompt: data.prompt ?? '',\n duration: data.duration ?? 5,\n aspectRatio: data.aspectRatio ?? '16:9',\n style: data.style,\n quality: data.quality,\n } as VideoGenerationRequest;\n case 'image-to-video':\n return {\n type: 'video',\n imageUrl: data.imageUrl ?? '',\n prompt: data.prompt,\n duration: data.duration ?? 5,\n motion: data.motion ?? 'medium',\n camera: data.camera ?? 'static',\n } as ImageToVideoRequest;\n case 'video-to-video':\n return {\n type: 'video',\n sourceVideoUrl: data.sourceVideoUrl ?? '',\n prompt: data.prompt ?? '',\n styleTransfer: data.styleTransfer,\n enhanceQuality: data.enhanceQuality,\n } as VideoToVideoRequest;\n default:\n throw new Error(`Unsupported generation type: ${data.generationType}`);\n }\n}\n"]}