@burtson-labs/bandit-engine 2.0.51 → 2.0.53

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/dist/{aiProviderStore-3N3VE6D4.mjs → aiProviderStore-337QNQB3.mjs} +2 -2
  2. package/dist/{chat-W5IFNEUC.mjs → chat-U4SE4JQK.mjs} +6 -6
  3. package/dist/chat-provider.js +242 -17
  4. package/dist/chat-provider.js.map +1 -1
  5. package/dist/chat-provider.mjs +4 -4
  6. package/dist/{chunk-LXD3IV6Z.mjs → chunk-2BGORTWS.mjs} +4 -4
  7. package/dist/{chunk-IDH2YOW3.mjs → chunk-557E5VZ2.mjs} +198 -11
  8. package/dist/chunk-557E5VZ2.mjs.map +1 -0
  9. package/dist/{chunk-QFSEZAG6.mjs → chunk-AVV7HDGR.mjs} +34 -3
  10. package/dist/chunk-AVV7HDGR.mjs.map +1 -0
  11. package/dist/{chunk-N7RMUOFB.mjs → chunk-EULV5CHD.mjs} +2 -2
  12. package/dist/{chunk-STMXPFAQ.mjs → chunk-GNE4TTSI.mjs} +48 -15
  13. package/dist/chunk-GNE4TTSI.mjs.map +1 -0
  14. package/dist/{chunk-BENL3EF2.mjs → chunk-H3BYFEIE.mjs} +18 -10
  15. package/dist/chunk-H3BYFEIE.mjs.map +1 -0
  16. package/dist/{chunk-HETIHZ42.mjs → chunk-NZKLKZJT.mjs} +3 -3
  17. package/dist/{chunk-JBXNXSAH.mjs → chunk-O54PTFJM.mjs} +460 -181
  18. package/dist/chunk-O54PTFJM.mjs.map +1 -0
  19. package/dist/{chunk-EWUUF4GE.mjs → chunk-UFSEYVRS.mjs} +3 -3
  20. package/dist/cli.js +1 -1
  21. package/dist/cli.js.map +1 -1
  22. package/dist/{gateway-oScD5tvE.d.ts → gateway-C5T5FfCy.d.mts} +32 -0
  23. package/dist/{gateway-oScD5tvE.d.mts → gateway-C5T5FfCy.d.ts} +32 -0
  24. package/dist/index.d.mts +2 -2
  25. package/dist/index.d.ts +2 -2
  26. package/dist/index.js +738 -202
  27. package/dist/index.js.map +1 -1
  28. package/dist/index.mjs +9 -9
  29. package/dist/management/management.js +708 -202
  30. package/dist/management/management.js.map +1 -1
  31. package/dist/management/management.mjs +7 -7
  32. package/dist/modals/chat-modal/chat-modal.js +214 -17
  33. package/dist/modals/chat-modal/chat-modal.js.map +1 -1
  34. package/dist/modals/chat-modal/chat-modal.mjs +4 -4
  35. package/dist/public-types.d.mts +1 -1
  36. package/dist/public-types.d.ts +1 -1
  37. package/package.json +1 -1
  38. package/dist/chunk-BENL3EF2.mjs.map +0 -1
  39. package/dist/chunk-IDH2YOW3.mjs.map +0 -1
  40. package/dist/chunk-JBXNXSAH.mjs.map +0 -1
  41. package/dist/chunk-QFSEZAG6.mjs.map +0 -1
  42. package/dist/chunk-STMXPFAQ.mjs.map +0 -1
  43. /package/dist/{aiProviderStore-3N3VE6D4.mjs.map → aiProviderStore-337QNQB3.mjs.map} +0 -0
  44. /package/dist/{chat-W5IFNEUC.mjs.map → chat-U4SE4JQK.mjs.map} +0 -0
  45. /package/dist/{chunk-LXD3IV6Z.mjs.map → chunk-2BGORTWS.mjs.map} +0 -0
  46. /package/dist/{chunk-N7RMUOFB.mjs.map → chunk-EULV5CHD.mjs.map} +0 -0
  47. /package/dist/{chunk-HETIHZ42.mjs.map → chunk-NZKLKZJT.mjs.map} +0 -0
  48. /package/dist/{chunk-EWUUF4GE.mjs.map → chunk-UFSEYVRS.mjs.map} +0 -0
@@ -3,11 +3,11 @@ import {
3
3
  MAX_WINDOWED_HEIGHT,
4
4
  MIN_WINDOWED_HEIGHT,
5
5
  chat_modal_default
6
- } from "../../chunk-LXD3IV6Z.mjs";
7
- import "../../chunk-HETIHZ42.mjs";
8
- import "../../chunk-IDH2YOW3.mjs";
6
+ } from "../../chunk-2BGORTWS.mjs";
7
+ import "../../chunk-NZKLKZJT.mjs";
8
+ import "../../chunk-557E5VZ2.mjs";
9
9
  import "../../chunk-7ZDS33S2.mjs";
10
- import "../../chunk-BENL3EF2.mjs";
10
+ import "../../chunk-H3BYFEIE.mjs";
11
11
  import "../../chunk-KCI46M23.mjs";
12
12
  import "../../chunk-BJTO5JO5.mjs";
13
13
  export {
@@ -1,4 +1,4 @@
1
- export { t as AIChatRequest, u as AIChatResponse, w as AIGenerateRequest, x as AIGenerateResponse, y as AIMessage, s as AIModel, A as AIProviderConfig, g as ChatConfig, h as ChatModalProps, g as ChatProviderProps, b as FeatureEvaluation, F as FeatureFlagConfig, a as FeatureKey, f as FeatureMatrix, m as GatewayChatRequest, n as GatewayChatResponse, j as GatewayContract, o as GatewayGenerateRequest, p as GatewayGenerateResponse, G as GatewayHealthResponse, r as GatewayMemoryRecord, d as GatewayMemoryResponse, l as GatewayMessage, k as GatewayMessageContent, c as GatewayModel, q as GatewayModelsResponse, P as PackageSettings, S as SubscriptionTier, T as TrialUsage, i as VoiceModelsResponse } from './gateway-oScD5tvE.mjs';
1
+ export { t as AIChatRequest, u as AIChatResponse, w as AIGenerateRequest, x as AIGenerateResponse, y as AIMessage, s as AIModel, A as AIProviderConfig, g as ChatConfig, h as ChatModalProps, g as ChatProviderProps, b as FeatureEvaluation, F as FeatureFlagConfig, a as FeatureKey, f as FeatureMatrix, m as GatewayChatRequest, n as GatewayChatResponse, j as GatewayContract, o as GatewayGenerateRequest, p as GatewayGenerateResponse, G as GatewayHealthResponse, r as GatewayMemoryRecord, d as GatewayMemoryResponse, l as GatewayMessage, k as GatewayMessageContent, c as GatewayModel, q as GatewayModelsResponse, P as PackageSettings, S as SubscriptionTier, T as TrialUsage, i as VoiceModelsResponse } from './gateway-C5T5FfCy.mjs';
2
2
  import 'react';
3
3
 
4
4
  interface StoredBrandingConfig {
@@ -1,4 +1,4 @@
1
- export { t as AIChatRequest, u as AIChatResponse, w as AIGenerateRequest, x as AIGenerateResponse, y as AIMessage, s as AIModel, A as AIProviderConfig, g as ChatConfig, h as ChatModalProps, g as ChatProviderProps, b as FeatureEvaluation, F as FeatureFlagConfig, a as FeatureKey, f as FeatureMatrix, m as GatewayChatRequest, n as GatewayChatResponse, j as GatewayContract, o as GatewayGenerateRequest, p as GatewayGenerateResponse, G as GatewayHealthResponse, r as GatewayMemoryRecord, d as GatewayMemoryResponse, l as GatewayMessage, k as GatewayMessageContent, c as GatewayModel, q as GatewayModelsResponse, P as PackageSettings, S as SubscriptionTier, T as TrialUsage, i as VoiceModelsResponse } from './gateway-oScD5tvE.js';
1
+ export { t as AIChatRequest, u as AIChatResponse, w as AIGenerateRequest, x as AIGenerateResponse, y as AIMessage, s as AIModel, A as AIProviderConfig, g as ChatConfig, h as ChatModalProps, g as ChatProviderProps, b as FeatureEvaluation, F as FeatureFlagConfig, a as FeatureKey, f as FeatureMatrix, m as GatewayChatRequest, n as GatewayChatResponse, j as GatewayContract, o as GatewayGenerateRequest, p as GatewayGenerateResponse, G as GatewayHealthResponse, r as GatewayMemoryRecord, d as GatewayMemoryResponse, l as GatewayMessage, k as GatewayMessageContent, c as GatewayModel, q as GatewayModelsResponse, P as PackageSettings, S as SubscriptionTier, T as TrialUsage, i as VoiceModelsResponse } from './gateway-C5T5FfCy.js';
2
2
  import 'react';
3
3
 
4
4
  interface StoredBrandingConfig {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@burtson-labs/bandit-engine",
3
- "version": "2.0.51",
3
+ "version": "2.0.53",
4
4
  "license": "BUSL-1.1",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/store/aiProviderStore.ts","../src/services/ai-provider/providers/ollama.provider.ts","../src/services/ollama/ollama.service.ts","../src/services/ai-provider/providers/deprecated.ts","../src/services/ai-provider/providers/openai.provider.ts","../src/services/ai-provider/providers/azure-openai.provider.ts","../src/services/ai-provider/providers/anthropic.provider.ts","../src/services/ai-provider/providers/gateway.provider.ts","../src/services/gateway/gateway.service.ts","../src/services/gateway/openai-gateway.service.ts","../src/services/gateway/azure-openai-gateway.service.ts","../src/services/gateway/anthropic-gateway.service.ts","../src/services/gateway/ollama-gateway.service.ts","../src/services/gateway/bandit-gateway.service.ts","../src/services/ai-provider/providers/playground.provider.ts","../src/services/ai-provider/providers/xai.provider.ts","../src/services/ai-provider/providers/bandit-ai.provider.ts","../src/services/ai-provider/ai-provider.factory.ts"],"sourcesContent":["/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-A223-4FC2FA\nconst __banditFingerprint_store_aiProviderStorets = 'BL-FP-9F95DD-6297';\nconst __auditTrail_store_aiProviderStorets = 'BL-AU-MGOIKVW3-JR0V';\n// File: aiProviderStore.ts | Path: src/store/aiProviderStore.ts | Hash: a2236297\n\nimport { create, StoreApi, UseBoundStore } from \"zustand\";\nimport { IAIProvider } from \"../services/ai-provider/interfaces/ai-provider.interface\";\nimport { AIProviderConfig } from \"../services/ai-provider/types/common.types\";\nimport { AIProviderFactory } from \"../services/ai-provider/ai-provider.factory\";\nimport { debugLogger } from \"../services/logging/debugLogger\";\n\nexport interface AIProviderStore {\n /**\n * The current AI provider instance.\n * @type {IAIProvider}\n * @default null\n * @description The provider instance used to interact with AI services.\n * \n * @example\n * const provider = useAIProviderStore((state) => state.provider);\n * const setProvider = useAIProviderStore((state) => state.setProvider);\n * \n * // Create and set an Ollama provider\n * const ollamaConfig = { type: 'ollama', baseUrl: 'http://localhost:11434' };\n * const ollamaProvider = AIProviderFactory.createProvider(ollamaConfig);\n * setProvider(ollamaProvider);\n * \n * @returns {IAIProvider | null} The current AI provider instance.\n */\n provider: IAIProvider | null;\n \n /**\n * The current provider configuration\n */\n config: AIProviderConfig | null;\n \n /**\n * Set the provider and config\n */\n setProvider: (provider: IAIProvider | null, config?: AIProviderConfig | null) => void;\n \n /**\n * Create a new provider from config\n */\n createProvider: (config: AIProviderConfig) => void;\n \n /**\n * Switch to a different provider\n */\n switchProvider: (config: AIProviderConfig) => void;\n}\n\n/**\n * Use for initializing the AI provider.\n * This is a private interface that extends the AIProviderStore interface.\n * This prevents the singleton service from being initialized multiple times.\n */\nexport interface AIProviderStoreInit extends AIProviderStore {\n // Additional methods could be added here if needed for internal initialization\n}\n\nexport const useAIProviderStore = create<AIProviderStore>((set, get) => ({\n provider: null,\n config: null,\n \n setProvider: (provider, config) => set({ provider, config }),\n \n createProvider: (config) => {\n try {\n const provider = AIProviderFactory.createProvider(config);\n set({ provider, config });\n } catch (error) {\n debugLogger.error('Failed to create AI provider:', { error });\n throw error;\n }\n },\n \n switchProvider: (config) => {\n const currentProvider = get().provider;\n try {\n const newProvider = AIProviderFactory.createProvider(config);\n set({ provider: newProvider, config });\n } catch (error) {\n debugLogger.error('Failed to switch AI provider:', { error });\n // Keep the current provider if switching fails\n throw error;\n }\n }\n})) as UseBoundStore<StoreApi<AIProviderStore>>;","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-A59E-4B6F9C\nconst __banditFingerprint_providers_ollamaproviderts = 'BL-FP-89E894-7B5E';\nconst __auditTrail_providers_ollamaproviderts = 'BL-AU-MGOIKVVQ-QJIU';\n// File: ollama.provider.ts | Path: src/services/ai-provider/providers/ollama.provider.ts | Hash: a59e7b5e\n\nimport { Observable, map } from 'rxjs';\nimport { OllamaService } from '../../ollama/ollama.service';\nimport { IAIProvider } from '../interfaces/ai-provider.interface';\nimport {\n AIChatRequest,\n AIChatResponse,\n AIGenerateRequest,\n AIGenerateResponse,\n AIModel,\n AIProviderConfig,\n AIProviderType\n} from '../types/common.types';\nimport { debugLogger } from '../../logging/debugLogger';\nimport { deprecatedOllamaProvider } from './deprecated';\n\n/**\n * Ollama provider implementation that wraps the existing OllamaService\n */\nexport class OllamaProvider implements IAIProvider {\n private ollamaService: OllamaService;\n private config: AIProviderConfig;\n\n constructor(config: AIProviderConfig) {\n deprecatedOllamaProvider(); // Show info about gateway option for production\n this.config = config;\n const baseUrl = config.baseUrl || 'http://localhost:11434';\n debugLogger.info(\"OllamaProvider: Constructor\", { \n configBaseUrl: config.baseUrl,\n finalBaseUrl: baseUrl,\n hasTokenFactory: !!config.tokenFactory \n });\n this.ollamaService = new OllamaService(\n baseUrl,\n config.tokenFactory || (() => null)\n );\n }\n\n chat(request: AIChatRequest): Observable<AIChatResponse> {\n // Transform common request to Ollama-specific format\n const ollamaRequest = {\n model: request.model,\n messages: request.messages.map(msg => ({\n role: msg.role as 'system' | 'user' | 'assistant',\n content: msg.content\n })),\n stream: request.stream,\n options: request.options,\n images: request.images\n };\n\n return this.ollamaService.chat(ollamaRequest).pipe(\n map(response => ({\n message: {\n content: response.message.content,\n role: 'assistant' as const\n },\n done: response.done\n }))\n );\n }\n\n generate(request: AIGenerateRequest): Observable<AIGenerateResponse> {\n // Transform common request to Ollama-specific format\n const ollamaRequest = {\n model: request.model,\n prompt: request.prompt,\n stream: request.stream,\n options: request.options\n };\n\n return this.ollamaService.generate(ollamaRequest).pipe(\n map(response => ({\n response: response.response,\n done: response.done\n }))\n );\n }\n\n listModels(): Observable<AIModel[]> {\n return this.ollamaService.listModels().pipe(\n map(models => models.map(model => ({\n name: model.name,\n size: model.size,\n details: model.details,\n digest: model.digest,\n modified_at: model.modified_at\n })))\n );\n }\n\n async validateServiceAvailability(args: { \n fallbackUrl?: string; \n timeoutMs: number; \n }): Promise<{ url: string; isAvailable: boolean }> {\n return this.ollamaService.validateServiceAvailability({\n fallbackUrl: args.fallbackUrl || '',\n timeoutMs: args.timeoutMs\n });\n }\n\n getProviderType(): string {\n return AIProviderType.OLLAMA;\n }\n\n getConfig(): AIProviderConfig {\n return this.config;\n }\n}","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-6CED-5122D4\nconst __banditFingerprint_ollama_ollamaservicets = 'BL-FP-3B6550-DAFC';\nconst __auditTrail_ollama_ollamaservicets = 'BL-AU-MGOIKVVW-1K0E';\n// File: ollama.service.ts | Path: src/services/ollama/ollama.service.ts | Hash: 6ceddafc\n\nimport { ChatRequest, ChatResponse, GenerateRequest, GenerateResponse, Model, ModelResponse } from \"./interfaces\";\nimport { catchError, from, lastValueFrom, map, Observable, of, shareReplay, switchMap, throwError, timeout } from \"rxjs\";\nimport { debugLogger } from \"../logging/debugLogger\";\n\nconst handleError = () => (obs: Observable<Response>) =>\n obs.pipe(\n switchMap((response) =>\n response.ok\n ? of(response)\n : throwError(() => new Error(`Request failed: ${response.status} ${response.statusText}`))\n )\n );\n\nconst parseResponseBody = async <T>(response: Response, responseType: 'json' | 'text'): Promise<T> => {\n if (responseType === 'text') {\n return (await response.text()) as unknown as T;\n }\n return (await response.json()) as T;\n};\n\nexport class OllamaService {\n\n constructor(\n private _baseUrl: string,\n private readonly _tokenFactory: () => string | null\n ) {\n if (!this._baseUrl) {\n this._baseUrl = 'http://localhost:11434'\n debugLogger.warn(`No base URL provided, using default: ${this._baseUrl}`);\n }\n }\n\n\n private _tryGatewayWithTimeout(args: {\n url: string,\n responseType: 'json' | 'text',\n timeoutMs: number,\n }): Observable<boolean> {\n const { url, responseType, timeoutMs } = args;\n const source = this._get(url, responseType)\n const mapped = source.pipe(\n catchError((e) => (e?.message.includes(\"401\") ? of(true) : of(false))),\n map(() => true),\n timeout(timeoutMs),\n );\n return mapped;\n }\n\n /**\n * Validates the availability of the service at the given base URL.\n * @param fallbackUrl The fallback URL to try if the base URL is not available.\n * @returns An object containing the URL and availability status.\n */\n async validateServiceAvailability(args: { fallbackUrl: string; timeoutMs: number; }): Promise<{ url: string, isAvailable: boolean }> {\n const { fallbackUrl, timeoutMs } = args;\n const responseType = 'text';\n const availablility = {\n url: \"\",\n isAvailable: false,\n }\n try {\n debugLogger.debug(`Validating service availability at ${this._baseUrl}`);\n\n\n\n availablility.url = this._baseUrl;\n availablility.isAvailable = await lastValueFrom(\n this._tryGatewayWithTimeout({\n url: availablility.url,\n responseType,\n timeoutMs,\n })\n ) as boolean;\n if (!availablility.isAvailable) {\n throw new Error(`Service not available at ${this._baseUrl}`);\n }\n\n return availablility;\n } catch (e) {\n debugLogger.warn(`Service not available at ${this._baseUrl}, trying fallback URL: ${fallbackUrl}`);\n try {\n\n availablility.url = fallbackUrl;\n availablility.isAvailable = await lastValueFrom(\n this._tryGatewayWithTimeout({\n url: availablility.url,\n responseType,\n timeoutMs,\n })\n ) as boolean;\n\n if (!availablility.isAvailable) {\n throw new Error(`Service not available at ${fallbackUrl}`);\n }\n this._baseUrl = fallbackUrl;\n return availablility;\n } catch (e) {\n debugLogger.error(`Service not available at fallback URL: ${fallbackUrl}`);\n throw e;\n }\n }\n }\n\n\n generate(request: GenerateRequest): Observable<GenerateResponse> {\n const url = `${this._baseUrl}/api/generate`;\n return new Observable<GenerateResponse>(observer => {\n const task = fetch(url, {\n method: 'POST',\n headers: this._getHeaders(),\n body: JSON.stringify({ ...request, stream: request.stream === false ? false : true }),\n });\n task.then(response => {\n this._throwErrorIfNotOk(url, response);\n\n const reader = response.body?.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n const read = () => {\n reader?.read().then(({ done, value }) => {\n if (done) {\n if (buffer.trim() !== \"\") {\n try {\n observer.next(JSON.parse(buffer));\n } catch (err) {\n observer.error(err);\n debugLogger.error('Final chunk parsing error (generate):', { buffer });\n }\n }\n observer.complete();\n return;\n }\n\n buffer += decoder.decode(value, { stream: true });\n\n const lines = buffer.split('\\n');\n buffer = lines.pop() ?? '';\n\n for (const line of lines) {\n if (line.trim()) {\n try {\n observer.next(JSON.parse(line));\n } catch (err) {\n observer.error(err);\n debugLogger.error('Error parsing JSON line (generate):', { line });\n }\n }\n }\n\n read();\n }).catch(err => observer.error(err));\n };\n read();\n })\n .catch(err => observer.error(err));\n });\n }\n\n // generate(request: GenerateRequest): Observable<GenerateResponse> {\n // const url = `${this._baseUrl}/api/generate`;\n // return this._post<GenerateRequest, GenerateResponse>(url, request);\n // }\n\n chat(request: ChatRequest): Observable<ChatResponse> {\n const url = `${this._baseUrl}/api/chat`;\n return new Observable<ChatResponse>(observer => {\n const task = fetch(url, {\n method: 'POST',\n headers: this._getHeaders(),\n body: JSON.stringify({ ...request, stream: true }),\n });\n task.then(response => {\n this._throwErrorIfNotOk(url, response);\n\n const reader = response.body?.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n const read = () => {\n reader?.read().then(({ done, value }) => {\n if (done) {\n if (buffer.trim() !== \"\") {\n try {\n observer.next(JSON.parse(buffer));\n } catch (err) {\n observer.error(err);\n debugLogger.error('Final chunk parsing error (chat):', { buffer });\n }\n }\n observer.complete();\n return;\n }\n\n buffer += decoder.decode(value, { stream: true });\n\n const lines = buffer.split('\\n');\n buffer = lines.pop() ?? '';\n\n for (const line of lines) {\n if (line.trim()) {\n try {\n observer.next(JSON.parse(line));\n } catch (err) {\n observer.error(err);\n debugLogger.error('Error parsing JSON line (chat):', { line });\n }\n }\n }\n\n read();\n }).catch(err => observer.error(err));\n };\n read();\n })\n .catch(err => observer.error(err));\n });\n }\n\n\n listModels(): Observable<Model[]> {\n const url = `${this._baseUrl}/api/tags`;\n const response = this._get<ModelResponse>(url);\n const result = response.pipe(\n map(data => data.models),\n shareReplay(1));\n return result;\n }\n\n private _get<T>(url: string, responseType: 'json' | 'text' = 'json'): Observable<T> {\n const requestInit = {\n method: 'GET',\n headers: this._getHeaders(),\n }\n\n const response = from(fetch(url, requestInit));\n const handleFetchError = response.pipe(handleError());\n const data = handleFetchError.pipe(switchMap((res) => from(parseResponseBody<T>(res, responseType))));\n const result = data.pipe(shareReplay(1));\n\n return result;\n }\n\n private _post<TRequest, TResponse>(url: string, body: TRequest): Observable<TResponse> {\n const response = from(fetch(url, {\n method: 'POST',\n headers: this._getHeaders(),\n body: JSON.stringify(body),\n }));\n const handleFetchError = response.pipe(handleError());\n const json = handleFetchError.pipe(switchMap((res) => from(parseResponseBody<TResponse>(res, 'json'))));\n const result = json.pipe(shareReplay(1));\n return result;\n }\n private _throwErrorIfNotOk(url: string, response: Response) {\n if (!response.ok) {\n throw new Error(`POST ${url} failed: ${response.status} ${response.statusText}`);\n }\n }\n private _getHeaders() {\n const token = this._tokenFactory();\n \n if (!token) {\n debugLogger.warn('OllamaService: No token found, using empty string for Authorization header');\n }\n\n return {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${token || ''}`\n };\n }\n\n\n}\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-22FF-7E873B\nconst __banditFingerprint_providers_deprecatedts = 'BL-FP-DA6749-9B2A';\nconst __auditTrail_providers_deprecatedts = 'BL-AU-MGOIKVVQ-2ZKO';\n// File: deprecated.ts | Path: src/services/ai-provider/providers/deprecated.ts | Hash: 22ff9b2a\n\nimport { debugLogger } from '../../logging/debugLogger';\nimport { AIProviderConfig } from '../types/common.types';\n\n/**\n * Deprecation notices for direct provider implementations\n * \n * MIGRATION NOTICE: Direct provider implementations are being phased out in favor \n * of the new unified gateway architecture. Please migrate to gateway-based providers\n * for enhanced security, performance, and centralized management.\n * \n * See GATEWAY_MIGRATION_GUIDE.md for migration instructions.\n */\n\n/**\n * @deprecated Use GatewayProvider with provider: 'openai' instead\n * \n * Migration example:\n * ```typescript\n * // Old (deprecated)\n * const config = { type: 'openai', apiKey: 'sk-...', baseUrl: '...' };\n * \n * // New (recommended)\n * const config = { \n * type: 'gateway', \n * gatewayUrl: 'https://your-gateway.com',\n * provider: 'openai',\n * tokenFactory: () => localStorage.getItem('authToken')\n * };\n * ```\n */\nexport function deprecatedOpenAIProvider() {\n debugLogger.warn('⚠️ DEPRECATION WARNING: Direct OpenAI provider is deprecated. Please migrate to GatewayProvider with provider: \"openai\". See GATEWAY_MIGRATION_GUIDE.md for details.');\n}\n\n/**\n * @deprecated Use GatewayProvider with provider: 'azure-openai' instead\n * \n * Migration example:\n * ```typescript\n * // Old (deprecated)\n * const config = { \n * type: 'azure-openai', \n * baseUrl: 'https://your-resource.openai.azure.com',\n * apiKey: 'your-key',\n * apiVersion: '2024-02-15-preview',\n * deploymentName: 'gpt-4'\n * };\n * \n * // New (recommended)\n * const config = { \n * type: 'gateway', \n * gatewayUrl: 'https://your-gateway.com',\n * provider: 'azure-openai',\n * deploymentName: 'gpt-4',\n * apiVersion: '2024-02-15-preview',\n * tokenFactory: () => localStorage.getItem('authToken')\n * };\n * ```\n */\nexport function deprecatedAzureOpenAIProvider() {\n debugLogger.warn('⚠️ DEPRECATION WARNING: Direct Azure OpenAI provider is deprecated. Please migrate to GatewayProvider with provider: \"azure-openai\". See GATEWAY_MIGRATION_GUIDE.md for details.');\n}\n\n/**\n * @deprecated Use GatewayProvider with provider: 'anthropic' instead\n * \n * Migration example:\n * ```typescript\n * // Old (deprecated)\n * const config = { type: 'anthropic', apiKey: 'sk-ant-...', baseUrl: '...' };\n * \n * // New (recommended)\n * const config = { \n * type: 'gateway', \n * gatewayUrl: 'https://your-gateway.com',\n * provider: 'anthropic',\n * tokenFactory: () => localStorage.getItem('authToken')\n * };\n * ```\n */\nexport function deprecatedAnthropicProvider() {\n debugLogger.warn('⚠️ DEPRECATION WARNING: Direct Anthropic provider is deprecated. Please migrate to GatewayProvider with provider: \"anthropic\". See GATEWAY_MIGRATION_GUIDE.md for details.');\n}\n\n/**\n * @deprecated Use GatewayProvider with provider: 'ollama' instead for production environments\n * \n * Note: The direct Ollama provider will remain available for local development,\n * but for production deployments, use the gateway for better management.\n * \n * Migration example:\n * ```typescript\n * // Development (still supported)\n * const config = { type: 'ollama', baseUrl: 'http://localhost:11434' };\n * \n * // Production (recommended)\n * const config = { \n * type: 'gateway', \n * gatewayUrl: 'https://your-gateway.com',\n * provider: 'ollama',\n * tokenFactory: () => localStorage.getItem('authToken')\n * };\n * ```\n */\nexport function deprecatedOllamaProvider() {\n debugLogger.info('ℹ️ INFO: Direct Ollama provider is available for local development. For production environments, consider using GatewayProvider with provider: \"ollama\" for enhanced management. See GATEWAY_MIGRATION_GUIDE.md for details.');\n}\n\n/**\n * Display deprecation summary\n */\nexport function showDeprecationSummary() {\n debugLogger.warn(`\n🏗️ BANDIT ENGINE PROVIDER ARCHITECTURE UPDATE\n\nThe Bandit Engine is transitioning to a unified gateway architecture for enhanced:\n• Security (centralized API key management)\n• Performance (connection pooling, caching)\n• Monitoring (unified logging, health checks)\n• Scaling (load balancing, failover)\n\nMIGRATION REQUIRED:\n• OpenAI Provider → GatewayProvider (provider: 'openai')\n• Azure OpenAI Provider → GatewayProvider (provider: 'azure-openai') \n• Anthropic Provider → GatewayProvider (provider: 'anthropic')\n\nMIGRATION RECOMMENDED:\n• Ollama Provider → GatewayProvider (provider: 'ollama') for production\n\n📖 Full migration guide: GATEWAY_MIGRATION_GUIDE.md\n🆘 Need help? Check the troubleshooting section in the migration guide\n `);\n}\n\n/**\n * Check if provider config is using deprecated direct provider\n */\nexport function isDeprecatedProvider(config: AIProviderConfig | undefined): boolean {\n const deprecatedTypes = ['openai', 'azure-openai', 'anthropic'];\n return deprecatedTypes.includes(config?.type);\n}\n\n/**\n * Suggest gateway migration for deprecated config\n */\nexport function suggestGatewayMigration(config: AIProviderConfig): AIProviderConfig {\n if (!isDeprecatedProvider(config)) {\n return config; // No migration needed\n }\n\n const gatewayConfig: AIProviderConfig = {\n type: 'gateway',\n gatewayUrl: '${GATEWAY_URL}', // Replace with your gateway URL\n provider: config.type as 'openai' | 'azure-openai' | 'anthropic' | 'ollama',\n tokenFactory: () => localStorage.getItem('authToken')\n };\n\n // Preserve Azure-specific config\n if (config.type === 'azure-openai') {\n gatewayConfig.deploymentName = config.deploymentName;\n gatewayConfig.apiVersion = config.apiVersion;\n }\n\n debugLogger.info('🔄 Suggested gateway migration:', {\n from: config,\n to: gatewayConfig\n });\n\n return gatewayConfig;\n}\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-E7EE-93DC85\nconst __banditFingerprint_providers_openaiproviderts = 'BL-FP-7E2188-DCC5';\nconst __auditTrail_providers_openaiproviderts = 'BL-AU-MGOIKVVQ-8GVP';\n// File: openai.provider.ts | Path: src/services/ai-provider/providers/openai.provider.ts | Hash: e7eedcc5\n\nimport { Observable, from, switchMap, map, throwError } from 'rxjs';\nimport { IAIProvider } from '../interfaces/ai-provider.interface';\nimport {\n AIChatRequest,\n AIChatResponse,\n AIGenerateRequest,\n AIGenerateResponse,\n AIModel,\n AIProviderConfig,\n AIProviderType\n} from '../types/common.types';\nimport { debugLogger } from '../../logging/debugLogger';\nimport { deprecatedOpenAIProvider } from './deprecated';\n\ninterface OpenAIChatPayload {\n model: string;\n messages: AIChatRequest['messages'];\n stream: boolean;\n temperature?: number;\n max_tokens?: number;\n}\n\ninterface OpenAIStreamChunk {\n choices?: Array<{\n delta?: {\n content?: string;\n };\n }>;\n}\n\ninterface OpenAIChatResponsePayload {\n choices?: Array<{\n message?: {\n content?: string;\n };\n }>;\n}\n\ninterface OpenAIModelListResponse {\n data: Array<{\n id: string;\n object?: string;\n }>;\n}\n\n/**\n * OpenAI provider implementation\n */\nexport class OpenAIProvider implements IAIProvider {\n private config: AIProviderConfig;\n private baseUrl: string;\n\n constructor(config: AIProviderConfig) {\n deprecatedOpenAIProvider(); // Show deprecation warning\n this.config = config;\n this.baseUrl = config.baseUrl || 'https://api.openai.com/v1';\n }\n\n chat(request: AIChatRequest): Observable<AIChatResponse> {\n const url = `${this.baseUrl}/chat/completions`;\n \n const payload: OpenAIChatPayload = {\n model: request.model,\n messages: request.messages,\n stream: Boolean(request.stream),\n temperature: request.temperature,\n max_tokens: request.maxTokens\n };\n\n if (request.stream) {\n return this.streamChatRequest(url, payload);\n } else {\n return this.nonStreamChatRequest(url, payload);\n }\n }\n\n generate(request: AIGenerateRequest): Observable<AIGenerateResponse> {\n // For OpenAI, we'll use the chat endpoint with a single user message\n const chatRequest: AIChatRequest = {\n model: request.model,\n messages: [{ role: 'user', content: request.prompt }],\n stream: request.stream,\n options: request.options\n };\n\n return this.chat(chatRequest).pipe(\n map(response => ({\n response: response.message.content,\n done: response.done\n }))\n );\n }\n\n listModels(): Observable<AIModel[]> {\n const url = `${this.baseUrl}/models`;\n \n return from(fetch(url, {\n headers: this.getHeaders()\n })).pipe(\n switchMap(response => {\n if (!response.ok) {\n return throwError(() => new Error(`Failed to list models: ${response.status}`));\n }\n return from(response.json() as Promise<OpenAIModelListResponse>);\n }),\n map((data) =>\n data.data.map((model) => ({\n name: model.id,\n details: {\n format: 'openai',\n family: model.object\n }\n }))\n )\n );\n }\n\n async validateServiceAvailability(args: { \n fallbackUrl?: string; \n timeoutMs: number; \n }): Promise<{ url: string; isAvailable: boolean }> {\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), args.timeoutMs);\n\n const response = await fetch(`${this.baseUrl}/models`, {\n headers: this.getHeaders(),\n signal: controller.signal\n });\n\n clearTimeout(timeoutId);\n\n return {\n url: this.baseUrl,\n isAvailable: response.ok\n };\n } catch (error) {\n if (args.fallbackUrl) {\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), args.timeoutMs);\n\n const response = await fetch(`${args.fallbackUrl}/models`, {\n headers: this.getHeaders(),\n signal: controller.signal\n });\n\n clearTimeout(timeoutId);\n\n if (response.ok) {\n this.baseUrl = args.fallbackUrl;\n return {\n url: args.fallbackUrl,\n isAvailable: true\n };\n }\n } catch (fallbackError) {\n // Fall through to return unavailable\n }\n }\n\n return {\n url: this.baseUrl,\n isAvailable: false\n };\n }\n }\n\n getProviderType(): string {\n return AIProviderType.OPENAI;\n }\n\n getConfig(): AIProviderConfig {\n return this.config;\n }\n\n private streamChatRequest(url: string, payload: OpenAIChatPayload): Observable<AIChatResponse> {\n return new Observable<AIChatResponse>(observer => {\n const task = fetch(url, {\n method: 'POST',\n headers: {\n ...this.getHeaders(),\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(payload)\n });\n\n task.then(response => {\n if (!response.ok) {\n observer.error(new Error(`OpenAI request failed: ${response.status}`));\n return;\n }\n\n const reader = response.body?.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n const read = () => {\n reader?.read().then(({ done, value }) => {\n if (done) {\n observer.next({\n message: { content: '', role: 'assistant' },\n done: true\n });\n observer.complete();\n return;\n }\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() ?? '';\n\n for (const line of lines) {\n if (line.trim() && line.startsWith('data: ')) {\n const data = line.slice(6).trim();\n if (data === '[DONE]') {\n observer.next({\n message: { content: '', role: 'assistant' },\n done: true\n });\n observer.complete();\n return;\n }\n\n try {\n const parsed = JSON.parse(data) as OpenAIStreamChunk;\n const content = parsed.choices?.[0]?.delta?.content ?? '';\n if (content) {\n observer.next({\n message: { content, role: 'assistant' },\n done: false\n });\n }\n } catch (err) {\n debugLogger.error('Error parsing OpenAI stream data:', { data, error: err });\n }\n }\n }\n\n read();\n }).catch(err => observer.error(err));\n };\n read();\n }).catch(err => observer.error(err));\n });\n }\n\n private nonStreamChatRequest(url: string, payload: OpenAIChatPayload): Observable<AIChatResponse> {\n return from(fetch(url, {\n method: 'POST',\n headers: {\n ...this.getHeaders(),\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(payload)\n })).pipe(\n switchMap(response => {\n if (!response.ok) {\n return throwError(() => new Error(`OpenAI request failed: ${response.status}`));\n }\n return from(response.json() as Promise<OpenAIChatResponsePayload>);\n }),\n map((data) => ({\n message: {\n content: data.choices?.[0]?.message?.content ?? '',\n role: 'assistant' as const\n },\n done: true\n }))\n );\n }\n\n private getHeaders(): Record<string, string> {\n const headers: Record<string, string> = {};\n \n if (this.config.apiKey) {\n headers['Authorization'] = `Bearer ${this.config.apiKey}`;\n }\n\n return headers;\n }\n}\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-4A56-02BF87\nconst __banditFingerprint_providers_azureopenaiproviderts = 'BL-FP-51FF06-B29D';\nconst __auditTrail_providers_azureopenaiproviderts = 'BL-AU-MGOIKVVQ-070A';\n// File: azure-openai.provider.ts | Path: src/services/ai-provider/providers/azure-openai.provider.ts | Hash: 4a56b29d\n\nimport { Observable, from, switchMap, map, throwError } from 'rxjs';\nimport { IAIProvider } from '../interfaces/ai-provider.interface';\nimport {\n AIChatRequest,\n AIChatResponse,\n AIGenerateRequest,\n AIGenerateResponse,\n AIModel,\n AIProviderConfig,\n AIProviderType\n} from '../types/common.types';\nimport { debugLogger } from '../../logging/debugLogger';\nimport { deprecatedAzureOpenAIProvider } from './deprecated';\n\ninterface AzureChatPayload {\n messages: AIChatRequest['messages'];\n stream: boolean;\n temperature?: number;\n max_tokens?: number;\n}\n\ninterface OpenAIStreamChunk {\n choices?: Array<{\n delta?: {\n content?: string;\n };\n }>;\n}\n\ninterface OpenAIChatResponsePayload {\n choices?: Array<{\n message?: {\n content?: string;\n };\n }>;\n}\n/**\n * Azure OpenAI provider implementation\n */\nexport class AzureOpenAIProvider implements IAIProvider {\n private config: AIProviderConfig;\n private baseUrl: string;\n\n constructor(config: AIProviderConfig) {\n deprecatedAzureOpenAIProvider(); // Show deprecation warning\n this.config = config;\n if (!config.baseUrl || !config.deploymentName || !config.apiVersion) {\n throw new Error('Azure OpenAI requires baseUrl, deploymentName, and apiVersion');\n }\n this.baseUrl = config.baseUrl;\n }\n\n chat(request: AIChatRequest): Observable<AIChatResponse> {\n const url = `${this.baseUrl}/openai/deployments/${this.config.deploymentName}/chat/completions?api-version=${this.config.apiVersion}`;\n \n const payload: AzureChatPayload = {\n messages: request.messages,\n stream: Boolean(request.stream),\n temperature: request.temperature,\n max_tokens: request.maxTokens\n };\n\n if (request.stream) {\n return this.streamChatRequest(url, payload);\n } else {\n return this.nonStreamChatRequest(url, payload);\n }\n }\n\n generate(request: AIGenerateRequest): Observable<AIGenerateResponse> {\n // For Azure OpenAI, we'll use the chat endpoint with a single user message\n const chatRequest: AIChatRequest = {\n model: request.model,\n messages: [{ role: 'user', content: request.prompt }],\n stream: request.stream,\n options: request.options\n };\n\n return this.chat(chatRequest).pipe(\n map(response => ({\n response: response.message.content,\n done: response.done\n }))\n );\n }\n\n listModels(): Observable<AIModel[]> {\n // Azure OpenAI doesn't have a direct models endpoint, return the deployment as a model\n const model: AIModel = {\n name: this.config.deploymentName || 'azure-deployment',\n details: {\n format: 'azure-openai',\n family: 'gpt'\n }\n };\n\n return new Observable<AIModel[]>(observer => {\n observer.next([model]);\n observer.complete();\n });\n }\n\n async validateServiceAvailability(args: { \n fallbackUrl?: string; \n timeoutMs: number; \n }): Promise<{ url: string; isAvailable: boolean }> {\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), args.timeoutMs);\n\n // Test with a simple chat request\n const testUrl = `${this.baseUrl}/openai/deployments/${this.config.deploymentName}/chat/completions?api-version=${this.config.apiVersion}`;\n const response = await fetch(testUrl, {\n method: 'POST',\n headers: this.getHeaders(),\n body: JSON.stringify({\n messages: [{ role: 'user', content: 'test' }],\n max_tokens: 1\n }),\n signal: controller.signal\n });\n\n clearTimeout(timeoutId);\n\n return {\n url: this.baseUrl,\n isAvailable: response.ok || response.status === 400 // 400 might be expected for the test\n };\n } catch (error) {\n if (args.fallbackUrl) {\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), args.timeoutMs);\n\n const testUrl = `${args.fallbackUrl}/openai/deployments/${this.config.deploymentName}/chat/completions?api-version=${this.config.apiVersion}`;\n const response = await fetch(testUrl, {\n method: 'POST',\n headers: this.getHeaders(),\n body: JSON.stringify({\n messages: [{ role: 'user', content: 'test' }],\n max_tokens: 1\n }),\n signal: controller.signal\n });\n\n clearTimeout(timeoutId);\n\n if (response.ok || response.status === 400) {\n this.baseUrl = args.fallbackUrl;\n return {\n url: args.fallbackUrl,\n isAvailable: true\n };\n }\n } catch (fallbackError) {\n // Fall through to return unavailable\n }\n }\n\n return {\n url: this.baseUrl,\n isAvailable: false\n };\n }\n }\n\n getProviderType(): string {\n return AIProviderType.AZURE_OPENAI;\n }\n\n getConfig(): AIProviderConfig {\n return this.config;\n }\n\n private streamChatRequest(url: string, payload: AzureChatPayload): Observable<AIChatResponse> {\n return new Observable<AIChatResponse>(observer => {\n const task = fetch(url, {\n method: 'POST',\n headers: {\n ...this.getHeaders(),\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(payload)\n });\n\n task.then(response => {\n if (!response.ok) {\n observer.error(new Error(`Azure OpenAI request failed: ${response.status}`));\n return;\n }\n\n const reader = response.body?.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n const read = () => {\n reader?.read().then(({ done, value }) => {\n if (done) {\n observer.next({\n message: { content: '', role: 'assistant' },\n done: true\n });\n observer.complete();\n return;\n }\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() ?? '';\n\n for (const line of lines) {\n if (line.trim() && line.startsWith('data: ')) {\n const data = line.slice(6).trim();\n if (data === '[DONE]') {\n observer.next({\n message: { content: '', role: 'assistant' },\n done: true\n });\n observer.complete();\n return;\n }\n\n try {\n const parsed = JSON.parse(data) as OpenAIStreamChunk;\n const content = parsed.choices?.[0]?.delta?.content ?? '';\n if (content) {\n observer.next({\n message: { content, role: 'assistant' },\n done: false\n });\n }\n } catch (err) {\n debugLogger.error('Error parsing Azure OpenAI stream data:', { data, error: err });\n }\n }\n }\n\n read();\n }).catch(err => observer.error(err));\n };\n read();\n }).catch(err => observer.error(err));\n });\n }\n\n private nonStreamChatRequest(url: string, payload: AzureChatPayload): Observable<AIChatResponse> {\n return from(fetch(url, {\n method: 'POST',\n headers: {\n ...this.getHeaders(),\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(payload)\n })).pipe(\n switchMap(response => {\n if (!response.ok) {\n return throwError(() => new Error(`Azure OpenAI request failed: ${response.status}`));\n }\n return from(response.json() as Promise<OpenAIChatResponsePayload>);\n }),\n map((data) => {\n const content = data.choices?.[0]?.message?.content ?? '';\n return {\n message: {\n content,\n role: 'assistant' as const\n },\n done: true\n };\n })\n );\n }\n\n private getHeaders(): Record<string, string> {\n const headers: Record<string, string> = {};\n \n if (this.config.apiKey) {\n headers['api-key'] = this.config.apiKey;\n }\n\n return headers;\n }\n}\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-8631-D26CFA\nconst __banditFingerprint_providers_anthropicproviderts = 'BL-FP-B138E7-AB87';\nconst __auditTrail_providers_anthropicproviderts = 'BL-AU-MGOIKVVP-762R';\n// File: anthropic.provider.ts | Path: src/services/ai-provider/providers/anthropic.provider.ts | Hash: 8631ab87\n\nimport { Observable, from, switchMap, map, throwError } from 'rxjs';\nimport { IAIProvider } from '../interfaces/ai-provider.interface';\nimport {\n AIChatRequest,\n AIChatResponse,\n AIGenerateRequest,\n AIGenerateResponse,\n AIModel,\n AIProviderConfig,\n AIProviderType\n} from '../types/common.types';\nimport { debugLogger } from '../../logging/debugLogger';\nimport { deprecatedAnthropicProvider } from './deprecated';\n\ntype AnthropicRole = 'user' | 'assistant';\n\ninterface AnthropicChatMessagePayload {\n role: AnthropicRole;\n content: string;\n}\n\ninterface AnthropicChatPayload {\n model: string;\n messages: AnthropicChatMessagePayload[];\n system?: string;\n stream: boolean;\n temperature?: number;\n max_tokens: number;\n}\n\ninterface AnthropicStreamChunk {\n delta?: {\n text?: string;\n };\n}\n\ninterface AnthropicChatResponsePayload {\n content?: unknown;\n completion?: string;\n message?: {\n content?: string;\n };\n}\n\n/**\n * Anthropic provider implementation for direct API access\n */\nexport class AnthropicProvider implements IAIProvider {\n private config: AIProviderConfig;\n private baseUrl: string;\n private version: string;\n private defaultMaxTokens: number;\n\n constructor(config: AIProviderConfig) {\n deprecatedAnthropicProvider(); // Show deprecation warning\n this.config = config;\n this.baseUrl = config.baseUrl || 'https://api.anthropic.com/v1';\n this.version = typeof config.anthropicVersion === 'string' && config.anthropicVersion.trim()\n ? config.anthropicVersion.trim()\n : '2023-06-01';\n this.defaultMaxTokens =\n typeof config.anthropicMaxTokens === 'number' && config.anthropicMaxTokens > 0\n ? config.anthropicMaxTokens\n : 1024;\n this.config.anthropicVersion = this.version;\n this.config.anthropicMaxTokens = this.defaultMaxTokens;\n }\n\n chat(request: AIChatRequest): Observable<AIChatResponse> {\n const url = `${this.baseUrl}/messages`;\n \n // Convert system messages to Anthropic format\n const systemMessage = request.messages.find(msg => msg.role === 'system');\n const userMessages = request.messages.filter(msg => msg.role !== 'system');\n \n const payload: AnthropicChatPayload = {\n model: request.model,\n messages: userMessages.map(msg => ({\n role: msg.role === 'user' ? 'user' : 'assistant',\n content: msg.content\n })),\n system: systemMessage?.content,\n stream: Boolean(request.stream),\n temperature: request.temperature,\n max_tokens: request.maxTokens ?? this.defaultMaxTokens\n };\n\n if (request.stream) {\n return this.streamChatRequest(url, payload);\n } else {\n return this.nonStreamChatRequest(url, payload);\n }\n }\n\n generate(request: AIGenerateRequest): Observable<AIGenerateResponse> {\n // For Anthropic, we'll use the messages endpoint with a single user message\n const chatRequest: AIChatRequest = {\n model: request.model,\n messages: [{ role: 'user', content: request.prompt }],\n stream: request.stream,\n options: request.options\n };\n\n return this.chat(chatRequest).pipe(\n map(response => ({\n response: response.message.content,\n done: response.done\n }))\n );\n }\n\n listModels(): Observable<AIModel[]> {\n // Anthropic doesn't have a public models endpoint, return common models\n const commonModels: AIModel[] = [\n {\n name: 'claude-3-5-sonnet-20241022',\n details: {\n format: 'anthropic',\n family: 'claude-3.5'\n }\n },\n {\n name: 'claude-3-5-haiku-20241022',\n details: {\n format: 'anthropic',\n family: 'claude-3.5'\n }\n },\n {\n name: 'claude-3-opus-20240229',\n details: {\n format: 'anthropic',\n family: 'claude-3'\n }\n },\n {\n name: 'claude-3-sonnet-20240229',\n details: {\n format: 'anthropic',\n family: 'claude-3'\n }\n },\n {\n name: 'claude-3-haiku-20240307',\n details: {\n format: 'anthropic',\n family: 'claude-3'\n }\n }\n ];\n\n return new Observable<AIModel[]>(observer => {\n observer.next(commonModels);\n observer.complete();\n });\n }\n\n async validateServiceAvailability(args: { \n fallbackUrl?: string; \n timeoutMs: number; \n }): Promise<{ url: string; isAvailable: boolean }> {\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), args.timeoutMs);\n\n // Test with a simple messages request\n const response = await fetch(`${this.baseUrl}/messages`, {\n method: 'POST',\n headers: this.getHeaders(),\n body: JSON.stringify({\n model: 'claude-3-haiku-20240307',\n messages: [{ role: 'user', content: 'test' }],\n max_tokens: 1\n }),\n signal: controller.signal\n });\n\n clearTimeout(timeoutId);\n\n return {\n url: this.baseUrl,\n isAvailable: response.ok || response.status === 400 // 400 might be expected for the test\n };\n } catch (error) {\n if (args.fallbackUrl) {\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), args.timeoutMs);\n\n const response = await fetch(`${args.fallbackUrl}/messages`, {\n method: 'POST',\n headers: this.getHeaders(),\n body: JSON.stringify({\n model: 'claude-3-haiku-20240307',\n messages: [{ role: 'user', content: 'test' }],\n max_tokens: 1\n }),\n signal: controller.signal\n });\n\n clearTimeout(timeoutId);\n\n if (response.ok || response.status === 400) {\n this.baseUrl = args.fallbackUrl;\n return {\n url: args.fallbackUrl,\n isAvailable: true\n };\n }\n } catch (fallbackError) {\n // Fall through to return unavailable\n }\n }\n\n return {\n url: this.baseUrl,\n isAvailable: false\n };\n }\n }\n\n getProviderType(): string {\n return AIProviderType.ANTHROPIC;\n }\n\n getConfig(): AIProviderConfig {\n return this.config;\n }\n\n private streamChatRequest(url: string, payload: AnthropicChatPayload): Observable<AIChatResponse> {\n return new Observable<AIChatResponse>(observer => {\n const task = fetch(url, {\n method: 'POST',\n headers: {\n ...this.getHeaders(),\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(payload)\n });\n\n task.then(response => {\n if (!response.ok) {\n observer.error(new Error(`Anthropic request failed: ${response.status}`));\n return;\n }\n\n const reader = response.body?.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n const read = () => {\n reader?.read().then(({ done, value }) => {\n if (done) {\n observer.next({\n message: { content: '', role: 'assistant' },\n done: true\n });\n observer.complete();\n return;\n }\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() ?? '';\n\n for (const line of lines) {\n if (line.trim() && line.startsWith('data: ')) {\n const data = line.slice(6).trim();\n if (data === '[DONE]') {\n observer.next({\n message: { content: '', role: 'assistant' },\n done: true\n });\n observer.complete();\n return;\n }\n\n try {\n const parsed = JSON.parse(data) as AnthropicStreamChunk;\n // Anthropic streaming format may differ, adjust as needed\n const content = parsed.delta?.text || '';\n if (content) {\n observer.next({\n message: { content, role: 'assistant' },\n done: false\n });\n }\n } catch (err) {\n debugLogger.error('Error parsing Anthropic stream data:', { data, error: err });\n }\n }\n }\n\n read();\n }).catch(err => observer.error(err));\n };\n read();\n }).catch(err => observer.error(err));\n });\n }\n\n private nonStreamChatRequest(url: string, payload: AnthropicChatPayload): Observable<AIChatResponse> {\n return from(fetch(url, {\n method: 'POST',\n headers: {\n ...this.getHeaders(),\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(payload)\n })).pipe(\n switchMap(response => {\n if (!response.ok) {\n return throwError(() => new Error(`Anthropic request failed: ${response.status}`));\n }\n return from(response.json() as Promise<AnthropicChatResponsePayload>);\n }),\n map((data) => ({\n message: {\n content: this.extractContentText(data),\n role: 'assistant' as const\n },\n done: true\n }))\n );\n }\n\n private extractContentText(payload: AnthropicChatResponsePayload): string {\n const { content } = payload;\n\n if (Array.isArray(content)) {\n for (const entry of content) {\n if (typeof entry === 'string') {\n return entry;\n }\n if (entry && typeof entry === 'object' && 'text' in entry) {\n const text = (entry as { text?: unknown }).text;\n if (typeof text === 'string') {\n return text;\n }\n }\n }\n } else if (typeof content === 'string') {\n return content;\n }\n\n if (typeof payload.completion === 'string') {\n return payload.completion;\n }\n\n if (payload.message && typeof payload.message.content === 'string') {\n return payload.message.content;\n }\n\n return '';\n }\n\n private getHeaders(): Record<string, string> {\n const headers: Record<string, string> = {\n 'anthropic-version': this.version\n };\n \n if (this.config.apiKey) {\n headers['x-api-key'] = this.config.apiKey;\n }\n\n return headers;\n }\n}\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-0C91-217979\nconst __banditFingerprint_providers_gatewayproviderts = 'BL-FP-4F2F4F-2A21';\nconst __auditTrail_providers_gatewayproviderts = 'BL-AU-MGOIKVVQ-MHFK';\n// File: gateway.provider.ts | Path: src/services/ai-provider/providers/gateway.provider.ts | Hash: 0c912a21\n\nimport { Observable, map } from 'rxjs';\nimport { IAIProvider } from '../interfaces/ai-provider.interface';\nimport {\n AIChatRequest,\n AIChatResponse,\n AIGenerateRequest,\n AIGenerateResponse,\n AIModel,\n AIProviderConfig,\n AIProviderType\n} from '../types/common.types';\nimport { debugLogger } from '../../logging/debugLogger';\nimport { GatewayService } from '../../gateway/gateway.service';\nimport { OpenAIGatewayService } from '../../gateway/openai-gateway.service';\nimport { AzureOpenAIGatewayService } from '../../gateway/azure-openai-gateway.service';\nimport { AnthropicGatewayService } from '../../gateway/anthropic-gateway.service';\nimport { OllamaGatewayService } from '../../gateway/ollama-gateway.service';\nimport { BanditAIGatewayService } from '../../gateway/bandit-gateway.service';\nimport { \n GatewayChatRequest,\n GatewayMessage,\n GatewayMessageContent\n} from '../../gateway/interfaces';\n\n/**\n * Gateway provider implementation that routes requests through the .NET gateway API\n * This consolidates all AI provider logic behind a single gateway endpoint\n */\nexport class GatewayProvider implements IAIProvider {\n private config: AIProviderConfig;\n private gatewayService: GatewayService;\n private providerSpecificService: OpenAIGatewayService | AzureOpenAIGatewayService | AnthropicGatewayService | OllamaGatewayService | BanditAIGatewayService | null = null;\n\n constructor(config: AIProviderConfig) {\n this.config = config;\n \n if (!config.gatewayUrl) {\n throw new Error('Gateway provider requires gatewayUrl in config');\n }\n \n if (!config.provider) {\n throw new Error('Gateway provider requires provider field to specify backend (openai, azure-openai, anthropic, ollama)');\n }\n\n const tokenFactory = config.tokenFactory || (() => null);\n this.gatewayService = new GatewayService(config.gatewayUrl, tokenFactory);\n\n // Create provider-specific service for enhanced functionality\n this.createProviderSpecificService(config.gatewayUrl, tokenFactory);\n\n debugLogger.info('GatewayProvider initialized', { \n gatewayUrl: config.gatewayUrl,\n backendProvider: config.provider\n });\n }\n\n private createProviderSpecificService(gatewayUrl: string, tokenFactory: () => string | null) {\n switch (this.config.provider) {\n case 'openai':\n this.providerSpecificService = new OpenAIGatewayService(gatewayUrl, tokenFactory);\n break;\n case 'azure-openai':\n if (!this.config.deploymentName || !this.config.apiVersion) {\n throw new Error('Azure OpenAI gateway provider requires deploymentName and apiVersion');\n }\n this.providerSpecificService = new AzureOpenAIGatewayService(\n gatewayUrl, \n tokenFactory,\n {\n deploymentName: this.config.deploymentName,\n apiVersion: this.config.apiVersion\n }\n );\n break;\n case 'anthropic':\n this.providerSpecificService = new AnthropicGatewayService(gatewayUrl, tokenFactory);\n break;\n case 'bandit':\n this.providerSpecificService = new BanditAIGatewayService(gatewayUrl, tokenFactory);\n break;\n case 'ollama':\n this.providerSpecificService = new OllamaGatewayService(gatewayUrl, tokenFactory);\n break;\n case 'playground':\n // Preview gateway uses custom routing; no provider-specific service\n this.providerSpecificService = null;\n break;\n default:\n debugLogger.warn('Unknown provider for gateway, using generic gateway service', { \n provider: this.config.provider \n });\n }\n }\n\n chat(request: AIChatRequest): Observable<AIChatResponse> {\n // Convert AI request to standardized gateway request format\n // The gateway API will handle provider-specific transformations\n \n const messages: GatewayMessage[] = request.messages.map(msg => ({\n role: msg.role,\n content: msg.content\n }));\n \n // Handle images based on provider type\n const normalizeImageUrl = (value: string) => {\n if (!value) {\n return value;\n }\n const trimmed = value.trim();\n if (/^data:/i.test(trimmed) || /^https?:\\/\\//i.test(trimmed)) {\n return trimmed;\n }\n return `data:image/jpeg;base64,${trimmed}`;\n };\n\n if (request.images && request.images.length > 0) {\n const lastUserMessageIndex = messages.map(m => m.role).lastIndexOf('user');\n\n if (this.config.provider === 'ollama') {\n // Ollama: attach images directly to the last user message\n if (lastUserMessageIndex !== -1) {\n messages[lastUserMessageIndex] = {\n ...messages[lastUserMessageIndex],\n images: request.images\n };\n }\n } else if (['openai', 'azure-openai', 'anthropic', 'bandit', 'playground'].includes(this.config.provider || '')) {\n // OpenAI/Azure/Anthropic: convert to structured content format\n if (lastUserMessageIndex !== -1) {\n const currentMessage = messages[lastUserMessageIndex];\n const contentArray: GatewayMessageContent[] = [\n {\n type: 'text',\n text: currentMessage.content as string\n }\n ];\n\n // Add images as image_url content\n request.images.forEach(imageRef => {\n contentArray.push({\n type: 'image_url',\n image_url: {\n url: normalizeImageUrl(imageRef),\n detail: 'auto'\n }\n });\n });\n\n messages[lastUserMessageIndex] = {\n ...messages[lastUserMessageIndex],\n content: contentArray\n };\n debugLogger.debug('Gateway provider injected image attachments', {\n provider: this.config.provider,\n imageCount: request.images.length,\n messageIndex: lastUserMessageIndex\n });\n }\n }\n }\n \n const gatewayRequest: GatewayChatRequest = {\n model: request.model,\n messages,\n stream: request.stream,\n temperature: request.temperature,\n max_tokens: request.maxTokens,\n provider: this.config.provider,\n // Only include top-level images for Ollama (fallback)\n images: this.config.provider === 'ollama' ? request.images : undefined\n };\n\n debugLogger.debug('Gateway provider chat request', { \n model: request.model,\n provider: this.config.provider,\n messageCount: request.messages.length,\n stream: request.stream,\n hasImages: !!(request.images && request.images.length > 0),\n imageCount: request.images?.length || 0,\n imageStrategy: this.config.provider === 'ollama' \n ? 'message-level-array' \n : ['openai', 'azure-openai', 'anthropic', 'playground'].includes(this.config.provider || '')\n ? 'structured-content'\n : 'top-level-fallback',\n finalMessages: messages.map(m => ({ \n role: m.role, \n hasImages: Array.isArray(m.images) && m.images.length > 0,\n contentType: Array.isArray(m.content) ? 'structured' : 'text'\n }))\n });\n\n return this.gatewayService.chat(gatewayRequest).pipe(\n map(response => ({\n message: {\n content: response.choices?.[0]?.message?.content || \n response.choices?.[0]?.delta?.content || '',\n role: 'assistant' as const\n },\n done: response.choices?.[0]?.finish_reason === 'stop' || response.choices?.[0]?.finish_reason === 'length'\n }))\n );\n }\n\n generate(request: AIGenerateRequest): Observable<AIGenerateResponse> {\n const gatewayRequest = {\n model: request.model,\n prompt: request.prompt,\n stream: request.stream,\n provider: this.config.provider\n };\n\n debugLogger.debug('Gateway provider generate request', { \n model: request.model,\n provider: this.config.provider,\n promptLength: request.prompt.length,\n stream: request.stream \n });\n\n return this.gatewayService.generate(gatewayRequest).pipe(\n map(response => ({\n response: response.response || '',\n done: response.done || false\n }))\n );\n }\n\n listModels(): Observable<AIModel[]> {\n debugLogger.debug('Gateway provider listing models', { provider: this.config.provider });\n \n if (this.config.provider) {\n return this.gatewayService.listModelsByProvider(this.config.provider).pipe(\n map(models => models.map(model => ({\n name: model.id || model.name,\n size: model.size,\n details: model.details,\n digest: model.digest,\n modified_at: model.modified_at\n })))\n );\n } else {\n // List all models from all providers\n return this.gatewayService.listModels().pipe(\n map(models => models.map(model => ({\n name: model.id || model.name,\n size: model.size,\n details: model.details,\n digest: model.digest,\n modified_at: model.modified_at\n })))\n );\n }\n }\n\n async validateServiceAvailability(args: { \n fallbackUrl?: string; \n timeoutMs: number; \n }): Promise<{ url: string; isAvailable: boolean }> {\n debugLogger.debug('Gateway provider validating service availability');\n return this.gatewayService.validateServiceAvailability(args);\n }\n\n getProviderType(): string {\n return AIProviderType.GATEWAY;\n }\n\n getConfig(): AIProviderConfig {\n return this.config;\n }\n\n /**\n * Get the backend provider type\n */\n getBackendProvider(): string | undefined {\n return this.config.provider;\n }\n\n /**\n * Get gateway health including backend provider status\n */\n getHealth() {\n return this.gatewayService.getHealth().pipe(\n map(health => ({\n ...health,\n backend_provider: this.config.provider,\n backend_provider_status: health.providers.find(p => p.name === this.config.provider)?.status || 'unavailable'\n }))\n );\n }\n\n /**\n * Use provider-specific service if available for enhanced functionality\n */\n getProviderSpecificService(): OpenAIGatewayService | AzureOpenAIGatewayService | AnthropicGatewayService | OllamaGatewayService | BanditAIGatewayService | null {\n return this.providerSpecificService;\n }\n}\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-809E-685A92\nconst __banditFingerprint_gateway_gatewayservicets = 'BL-FP-6DB2F9-8464';\nconst __auditTrail_gateway_gatewayservicets = 'BL-AU-MGOIKVVT-6725';\n// File: gateway.service.ts | Path: src/services/gateway/gateway.service.ts | Hash: 809e8464\n\nimport axios, { AxiosError, AxiosHeaders, AxiosInstance } from \"axios\";\nimport {\n GatewayChatRequest,\n GatewayChatResponse,\n GatewayGenerateRequest,\n GatewayGenerateResponse,\n GatewayModel,\n GatewayModelsResponse,\n GatewayHealthResponse,\n GatewayMemoryResponse\n} from \"./interfaces\";\nimport { FeedbackRequest, FeedbackResponse } from \"./feedback.interfaces\";\nimport { catchError, from, lastValueFrom, map, Observable, of, shareReplay, timeout } from \"rxjs\";\nimport { debugLogger } from \"../logging/debugLogger\";\n\ninterface GatewayHttpErrorResponse {\n status: number;\n statusText: string;\n data: unknown;\n url: string;\n}\n\ntype GatewayHttpError = Error & { response: GatewayHttpErrorResponse };\n\nexport class GatewayService {\n private readonly _client: AxiosInstance;\n\n constructor(\n private _baseUrl: string,\n private readonly _tokenFactory: () => string | null,\n private readonly _feedbackEmail?: string\n ) {\n if (!this._baseUrl) {\n this._baseUrl = 'http://localhost:5000'\n debugLogger.warn(`No gateway URL provided, using default: ${this._baseUrl}`);\n }\n \n // Ensure baseUrl doesn't end with slash\n this._baseUrl = this._baseUrl.replace(/\\/$/, '');\n\n // Remove /api suffix if it exists to avoid double /api/api paths\n if (this._baseUrl.endsWith('/api')) {\n this._baseUrl = this._baseUrl.slice(0, -4);\n debugLogger.info(`Removed /api suffix from gateway URL: ${this._baseUrl}`);\n }\n\n this._client = this._createAxiosClient();\n }\n\n private _createAxiosClient(): AxiosInstance {\n const instance = axios.create({\n baseURL: this._baseUrl,\n headers: {\n 'Content-Type': 'application/json'\n }\n });\n\n instance.interceptors.request.use((config) => {\n const token = this._tokenFactory();\n const headers = AxiosHeaders.from(config.headers ?? {});\n\n if (!headers.has('Content-Type')) {\n headers.set('Content-Type', 'application/json');\n }\n\n if (token && token.trim()) {\n headers.set('Authorization', `Bearer ${token}`);\n } else if (headers.has('Authorization')) {\n headers.delete('Authorization');\n }\n\n config.headers = headers;\n return config;\n });\n\n instance.interceptors.response.use(\n (response) => response,\n (error) => Promise.reject(this._normalizeAxiosError(error))\n );\n\n return instance;\n }\n\n private _normalizeAxiosError(error: AxiosError): Error {\n if (error.response) {\n return this._createHttpError(\n `Request failed: ${error.response.status} ${error.response.statusText ?? \"\"}`,\n {\n status: error.response.status,\n statusText: error.response.statusText ?? \"\",\n data: error.response.data,\n url: error.config?.url ?? \"\"\n }\n );\n }\n\n if (error.request) {\n return new Error(`No response received from gateway: ${error.message}`);\n }\n\n return new Error(error.message);\n }\n\n private _createHttpError(message: string, response: GatewayHttpErrorResponse): GatewayHttpError {\n return Object.assign(new Error(message), { response }) as GatewayHttpError;\n }\n\n private _setBaseUrl(url: string) {\n this._baseUrl = url;\n this._client.defaults.baseURL = url;\n }\n\n private _tryGatewayWithTimeout(args: {\n url: string,\n responseType: 'json' | 'text',\n timeoutMs: number,\n }): Observable<boolean> {\n const { url, responseType, timeoutMs } = args;\n const source = this._get(url, responseType)\n const mapped = source.pipe(\n catchError((e) => (e?.message.includes(\"401\") ? of(true) : of(false))),\n map(() => true),\n timeout(timeoutMs),\n );\n return mapped;\n }\n\n /**\n * Validates the availability of the gateway service.\n * @param fallbackUrl The fallback URL to try if the base URL is not available.\n * @returns An object containing the URL and availability status.\n */\n async validateServiceAvailability(args: { fallbackUrl?: string; timeoutMs: number; }): Promise<{ url: string, isAvailable: boolean }> {\n const { fallbackUrl, timeoutMs } = args;\n const responseType = 'json';\n const availability = {\n url: \"\",\n isAvailable: false,\n }\n\n try {\n debugLogger.debug(`Validating gateway service availability at ${this._baseUrl}`);\n\n availability.url = this._baseUrl;\n availability.isAvailable = await lastValueFrom(\n this._tryGatewayWithTimeout({\n url: `${availability.url}/api/health`,\n responseType,\n timeoutMs,\n })\n ) as boolean;\n \n if (!availability.isAvailable) {\n throw new Error(`Gateway service not available at ${this._baseUrl}`);\n }\n\n return availability;\n } catch (e) {\n if (fallbackUrl) {\n debugLogger.warn(`Gateway service not available at ${this._baseUrl}, trying fallback URL: ${fallbackUrl}`);\n try {\n availability.url = fallbackUrl.replace(/\\/$/, '');\n availability.isAvailable = await lastValueFrom(\n this._tryGatewayWithTimeout({\n url: `${availability.url}/api/health`,\n responseType,\n timeoutMs,\n })\n ) as boolean;\n\n if (!availability.isAvailable) {\n throw new Error(`Gateway service not available at ${fallbackUrl}`);\n }\n \n this._setBaseUrl(availability.url);\n return availability;\n } catch (e) {\n debugLogger.error(`Gateway service not available at fallback URL: ${fallbackUrl}`);\n throw e;\n }\n } else {\n debugLogger.error(`Gateway service not available and no fallback URL provided`);\n throw e;\n }\n }\n }\n\n /**\n * Get gateway health status and available providers\n */\n getHealth(): Observable<GatewayHealthResponse> {\n const url = `${this._baseUrl}/api/health`;\n return this._get<GatewayHealthResponse>(url);\n }\n\n /**\n * Chat completion using the gateway API\n */\n chat(request: GatewayChatRequest): Observable<GatewayChatResponse> {\n // Use provider-specific endpoint if provider is specified\n // For Ollama specifically, use /chat instead of /chat/completions\n const endpoint =\n request.provider === 'ollama'\n ? `/api/${request.provider}/chat`\n : request.provider === 'playground'\n ? '/api/playground/chat/completions'\n : request.provider\n ? `/api/${request.provider}/chat/completions`\n : '/api/chat/completions';\n const fallbackEndpoint =\n request.provider === 'bandit' ? '/completions' : null;\n const normalizedModel =\n request.provider === 'bandit'\n ? (() => {\n const trimmed = (request.model ?? '').replace(/^bandit:/, '').trim();\n return trimmed !== '' ? trimmed : 'bandit-core-1';\n })()\n : request.model;\n \n const requestBody = { ...request, model: normalizedModel, stream: request.stream !== false };\n \n return new Observable<GatewayChatResponse>(observer => {\n const controller = new AbortController();\n const handleStreamingResponse = async (response: Response) => {\n const reader = response.body?.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n const read = () => {\n reader?.read().then(({ done, value }) => {\n if (done) {\n if (buffer.trim() !== \"\") {\n try {\n const finalResponse = JSON.parse(buffer);\n observer.next(finalResponse);\n } catch (err) {\n debugLogger.error('GatewayService chat final chunk parsing error', { buffer, error: err });\n observer.error(err);\n }\n }\n observer.complete();\n return;\n }\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() ?? '';\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (trimmed) {\n // Handle both SSE format (OpenAI-style) and direct JSON (Ollama-style)\n let data = trimmed;\n \n if (trimmed.startsWith('data: ')) {\n data = trimmed.slice(6); // Remove 'data: ' prefix for SSE format\n if (data === '[DONE]') {\n observer.complete();\n return;\n }\n }\n \n try {\n const parsed = JSON.parse(data);\n \n // Transform Ollama chat format to OpenAI-compatible format\n if (request.provider === 'ollama' && parsed.message) {\n const transformed: GatewayChatResponse = {\n id: `chatcmpl-${Date.now()}`,\n object: 'chat.completion.chunk',\n created: Math.floor(new Date(parsed.created_at || Date.now()).getTime() / 1000),\n model: parsed.model,\n choices: [{\n index: 0,\n delta: {\n role: parsed.message.role,\n content: parsed.message.content\n },\n finish_reason: parsed.done ? (parsed.done_reason || 'stop') : null\n }]\n };\n \n if (parsed.done && parsed.total_duration) {\n transformed.usage = {\n prompt_tokens: parsed.prompt_eval_count || 0,\n completion_tokens: parsed.eval_count || 0,\n total_tokens: (parsed.prompt_eval_count || 0) + (parsed.eval_count || 0)\n };\n }\n \n observer.next(transformed);\n } else {\n // For non-Ollama providers or already transformed responses\n observer.next(parsed);\n }\n } catch (err) {\n debugLogger.error('GatewayService chat stream chunk parsing error', {\n line: trimmed,\n rawData: data,\n error: err\n });\n observer.error(err);\n }\n }\n }\n\n read();\n }).catch(err => observer.error(err));\n };\n read();\n };\n\n const sendRequest = (targetEndpoint: string, allowFallback: boolean) => {\n const url = `${this._baseUrl}${targetEndpoint}`;\n\n debugLogger.debug(`Gateway chat request to ${url} with provider: ${request.provider || 'default'}`, {\n model: normalizedModel,\n messageCount: request.messages.length,\n hasImages: !!(request.images && request.images.length > 0),\n imageCount: request.images?.length || 0\n });\n\n fetch(url, {\n method: 'POST',\n headers: this._getHeaders(),\n body: JSON.stringify(requestBody),\n signal: controller.signal,\n })\n .then(async (response) => {\n debugLogger.debug(`Gateway chat response status: ${response.status} for provider: ${request.provider || 'default'}`);\n\n if (response.status === 404 && allowFallback && fallbackEndpoint) {\n debugLogger.warn('GatewayService chat endpoint returned 404, attempting fallback route', {\n provider: request.provider,\n attemptedEndpoint: targetEndpoint,\n fallbackEndpoint\n });\n sendRequest(fallbackEndpoint, false);\n return;\n }\n\n if (!response.ok) {\n // Handle error response properly with body parsing\n let errorText = '';\n let errorData: unknown = null;\n \n try {\n // First, try to read the response body\n errorText = await response.text();\n debugLogger.error('GatewayService chat error response body', {\n status: response.status,\n statusText: response.statusText,\n url: response.url,\n body: errorText\n });\n } catch (readError) {\n debugLogger.error('GatewayService chat failed to read error response body', { error: readError });\n errorText = `Request failed with status ${response.status}`;\n }\n \n // Then, try to parse as JSON for better error info\n try {\n errorData = JSON.parse(errorText);\n debugLogger.error('GatewayService chat parsed error payload', errorData);\n } catch (parseError) {\n debugLogger.error('GatewayService chat error payload was not valid JSON');\n errorData = { message: errorText };\n }\n \n // Create an error object that mimics an HTTP response error for the notification service\n const error = this._createHttpError(\n `POST ${url} failed: ${response.status} ${response.statusText ?? \"\"}`,\n {\n status: response.status,\n statusText: response.statusText ?? \"\",\n data: errorData,\n url\n }\n );\n \n throw error;\n }\n\n await handleStreamingResponse(response);\n })\n .catch(err => {\n debugLogger.error('GatewayService chat fetch error', {\n error: err,\n url,\n provider: request.provider\n });\n observer.error(err);\n });\n };\n\n sendRequest(endpoint, true);\n\n // Teardown: abort the request/stream on unsubscribe\n return () => {\n try { controller.abort(); } catch {}\n };\n });\n }\n\n /**\n * Text generation using the gateway API\n */\n generate(request: GatewayGenerateRequest): Observable<GatewayGenerateResponse> {\n // Use provider-specific endpoint if provider is specified\n const endpoint = request.provider ? `/api/${request.provider}/generate` : '/api/generate';\n const url = `${this._baseUrl}${endpoint}`;\n const normalizedModel =\n request.provider === 'bandit'\n ? (() => {\n const trimmed = (request.model ?? '').replace(/^bandit:/, '').trim();\n return trimmed !== '' ? trimmed : 'bandit-core-1';\n })()\n : request.model;\n \n debugLogger.debug(`Gateway generate request to ${url} with provider: ${request.provider || 'default'}`, {\n model: normalizedModel\n });\n \n return new Observable<GatewayGenerateResponse>(observer => {\n const task = fetch(url, {\n method: 'POST',\n headers: this._getHeaders(),\n body: JSON.stringify({ ...request, model: normalizedModel, stream: request.stream !== false }),\n });\n \n task.then(async (response) => {\n if (!response.ok) {\n // Handle error response properly with body parsing\n let errorText = '';\n let errorData: unknown = null;\n \n try {\n // First, try to read the response body\n errorText = await response.text();\n } catch (readError) {\n errorText = `Request failed with status ${response.status}`;\n }\n \n // Then, try to parse as JSON for better error info\n try {\n errorData = JSON.parse(errorText);\n } catch (parseError) {\n errorData = { message: errorText };\n }\n \n // Create an error object that mimics an HTTP response error for the notification service\n const error = this._createHttpError(\n `POST ${url} failed: ${response.status} ${response.statusText ?? \"\"}`,\n {\n status: response.status,\n statusText: response.statusText ?? \"\",\n data: errorData,\n url\n }\n );\n \n throw error;\n }\n\n const reader = response.body?.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n \n const read = () => {\n reader?.read().then(({ done, value }) => {\n if (done) {\n if (buffer.trim() !== \"\") {\n try {\n observer.next(JSON.parse(buffer));\n } catch (err) {\n observer.error(err);\n debugLogger.error('Final chunk parsing error (gateway generate):', { buffer });\n }\n }\n observer.complete();\n return;\n }\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() ?? '';\n\n for (const line of lines) {\n if (line.trim()) {\n try {\n observer.next(JSON.parse(line));\n } catch (err) {\n observer.error(err);\n debugLogger.error('Error parsing JSON line (gateway generate):', { line });\n }\n }\n }\n\n read();\n }).catch(err => observer.error(err));\n };\n read();\n })\n .catch(err => observer.error(err));\n });\n }\n\n /**\n * List all available models from all providers\n */\n listModels(): Observable<GatewayModel[]> {\n const url = `${this._baseUrl}/api/models`;\n const response = this._get<GatewayModelsResponse>(url);\n const result = response.pipe(\n map(data => data.models),\n shareReplay(1)\n );\n return result;\n }\n\n /**\n * List models for a specific provider\n */\n listModelsByProvider(provider: string): Observable<GatewayModel[]> {\n const url = `${this._baseUrl}/api/models/${provider}`;\n const response = this._get<GatewayModelsResponse>(url);\n const result = response.pipe(\n map(data => data.models),\n shareReplay(1)\n );\n return result;\n }\n\n getMemory(): Observable<GatewayMemoryResponse> {\n const url = `${this._baseUrl}/api/memory`;\n return this._get<GatewayMemoryResponse>(url);\n }\n\n private _get<T>(url: string, responseType: 'json' | 'text' = 'json'): Observable<T> {\n const request = this._client.get<T>(url, { responseType });\n return from(request).pipe(\n map(response => response.data as T),\n shareReplay(1)\n );\n }\n\n private _post<TRequest, TResponse>(url: string, body: TRequest): Observable<TResponse> {\n const request = this._client.post<TResponse>(url, body);\n return from(request).pipe(\n map(response => response.data),\n shareReplay(1)\n );\n }\n\n private _getHeaders() {\n const rawToken = this._tokenFactory();\n const headers: { [key: string]: string } = {\n 'Content-Type': 'application/json'\n };\n\n if (!rawToken) {\n debugLogger.warn('GatewayService: No token found, skipping Authorization header');\n return headers;\n }\n\n const token = rawToken.trim();\n if (token === '') {\n debugLogger.warn('GatewayService: Token factory returned empty string');\n return headers;\n }\n\n if (/^(Bearer|ApiKey)\\s+/i.test(token)) {\n headers['Authorization'] = token;\n debugLogger.debug('GatewayService: Authorization header set with explicit scheme');\n return headers;\n }\n\n if (this._isLikelyBanditApiKey(token)) {\n headers['Authorization'] = `ApiKey ${token}`;\n headers['X-Burtson-Api-Key'] = token;\n debugLogger.debug('GatewayService: Authorization header set using API key');\n return headers;\n }\n\n if (this._isLikelyJwt(token)) {\n headers['Authorization'] = `Bearer ${token}`;\n debugLogger.debug('GatewayService: Authorization header set using bearer token');\n return headers;\n }\n\n // Default to bearer scheme to avoid breaking other providers\n headers['Authorization'] = `Bearer ${token}`;\n debugLogger.debug('GatewayService: Authorization header defaulted to bearer scheme');\n return headers;\n }\n\n private _isLikelyJwt(token: string): boolean {\n const segments = token.split('.');\n return segments.length === 3 && segments.every((segment) => segment.length > 0);\n }\n\n private _isLikelyBanditApiKey(value: string): boolean {\n return /^bai_[a-z0-9]{10,}$/i.test(value);\n }\n\n /**\n * Submit feedback to the gateway API\n */\n submitFeedback(feedback: FeedbackRequest): Observable<FeedbackResponse> {\n const url = `${this._baseUrl}/api/feedback`;\n \n debugLogger.debug('Gateway feedback submission', {\n category: feedback.category,\n priority: feedback.priority,\n hasImages: !!(feedback.images && feedback.images.length > 0),\n hasAttachments: !!(feedback.attachments && feedback.attachments.length > 0)\n });\n\n return from(\n this._client.post<FeedbackResponse>(url, feedback).then(response => response.data)\n ).pipe(\n catchError(error => {\n debugLogger.error('Feedback submission failed, using email fallback', error);\n\n const fallbackResponse: FeedbackResponse = {\n id: `fallback-${Date.now()}`,\n status: 'submitted',\n message: 'Feedback submission failed. Opening email client as fallback.',\n mailtoUrl: this._generateMailtoUrl(feedback)\n };\n return of(fallbackResponse);\n })\n );\n }\n\n /**\n * Generate a mailto URL as fallback for feedback submission\n */\n private _generateMailtoUrl(feedback: FeedbackRequest): string {\n const subject = encodeURIComponent(`[${feedback.category.toUpperCase()}] ${feedback.title}`);\n \n let body = `Category: ${feedback.category}\\n`;\n body += `Priority: ${feedback.priority}\\n`;\n \n if (feedback.annoyanceLevel) {\n const annoyanceLabels = {\n 1: '😊 Not annoying at all',\n 2: '😐 Slightly annoying',\n 3: '🙄 Moderately annoying', \n 4: '😠 Very annoying',\n 5: '🤬 Extremely annoying'\n };\n body += `Annoyance Level: ${feedback.annoyanceLevel}/5 - ${annoyanceLabels[feedback.annoyanceLevel as keyof typeof annoyanceLabels]}\\n`;\n }\n \n body += `\\nDescription:\\n${feedback.description}\\n\\n`;\n \n if (feedback.sessionInfo) {\n body += `Session Info:\\n`;\n body += `- Model: ${feedback.sessionInfo.currentModel}\\n`;\n body += `- Provider: ${feedback.sessionInfo.currentProvider}\\n`;\n body += `- Conversation: ${feedback.sessionInfo.conversationId}\\n`;\n body += `- Timestamp: ${feedback.sessionInfo.timestamp}\\n\\n`;\n }\n \n if (feedback.browserInfo) {\n body += `Browser Info:\\n`;\n body += `- Name: ${feedback.browserInfo.name}\\n`;\n body += `- Version: ${feedback.browserInfo.version}\\n`;\n body += `- Platform: ${feedback.browserInfo.platform}\\n\\n`;\n }\n \n if (feedback.userAgent) {\n body += `User Agent: ${feedback.userAgent}\\n\\n`;\n }\n \n if (feedback.contactEmail) {\n body += `Contact Email: ${feedback.contactEmail}\\n\\n`;\n }\n \n if (feedback.images && feedback.images.length > 0) {\n body += `📎 IMAGE ATTACHMENT:\\n`;\n body += `Please paste your clipboard contents here (Ctrl+V or Cmd+V)\\n\\n`;\n }\n \n if (feedback.attachments && feedback.attachments.length > 0) {\n body += `📎 IMPORTANT - FILES TO ATTACH:\\n`;\n body += `Please attach the following ${feedback.attachments.length} file(s) to this email:\\n`;\n feedback.attachments.forEach((attachment, index) => {\n body += ` • File ${index + 1}: ${attachment.name || `[Attachment ${index + 1}]`}\\n`;\n });\n body += `\\n(Note: Files cannot be automatically included in email links)\\n\\n`;\n }\n \n body += `---\\nGenerated by Bandit AI Feedback System`;\n \n const encodedBody = encodeURIComponent(body);\n const toEmail = this._feedbackEmail || 'feedback@burtson.ai'; // Use custom email or default\n \n return `mailto:${toEmail}?subject=${subject}&body=${encodedBody}`;\n }\n}\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-1D46-424011\nconst __banditFingerprint_gateway_openaigatewayservicets = 'BL-FP-DEEDDF-C675';\nconst __auditTrail_gateway_openaigatewayservicets = 'BL-AU-MGOIKVVU-ZD2R';\n// File: openai-gateway.service.ts | Path: src/services/gateway/openai-gateway.service.ts | Hash: 1d46c675\n\nimport { GatewayService } from './gateway.service';\nimport { GatewayChatRequest, GatewayChatResponse, GatewayGenerateRequest, GatewayGenerateResponse, GatewayModel } from './interfaces';\nimport { Observable } from 'rxjs';\nimport { map } from 'rxjs/operators';\nimport { debugLogger } from '../logging/debugLogger';\n\nexport interface OpenAIMessage {\n role: 'system' | 'user' | 'assistant';\n content: string;\n name?: string;\n}\n\nexport interface OpenAIChatRequest {\n model: string;\n messages: OpenAIMessage[];\n stream?: boolean;\n temperature?: number;\n max_tokens?: number;\n top_p?: number;\n frequency_penalty?: number;\n presence_penalty?: number;\n stop?: string | string[];\n}\n\nexport class OpenAIGatewayService {\n private _gatewayService: GatewayService;\n\n constructor(\n gatewayUrl: string,\n tokenFactory: () => string | null\n ) {\n this._gatewayService = new GatewayService(gatewayUrl, tokenFactory);\n debugLogger.info('OpenAIGatewayService initialized', { gatewayUrl });\n }\n\n /**\n * Validates the availability of the gateway service for OpenAI\n */\n async validateServiceAvailability(args: { fallbackUrl?: string; timeoutMs: number; }): Promise<{ url: string, isAvailable: boolean }> {\n return this._gatewayService.validateServiceAvailability(args);\n }\n\n /**\n * Chat completion using OpenAI through the gateway\n */\n chat(request: OpenAIChatRequest): Observable<GatewayChatResponse> {\n const gatewayRequest: GatewayChatRequest = {\n ...request,\n provider: 'openai'\n };\n\n debugLogger.debug('OpenAI Gateway chat request', { \n model: request.model, \n messageCount: request.messages.length,\n stream: request.stream \n });\n\n return this._gatewayService.chat(gatewayRequest);\n }\n\n /**\n * Text completion using OpenAI through the gateway\n */\n complete(prompt: string, options: {\n model: string;\n temperature?: number;\n max_tokens?: number;\n stream?: boolean;\n stop?: string | string[];\n }): Observable<GatewayGenerateResponse> {\n const gatewayRequest: GatewayGenerateRequest = {\n model: options.model,\n prompt,\n temperature: options.temperature,\n max_tokens: options.max_tokens,\n stream: options.stream,\n stop: options.stop,\n provider: 'openai'\n };\n\n debugLogger.debug('OpenAI Gateway completion request', { \n model: options.model, \n promptLength: prompt.length,\n stream: options.stream \n });\n\n return this._gatewayService.generate(gatewayRequest);\n }\n\n /**\n * List available OpenAI models through the gateway\n */\n listModels(): Observable<GatewayModel[]> {\n debugLogger.debug('Fetching OpenAI models through gateway');\n return this._gatewayService.listModelsByProvider('openai');\n }\n\n /**\n * Get gateway health with OpenAI provider status\n */\n getHealth() {\n return this._gatewayService.getHealth().pipe(\n map(health => ({\n ...health,\n openai_status: health.providers.find(p => p.name === 'openai')?.status || 'unavailable'\n }))\n );\n }\n}\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-9B34-38B0E8\nconst __banditFingerprint_gateway_azureopenaigatewayservicets = 'BL-FP-4A759E-00DC';\nconst __auditTrail_gateway_azureopenaigatewayservicets = 'BL-AU-MGOIKVVT-GARS';\n// File: azure-openai-gateway.service.ts | Path: src/services/gateway/azure-openai-gateway.service.ts | Hash: 9b3400dc\n\nimport { GatewayService } from './gateway.service';\nimport { GatewayChatRequest, GatewayChatResponse, GatewayGenerateRequest, GatewayGenerateResponse, GatewayModel } from './interfaces';\nimport { Observable } from 'rxjs';\nimport { map } from 'rxjs/operators';\nimport { debugLogger } from '../logging/debugLogger';\n\nexport interface AzureOpenAIMessage {\n role: 'system' | 'user' | 'assistant';\n content: string;\n name?: string;\n}\n\nexport interface AzureOpenAIChatRequest {\n model: string; // This will be the deployment name for Azure\n messages: AzureOpenAIMessage[];\n stream?: boolean;\n temperature?: number;\n max_tokens?: number;\n top_p?: number;\n frequency_penalty?: number;\n presence_penalty?: number;\n stop?: string | string[];\n}\n\nexport interface AzureOpenAIConfig {\n deploymentName: string;\n apiVersion: string;\n resourceName?: string; // For endpoint construction if needed\n}\n\nexport class AzureOpenAIGatewayService {\n private _gatewayService: GatewayService;\n private _azureConfig: AzureOpenAIConfig;\n\n constructor(\n gatewayUrl: string,\n tokenFactory: () => string | null,\n azureConfig: AzureOpenAIConfig\n ) {\n this._gatewayService = new GatewayService(gatewayUrl, tokenFactory);\n this._azureConfig = azureConfig;\n debugLogger.info('AzureOpenAIGatewayService initialized', { \n gatewayUrl, \n deploymentName: azureConfig.deploymentName,\n apiVersion: azureConfig.apiVersion \n });\n }\n\n /**\n * Validates the availability of the gateway service for Azure OpenAI\n */\n async validateServiceAvailability(args: { fallbackUrl?: string; timeoutMs: number; }): Promise<{ url: string, isAvailable: boolean }> {\n return this._gatewayService.validateServiceAvailability(args);\n }\n\n /**\n * Chat completion using Azure OpenAI through the gateway\n */\n chat(request: AzureOpenAIChatRequest): Observable<GatewayChatResponse> {\n const gatewayRequest: GatewayChatRequest = {\n ...request,\n model: this._azureConfig.deploymentName, // Use deployment name as model\n provider: 'azure-openai'\n };\n\n debugLogger.debug('Azure OpenAI Gateway chat request', { \n deploymentName: this._azureConfig.deploymentName,\n apiVersion: this._azureConfig.apiVersion,\n messageCount: request.messages.length,\n stream: request.stream \n });\n\n return this._gatewayService.chat(gatewayRequest);\n }\n\n /**\n * Text completion using Azure OpenAI through the gateway\n */\n complete(prompt: string, options: {\n model?: string; // Optional override for deployment name\n temperature?: number;\n max_tokens?: number;\n stream?: boolean;\n stop?: string | string[];\n }): Observable<GatewayGenerateResponse> {\n const gatewayRequest: GatewayGenerateRequest = {\n model: options.model || this._azureConfig.deploymentName,\n prompt,\n temperature: options.temperature,\n max_tokens: options.max_tokens,\n stream: options.stream,\n stop: options.stop,\n provider: 'azure-openai'\n };\n\n debugLogger.debug('Azure OpenAI Gateway completion request', { \n deploymentName: options.model || this._azureConfig.deploymentName,\n promptLength: prompt.length,\n stream: options.stream \n });\n\n return this._gatewayService.generate(gatewayRequest);\n }\n\n /**\n * List available Azure OpenAI models through the gateway\n */\n listModels(): Observable<GatewayModel[]> {\n debugLogger.debug('Fetching Azure OpenAI models through gateway');\n return this._gatewayService.listModelsByProvider('azure-openai');\n }\n\n /**\n * Get gateway health with Azure OpenAI provider status\n */\n getHealth() {\n return this._gatewayService.getHealth().pipe(\n map(health => ({\n ...health,\n azure_openai_status: health.providers.find(p => p.name === 'azure-openai')?.status || 'unavailable',\n azure_config: {\n deploymentName: this._azureConfig.deploymentName,\n apiVersion: this._azureConfig.apiVersion\n }\n }))\n );\n }\n\n /**\n * Update Azure configuration\n */\n updateAzureConfig(newConfig: Partial<AzureOpenAIConfig>) {\n this._azureConfig = { ...this._azureConfig, ...newConfig };\n debugLogger.info('Azure OpenAI configuration updated', this._azureConfig);\n }\n\n /**\n * Get current Azure configuration\n */\n getAzureConfig(): AzureOpenAIConfig {\n return { ...this._azureConfig };\n }\n}\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-8264-DAEB3A\nconst __banditFingerprint_gateway_anthropicgatewayservicets = 'BL-FP-CA4EB6-817C';\nconst __auditTrail_gateway_anthropicgatewayservicets = 'BL-AU-MGOIKVVS-X7J4';\n// File: anthropic-gateway.service.ts | Path: src/services/gateway/anthropic-gateway.service.ts | Hash: 8264817c\n\nimport { GatewayService } from './gateway.service';\nimport { GatewayChatRequest, GatewayChatResponse, GatewayGenerateRequest, GatewayGenerateResponse, GatewayModel } from './interfaces';\nimport { Observable } from 'rxjs';\nimport { map } from 'rxjs/operators';\nimport { debugLogger } from '../logging/debugLogger';\n\nexport interface AnthropicMessage {\n role: 'system' | 'user' | 'assistant';\n content: string;\n name?: string;\n}\n\nexport interface AnthropicChatRequest {\n model: string;\n messages: AnthropicMessage[];\n stream?: boolean;\n temperature?: number;\n max_tokens?: number;\n top_p?: number;\n stop_sequences?: string[];\n system?: string; // Anthropic uses separate system parameter\n}\n\nexport class AnthropicGatewayService {\n private _gatewayService: GatewayService;\n\n constructor(\n gatewayUrl: string,\n tokenFactory: () => string | null\n ) {\n this._gatewayService = new GatewayService(gatewayUrl, tokenFactory);\n debugLogger.info('AnthropicGatewayService initialized', { gatewayUrl });\n }\n\n /**\n * Validates the availability of the gateway service for Anthropic\n */\n async validateServiceAvailability(args: { fallbackUrl?: string; timeoutMs: number; }): Promise<{ url: string, isAvailable: boolean }> {\n return this._gatewayService.validateServiceAvailability(args);\n }\n\n /**\n * Chat completion using Anthropic through the gateway\n */\n chat(request: AnthropicChatRequest): Observable<GatewayChatResponse> {\n // Convert Anthropic-specific request to gateway format\n const gatewayRequest: GatewayChatRequest = {\n model: request.model,\n messages: request.messages,\n stream: request.stream,\n temperature: request.temperature,\n max_tokens: request.max_tokens,\n top_p: request.top_p,\n stop: request.stop_sequences,\n provider: 'anthropic'\n };\n\n debugLogger.debug('Anthropic Gateway chat request', { \n model: request.model, \n messageCount: request.messages.length,\n stream: request.stream,\n hasSystem: !!request.system\n });\n\n return this._gatewayService.chat(gatewayRequest);\n }\n\n /**\n * Text completion using Anthropic through the gateway\n */\n complete(prompt: string, options: {\n model: string;\n temperature?: number;\n max_tokens?: number;\n stream?: boolean;\n stop_sequences?: string[];\n system?: string;\n }): Observable<GatewayGenerateResponse> {\n const gatewayRequest: GatewayGenerateRequest = {\n model: options.model,\n prompt,\n temperature: options.temperature,\n max_tokens: options.max_tokens,\n stream: options.stream,\n stop: options.stop_sequences,\n provider: 'anthropic'\n };\n\n debugLogger.debug('Anthropic Gateway completion request', { \n model: options.model, \n promptLength: prompt.length,\n stream: options.stream,\n hasSystem: !!options.system\n });\n\n return this._gatewayService.generate(gatewayRequest);\n }\n\n /**\n * List available Anthropic models through the gateway\n */\n listModels(): Observable<GatewayModel[]> {\n debugLogger.debug('Fetching Anthropic models through gateway');\n return this._gatewayService.listModelsByProvider('anthropic');\n }\n\n /**\n * Get gateway health with Anthropic provider status\n */\n getHealth() {\n return this._gatewayService.getHealth().pipe(\n map(health => ({\n ...health,\n anthropic_status: health.providers.find(p => p.name === 'anthropic')?.status || 'unavailable'\n }))\n );\n }\n\n /**\n * Helper method to convert system message to Anthropic format\n * Anthropic treats system messages differently - they can be separate from messages\n */\n private extractSystemMessage(messages: AnthropicMessage[]): { messages: AnthropicMessage[], system?: string } {\n const systemMessage = messages.find(msg => msg.role === 'system');\n const userMessages = messages.filter(msg => msg.role !== 'system');\n \n return {\n messages: userMessages,\n system: systemMessage?.content\n };\n }\n\n /**\n * Enhanced chat method that handles Anthropic's system message format\n */\n chatWithSystem(request: AnthropicChatRequest): Observable<GatewayChatResponse> {\n const { messages, system } = this.extractSystemMessage(request.messages);\n \n const enhancedRequest: AnthropicChatRequest = {\n ...request,\n messages,\n system: system || request.system\n };\n\n return this.chat(enhancedRequest);\n }\n}\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-76E6-8DEDE6\nconst __banditFingerprint_gateway_ollamagatewayservicets = 'BL-FP-124FB6-97C7';\nconst __auditTrail_gateway_ollamagatewayservicets = 'BL-AU-MGOIKVVU-PU6T';\n// File: ollama-gateway.service.ts | Path: src/services/gateway/ollama-gateway.service.ts | Hash: 76e697c7\n\nimport { GatewayService } from './gateway.service';\nimport { GatewayChatRequest, GatewayChatResponse, GatewayGenerateRequest, GatewayGenerateResponse, GatewayModel } from './interfaces';\nimport { Observable } from 'rxjs';\nimport { map } from 'rxjs/operators';\nimport { debugLogger } from '../logging/debugLogger';\n\nexport interface OllamaMessage {\n role: 'system' | 'user' | 'assistant';\n content: string;\n images?: string[]; // Ollama supports image inputs\n}\n\nexport interface OllamaChatRequest {\n model: string;\n messages: OllamaMessage[];\n stream?: boolean;\n options?: Record<string, unknown>;\n images?: string[];\n}\n\nexport interface OllamaGenerateRequest {\n model: string;\n prompt: string;\n stream?: boolean;\n images?: string[];\n options?: Record<string, unknown>;\n}\n\nexport class OllamaGatewayService {\n private _gatewayService: GatewayService;\n\n constructor(\n gatewayUrl: string,\n tokenFactory: () => string | null\n ) {\n this._gatewayService = new GatewayService(gatewayUrl, tokenFactory);\n debugLogger.info('OllamaGatewayService initialized', { gatewayUrl });\n }\n\n /**\n * Validates the availability of the gateway service for Ollama\n */\n async validateServiceAvailability(args: { fallbackUrl?: string; timeoutMs: number; }): Promise<{ url: string, isAvailable: boolean }> {\n return this._gatewayService.validateServiceAvailability(args);\n }\n\n /**\n * Chat completion using Ollama through the gateway\n */\n chat(request: OllamaChatRequest): Observable<GatewayChatResponse> {\n const gatewayRequest: GatewayChatRequest = {\n ...request,\n provider: 'ollama'\n };\n\n debugLogger.debug('Ollama Gateway chat request', { \n model: request.model, \n messageCount: request.messages.length,\n stream: request.stream,\n hasImages: !!(request.images && request.images.length > 0)\n });\n\n return this._gatewayService.chat(gatewayRequest);\n }\n\n /**\n * Text generation using Ollama through the gateway\n */\n generate(request: OllamaGenerateRequest): Observable<GatewayGenerateResponse> {\n const gatewayRequest: GatewayGenerateRequest = {\n ...request,\n provider: 'ollama'\n };\n\n debugLogger.debug('Ollama Gateway generate request', { \n model: request.model, \n promptLength: request.prompt.length,\n stream: request.stream,\n hasImages: !!(request.images && request.images.length > 0)\n });\n\n return this._gatewayService.generate(gatewayRequest);\n }\n\n /**\n * List available Ollama models through the gateway\n */\n listModels(): Observable<GatewayModel[]> {\n debugLogger.debug('Fetching Ollama models through gateway');\n return this._gatewayService.listModelsByProvider('ollama');\n }\n\n /**\n * Get gateway health with Ollama provider status\n */\n getHealth() {\n return this._gatewayService.getHealth().pipe(\n map(health => ({\n ...health,\n ollama_status: health.providers.find(p => p.name === 'ollama')?.status || 'unavailable'\n }))\n );\n }\n}\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-5C48-8D1103\nconst __banditFingerprint_gateway_banditgatewayservicets = 'BL-FP-37A8F1-0E5B';\nconst __auditTrail_gateway_banditgatewayservicets = 'BL-AU-MGOIKVVS-DH4W';\n// File: bandit-gateway.service.ts | Path: src/services/gateway/bandit-gateway.service.ts | Hash: 5c488d11\n\nimport { GatewayService } from './gateway.service';\nimport {\n GatewayChatRequest,\n GatewayChatResponse,\n GatewayGenerateRequest,\n GatewayGenerateResponse,\n GatewayMessage,\n GatewayMessageContent,\n GatewayModel\n} from './interfaces';\nimport { Observable } from 'rxjs';\nimport { map } from 'rxjs/operators';\nimport { debugLogger } from '../logging/debugLogger';\n\nexport interface BanditAIChatRequest {\n model: string;\n messages: Array<{ role: 'system' | 'user' | 'assistant'; content: unknown }>;\n stream?: boolean;\n temperature?: number;\n max_tokens?: number;\n top_p?: number;\n stop?: string | string[];\n}\n\nconst normalizeBanditModel = (model: string | undefined): string => {\n if (typeof model !== 'string' || model.trim() === '') {\n return 'bandit-core-1';\n }\n const normalized = model.replace(/^bandit:/, '').trim();\n return normalized === '' ? 'bandit-core-1' : normalized;\n};\n\nconst isGatewayMessageContent = (value: unknown): value is GatewayMessageContent => {\n if (!value || typeof value !== 'object') return false;\n const candidate = value as GatewayMessageContent;\n if (candidate.type !== 'text' && candidate.type !== 'image_url') {\n return false;\n }\n if (candidate.type === 'text') {\n return typeof candidate.text === 'string';\n }\n if (candidate.type === 'image_url') {\n return !!candidate.image_url && typeof candidate.image_url.url === 'string';\n }\n return false;\n};\n\nconst normalizeBanditMessages = (\n messages: Array<{ role: 'system' | 'user' | 'assistant'; content: unknown }>\n): GatewayMessage[] =>\n messages.map((message) => {\n const content = message.content;\n if (typeof content === 'string') {\n return { role: message.role, content };\n }\n if (Array.isArray(content)) {\n const filtered = content.filter(isGatewayMessageContent);\n if (filtered.length === 0) {\n return { role: message.role, content: JSON.stringify(content) };\n }\n return {\n role: message.role,\n content: filtered\n };\n }\n return { role: message.role, content: content != null ? String(content) : '' };\n });\n\nexport class BanditAIGatewayService {\n private _gatewayService: GatewayService;\n\n constructor(\n gatewayUrl: string,\n tokenFactory: () => string | null\n ) {\n this._gatewayService = new GatewayService(gatewayUrl, tokenFactory);\n debugLogger.info('BanditAIGatewayService initialized', { gatewayUrl });\n }\n\n async validateServiceAvailability(args: { fallbackUrl?: string; timeoutMs: number; }): Promise<{ url: string; isAvailable: boolean }> {\n return this._gatewayService.validateServiceAvailability(args);\n }\n\n chat(request: BanditAIChatRequest): Observable<GatewayChatResponse> {\n const model = normalizeBanditModel(request.model);\n const messages = normalizeBanditMessages(request.messages);\n const gatewayRequest: GatewayChatRequest = {\n ...request,\n messages,\n model,\n provider: 'bandit',\n stream: request.stream\n };\n\n debugLogger.debug('Bandit Gateway chat request', {\n model,\n messageCount: request.messages.length,\n stream: request.stream\n });\n\n return this._gatewayService.chat(gatewayRequest);\n }\n\n complete(prompt: string, options: {\n model: string;\n temperature?: number;\n max_tokens?: number;\n stream?: boolean;\n stop?: string | string[];\n }): Observable<GatewayGenerateResponse> {\n const model = normalizeBanditModel(options.model);\n const gatewayRequest: GatewayGenerateRequest = {\n model,\n prompt,\n temperature: options.temperature,\n max_tokens: options.max_tokens,\n stream: options.stream,\n stop: options.stop,\n provider: 'bandit'\n };\n\n debugLogger.debug('Bandit Gateway generate request', {\n model,\n promptLength: prompt.length,\n stream: options.stream\n });\n\n return this._gatewayService.generate(gatewayRequest);\n }\n\n listModels(): Observable<GatewayModel[]> {\n debugLogger.debug('Fetching Bandit models through gateway');\n return this._gatewayService.listModelsByProvider('bandit');\n }\n\n getHealth() {\n return this._gatewayService.getHealth().pipe(\n map(health => ({\n ...health,\n bandit_status: health.providers.find(p => p.name === 'bandit')?.status || 'unavailable'\n }))\n );\n }\n}\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-DBA3-6C3A2B\nconst __banditFingerprint_providers_playgroundproviderts = 'BL-FP-7465CF-7B8B';\nconst __auditTrail_providers_playgroundproviderts = 'BL-AU-MGOIKVVR-EV75';\n// File: playground.provider.ts | Path: src/services/ai-provider/providers/playground.provider.ts | Hash: dba37b8b\n\nimport { Observable } from 'rxjs';\nimport { IAIProvider } from '../interfaces/ai-provider.interface';\nimport {\n AIChatRequest,\n AIChatResponse,\n AIGenerateRequest,\n AIGenerateResponse,\n AIModel,\n AIProviderConfig,\n AIProviderType\n} from '../types/common.types';\n\ntype PlaygroundScript = {\n match: (input: string) => boolean;\n response: string;\n};\n\nconst PLAYGROUND_MODELS: AIModel[] = [\n {\n name: 'bandit-playground',\n details: {\n format: 'chat',\n family: 'bandit',\n families: ['bandit', 'demo'],\n parameter_size: 'demo',\n quantization_level: 'synthetic'\n },\n digest: 'playground-demo-001',\n modified_at: new Date().toISOString()\n },\n {\n name: 'bandit-starter',\n details: {\n format: 'chat',\n family: 'bandit',\n families: ['bandit', 'demo'],\n parameter_size: 'demo',\n quantization_level: 'synthetic'\n },\n digest: 'playground-demo-002',\n modified_at: new Date().toISOString()\n }\n];\n\nconst PLAYGROUND_CONVERSATION_STARTERS = [\n 'What can I build with Bandit Engine if my backend is not ready yet?',\n 'How does the gateway contract keep API keys out of the browser?',\n 'Can I theme the chat UI to match my product brand?',\n 'How do I switch between Ollama and OpenAI without redeploying the frontend?',\n 'Show me how the management console handles personas and models.'\n];\n\nconst PLAYGROUND_SCRIPTS: PlaygroundScript[] = [\n {\n match: (input) => /model|switch|personas|management/i.test(input),\n response: [\n \"Absolutely — the management console ships with live model switching, persona editing, and feature toggles.\",\n \"\",\n \"- Use the **Models** tab to expose whichever gateway-backed models you want customers to see.\",\n \"- Personas hydrate the chat with branded system prompts, voice preferences, and avatars.\",\n \"- Everything persists through the gateway, so you can roll out changes without shipping a new build.\"\n ].join('\\n')\n },\n {\n match: (input) => /gateway|api|contract|backend/i.test(input),\n response: [\n \"The gateway contract keeps secrets on the server while giving the UI a unified AI API.\",\n \"\",\n \"Key highlights:\",\n \"1. `/api/chat/completions` is the default OpenAI-format endpoint when no provider override is set.\",\n \"2. `/api/{provider}/chat/completions` handles OpenAI, Azure OpenAI, and Anthropic while `/api/ollama/chat` streams Ollama responses.\",\n \"3. The contract is language-agnostic — Express, FastAPI, .NET, Go… anything works as long as it speaks HTTP.\"\n ].join('\\n')\n },\n {\n match: (input) => /style|theme|brand|ui/i.test(input),\n response: [\n \"Every surface in Bandit Engine is themeable.\",\n \"\",\n \"- Drop a JSON config into your `public/` folder (or host it on a CDN) to control themes, logos, and accent colors.\",\n \"- The React components expose hooks for custom headers, menus, and call-to-action buttons.\",\n \"- Need a modal? `ChatModal` reuses the same store, so the handoff between embedded chat and floating assistant stays seamless.\"\n ].join('\\n')\n },\n {\n match: (input) => /voice|tts|audio/i.test(input),\n response: [\n \"Voice is opt-in, but the plumbing is ready.\",\n \"\",\n \"- Configure `/api/tts` and `/api/stt` on the gateway to unlock the speak/listen controls.\",\n \"- The UI lazily loads voices and respects feature flags, so you can leave it disabled in the playground.\",\n \"- Everything streams — the assistant starts speaking before the full response lands.\"\n ].join('\\n')\n },\n {\n match: (input) => /deploy|production|secure/i.test(input),\n response: [\n \"Production hardening is front and center.\",\n \"\",\n \"- Gateway tokens ride in the `Authorization` header; rotate them server-side without touching the bundle.\",\n \"- Feature flags gate premium surfaces, letting you trial the UI before wiring billing.\",\n \"- Vector search, knowledge, and memories are isolated behind `/api/embedding/*` so you can plug in your own storage policies.\"\n ].join('\\n')\n }\n];\n\nconst FALLBACK_RESPONSE = [\n \"Bandit Engine is running in playground mode. I'm simulating how streaming works so you can explore the UX without connecting a live model.\",\n \"\",\n \"Try asking about the gateway contract, theming, voice features, or model management to see tailored walkthroughs.\"\n].join('\\n');\n\nconst STREAM_DELAY_MS = 350;\n\nexport class PlaygroundProvider implements IAIProvider {\n private config: AIProviderConfig;\n\n constructor(config: AIProviderConfig) {\n this.config = { type: AIProviderType.PLAYGROUND, ...config };\n }\n\n chat(request: AIChatRequest): Observable<AIChatResponse> {\n const lastUserMessage = [...request.messages]\n .reverse()\n .find((m) => m.role === 'user')?.content ?? '';\n\n const script = PLAYGROUND_SCRIPTS.find((scenario) =>\n scenario.match(lastUserMessage)\n );\n\n const responseText = script?.response ?? FALLBACK_RESPONSE;\n const chunks = this.splitIntoChunks(responseText);\n\n return new Observable<AIChatResponse>((observer) => {\n let index = 0;\n const emitChunk = () => {\n if (index >= chunks.length) {\n observer.complete();\n return;\n }\n\n const chunk = chunks[index];\n observer.next({\n message: {\n content: chunk,\n role: 'assistant'\n },\n done: index === chunks.length - 1\n });\n\n index += 1;\n setTimeout(emitChunk, STREAM_DELAY_MS);\n };\n\n emitChunk();\n\n return () => {\n index = chunks.length;\n };\n });\n }\n\n generate(_request: AIGenerateRequest): Observable<AIGenerateResponse> {\n const starters = PLAYGROUND_CONVERSATION_STARTERS.join('\\n');\n\n return new Observable<AIGenerateResponse>((observer) => {\n observer.next({\n response: starters,\n done: true\n });\n observer.complete();\n });\n }\n\n listModels(): Observable<AIModel[]> {\n return new Observable<AIModel[]>((observer) => {\n observer.next(PLAYGROUND_MODELS);\n observer.complete();\n });\n }\n\n async validateServiceAvailability(args: { fallbackUrl?: string; timeoutMs: number }): Promise<{ url: string; isAvailable: boolean }> {\n const simulatedUrl = this.config.baseUrl ?? 'playground://local';\n\n if (args.timeoutMs > 0) {\n await new Promise((resolve) => setTimeout(resolve, Math.min(args.timeoutMs, 250)));\n }\n\n return {\n url: simulatedUrl,\n isAvailable: true\n };\n }\n\n getProviderType(): string {\n return AIProviderType.PLAYGROUND;\n }\n\n getConfig(): AIProviderConfig {\n return this.config;\n }\n\n private splitIntoChunks(response: string): string[] {\n const paragraphs = response.split('\\n\\n').map((p) => p.trim()).filter(Boolean);\n\n if (paragraphs.length <= 1) {\n const sentences = response.split(/(?<=[.!?])\\s+/).filter(Boolean);\n return sentences.length > 0 ? sentences : [response];\n }\n\n return paragraphs;\n }\n}\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-16A2-8F5D0C\nconst __banditFingerprint_providers_xaiproviderts = 'BL-FP-DA7844-7C12';\nconst __auditTrail_providers_xaiproviderts = 'BL-AU-MGOIKVVR-W7UB';\n// File: xai.provider.ts | Path: src/services/ai-provider/providers/xai.provider.ts | Hash: 16a28f5d\n\nimport { Observable, from, switchMap, map, throwError } from 'rxjs';\nimport { IAIProvider } from '../interfaces/ai-provider.interface';\nimport {\n AIChatRequest,\n AIChatResponse,\n AIGenerateRequest,\n AIGenerateResponse,\n AIModel,\n AIProviderConfig,\n AIProviderType\n} from '../types/common.types';\nimport { debugLogger } from '../../logging/debugLogger';\n\ninterface XAIChatPayload {\n model: string;\n messages: AIChatRequest['messages'];\n stream: boolean;\n temperature?: number;\n max_tokens?: number;\n}\n\ninterface XAIStreamChunk {\n choices?: Array<{\n delta?: {\n content?: string;\n };\n }>;\n}\n\ninterface XAIChatResponsePayload {\n choices?: Array<{\n message?: {\n content?: string;\n };\n }>;\n}\n\ninterface XAIModelListResponse {\n data: Array<{\n id: string;\n object?: string;\n }>;\n}\n\n/**\n * xAI provider implementation\n */\nexport class XAIProvider implements IAIProvider {\n private config: AIProviderConfig;\n private baseUrl: string;\n\n constructor(config: AIProviderConfig) {\n this.config = config;\n this.baseUrl = config.baseUrl || 'https://api.x.ai/v1';\n }\n\n chat(request: AIChatRequest): Observable<AIChatResponse> {\n const url = `${this.baseUrl}/chat/completions`;\n\n const payload: XAIChatPayload = {\n model: request.model,\n messages: request.messages,\n stream: Boolean(request.stream),\n temperature: request.temperature,\n max_tokens: request.maxTokens\n };\n\n if (request.stream) {\n return this.streamChatRequest(url, payload);\n } else {\n return this.nonStreamChatRequest(url, payload);\n }\n }\n\n generate(request: AIGenerateRequest): Observable<AIGenerateResponse> {\n const chatRequest: AIChatRequest = {\n model: request.model,\n messages: [{ role: 'user', content: request.prompt }],\n stream: request.stream,\n options: request.options\n };\n\n return this.chat(chatRequest).pipe(\n map(response => ({\n response: response.message.content,\n done: response.done\n }))\n );\n }\n\n listModels(): Observable<AIModel[]> {\n const url = `${this.baseUrl}/models`;\n\n return from(fetch(url, {\n headers: this.getHeaders()\n })).pipe(\n switchMap(response => {\n if (!response.ok) {\n return throwError(() => new Error(`Failed to list models: ${response.status}`));\n }\n return from(response.json() as Promise<XAIModelListResponse>);\n }),\n map((data) =>\n data.data.map((model) => ({\n name: model.id,\n details: {\n format: 'xai',\n family: model.object\n }\n }))\n )\n );\n }\n\n async validateServiceAvailability(args: {\n fallbackUrl?: string;\n timeoutMs: number;\n }): Promise<{ url: string; isAvailable: boolean }> {\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), args.timeoutMs);\n\n const response = await fetch(`${this.baseUrl}/models`, {\n headers: this.getHeaders(),\n signal: controller.signal\n });\n\n clearTimeout(timeoutId);\n\n return {\n url: this.baseUrl,\n isAvailable: response.ok\n };\n } catch (error) {\n if (args.fallbackUrl) {\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), args.timeoutMs);\n\n const response = await fetch(`${args.fallbackUrl}/models`, {\n headers: this.getHeaders(),\n signal: controller.signal\n });\n\n clearTimeout(timeoutId);\n\n if (response.ok) {\n this.baseUrl = args.fallbackUrl;\n return {\n url: args.fallbackUrl,\n isAvailable: true\n };\n }\n } catch (fallbackError) {\n debugLogger.warn('xAI fallback validation failed', { error: fallbackError });\n }\n }\n\n return {\n url: this.baseUrl,\n isAvailable: false\n };\n }\n }\n\n getProviderType(): string {\n return AIProviderType.XAI;\n }\n\n getConfig(): AIProviderConfig {\n return this.config;\n }\n\n private streamChatRequest(url: string, payload: XAIChatPayload): Observable<AIChatResponse> {\n return new Observable<AIChatResponse>(observer => {\n const task = fetch(url, {\n method: 'POST',\n headers: {\n ...this.getHeaders(),\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(payload)\n });\n\n task.then(response => {\n if (!response.ok) {\n observer.error(new Error(`xAI request failed: ${response.status}`));\n return;\n }\n\n const reader = response.body?.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n\n const read = () => {\n reader?.read().then(({ done, value }) => {\n if (done) {\n observer.next({\n message: { content: '', role: 'assistant' },\n done: true\n });\n observer.complete();\n return;\n }\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() ?? '';\n\n for (const line of lines) {\n if (line.trim() && line.startsWith('data: ')) {\n const data = line.slice(6).trim();\n if (data === '[DONE]') {\n observer.next({\n message: { content: '', role: 'assistant' },\n done: true\n });\n observer.complete();\n return;\n }\n\n try {\n const parsed = JSON.parse(data) as XAIStreamChunk;\n const content = parsed.choices?.[0]?.delta?.content ?? '';\n if (content) {\n observer.next({\n message: { content, role: 'assistant' },\n done: false\n });\n }\n } catch (err) {\n debugLogger.error('Error parsing xAI stream data:', { data, error: err });\n }\n }\n }\n\n read();\n }).catch(err => observer.error(err));\n };\n read();\n }).catch(err => observer.error(err));\n });\n }\n\n private nonStreamChatRequest(url: string, payload: XAIChatPayload): Observable<AIChatResponse> {\n return from(fetch(url, {\n method: 'POST',\n headers: {\n ...this.getHeaders(),\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(payload)\n })).pipe(\n switchMap(response => {\n if (!response.ok) {\n return throwError(() => new Error(`xAI request failed: ${response.status}`));\n }\n return from(response.json() as Promise<XAIChatResponsePayload>);\n }),\n map((data) => ({\n message: {\n content: data.choices?.[0]?.message?.content ?? '',\n role: 'assistant' as const\n },\n done: true\n }))\n );\n }\n\n private getHeaders(): Record<string, string> {\n const headers: Record<string, string> = {};\n\n if (this.config.apiKey) {\n headers['Authorization'] = `Bearer ${this.config.apiKey}`;\n }\n\n return headers;\n }\n}\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-7D56-94BC03\nconst __banditFingerprint_providers_banditai_providerts = 'BL-FP-0A9B76-CCF1';\nconst __auditTrail_providers_banditai_providerts = 'BL-AU-MGOIKVVS-LZU9';\n// File: bandit-ai.provider.ts | Path: src/services/ai-provider/providers/bandit-ai.provider.ts | Hash: 7d5694bc\n\nimport { Observable, from, switchMap, map, throwError } from 'rxjs';\nimport { IAIProvider } from '../interfaces/ai-provider.interface';\nimport {\n AIChatRequest,\n AIChatResponse,\n AIGenerateRequest,\n AIGenerateResponse,\n AIModel,\n AIProviderConfig,\n AIProviderType\n} from '../types/common.types';\nimport { debugLogger } from '../../logging/debugLogger';\n\ninterface BanditAIChatPayload {\n model: string;\n messages: BanditAIMessage[];\n stream: boolean;\n temperature?: number;\n max_tokens?: number;\n}\n\ninterface BanditAIStreamChunk {\n choices?: Array<{\n delta?: {\n content?: string;\n };\n finish_reason?: string | null;\n }>;\n}\n\ninterface BanditAINonStreamResponse {\n choices?: Array<{\n message?: {\n content?: string;\n };\n }>;\n}\n\ninterface BanditAIModelListResponse {\n data: Array<{\n id: string;\n object?: string;\n }>;\n}\n\nconst DEFAULT_BANDIT_BASE = 'https://api.burtson.ai';\n\ntype BanditAIMessageContent =\n | string\n | Array<\n | { type: 'text'; text: string }\n | { type: 'image_url'; image_url: { url: string; detail?: 'low' | 'high' | 'auto' } }\n >;\n\ninterface BanditAIMessage {\n role: 'system' | 'user' | 'assistant';\n content: BanditAIMessageContent;\n}\n\nconst normalizeImageUrl = (value: string | undefined): string | null => {\n if (!value) {\n return null;\n }\n const trimmed = value.trim();\n if (!trimmed) {\n return null;\n }\n if (/^data:/i.test(trimmed) || /^https?:\\/\\//i.test(trimmed)) {\n return trimmed;\n }\n return `data:image/jpeg;base64,${trimmed}`;\n};\n\nconst injectImagesIntoMessages = (\n messages: AIChatRequest['messages'],\n images: string[] | undefined\n): BanditAIMessage[] => {\n const normalized: BanditAIMessage[] = messages.map((message) => ({\n role: message.role,\n content: message.content,\n }));\n\n if (!images || images.length === 0) {\n return normalized;\n }\n\n const normalizedImages = images\n .map(normalizeImageUrl)\n .filter((url): url is string => Boolean(url));\n\n if (normalizedImages.length === 0) {\n return normalized;\n }\n\n const lastUserIndex = normalized.map((msg) => msg.role).lastIndexOf('user');\n if (lastUserIndex === -1) {\n return normalized;\n }\n\n const target = normalized[lastUserIndex];\n const baseContent =\n typeof target.content === 'string' && target.content.trim().length > 0\n ? [\n {\n type: 'text' as const,\n text: target.content,\n },\n ]\n : [];\n\n const imageContent = normalizedImages.map((url) => ({\n type: 'image_url' as const,\n image_url: { url, detail: 'auto' as const },\n }));\n\n normalized[lastUserIndex] = {\n role: target.role,\n content: [...baseContent, ...imageContent],\n };\n\n return normalized;\n};\n\n/**\n * Bandit AI provider implementation (OpenAI-compatible)\n */\nexport class BanditAIProvider implements IAIProvider {\n private config: AIProviderConfig;\n private baseUrl: string;\n\n constructor(config: AIProviderConfig) {\n this.config = config;\n this.baseUrl = (config.baseUrl || DEFAULT_BANDIT_BASE).replace(/\\/$/, '');\n }\n\n chat(request: AIChatRequest): Observable<AIChatResponse> {\n const url = `${this.baseUrl}/chat/completions`;\n const messages = injectImagesIntoMessages(request.messages, request.images);\n\n const payload: BanditAIChatPayload = {\n model: request.model,\n messages,\n stream: Boolean(request.stream),\n temperature: request.temperature,\n max_tokens: request.maxTokens\n };\n\n if (request.stream) {\n return this.streamChatRequest(url, payload);\n }\n\n return this.nonStreamChatRequest(url, payload);\n }\n\n generate(request: AIGenerateRequest): Observable<AIGenerateResponse> {\n const chatRequest: AIChatRequest = {\n model: request.model,\n messages: [{ role: 'user', content: request.prompt }],\n stream: request.stream,\n options: request.options\n };\n\n return this.chat(chatRequest).pipe(\n map(response => ({\n response: response.message.content,\n done: response.done\n }))\n );\n }\n\n listModels(): Observable<AIModel[]> {\n const url = `${this.baseUrl}/models`;\n\n return from(fetch(url, { headers: this.getHeaders() })).pipe(\n switchMap(response => {\n if (!response.ok) {\n debugLogger.error('BanditAI listModels failed', { status: response.status, url });\n return throwError(() => new Error(`Failed to list Bandit models: ${response.status}`));\n }\n return from(response.json() as Promise<BanditAIModelListResponse>);\n }),\n map((data) =>\n data.data.map((model) => ({\n name: model.id,\n details: {\n format: 'bandit',\n family: model.object\n }\n }))\n )\n );\n }\n\n async validateServiceAvailability(args: { fallbackUrl?: string; timeoutMs: number; }): Promise<{ url: string; isAvailable: boolean }> {\n const attempt = async (url: string) => {\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), args.timeoutMs);\n const response = await fetch(`${url}/models`, {\n headers: this.getHeaders(),\n signal: controller.signal\n });\n clearTimeout(timeoutId);\n return response.ok;\n } catch (error) {\n debugLogger.warn('BanditAI availability check failed', { url, error });\n return false;\n }\n };\n\n const primary = await attempt(this.baseUrl);\n if (primary) {\n return { url: this.baseUrl, isAvailable: true };\n }\n\n if (args.fallbackUrl) {\n const fallback = args.fallbackUrl.replace(/\\/$/, '');\n if (await attempt(fallback)) {\n this.baseUrl = fallback;\n return { url: fallback, isAvailable: true };\n }\n }\n\n return { url: this.baseUrl, isAvailable: false };\n }\n\n getProviderType(): string {\n return AIProviderType.BANDIT;\n }\n\n getConfig(): AIProviderConfig {\n return this.config;\n }\n\n private streamChatRequest(url: string, payload: BanditAIChatPayload): Observable<AIChatResponse> {\n return new Observable<AIChatResponse>(observer => {\n const task = fetch(url, {\n method: 'POST',\n headers: {\n ...this.getHeaders(),\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(payload)\n });\n\n task.then(response => {\n if (!response.ok) {\n observer.error(new Error(`BanditAI request failed: ${response.status}`));\n return;\n }\n\n const reader = response.body?.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n\n const read = () => {\n reader?.read().then(({ done, value }) => {\n if (done) {\n observer.next({ message: { content: '', role: 'assistant' }, done: true });\n observer.complete();\n return;\n }\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() ?? '';\n\n for (const rawLine of lines) {\n const line = rawLine.trim();\n if (!line.startsWith('data: ')) {\n continue;\n }\n\n const data = line.slice(6).trim();\n if (data === '[DONE]') {\n observer.next({ message: { content: '', role: 'assistant' }, done: true });\n observer.complete();\n return;\n }\n\n try {\n const parsed = JSON.parse(data) as BanditAIStreamChunk;\n const content = parsed.choices?.[0]?.delta?.content ?? '';\n if (content) {\n observer.next({ message: { content, role: 'assistant' }, done: false });\n }\n } catch (error) {\n debugLogger.error('BanditAI stream chunk parse failure', { data, error });\n }\n }\n\n read();\n }).catch(err => observer.error(err));\n };\n\n read();\n }).catch(err => observer.error(err));\n });\n }\n\n private nonStreamChatRequest(url: string, payload: BanditAIChatPayload): Observable<AIChatResponse> {\n return from(fetch(url, {\n method: 'POST',\n headers: {\n ...this.getHeaders(),\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(payload)\n })).pipe(\n switchMap(response => {\n if (!response.ok) {\n return throwError(() => new Error(`BanditAI request failed: ${response.status}`));\n }\n return from(response.json() as Promise<BanditAINonStreamResponse>);\n }),\n map((data) => ({\n message: {\n content: data.choices?.[0]?.message?.content ?? '',\n role: 'assistant' as const\n },\n done: true\n }))\n );\n }\n\n private getHeaders(): Record<string, string> {\n const headers: Record<string, string> = {};\n\n if (this.config.apiKey) {\n headers['Authorization'] = `Bearer ${this.config.apiKey}`;\n }\n\n return headers;\n }\n}\n","/*\n © 2025 Burtson Labs — Licensed under Business Source License 1.1\n https://burtson.ai/license\n\n This file is protected intellectual property.\n Do NOT use in commercial software, prompts, AI training data, or derivative works without a valid commercial license.\n\n 🚫 AI NOTICE: This file contains visible and invisible watermarks.\n ⚖️ VIOLATION NOTICE: Removing, modifying, or obscuring these watermarks is a license violation.\n 🔒 LICENSE TERMINATION: Upon license termination, ALL forks, copies, and derivatives must be permanently deleted.\n 📋 AUDIT TRAIL: File usage is logged and monitored for compliance verification.\n*/\n\n// Bandit Engine Watermark: BL-WM-AED4-661A13\nconst __banditFingerprint_aiprovider_aiproviderfactoryts = 'BL-FP-C75FF8-443D';\nconst __auditTrail_aiprovider_aiproviderfactoryts = 'BL-AU-MGOIKVVP-DXHW';\n// File: ai-provider.factory.ts | Path: src/services/ai-provider/ai-provider.factory.ts | Hash: aed4443d\n\nimport { IAIProvider } from './interfaces/ai-provider.interface';\nimport { AIProviderConfig, AIProviderType } from './types/common.types';\nimport { OllamaProvider } from './providers/ollama.provider';\nimport { OpenAIProvider } from './providers/openai.provider';\nimport { AzureOpenAIProvider } from './providers/azure-openai.provider';\nimport { AnthropicProvider } from './providers/anthropic.provider';\nimport { GatewayProvider } from './providers/gateway.provider';\nimport { PlaygroundProvider } from './providers/playground.provider';\nimport { XAIProvider } from './providers/xai.provider';\nimport { BanditAIProvider } from './providers/bandit-ai.provider';\n\n/**\n * Factory for creating AI provider instances\n */\nexport class AIProviderFactory {\n static createProvider(config: AIProviderConfig): IAIProvider {\n switch (config.type) {\n case AIProviderType.OLLAMA:\n return new OllamaProvider(config);\n \n case AIProviderType.OPENAI:\n return new OpenAIProvider(config);\n \n case AIProviderType.AZURE_OPENAI:\n return new AzureOpenAIProvider(config);\n \n case AIProviderType.ANTHROPIC:\n return new AnthropicProvider(config);\n\n case AIProviderType.XAI:\n return new XAIProvider(config);\n\n case AIProviderType.BANDIT:\n return new BanditAIProvider(config);\n\n case AIProviderType.GATEWAY:\n return new GatewayProvider(config);\n\n case AIProviderType.PLAYGROUND:\n return new PlaygroundProvider(config);\n \n default:\n throw new Error(`Unsupported AI provider type: ${config.type}`);\n }\n }\n\n static getSupportedProviders(): AIProviderType[] {\n return [\n AIProviderType.OLLAMA,\n AIProviderType.OPENAI,\n AIProviderType.AZURE_OPENAI,\n AIProviderType.XAI,\n AIProviderType.BANDIT,\n AIProviderType.GATEWAY,\n AIProviderType.PLAYGROUND\n ];\n }\n\n static validateConfig(config: AIProviderConfig): boolean {\n switch (config.type) {\n case AIProviderType.OLLAMA:\n return true; // Ollama only needs baseUrl which has defaults\n \n case AIProviderType.OPENAI:\n return !!config.apiKey;\n \n case AIProviderType.AZURE_OPENAI:\n return !!(config.baseUrl && config.apiKey && config.apiVersion && config.deploymentName);\n \n case AIProviderType.ANTHROPIC:\n return !!config.apiKey;\n\n case AIProviderType.XAI:\n return !!config.apiKey;\n\n case AIProviderType.BANDIT:\n return !!config.apiKey;\n\n case AIProviderType.GATEWAY:\n return !!(config.gatewayUrl && config.provider);\n\n case AIProviderType.PLAYGROUND:\n return true;\n \n default:\n return false;\n }\n }\n}\n"],"mappings":"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","names":["map","e","map","Observable","from","switchMap","map","throwError","map","from","switchMap","throwError","Observable","Observable","from","switchMap","map","throwError","map","Observable","from","switchMap","throwError","Observable","from","switchMap","map","throwError","map","Observable","from","switchMap","throwError","map","catchError","from","lastValueFrom","map","Observable","of","shareReplay","timeout","catchError","of","map","timeout","lastValueFrom","e","Observable","shareReplay","from","map","map","map","map","map","map","map","map","map","map","normalizeImageUrl","map","Observable","Observable","Observable","from","switchMap","map","throwError","map","from","switchMap","throwError","Observable","Observable","from","switchMap","map","throwError","map","from","switchMap","throwError","Observable"]}