@umituz/web-ai 1.0.0 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/dist/{ABTesting-DDqNhHtP.d.ts → AIErrors-B2ogd1PB.d.ts} +14 -1
  2. package/dist/{ABTesting-DWBtKTMQ.d.cts → AIErrors-C5EasV_c.d.cts} +14 -1
  3. package/dist/{ProviderConfig-a55tLhWT.d.cts → ProviderConfig-DIFa9nmG.d.cts} +10 -1
  4. package/dist/{ProviderConfig-a55tLhWT.d.ts → ProviderConfig-DIFa9nmG.d.ts} +10 -1
  5. package/dist/chat/index.cjs +114 -23
  6. package/dist/chat/index.cjs.map +1 -1
  7. package/dist/chat/index.d.cts +4 -4
  8. package/dist/chat/index.d.ts +4 -4
  9. package/dist/chat/index.js +114 -23
  10. package/dist/chat/index.js.map +1 -1
  11. package/dist/{chat.service-DBKq9I2c.d.cts → chat.service-CL1qtYxe.d.cts} +7 -7
  12. package/dist/{chat.service-RQn8UTXD.d.ts → chat.service-q05GnhEm.d.ts} +7 -7
  13. package/dist/content/index.cjs +393 -186
  14. package/dist/content/index.cjs.map +1 -1
  15. package/dist/content/index.d.cts +7 -8
  16. package/dist/content/index.d.ts +7 -8
  17. package/dist/content/index.js +393 -186
  18. package/dist/content/index.js.map +1 -1
  19. package/dist/core/index.cjs +112 -15
  20. package/dist/core/index.cjs.map +1 -1
  21. package/dist/core/index.d.cts +5 -33
  22. package/dist/core/index.d.ts +5 -33
  23. package/dist/core/index.js +111 -16
  24. package/dist/core/index.js.map +1 -1
  25. package/dist/{create-ai-DGZFBOA1.d.cts → create-ai-DOI9jD3v.d.cts} +4 -21
  26. package/dist/{create-ai-BhNaz86i.d.ts → create-ai-DXEoke8-.d.ts} +4 -21
  27. package/dist/hooks/index.cjs +359 -169
  28. package/dist/hooks/index.cjs.map +1 -1
  29. package/dist/hooks/index.d.cts +6 -6
  30. package/dist/hooks/index.d.ts +6 -6
  31. package/dist/hooks/index.js +359 -169
  32. package/dist/hooks/index.js.map +1 -1
  33. package/dist/index-DIHz8_OJ.d.ts +48 -0
  34. package/dist/index-DKHNcMbl.d.cts +48 -0
  35. package/dist/index.cjs +245 -94
  36. package/dist/index.cjs.map +1 -1
  37. package/dist/index.d.cts +6 -6
  38. package/dist/index.d.ts +6 -6
  39. package/dist/index.js +244 -95
  40. package/dist/index.js.map +1 -1
  41. package/dist/{provider.factory-COsnprLH.d.cts → provider.factory-BxsfK4WW.d.cts} +1 -1
  42. package/dist/{provider.factory-CpWFyjbw.d.ts → provider.factory-DfDfk0dK.d.ts} +1 -1
  43. package/dist/providers/index.cjs +281 -124
  44. package/dist/providers/index.cjs.map +1 -1
  45. package/dist/providers/index.d.cts +11 -12
  46. package/dist/providers/index.d.ts +11 -12
  47. package/dist/providers/index.js +281 -124
  48. package/dist/providers/index.js.map +1 -1
  49. package/dist/wizard/index.d.cts +1 -1
  50. package/dist/wizard/index.d.ts +1 -1
  51. package/package.json +4 -1
  52. package/dist/index-DjX9ZKuM.d.cts +0 -14
  53. package/dist/index-DxLvE588.d.ts +0 -14
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/core/tiers/index.ts","../src/core/errors/ai-error-types.ts","../src/core/errors/ai-error.ts","../src/core/errors/error-classifier.ts","../src/core/errors/http-status-classifier.ts","../src/core/errors/user-friendly-error-resolver.ts","../src/core/errors/error-resolver.ts","../src/core/errors/response-error-message-extractor.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/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/calculations/timing-window.ts","../src/core/utils/debounce.ts","../src/core/utils/api-key-validator.ts","../src/core/utils/coercion.util.ts","../src/core/constants/protocol.constants.ts","../src/core/parsers/sse-lines.ts","../src/core/parsers/streaming-response.parser.ts","../src/core/parsers/json-content-extractor.ts","../src/core/parsers/json-response.parser.ts","../src/core/parsers/structured-prompt.builder.ts","../src/core/sse/sse-response.service.ts","../src/providers/base/provider.types.ts","../src/content/domain/errors/AIErrors.ts","../src/content/domain/limits/ProviderTimingConfig.ts","../src/content/domain/calculations/RetryBackoffDelay.ts","../src/providers/base/base.provider.ts","../src/providers/factory/provider.factory.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/providers/groq/groq.constants.ts","../src/providers/groq/groq-request.builder.ts","../src/providers/groq/groq-http-transport.ts","../src/providers/groq/groq-http-client.ts","../src/providers/groq/groq-sse.ts","../src/providers/groq/groq.provider.ts","../src/content/domain/predicates/ProviderCostEstimator.ts","../src/content/domain/limits/ModelDefaults.ts","../src/providers/gemini/gemini.provider.ts","../src/content/domain/predicates/FalImageRenderingOptions.ts","../src/providers/fal/fal.provider.ts","../src/providers/pruna/pruna-generate.ts","../src/providers/pruna/pruna.provider.ts","../src/providers/factory/create-ai.ts","../src/core/calculations/random-base36-suffix.ts","../src/chat/utils/chat-id-generator.ts","../src/chat/utils/message-formatter.ts","../src/chat/utils/prompt-strategy.ts","../src/chat/services/chat.service.ts"],"names":["AIErrorType","retryManager","AIError","findLastIndex"],"mappings":"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","file":"index.js","sourcesContent":["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","\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\nexport class AIError extends Error {\n public readonly type: AIErrorType;\n public readonly cause?: Error;\n public readonly metadata: AIErrorMetadata;\n\n constructor(\n type: AIErrorType,\n message: string,\n cause?: Error,\n metadata: AIErrorMetadata = {},\n ) {\n super(message);\n this.name = \"AIError\";\n this.type = type;\n this.cause = cause;\n this.metadata = metadata;\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 message: string;\n metadata: AIErrorMetadata;\n } {\n return {\n name: this.name,\n type: this.type,\n message: this.message,\n metadata: this.metadata,\n };\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 { AIError } from \"./ai-error\";\nimport { AIErrorType, USER_FRIENDLY_ERROR_MESSAGES } from \"./ai-error-types\";\n\nconst KEYWORD_FALLBACK_RULES: ReadonlyArray<{ keywords: ReadonlyArray<string>; type: AIErrorType }> = [\n { keywords: [\"api key\", \"unauthorized\"], type: AIErrorType.INVALID_API_KEY },\n { keywords: [\"rate limit\"], type: AIErrorType.RATE_LIMIT_ERROR },\n { keywords: [\"network\", \"fetch\"], type: AIErrorType.NETWORK_ERROR },\n { keywords: [\"abort\"], type: AIErrorType.ABORT_ERROR },\n];\n\nexport function resolveUserFriendlyErrorMessage(error: unknown): string {\n if (error instanceof AIError) {\n return USER_FRIENDLY_ERROR_MESSAGES[error.type];\n }\n\n if (error instanceof Error) {\n const lower = error.message.toLowerCase();\n for (const rule of KEYWORD_FALLBACK_RULES) {\n if (rule.keywords.some((kw) => lower.includes(kw))) {\n return USER_FRIENDLY_ERROR_MESSAGES[rule.type];\n }\n }\n if (error.message.length > 0) return error.message;\n }\n\n return USER_FRIENDLY_ERROR_MESSAGES[AIErrorType.UNKNOWN_ERROR];\n}\n","\nimport { resolveUserFriendlyErrorMessage } from \"./user-friendly-error-resolver\";\nimport { AIError } from \"./ai-error\";\nimport { AIErrorType, USER_FRIENDLY_ERROR_MESSAGES } from \"./ai-error-types\";\nimport type { AIErrorMetadata } from \"./ai-error\";\n\nexport const resolveUserFriendlyMessage = resolveUserFriendlyErrorMessage;\n\nexport interface LoggedError {\n readonly message: string;\n readonly type: string;\n readonly stack?: string;\n readonly metadata?: AIErrorMetadata;\n}\n\nexport function formatErrorForLogging(error: unknown): LoggedError {\n if (error instanceof AIError) {\n return {\n message: error.message,\n type: error.type,\n stack: error.stack,\n metadata: error.metadata,\n };\n }\n if (error instanceof Error) {\n return { message: error.message, type: error.name, stack: error.stack };\n }\n return { message: String(error), type: typeof error };\n}\n\nexport { AIErrorType, USER_FRIENDLY_ERROR_MESSAGES };\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 { 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","\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 LeadingEdgeParams {\n readonly now: number;\n readonly lastCallTime: number;\n readonly interval: number;\n readonly leadingEnabled: boolean;\n readonly isThrottled: boolean;\n}\n\nexport function shouldCallOnLeadingEdge(params: LeadingEdgeParams): boolean {\n const { now, lastCallTime, interval, leadingEnabled, isThrottled } = params;\n if (!leadingEnabled) return false;\n if (isThrottled) return false;\n return now - lastCallTime >= interval;\n}\n\nexport interface TrailingDelayParams {\n readonly interval: number;\n readonly timeSinceLastCall: number;\n}\n\nexport function calculateTrailingDelay(params: TrailingDelayParams): number {\n return Math.max(0, params.interval - params.timeSinceLastCall);\n}\n\nexport function isWithinWindow(now: number, lastCallTime: number, interval: number): boolean {\n return now - lastCallTime < interval;\n}\n","\nimport {\n shouldCallOnLeadingEdge,\n calculateTrailingDelay,\n} from \"../calculations/timing-window\";\n\ntype TimerHandle = ReturnType<typeof setTimeout>;\n\nexport interface DebounceOptions {\n readonly delay?: number;\n readonly leading?: boolean;\n readonly trailing?: boolean;\n}\n\nexport interface ThrottleOptions {\n readonly interval?: number;\n readonly leading?: boolean;\n readonly trailing?: boolean;\n}\n\nconst DEFAULT_DEBOUNCE_DELAY_MS = 300;\nconst DEFAULT_THROTTLE_INTERVAL_MS = 1000;\n\nexport class DebounceManager {\n private readonly timers = new Map<string, TimerHandle>();\n private readonly lastArgs = new Map<string, readonly unknown[]>();\n\n debounce<T extends (...args: never[]) => unknown>(\n fn: T,\n options: DebounceOptions = {},\n ): T {\n const delay = options.delay ?? DEFAULT_DEBOUNCE_DELAY_MS;\n const leading = options.leading ?? false;\n const trailing = options.trailing ?? true;\n\n let timer: TimerHandle | null = null;\n let lastCallTime = 0;\n let lastResult: unknown;\n\n return ((...args: never[]) => {\n const now = Date.now();\n const shouldCallLeading = shouldCallOnLeadingEdge({\n now,\n lastCallTime,\n interval: delay,\n leadingEnabled: leading,\n isThrottled: timer !== null,\n });\n\n if (timer) {\n clearTimeout(timer);\n timer = null;\n }\n\n if (shouldCallLeading) {\n lastCallTime = now;\n lastResult = fn(...args);\n return lastResult;\n }\n\n if (trailing) {\n timer = setTimeout(() => {\n timer = null;\n lastCallTime = Date.now();\n lastResult = fn(...args);\n }, delay);\n }\n\n return lastResult;\n }) as T;\n }\n\n debounceByKey<T extends (...args: never[]) => unknown>(\n key: string,\n fn: T,\n delay: number = DEFAULT_DEBOUNCE_DELAY_MS,\n ): T {\n return ((...args: never[]) => {\n this.lastArgs.set(key, args);\n const existingTimer = this.timers.get(key);\n if (existingTimer) clearTimeout(existingTimer);\n\n const timer = setTimeout(() => {\n this.timers.delete(key);\n const pendingArgs = this.lastArgs.get(key);\n this.lastArgs.delete(key);\n if (pendingArgs) fn(...(pendingArgs as never[]));\n }, delay);\n\n this.timers.set(key, timer);\n }) as T;\n }\n\n cancelDebounce(key: string): void {\n const timer = this.timers.get(key);\n if (timer) {\n clearTimeout(timer);\n this.timers.delete(key);\n }\n this.lastArgs.delete(key);\n }\n\n flushDebounce<T extends (...args: never[]) => unknown>(\n key: string,\n fn: T,\n ): void {\n this.cancelDebounce(key);\n const args = this.lastArgs.get(key);\n if (args) {\n fn(...(args as never[]));\n this.lastArgs.delete(key);\n }\n }\n}\n\nexport class ThrottleManager {\n private readonly timers = new Map<string, TimerHandle>();\n private readonly lastArgs = new Map<string, readonly unknown[]>();\n\n throttle<T extends (...args: never[]) => unknown>(\n fn: T,\n options: ThrottleOptions = {},\n ): T {\n const interval = options.interval ?? DEFAULT_THROTTLE_INTERVAL_MS;\n const leading = options.leading ?? true;\n const trailing = options.trailing ?? false;\n\n let timer: TimerHandle | null = null;\n let lastCallTime = 0;\n let lastResult: unknown;\n let pendingArgs: readonly unknown[] | null = null;\n\n return ((...args: never[]) => {\n const now = Date.now();\n const timeSinceLastCall = now - lastCallTime;\n const shouldCall = shouldCallOnLeadingEdge({\n now,\n lastCallTime,\n interval,\n leadingEnabled: leading,\n isThrottled: timer !== null,\n });\n pendingArgs = args;\n\n if (shouldCall) {\n lastCallTime = now;\n lastResult = fn(...args);\n return lastResult;\n }\n\n if (trailing && !timer) {\n const delay = calculateTrailingDelay({ interval, timeSinceLastCall });\n timer = setTimeout(() => {\n timer = null;\n lastCallTime = Date.now();\n if (pendingArgs) {\n lastResult = fn(...(pendingArgs as never[]));\n pendingArgs = null;\n }\n }, delay);\n }\n\n return lastResult;\n }) as T;\n }\n\n throttleByKey<T extends (...args: never[]) => unknown>(\n key: string,\n fn: T,\n interval: number = DEFAULT_THROTTLE_INTERVAL_MS,\n ): T {\n return ((...args: never[]) => {\n const existingTimer = this.timers.get(key);\n if (existingTimer) {\n this.lastArgs.set(key, args);\n return;\n }\n\n fn(...args);\n\n const timer = setTimeout(() => {\n this.timers.delete(key);\n const pendingArgs = this.lastArgs.get(key);\n if (pendingArgs) {\n this.lastArgs.delete(key);\n fn(...(pendingArgs as never[]));\n const nextTimer = setTimeout(() => {\n this.timers.delete(key);\n }, interval);\n this.timers.set(key, nextTimer);\n }\n }, interval);\n\n this.timers.set(key, timer);\n }) as T;\n }\n\n cancelThrottle(key: string): void {\n const timer = this.timers.get(key);\n if (timer) {\n clearTimeout(timer);\n this.timers.delete(key);\n }\n this.lastArgs.delete(key);\n }\n\n isThrottled(key: string): boolean {\n return this.timers.has(key);\n }\n}\n\nexport const debounceManager = new DebounceManager();\nexport const throttleManager = new ThrottleManager();\n\nexport function debounce<T extends (...args: never[]) => unknown>(\n fn: T,\n delay?: number,\n): T {\n return debounceManager.debounce(fn, { delay });\n}\n\nexport function throttle<T extends (...args: never[]) => unknown>(\n fn: T,\n interval?: number,\n): T {\n return throttleManager.throttle(fn, { interval });\n}\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","export function asRecord(value: unknown): Record<string, unknown> {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) return {};\n return value as Record<string, unknown>;\n}\n\nexport function asStringArray(value: unknown, max: number): string[] {\n if (!Array.isArray(value)) return [];\n return value\n .filter((entry): entry is string => typeof entry === \"string\" && entry.trim().length > 0)\n .slice(0, max);\n}\n\nexport function asObjectArray(value: unknown): Record<string, unknown>[] {\n if (!Array.isArray(value)) return [];\n return value.filter(\n (entry): entry is Record<string, unknown> =>\n typeof entry === \"object\" && entry !== null && !Array.isArray(entry),\n );\n}\n\nexport function asTrimmedOptionalString(value: unknown): string | undefined {\n if (typeof value !== \"string\") return undefined;\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n}\n\nexport function clampScore(value: unknown, min: number, max: number): number | null {\n if (typeof value !== \"number\" || !Number.isFinite(value)) return null;\n return Math.max(min, Math.min(max, Math.round(value)));\n}\n\nexport function oneOfCatalog<T extends readonly string[]>(\n catalog: T,\n value: unknown,\n): T[number] | null {\n return catalog.includes(value as T[number]) ? (value as T[number]) : null;\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\\n([\\s\\S]*?)\\n```/;\nexport const JSON_OBJECT_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);\n}\n\nexport function extractSseDataPayload(line: string): string {\n return line.slice(SSE_PREFIX.length);\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","import { AIError } from \"../errors/ai-error\";\nimport { AIErrorType } from \"../errors/ai-error-types\";\nimport {\n isSseDataLine,\n extractSseDataPayload,\n isSseDoneMarker,\n} from \"./sse-lines\";\n\n/**\n * Extracts the text delta from a single SSE `data:` payload, or null when the\n * payload carries no displayable text. Provider-specific: each provider passes\n * its own extractor so the line-buffering machinery below stays generic.\n */\nexport type SseDeltaExtractor = (payload: string) => string | null;\n\nexport interface StreamingParserCallbacks {\n readonly onChunk: (content: string) => void;\n}\n\nexport class StreamingResponseParser {\n private readonly decoder = new TextDecoder();\n\n constructor(\n private readonly callbacks: StreamingParserCallbacks,\n private readonly extractDelta: SseDeltaExtractor,\n ) {}\n\n async parse(stream: ReadableStream<Uint8Array>): Promise<string> {\n const reader = stream.getReader();\n const contentChunks: string[] = [];\n let buffer = \"\";\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 const content = this.extractDelta(payload);\n if (content !== null) {\n contentChunks.push(content);\n this.callbacks.onChunk(content);\n }\n };\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += this.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 += this.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 contentChunks.join(\"\");\n }\n}\n","\nimport { JSON_CODE_BLOCK_PATTERN, JSON_OBJECT_PATTERN } 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];\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 extractJsonCandidate(content: string): string {\n return (\n extractJsonFromCodeFence(content) ??\n extractJsonObject(content) ??\n content\n );\n}\n","\nimport { AIError } from \"../errors/ai-error\";\nimport { AIErrorType } from \"../errors/ai-error-types\";\nimport { extractJsonCandidate } 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 (error) {\n throw new AIError(\n AIErrorType.UNKNOWN_ERROR,\n \"Failed to parse structured response as JSON\",\n error instanceof Error ? error : undefined,\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 {\n extractSseDataPayload,\n isSseDataLine,\n isSseDoneMarker,\n} from \"../parsers/sse-lines\";\nimport type { SseDeltaExtractor } from \"../parsers/streaming-response.parser\";\n\nexport const SSE_BRIDGE_EVENTS = {\n delta: \"delta\",\n done: \"done\",\n error: \"error\",\n} as const;\n\nexport interface SseResponseOptions {\n readonly donePayload: unknown;\n readonly errorCode: (error: unknown) => string;\n readonly onStreamFailure?: (error: unknown) => Promise<void> | void;\n /** Provider-specific: pulls the displayable text delta out of an SSE payload. */\n readonly extractDelta: SseDeltaExtractor;\n}\n\nexport function createSseResponse(\n openUpstream: () => Promise<ReadableStream<Uint8Array>>,\n options: SseResponseOptions,\n): Response {\n const encoder = new TextEncoder();\n const decoder = new TextDecoder();\n const stream = new ReadableStream<Uint8Array>({\n async start(controller) {\n let closed = false;\n const emit = (event: string, data: unknown) => {\n if (closed) return;\n try {\n controller.enqueue(\n encoder.encode(`event: ${event}\\ndata: ${JSON.stringify(data)}\\n\\n`),\n );\n } catch {\n closed = true;\n }\n };\n const finish = () => {\n if (closed) return;\n closed = true;\n try {\n controller.close();\n } catch {\n closed = true;\n }\n };\n let delivered = false;\n const consumeLine = (line: string): boolean => {\n const trimmed = line.trim();\n if (!isSseDataLine(trimmed)) return false;\n const payload = extractSseDataPayload(trimmed);\n if (isSseDoneMarker(payload)) return true;\n const text = options.extractDelta(payload);\n if (text) {\n delivered = true;\n emit(SSE_BRIDGE_EVENTS.delta, { text });\n }\n return false;\n };\n try {\n const upstream = await openUpstream();\n const reader = upstream.getReader();\n let buffer = \"\";\n let finished = false;\n while (!finished) {\n const { value, done: readerDone } = await reader.read();\n if (readerDone) break;\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop() ?? \"\";\n for (const line of lines) {\n finished = consumeLine(line);\n if (finished) break;\n }\n }\n if (!finished && buffer.length > 0) consumeLine(buffer);\n emit(SSE_BRIDGE_EVENTS.done, options.donePayload);\n finish();\n } catch (err) {\n if (!delivered && options.onStreamFailure) {\n await options.onStreamFailure(err);\n }\n emit(SSE_BRIDGE_EVENTS.error, { code: options.errorCode(err) });\n finish();\n }\n },\n });\n return new Response(stream, {\n headers: {\n \"content-type\": \"text/event-stream; charset=utf-8\",\n \"cache-control\": \"no-cache, no-transform\",\n \"x-accel-buffering\": \"no\",\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 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;\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","\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 class AIError extends Error {\n public readonly code: AIErrorCode;\n public readonly cause?: unknown;\n\n constructor(message: string, code: AIErrorCode, cause?: unknown) {\n super(message);\n this.name = 'AIError';\n this.code = code;\n this.cause = cause;\n }\n\n static from(error: unknown, fallbackCode: AIErrorCode = 'UNKNOWN'): AIError {\n if (error instanceof AIError) return error;\n if (error instanceof Error) {\n return new AIError(error.message, mapMessageToCode(error.message, fallbackCode), error);\n }\n return new AIError(String(error), fallbackCode, error);\n }\n}\n\nfunction mapMessageToCode(message: string, fallback: AIErrorCode): AIErrorCode {\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 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 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","\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","\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 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 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 notify = (): void => {\n const resolve = wake;\n wake = null;\n resolve?.();\n };\n\n const completion = this.chatStream(request, {\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 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 }\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","\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 throw new AIError(\n event.error.type === \"rate_limit_error\"\n ? AIErrorType.RATE_LIMIT_ERROR\n : AIErrorType.SERVER_ERROR,\n event.error.message || \"Anthropic stream failed mid-flight\",\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","\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 GROQ_BASE_URL = \"https://api.groq.com/openai/v1\" as const;\nexport const CHAT_COMPLETIONS_PATH = \"/chat/completions\" as const;\n\nexport const GROQ_TIMEOUTS = {\n DEFAULT: 30000,\n STREAMING: 60000,\n} as const;\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","\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\";\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 config: GroqProviderConfig) {}\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.config.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.config.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.config.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.config.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 { GroqChatRequest, GroqChatResponse, GroqProviderConfig, StreamRequestOptions } from \"./groq.entities\";\nimport type { IRequestExecutor } from \"../../core/executor\";\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 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. Composition root for\n * GroqProvider — no global state.\n */\nexport class GroqHttpClient {\n private readonly transport: GroqHttpTransport;\n private readonly executor: IRequestExecutor<[GroqChatRequest], GroqChatResponse>;\n\n constructor(config: GroqProviderConfig, deps: GroqHttpClientDeps = {}) {\n this.transport = deps.transport ?? new GroqHttpTransport(config);\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, config.apiKey),\n }),\n new RetryExecutor<[GroqChatRequest], GroqChatResponse>(retryManager),\n new QueueExecutor<[GroqChatRequest], GroqChatResponse>(queue, QUEUE_PRIORITY_USER_REQUEST),\n ]);\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\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 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 const errorBody = (chunk as unknown as GroqErrorResponse).error;\n if (errorBody) {\n throw new AIError(\n AIErrorType.SERVER_ERROR,\n errorBody.message || \"Groq stream failed mid-flight\",\n );\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\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 { 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","\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","\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 { AIError, AIErrorType } 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 return response.ok ? 'healthy' : 'unavailable';\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 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 request.systemPrompt && request.systemPrompt.length > 0\n ? { parts: [{ text: request.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 throw new Error(`Gemini API error: ${response.statusText}`);\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 throw new Error(`Gemini API error: ${response.statusText}`);\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 Error('No image data in 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","\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 { 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","\nexport interface PrunaRequest {\n model?: string;\n image?: string;\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 generateWithPruna?: (\n request: PrunaRequest,\n apiKey: string,\n signal?: AbortSignal,\n onProgress?: (stage: PrunaProgressStage['stage'], attempt?: number) => void,\n ) => AsyncGenerator<PrunaProgressStage>;\n submitPrediction?: (\n modelId: string,\n request: PrunaRequest,\n apiKey: string,\n signal?: AbortSignal,\n onProgress?: (stage: PrunaProgressStage['stage'], attempt?: number) => void,\n ) => Promise<{ output?: { url?: string }; status_url?: string; generation_url?: string }>;\n pollForResult?: (\n pollUrl: string,\n apiKey: string,\n maxAttempts: number,\n intervalMs: number,\n signal?: AbortSignal,\n onProgress?: (stage: PrunaProgressStage['stage'], attempt?: number) => void,\n ) => Promise<string>;\n}\n\nlet prunaCorePromise: Promise<PrunaCore> | null = null;\n\nasync function loadPrunaCore(): Promise<PrunaCore> {\n if (!prunaCorePromise) {\n const specifier = '@umituz/pruna-provider/core';\n prunaCorePromise = import(specifier) as Promise<PrunaCore>;\n }\n return prunaCorePromise;\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 prunaCore = await loadPrunaCore();\n\n if (prunaCore.generateWithPruna) {\n yield* prunaCore.generateWithPruna(request, apiKey, signal, onProgress);\n return;\n }\n\n if (!prunaCore.submitPrediction || !prunaCore.pollForResult) {\n throw new Error('@umituz/pruna-provider/core does not export required functions');\n }\n\n const modelId = request.model || (request.image ? 'p-image-edit' : 'p-image');\n const prediction = await prunaCore.submitPrediction(modelId, request, apiKey, signal, onProgress);\n\n if (prediction.output && typeof prediction.output === 'object' && 'url' in prediction.output) {\n yield {\n stage: 'predicting',\n result: { url: prediction.output.url as string, model: modelId },\n };\n return;\n }\n\n const pollUrl = prediction.status_url || prediction.generation_url;\n if (!pollUrl) {\n throw new Error('Pruna prediction response missing polling URL');\n }\n\n const resultUrl = await prunaCore.pollForResult(pollUrl, apiKey, 60, 2000, signal, onProgress);\n yield { stage: 'polling', result: { url: resultUrl, model: modelId } };\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';\nexport { generateWithPruna } from './pruna-generate';\nexport type {\n PrunaRequest,\n PrunaProgressStage,\n PrunaCore,\n} from './pruna-generate';\n\n/**\n * Placeholder seat for the Pruna fleet: registering it makes the provider\n * visible to health/fallback machinery, while actual generation goes through\n * the lazy-loaded `generateWithPruna` helper (peer optional dependency).\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 throw new AIError(AIErrorType.UNKNOWN_ERROR, 'Use generateWithPruna instead');\n }\n\n async generateVideo(_request: VideoGenerationRequest): Promise<GeneratedContent> {\n throw new AIError(AIErrorType.UNKNOWN_ERROR, 'Use generateWithPruna instead');\n }\n\n async imageToVideo(_request: ImageToVideoRequest): Promise<GeneratedContent> {\n throw new AIError(AIErrorType.UNKNOWN_ERROR, 'Use generateWithPruna instead');\n }\n\n async videoToVideo(_request: VideoToVideoRequest): Promise<GeneratedContent> {\n throw new AIError(AIErrorType.UNKNOWN_ERROR, 'Use generateWithPruna instead');\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","\nconst BASE_36_RADIX = 36;\nconst DECIMAL_OFFSET = 2;\n\nexport function generateRandomBase36Suffix(\n length: number,\n random: () => number = Math.random,\n): string {\n if (length <= 0) return \"\";\n const raw = random().toString(BASE_36_RADIX).slice(DECIMAL_OFFSET);\n if (raw.length >= length) return raw.slice(0, length);\n\n let result = raw;\n while (result.length < length) {\n result += random().toString(BASE_36_RADIX).slice(DECIMAL_OFFSET);\n }\n return result.slice(0, length);\n}\n","\nimport { generateRandomBase36Suffix } from \"../../core/calculations/random-base36-suffix\";\nimport {\n MESSAGE_ID_PREFIX,\n CHAT_MESSAGE_ID_SUFFIX_LENGTH,\n} from \"../../core/constants/identifier.constants\";\n\nconst ID_PART_DELIMITER = \"-\";\n\nexport class ChatIdGenerator {\n private counter = 0;\n private readonly randomLength: number;\n\n constructor(randomLength: number = CHAT_MESSAGE_ID_SUFFIX_LENGTH) {\n this.randomLength = randomLength;\n }\n\n next(sender: string): string {\n this.counter += 1;\n const random = generateRandomBase36Suffix(this.randomLength);\n return [\n MESSAGE_ID_PREFIX,\n Date.now(),\n sender,\n this.counter,\n random,\n ].join(ID_PART_DELIMITER);\n }\n}\n\nexport const chatIdGenerator = new ChatIdGenerator();\n","\nimport type { IMessageFormatter } from \"../interfaces\";\nimport type { ChatMessage } from \"../entities\";\nimport type { ChatMessage as CoreChatMessage } from \"../../core/types\";\nimport type { ChatIdGenerator } from \"./chat-id-generator\";\nimport { chatIdGenerator as defaultIdGenerator } from \"./chat-id-generator\";\nimport { ASSISTANT_ROLE, USER_ROLE } from \"../../core/constants/identifier.constants\";\n\nexport class MessageFormatter implements IMessageFormatter {\n constructor(private readonly idGenerator: ChatIdGenerator = defaultIdGenerator) {}\n\n /** Maps chat-domain history to neutral core messages; system senders are\n * dropped — the system prompt travels on the request's own slot. */\n toCoreMessages(messages: ReadonlyArray<ChatMessage>): CoreChatMessage[] {\n const coreMessages: CoreChatMessage[] = [];\n for (const message of messages) {\n if (message.sender === \"system\") continue;\n coreMessages.push({\n role: message.sender === \"user\" ? USER_ROLE : ASSISTANT_ROLE,\n content: message.content,\n });\n }\n return coreMessages;\n }\n\n toChatMessage(content: string, sender: ChatMessage[\"sender\"]): ChatMessage {\n return {\n id: this.idGenerator.next(sender),\n sender,\n content: content.trim(),\n timestamp: new Date().toISOString(),\n type: \"text\",\n };\n }\n}\n\nexport const messageFormatter = new MessageFormatter();\n","\nimport type { ChatConfig } from \"../entities\";\n\nexport interface SystemPromptStrategy {\n resolve(config: ChatConfig): string | undefined;\n}\n\nexport const DEFAULT_PROMPT_STRATEGY: SystemPromptStrategy = {\n resolve: (config) => {\n if (config.systemPrompt && config.systemPrompt.length > 0) {\n return config.systemPrompt;\n }\n return undefined;\n },\n};\n","\nimport type {\n IChatService,\n SystemPromptStrategy,\n} from \"../interfaces\";\nimport type {\n ChatMessage,\n ChatConfig,\n ChatConversation,\n SendMessageInput,\n SendMessageResult,\n IChatStorage,\n ChatTokenUsage,\n} from \"../entities\";\nimport type { GenerationResult, StreamCallbacks, TextRequest } from \"../../core/types\";\nimport { AIError, AIErrorType } from \"../../core/errors\";\nimport type { ITextProvider } from \"../../providers/base/provider.types\";\nimport { ProviderFactory } from \"../../providers/factory/provider.factory\";\nimport { messageFormatter } from \"../utils/message-formatter\";\nimport { DEFAULT_PROMPT_STRATEGY } from \"../utils/prompt-strategy\";\n\nconst DEFAULT_CONFIG: ChatConfig = {\n temperature: 0.8,\n maxTokens: 500,\n};\n\n/**\n * Conversation engine over the neutral text surface. Accepts either a\n * single ITextProvider or a ProviderFactory (which brings tier defaults,\n * health checks, and fallback across providers). Model choice is tier-based:\n * `config.tier ?? provider default` — no hardcoded model names anywhere.\n */\nexport class ChatService implements IChatService {\n private config: ChatConfig = DEFAULT_CONFIG;\n private promptStrategy: SystemPromptStrategy = DEFAULT_PROMPT_STRATEGY;\n private storage: IChatStorage | null = null;\n\n constructor(\n private readonly engine: ITextProvider | ProviderFactory,\n ) {}\n\n initialize(config: ChatConfig): void {\n this.config = { ...DEFAULT_CONFIG, ...config };\n }\n\n updateConfig(config: Partial<ChatConfig>): void {\n this.config = { ...this.config, ...config };\n }\n\n setPromptStrategy(strategy: SystemPromptStrategy): void {\n this.promptStrategy = strategy;\n }\n\n setStorage(storage: IChatStorage): void {\n this.storage = storage;\n }\n\n async getConversation(conversationId: string): Promise<ChatConversation | null> {\n const storage = this.requireStorage();\n const messages = await storage.getMessages(conversationId);\n if (messages.length === 0) return null;\n const last = messages[messages.length - 1];\n const first = messages[0];\n const companionId = String(first.metadata?.[\"companionId\"] ?? \"unknown\");\n const companionName = String(first.metadata?.[\"companionName\"] ?? \"Unknown\");\n return {\n id: conversationId,\n companionId,\n companionName,\n lastMessage: last,\n messageCount: messages.length,\n updatedAt: last.timestamp,\n };\n }\n\n async getConversations(): Promise<ChatConversation[]> {\n return [];\n }\n\n async sendMessage(input: SendMessageInput): Promise<SendMessageResult> {\n const userMessage: ChatMessage = {\n ...messageFormatter.toChatMessage(input.text, \"user\"),\n type: input.type ?? \"text\",\n ...(input.imageUrl !== undefined ? { imageUrl: input.imageUrl } : {}),\n };\n\n const aiResponse = await this.generateAIResponse(\n input.companionId,\n input.text,\n [],\n );\n\n return { userMessage, aiResponse };\n }\n\n async generateAIResponse(\n companionId: string,\n userMessage: string,\n context: ReadonlyArray<ChatMessage> = [],\n ): Promise<ChatMessage> {\n const result = await this.run({\n ...this.buildRequest(userMessage, context),\n });\n\n return {\n ...messageFormatter.toChatMessage(result.text, \"assistant\"),\n metadata: {\n companionId,\n model: result.model,\n usage: {\n input_tokens: result.usage?.inputTokens,\n output_tokens: result.usage?.outputTokens,\n total_tokens: result.usage?.totalTokens,\n },\n finishReason: result.finishReason,\n },\n };\n }\n\n async generateStreamingResponse(\n userMessage: string,\n context: ReadonlyArray<ChatMessage>,\n onChunk: (chunk: string) => void,\n ): Promise<string> {\n const request = this.buildRequest(userMessage, context);\n const result = await this.runStream(request, { onChunk });\n return result.text;\n }\n\n private buildRequest(\n userMessage: string,\n context: ReadonlyArray<ChatMessage>,\n ): TextRequest {\n const messages = messageFormatter.toCoreMessages(context);\n messages.push({ role: \"user\", content: userMessage });\n return {\n messages,\n systemPrompt: this.resolveSystemPrompt(),\n model: this.config.model,\n tier: this.config.tier,\n temperature: this.config.temperature,\n maxTokens: this.config.maxTokens,\n };\n }\n\n private resolveSystemPrompt(): string | undefined {\n const prompt = this.promptStrategy.resolve(this.config);\n return prompt && prompt.length > 0 ? prompt : undefined;\n }\n\n private async run(request: TextRequest): Promise<GenerationResult> {\n if (this.engine instanceof ProviderFactory) {\n return this.engine.chat(request);\n }\n return this.engine.generate(request);\n }\n\n private async runStream(\n request: TextRequest,\n callbacks: Pick<StreamCallbacks, \"onChunk\">,\n ): Promise<GenerationResult> {\n if (this.engine instanceof ProviderFactory) {\n return this.engine.chatStream(request, callbacks);\n }\n return this.engine.stream(request, callbacks);\n }\n\n private requireStorage(): IChatStorage {\n if (!this.storage) {\n throw new AIError(\n AIErrorType.MISSING_CONFIG,\n \"ChatService.getConversation requires setStorage() to be called first.\",\n );\n }\n return this.storage;\n }\n}\n\nexport function extractTokenUsage(message: ChatMessage): ChatTokenUsage | null {\n const meta = message.metadata;\n if (!meta) return null;\n const usage = meta[\"usage\"];\n if (!usage || typeof usage !== \"object\") return null;\n const u = usage as Record<string, unknown>;\n const inputTokens = readNumber(u, [\"input_tokens\", \"prompt_tokens\"]);\n const outputTokens = readNumber(u, [\"output_tokens\", \"completion_tokens\"]);\n const totalTokens = readNumber(u, [\"total_tokens\"]);\n if (inputTokens === null || outputTokens === null || totalTokens === null) {\n return null;\n }\n return {\n promptTokens: inputTokens,\n completionTokens: outputTokens,\n totalTokens,\n };\n}\n\nfunction readNumber(\n source: Record<string, unknown>,\n keys: ReadonlyArray<string>,\n): number | null {\n for (const key of keys) {\n const value = source[key];\n if (typeof value === \"number\") return value;\n }\n return null;\n}\n"]}
1
+ {"version":3,"sources":["../src/core/tiers/index.ts","../src/core/errors/ai-error-types.ts","../src/core/errors/ai-error.ts","../src/core/errors/error-classifier.ts","../src/core/errors/http-status-classifier.ts","../src/core/errors/user-friendly-error-resolver.ts","../src/core/errors/error-resolver.ts","../src/core/errors/response-error-message-extractor.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/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/calculations/timing-window.ts","../src/core/utils/debounce.ts","../src/core/utils/api-key-validator.ts","../src/core/utils/coercion.util.ts","../src/core/constants/protocol.constants.ts","../src/core/parsers/sse-lines.ts","../src/core/parsers/streaming-response.parser.ts","../src/core/parsers/json-content-extractor.ts","../src/core/parsers/json-response.parser.ts","../src/core/parsers/structured-prompt.builder.ts","../src/core/sse/sse-response.service.ts","../src/providers/base/provider.types.ts","../src/content/domain/limits/ProviderTimingConfig.ts","../src/content/domain/calculations/RetryBackoffDelay.ts","../src/providers/base/base.provider.ts","../src/providers/factory/provider.factory.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/providers/groq/groq.constants.ts","../src/providers/groq/groq-request.builder.ts","../src/providers/groq/groq-http-transport.ts","../src/providers/groq/groq-http-client.ts","../src/providers/groq/groq-sse.ts","../src/providers/groq/groq.provider.ts","../src/content/domain/predicates/ProviderCostEstimator.ts","../src/content/domain/limits/ModelDefaults.ts","../src/providers/gemini/gemini.provider.ts","../src/content/domain/predicates/FalImageRenderingOptions.ts","../src/providers/fal/fal.provider.ts","../src/providers/pruna/pruna-generate.ts","../src/providers/pruna/pruna.provider.ts","../src/providers/factory/create-ai.ts","../src/core/calculations/random-base36-suffix.ts","../src/chat/utils/chat-id-generator.ts","../src/chat/utils/message-formatter.ts","../src/chat/utils/prompt-strategy.ts","../src/chat/services/chat.service.ts"],"names":["AIErrorType","retryManager","findLastIndex"],"mappings":"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","file":"index.js","sourcesContent":["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","\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 { 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 { AIError } from \"./ai-error\";\nimport { AIErrorType, USER_FRIENDLY_ERROR_MESSAGES } from \"./ai-error-types\";\n\nconst KEYWORD_FALLBACK_RULES: ReadonlyArray<{ keywords: ReadonlyArray<string>; type: AIErrorType }> = [\n { keywords: [\"api key\", \"unauthorized\"], type: AIErrorType.INVALID_API_KEY },\n { keywords: [\"rate limit\"], type: AIErrorType.RATE_LIMIT_ERROR },\n { keywords: [\"network\", \"fetch\"], type: AIErrorType.NETWORK_ERROR },\n { keywords: [\"abort\"], type: AIErrorType.ABORT_ERROR },\n];\n\nexport function resolveUserFriendlyErrorMessage(error: unknown): string {\n if (error instanceof AIError) {\n return USER_FRIENDLY_ERROR_MESSAGES[error.type];\n }\n\n if (error instanceof Error) {\n const lower = error.message.toLowerCase();\n for (const rule of KEYWORD_FALLBACK_RULES) {\n if (rule.keywords.some((kw) => lower.includes(kw))) {\n return USER_FRIENDLY_ERROR_MESSAGES[rule.type];\n }\n }\n if (error.message.length > 0) return error.message;\n }\n\n return USER_FRIENDLY_ERROR_MESSAGES[AIErrorType.UNKNOWN_ERROR];\n}\n","\nimport { resolveUserFriendlyErrorMessage } from \"./user-friendly-error-resolver\";\nimport { AIError } from \"./ai-error\";\nimport { AIErrorType, USER_FRIENDLY_ERROR_MESSAGES } from \"./ai-error-types\";\nimport type { AIErrorMetadata } from \"./ai-error\";\n\nexport const resolveUserFriendlyMessage = resolveUserFriendlyErrorMessage;\n\nexport interface LoggedError {\n readonly message: string;\n readonly type: string;\n readonly stack?: string;\n readonly metadata?: AIErrorMetadata;\n}\n\nexport function formatErrorForLogging(error: unknown): LoggedError {\n if (error instanceof AIError) {\n return {\n message: error.message,\n type: error.type,\n stack: error.stack,\n metadata: error.metadata,\n };\n }\n if (error instanceof Error) {\n return { message: error.message, type: error.name, stack: error.stack };\n }\n return { message: String(error), type: typeof error };\n}\n\nexport { AIErrorType, USER_FRIENDLY_ERROR_MESSAGES };\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 { 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","\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 LeadingEdgeParams {\n readonly now: number;\n readonly lastCallTime: number;\n readonly interval: number;\n readonly leadingEnabled: boolean;\n readonly isThrottled: boolean;\n}\n\nexport function shouldCallOnLeadingEdge(params: LeadingEdgeParams): boolean {\n const { now, lastCallTime, interval, leadingEnabled, isThrottled } = params;\n if (!leadingEnabled) return false;\n if (isThrottled) return false;\n return now - lastCallTime >= interval;\n}\n\nexport interface TrailingDelayParams {\n readonly interval: number;\n readonly timeSinceLastCall: number;\n}\n\nexport function calculateTrailingDelay(params: TrailingDelayParams): number {\n return Math.max(0, params.interval - params.timeSinceLastCall);\n}\n\nexport function isWithinWindow(now: number, lastCallTime: number, interval: number): boolean {\n return now - lastCallTime < interval;\n}\n","\nimport {\n shouldCallOnLeadingEdge,\n calculateTrailingDelay,\n} from \"../calculations/timing-window\";\n\ntype TimerHandle = ReturnType<typeof setTimeout>;\n\nexport interface DebounceOptions {\n readonly delay?: number;\n readonly leading?: boolean;\n readonly trailing?: boolean;\n}\n\nexport interface ThrottleOptions {\n readonly interval?: number;\n readonly leading?: boolean;\n readonly trailing?: boolean;\n}\n\nconst DEFAULT_DEBOUNCE_DELAY_MS = 300;\nconst DEFAULT_THROTTLE_INTERVAL_MS = 1000;\n\nexport class DebounceManager {\n private readonly timers = new Map<string, TimerHandle>();\n private readonly lastArgs = new Map<string, readonly unknown[]>();\n\n debounce<T extends (...args: never[]) => unknown>(\n fn: T,\n options: DebounceOptions = {},\n ): T {\n const delay = options.delay ?? DEFAULT_DEBOUNCE_DELAY_MS;\n const leading = options.leading ?? false;\n const trailing = options.trailing ?? true;\n\n let timer: TimerHandle | null = null;\n let lastCallTime = 0;\n let lastResult: unknown;\n\n return ((...args: never[]) => {\n const now = Date.now();\n const shouldCallLeading = shouldCallOnLeadingEdge({\n now,\n lastCallTime,\n interval: delay,\n leadingEnabled: leading,\n isThrottled: timer !== null,\n });\n\n if (timer) {\n clearTimeout(timer);\n timer = null;\n }\n\n if (shouldCallLeading) {\n lastCallTime = now;\n lastResult = fn(...args);\n return lastResult;\n }\n\n if (trailing) {\n timer = setTimeout(() => {\n timer = null;\n lastCallTime = Date.now();\n lastResult = fn(...args);\n }, delay);\n }\n\n return lastResult;\n }) as T;\n }\n\n debounceByKey<T extends (...args: never[]) => unknown>(\n key: string,\n fn: T,\n delay: number = DEFAULT_DEBOUNCE_DELAY_MS,\n ): T {\n return ((...args: never[]) => {\n this.lastArgs.set(key, args);\n const existingTimer = this.timers.get(key);\n if (existingTimer) clearTimeout(existingTimer);\n\n const timer = setTimeout(() => {\n this.timers.delete(key);\n const pendingArgs = this.lastArgs.get(key);\n this.lastArgs.delete(key);\n if (pendingArgs) fn(...(pendingArgs as never[]));\n }, delay);\n\n this.timers.set(key, timer);\n }) as T;\n }\n\n cancelDebounce(key: string): void {\n const timer = this.timers.get(key);\n if (timer) {\n clearTimeout(timer);\n this.timers.delete(key);\n }\n this.lastArgs.delete(key);\n }\n\n flushDebounce<T extends (...args: never[]) => unknown>(\n key: string,\n fn: T,\n ): void {\n this.cancelDebounce(key);\n const args = this.lastArgs.get(key);\n if (args) {\n fn(...(args as never[]));\n this.lastArgs.delete(key);\n }\n }\n}\n\nexport class ThrottleManager {\n private readonly timers = new Map<string, TimerHandle>();\n private readonly lastArgs = new Map<string, readonly unknown[]>();\n\n throttle<T extends (...args: never[]) => unknown>(\n fn: T,\n options: ThrottleOptions = {},\n ): T {\n const interval = options.interval ?? DEFAULT_THROTTLE_INTERVAL_MS;\n const leading = options.leading ?? true;\n const trailing = options.trailing ?? false;\n\n let timer: TimerHandle | null = null;\n let lastCallTime = 0;\n let lastResult: unknown;\n let pendingArgs: readonly unknown[] | null = null;\n\n return ((...args: never[]) => {\n const now = Date.now();\n const timeSinceLastCall = now - lastCallTime;\n const shouldCall = shouldCallOnLeadingEdge({\n now,\n lastCallTime,\n interval,\n leadingEnabled: leading,\n isThrottled: timer !== null,\n });\n pendingArgs = args;\n\n if (shouldCall) {\n lastCallTime = now;\n lastResult = fn(...args);\n return lastResult;\n }\n\n if (trailing && !timer) {\n const delay = calculateTrailingDelay({ interval, timeSinceLastCall });\n timer = setTimeout(() => {\n timer = null;\n lastCallTime = Date.now();\n if (pendingArgs) {\n lastResult = fn(...(pendingArgs as never[]));\n pendingArgs = null;\n }\n }, delay);\n }\n\n return lastResult;\n }) as T;\n }\n\n throttleByKey<T extends (...args: never[]) => unknown>(\n key: string,\n fn: T,\n interval: number = DEFAULT_THROTTLE_INTERVAL_MS,\n ): T {\n return ((...args: never[]) => {\n const existingTimer = this.timers.get(key);\n if (existingTimer) {\n this.lastArgs.set(key, args);\n return;\n }\n\n fn(...args);\n\n const timer = setTimeout(() => {\n this.timers.delete(key);\n const pendingArgs = this.lastArgs.get(key);\n if (pendingArgs) {\n this.lastArgs.delete(key);\n fn(...(pendingArgs as never[]));\n const nextTimer = setTimeout(() => {\n this.timers.delete(key);\n }, interval);\n this.timers.set(key, nextTimer);\n }\n }, interval);\n\n this.timers.set(key, timer);\n }) as T;\n }\n\n cancelThrottle(key: string): void {\n const timer = this.timers.get(key);\n if (timer) {\n clearTimeout(timer);\n this.timers.delete(key);\n }\n this.lastArgs.delete(key);\n }\n\n isThrottled(key: string): boolean {\n return this.timers.has(key);\n }\n}\n\nexport const debounceManager = new DebounceManager();\nexport const throttleManager = new ThrottleManager();\n\nexport function debounce<T extends (...args: never[]) => unknown>(\n fn: T,\n delay?: number,\n): T {\n return debounceManager.debounce(fn, { delay });\n}\n\nexport function throttle<T extends (...args: never[]) => unknown>(\n fn: T,\n interval?: number,\n): T {\n return throttleManager.throttle(fn, { interval });\n}\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","export function asRecord(value: unknown): Record<string, unknown> {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) return {};\n return value as Record<string, unknown>;\n}\n\nexport function asStringArray(value: unknown, max: number): string[] {\n if (!Array.isArray(value)) return [];\n return value\n .filter((entry): entry is string => typeof entry === \"string\" && entry.trim().length > 0)\n .slice(0, max);\n}\n\nexport function asObjectArray(value: unknown): Record<string, unknown>[] {\n if (!Array.isArray(value)) return [];\n return value.filter(\n (entry): entry is Record<string, unknown> =>\n typeof entry === \"object\" && entry !== null && !Array.isArray(entry),\n );\n}\n\nexport function asTrimmedOptionalString(value: unknown): string | undefined {\n if (typeof value !== \"string\") return undefined;\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n}\n\nexport function clampScore(value: unknown, min: number, max: number): number | null {\n if (typeof value !== \"number\" || !Number.isFinite(value)) return null;\n return Math.max(min, Math.min(max, Math.round(value)));\n}\n\nexport function oneOfCatalog<T extends readonly string[]>(\n catalog: T,\n value: unknown,\n): T[number] | null {\n return catalog.includes(value as T[number]) ? (value as T[number]) : null;\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","import { AIError } from \"../errors/ai-error\";\nimport { AIErrorType } from \"../errors/ai-error-types\";\nimport {\n isSseDataLine,\n extractSseDataPayload,\n isSseDoneMarker,\n} from \"./sse-lines\";\n\n/**\n * Extracts the text delta from a single SSE `data:` payload, or null when the\n * payload carries no displayable text. Provider-specific: each provider passes\n * its own extractor so the line-buffering machinery below stays generic.\n */\nexport type SseDeltaExtractor = (payload: string) => string | null;\n\nexport interface StreamingParserCallbacks {\n readonly onChunk: (content: string) => void;\n}\n\nexport class StreamingResponseParser {\n private readonly decoder = new TextDecoder();\n\n constructor(\n private readonly callbacks: StreamingParserCallbacks,\n private readonly extractDelta: SseDeltaExtractor,\n ) {}\n\n async parse(stream: ReadableStream<Uint8Array>): Promise<string> {\n const reader = stream.getReader();\n const contentChunks: string[] = [];\n let buffer = \"\";\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 const content = this.extractDelta(payload);\n if (content !== null) {\n contentChunks.push(content);\n this.callbacks.onChunk(content);\n }\n };\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += this.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 += this.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 contentChunks.join(\"\");\n }\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 {\n extractSseDataPayload,\n isSseDataLine,\n isSseDoneMarker,\n} from \"../parsers/sse-lines\";\nimport type { SseDeltaExtractor } from \"../parsers/streaming-response.parser\";\n\nexport const SSE_BRIDGE_EVENTS = {\n delta: \"delta\",\n done: \"done\",\n error: \"error\",\n} as const;\n\nexport interface SseResponseOptions {\n readonly donePayload: unknown;\n readonly errorCode: (error: unknown) => string;\n readonly onStreamFailure?: (error: unknown) => Promise<void> | void;\n /** Provider-specific: pulls the displayable text delta out of an SSE payload. */\n readonly extractDelta: SseDeltaExtractor;\n}\n\nexport function createSseResponse(\n openUpstream: () => Promise<ReadableStream<Uint8Array>>,\n options: SseResponseOptions,\n): Response {\n const encoder = new TextEncoder();\n const decoder = new TextDecoder();\n const stream = new ReadableStream<Uint8Array>({\n async start(controller) {\n let closed = false;\n const emit = (event: string, data: unknown) => {\n if (closed) return;\n try {\n controller.enqueue(\n encoder.encode(`event: ${event}\\ndata: ${JSON.stringify(data)}\\n\\n`),\n );\n } catch {\n closed = true;\n }\n };\n const finish = () => {\n if (closed) return;\n closed = true;\n try {\n controller.close();\n } catch {\n closed = true;\n }\n };\n let delivered = false;\n const consumeLine = (line: string): boolean => {\n const trimmed = line.trim();\n if (!isSseDataLine(trimmed)) return false;\n const payload = extractSseDataPayload(trimmed);\n if (isSseDoneMarker(payload)) return true;\n const text = options.extractDelta(payload);\n if (text) {\n delivered = true;\n emit(SSE_BRIDGE_EVENTS.delta, { text });\n }\n return false;\n };\n try {\n const upstream = await openUpstream();\n const reader = upstream.getReader();\n let buffer = \"\";\n let finished = false;\n while (!finished) {\n const { value, done: readerDone } = await reader.read();\n if (readerDone) break;\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop() ?? \"\";\n for (const line of lines) {\n finished = consumeLine(line);\n if (finished) break;\n }\n }\n if (!finished && buffer.length > 0) consumeLine(buffer);\n emit(SSE_BRIDGE_EVENTS.done, options.donePayload);\n finish();\n } catch (err) {\n if (!delivered && options.onStreamFailure) {\n await options.onStreamFailure(err);\n }\n emit(SSE_BRIDGE_EVENTS.error, { code: options.errorCode(err) });\n finish();\n }\n },\n });\n return new Response(stream, {\n headers: {\n \"content-type\": \"text/event-stream; charset=utf-8\",\n \"cache-control\": \"no-cache, no-transform\",\n \"x-accel-buffering\": \"no\",\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 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;\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","\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","\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","\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 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 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","\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","\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 GROQ_BASE_URL = \"https://api.groq.com/openai/v1\" as const;\nexport const CHAT_COMPLETIONS_PATH = \"/chat/completions\" as const;\n\nexport const GROQ_TIMEOUTS = {\n DEFAULT: 30000,\n STREAMING: 60000,\n} as const;\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","\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\";\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 config: GroqProviderConfig) {}\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.config.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.config.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.config.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.config.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 { GroqChatRequest, GroqChatResponse, GroqProviderConfig, StreamRequestOptions } from \"./groq.entities\";\nimport type { IRequestExecutor } from \"../../core/executor\";\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 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. Composition root for\n * GroqProvider — no global state.\n */\nexport class GroqHttpClient {\n private readonly transport: GroqHttpTransport;\n private readonly executor: IRequestExecutor<[GroqChatRequest], GroqChatResponse>;\n\n constructor(config: GroqProviderConfig, deps: GroqHttpClientDeps = {}) {\n this.transport = deps.transport ?? new GroqHttpTransport(config);\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, config.apiKey),\n }),\n new RetryExecutor<[GroqChatRequest], GroqChatResponse>(retryManager),\n new QueueExecutor<[GroqChatRequest], GroqChatResponse>(queue, QUEUE_PRIORITY_USER_REQUEST),\n ]);\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\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\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 { 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","\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","\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","\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 { 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","\nexport interface PrunaRequest {\n model?: string;\n image?: string;\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 generateWithPruna?: (\n request: PrunaRequest,\n apiKey: string,\n signal?: AbortSignal,\n onProgress?: (stage: PrunaProgressStage['stage'], attempt?: number) => void,\n ) => AsyncGenerator<PrunaProgressStage>;\n submitPrediction?: (\n modelId: string,\n request: PrunaRequest,\n apiKey: string,\n signal?: AbortSignal,\n onProgress?: (stage: PrunaProgressStage['stage'], attempt?: number) => void,\n ) => Promise<{ output?: { url?: string }; status_url?: string; generation_url?: string }>;\n pollForResult?: (\n pollUrl: string,\n apiKey: string,\n maxAttempts: number,\n intervalMs: number,\n signal?: AbortSignal,\n onProgress?: (stage: PrunaProgressStage['stage'], attempt?: number) => void,\n ) => Promise<string>;\n}\n\nlet prunaCorePromise: Promise<PrunaCore> | null = null;\n\nasync function loadPrunaCore(): Promise<PrunaCore> {\n if (!prunaCorePromise) {\n const specifier = '@umituz/pruna-provider/core';\n prunaCorePromise = import(specifier) as Promise<PrunaCore>;\n }\n return prunaCorePromise;\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 prunaCore = await loadPrunaCore();\n\n if (prunaCore.generateWithPruna) {\n yield* prunaCore.generateWithPruna(request, apiKey, signal, onProgress);\n return;\n }\n\n if (!prunaCore.submitPrediction || !prunaCore.pollForResult) {\n throw new Error('@umituz/pruna-provider/core does not export required functions');\n }\n\n const modelId = request.model || (request.image ? 'p-image-edit' : 'p-image');\n const prediction = await prunaCore.submitPrediction(modelId, request, apiKey, signal, onProgress);\n\n if (prediction.output && typeof prediction.output === 'object' && 'url' in prediction.output) {\n yield {\n stage: 'predicting',\n result: { url: prediction.output.url as string, model: modelId },\n };\n return;\n }\n\n const pollUrl = prediction.status_url || prediction.generation_url;\n if (!pollUrl) {\n throw new Error('Pruna prediction response missing polling URL');\n }\n\n const resultUrl = await prunaCore.pollForResult(pollUrl, apiKey, 60, 2000, signal, onProgress);\n yield { stage: 'polling', result: { url: resultUrl, model: modelId } };\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","\nconst BASE_36_RADIX = 36;\nconst DECIMAL_OFFSET = 2;\n\nexport function generateRandomBase36Suffix(\n length: number,\n random: () => number = Math.random,\n): string {\n if (length <= 0) return \"\";\n const raw = random().toString(BASE_36_RADIX).slice(DECIMAL_OFFSET);\n if (raw.length >= length) return raw.slice(0, length);\n\n let result = raw;\n while (result.length < length) {\n result += random().toString(BASE_36_RADIX).slice(DECIMAL_OFFSET);\n }\n return result.slice(0, length);\n}\n","\nimport { generateRandomBase36Suffix } from \"../../core/calculations/random-base36-suffix\";\nimport {\n MESSAGE_ID_PREFIX,\n CHAT_MESSAGE_ID_SUFFIX_LENGTH,\n} from \"../../core/constants/identifier.constants\";\n\nconst ID_PART_DELIMITER = \"-\";\n\nexport class ChatIdGenerator {\n private counter = 0;\n private readonly randomLength: number;\n\n constructor(randomLength: number = CHAT_MESSAGE_ID_SUFFIX_LENGTH) {\n this.randomLength = randomLength;\n }\n\n next(sender: string): string {\n this.counter += 1;\n const random = generateRandomBase36Suffix(this.randomLength);\n return [\n MESSAGE_ID_PREFIX,\n Date.now(),\n sender,\n this.counter,\n random,\n ].join(ID_PART_DELIMITER);\n }\n}\n\nexport const chatIdGenerator = new ChatIdGenerator();\n","\nimport type { IMessageFormatter } from \"../interfaces\";\nimport type { ChatMessage } from \"../entities\";\nimport type { ChatMessage as CoreChatMessage } from \"../../core/types\";\nimport type { ChatIdGenerator } from \"./chat-id-generator\";\nimport { chatIdGenerator as defaultIdGenerator } from \"./chat-id-generator\";\nimport { ASSISTANT_ROLE, USER_ROLE } from \"../../core/constants/identifier.constants\";\n\nexport class MessageFormatter implements IMessageFormatter {\n constructor(private readonly idGenerator: ChatIdGenerator = defaultIdGenerator) {}\n\n /** Maps chat-domain history to neutral core messages; system senders are\n * dropped — the system prompt travels on the request's own slot. */\n toCoreMessages(messages: ReadonlyArray<ChatMessage>): CoreChatMessage[] {\n const coreMessages: CoreChatMessage[] = [];\n for (const message of messages) {\n if (message.sender === \"system\") continue;\n coreMessages.push({\n role: message.sender === \"user\" ? USER_ROLE : ASSISTANT_ROLE,\n content: message.content,\n });\n }\n return coreMessages;\n }\n\n toChatMessage(content: string, sender: ChatMessage[\"sender\"]): ChatMessage {\n return {\n id: this.idGenerator.next(sender),\n sender,\n content: content.trim(),\n timestamp: new Date().toISOString(),\n type: \"text\",\n };\n }\n}\n\nexport const messageFormatter = new MessageFormatter();\n","\nimport type { ChatConfig } from \"../entities\";\n\nexport interface SystemPromptStrategy {\n resolve(config: ChatConfig): string | undefined;\n}\n\nexport const DEFAULT_PROMPT_STRATEGY: SystemPromptStrategy = {\n resolve: (config) => {\n if (config.systemPrompt && config.systemPrompt.length > 0) {\n return config.systemPrompt;\n }\n return undefined;\n },\n};\n","\nimport type {\n IChatService,\n SystemPromptStrategy,\n} from \"../interfaces\";\nimport type {\n ChatMessage,\n ChatConfig,\n ChatConversation,\n SendMessageInput,\n SendMessageResult,\n IChatStorage,\n ChatTokenUsage,\n} from \"../entities\";\nimport type { GenerationResult, StreamCallbacks, TextRequest } from \"../../core/types\";\nimport { AIError, AIErrorType } from \"../../core/errors\";\nimport type { ITextProvider } from \"../../providers/base/provider.types\";\nimport { ProviderFactory } from \"../../providers/factory/provider.factory\";\nimport { messageFormatter } from \"../utils/message-formatter\";\nimport { DEFAULT_PROMPT_STRATEGY } from \"../utils/prompt-strategy\";\n\nconst DEFAULT_CONFIG: ChatConfig = {\n temperature: 0.8,\n maxTokens: 500,\n};\n\n/**\n * Conversation engine over the neutral text surface. Accepts either a\n * single ITextProvider or a ProviderFactory (which brings tier defaults,\n * health checks, and fallback across providers). Model choice is tier-based:\n * `config.tier ?? provider default` — no hardcoded model names anywhere.\n */\nexport class ChatService implements IChatService {\n private config: ChatConfig = DEFAULT_CONFIG;\n private promptStrategy: SystemPromptStrategy = DEFAULT_PROMPT_STRATEGY;\n private storage: IChatStorage | null = null;\n\n constructor(\n private readonly engine: ITextProvider | ProviderFactory,\n ) {}\n\n initialize(config: ChatConfig): void {\n this.config = { ...DEFAULT_CONFIG, ...config };\n }\n\n updateConfig(config: Partial<ChatConfig>): void {\n this.config = { ...this.config, ...config };\n }\n\n setPromptStrategy(strategy: SystemPromptStrategy): void {\n this.promptStrategy = strategy;\n }\n\n setStorage(storage: IChatStorage): void {\n this.storage = storage;\n }\n\n async getConversation(conversationId: string): Promise<ChatConversation | null> {\n const storage = this.requireStorage();\n const messages = await storage.getMessages(conversationId);\n if (messages.length === 0) return null;\n const last = messages[messages.length - 1];\n const first = messages[0];\n const companionId = String(first.metadata?.[\"companionId\"] ?? \"unknown\");\n const companionName = String(first.metadata?.[\"companionName\"] ?? \"Unknown\");\n return {\n id: conversationId,\n companionId,\n companionName,\n lastMessage: last,\n messageCount: messages.length,\n updatedAt: last.timestamp,\n };\n }\n\n async getConversations(): Promise<ChatConversation[]> {\n if (\n this.storage &&\n \"getConversations\" in this.storage &&\n typeof (this.storage as unknown as { getConversations: () => Promise<ChatConversation[]> }).getConversations === \"function\"\n ) {\n return (this.storage as unknown as { getConversations: () => Promise<ChatConversation[]> }).getConversations();\n }\n return [];\n }\n\n async sendMessage(input: SendMessageInput, signal?: AbortSignal): Promise<SendMessageResult> {\n const userMessage: ChatMessage = {\n ...messageFormatter.toChatMessage(input.text, \"user\"),\n type: input.type ?? \"text\",\n ...(input.imageUrl !== undefined ? { imageUrl: input.imageUrl } : {}),\n };\n\n const aiResponse = await this.generateAIResponse(\n input.companionId,\n input.text,\n [],\n signal,\n );\n\n return { userMessage, aiResponse };\n }\n\n async generateAIResponse(\n companionId: string,\n userMessage: string,\n context: ReadonlyArray<ChatMessage> = [],\n signal?: AbortSignal,\n ): Promise<ChatMessage> {\n const result = await this.run({\n ...this.buildRequest(userMessage, context, signal),\n });\n\n return {\n ...messageFormatter.toChatMessage(result.text, \"assistant\"),\n metadata: {\n companionId,\n model: result.model,\n usage: {\n input_tokens: result.usage?.inputTokens,\n output_tokens: result.usage?.outputTokens,\n total_tokens: result.usage?.totalTokens,\n },\n finishReason: result.finishReason,\n },\n };\n }\n\n async generateStreamingResponse(\n userMessage: string,\n context: ReadonlyArray<ChatMessage>,\n onChunk: (chunk: string) => void,\n signal?: AbortSignal,\n ): Promise<string> {\n const request = this.buildRequest(userMessage, context, signal);\n const result = await this.runStream(request, { onChunk });\n return result.text;\n }\n\n private buildRequest(\n userMessage: string,\n context: ReadonlyArray<ChatMessage>,\n signal?: AbortSignal,\n ): TextRequest {\n const messages = messageFormatter.toCoreMessages(context);\n messages.push({ role: \"user\", content: userMessage });\n return {\n messages,\n systemPrompt: this.resolveSystemPrompt(),\n model: this.config.model,\n tier: this.config.tier,\n temperature: this.config.temperature,\n maxTokens: this.config.maxTokens,\n ...(signal !== undefined ? { signal } : {}),\n };\n }\n\n private resolveSystemPrompt(): string | undefined {\n const prompt = this.promptStrategy.resolve(this.config);\n return prompt && prompt.length > 0 ? prompt : undefined;\n }\n\n private async run(request: TextRequest): Promise<GenerationResult> {\n if (this.engine instanceof ProviderFactory) {\n return this.engine.chat(request);\n }\n return this.engine.generate(request);\n }\n\n private async runStream(\n request: TextRequest,\n callbacks: Pick<StreamCallbacks, \"onChunk\">,\n ): Promise<GenerationResult> {\n if (this.engine instanceof ProviderFactory) {\n return this.engine.chatStream(request, callbacks);\n }\n return this.engine.stream(request, callbacks);\n }\n\n private requireStorage(): IChatStorage {\n if (!this.storage) {\n throw new AIError(\n AIErrorType.MISSING_CONFIG,\n \"ChatService.getConversation requires setStorage() to be called first.\",\n );\n }\n return this.storage;\n }\n}\n\nexport function extractTokenUsage(message: ChatMessage): ChatTokenUsage | null {\n const meta = message.metadata;\n if (!meta) return null;\n const usage = meta[\"usage\"];\n if (!usage || typeof usage !== \"object\") return null;\n const u = usage as Record<string, unknown>;\n const inputTokens = readNumber(u, [\"input_tokens\", \"prompt_tokens\"]);\n const outputTokens = readNumber(u, [\"output_tokens\", \"completion_tokens\"]);\n const totalTokens = readNumber(u, [\"total_tokens\"]);\n if (inputTokens === null || outputTokens === null || totalTokens === null) {\n return null;\n }\n return {\n promptTokens: inputTokens,\n completionTokens: outputTokens,\n totalTokens,\n };\n}\n\nfunction readNumber(\n source: Record<string, unknown>,\n keys: ReadonlyArray<string>,\n): number | null {\n for (const key of keys) {\n const value = source[key];\n if (typeof value === \"number\") return value;\n }\n return null;\n}\n"]}