@umituz/web-ai 1.0.0 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/dist/{ABTesting-DDqNhHtP.d.ts → AIErrors-B2ogd1PB.d.ts} +14 -1
  2. package/dist/{ABTesting-DWBtKTMQ.d.cts → AIErrors-C5EasV_c.d.cts} +14 -1
  3. package/dist/{ProviderConfig-a55tLhWT.d.cts → ProviderConfig-DIFa9nmG.d.cts} +10 -1
  4. package/dist/{ProviderConfig-a55tLhWT.d.ts → ProviderConfig-DIFa9nmG.d.ts} +10 -1
  5. package/dist/chat/index.cjs +114 -23
  6. package/dist/chat/index.cjs.map +1 -1
  7. package/dist/chat/index.d.cts +4 -4
  8. package/dist/chat/index.d.ts +4 -4
  9. package/dist/chat/index.js +114 -23
  10. package/dist/chat/index.js.map +1 -1
  11. package/dist/{chat.service-DBKq9I2c.d.cts → chat.service-CL1qtYxe.d.cts} +7 -7
  12. package/dist/{chat.service-RQn8UTXD.d.ts → chat.service-q05GnhEm.d.ts} +7 -7
  13. package/dist/content/index.cjs +393 -186
  14. package/dist/content/index.cjs.map +1 -1
  15. package/dist/content/index.d.cts +7 -8
  16. package/dist/content/index.d.ts +7 -8
  17. package/dist/content/index.js +393 -186
  18. package/dist/content/index.js.map +1 -1
  19. package/dist/core/index.cjs +112 -15
  20. package/dist/core/index.cjs.map +1 -1
  21. package/dist/core/index.d.cts +5 -33
  22. package/dist/core/index.d.ts +5 -33
  23. package/dist/core/index.js +111 -16
  24. package/dist/core/index.js.map +1 -1
  25. package/dist/{create-ai-DGZFBOA1.d.cts → create-ai-DOI9jD3v.d.cts} +4 -21
  26. package/dist/{create-ai-BhNaz86i.d.ts → create-ai-DXEoke8-.d.ts} +4 -21
  27. package/dist/hooks/index.cjs +359 -169
  28. package/dist/hooks/index.cjs.map +1 -1
  29. package/dist/hooks/index.d.cts +6 -6
  30. package/dist/hooks/index.d.ts +6 -6
  31. package/dist/hooks/index.js +359 -169
  32. package/dist/hooks/index.js.map +1 -1
  33. package/dist/index-DIHz8_OJ.d.ts +48 -0
  34. package/dist/index-DKHNcMbl.d.cts +48 -0
  35. package/dist/index.cjs +245 -94
  36. package/dist/index.cjs.map +1 -1
  37. package/dist/index.d.cts +6 -6
  38. package/dist/index.d.ts +6 -6
  39. package/dist/index.js +244 -95
  40. package/dist/index.js.map +1 -1
  41. package/dist/{provider.factory-COsnprLH.d.cts → provider.factory-BxsfK4WW.d.cts} +1 -1
  42. package/dist/{provider.factory-CpWFyjbw.d.ts → provider.factory-DfDfk0dK.d.ts} +1 -1
  43. package/dist/providers/index.cjs +281 -124
  44. package/dist/providers/index.cjs.map +1 -1
  45. package/dist/providers/index.d.cts +11 -12
  46. package/dist/providers/index.d.ts +11 -12
  47. package/dist/providers/index.js +281 -124
  48. package/dist/providers/index.js.map +1 -1
  49. package/dist/wizard/index.d.cts +1 -1
  50. package/dist/wizard/index.d.ts +1 -1
  51. package/package.json +4 -1
  52. package/dist/index-DjX9ZKuM.d.cts +0 -14
  53. package/dist/index-DxLvE588.d.ts +0 -14
package/dist/index.d.cts CHANGED
@@ -1,11 +1,11 @@
1
1
  export { C as ChatMessage, F as FinishReason, G as GenerationResult, P as ProviderHealth, S as StreamCallbacks, a as StructuredGeneration, b as StructuredTextRequest, T as TextRequest, c as TextTier, d as TokenUsage } from './index-fXjxTR5W.cjs';
2
- export { T as TEXT_TIERS, a as TierModelMap, i as isTextTier, m as mergeTierOverrides, r as resolveModel } from './index-DjX9ZKuM.cjs';
3
- export { AIError, AIErrorBody, AIErrorMetadata, AIErrorType, ApiKeyValidationRule, CompositeExecutor, DEFAULT_API_KEY_RULE, DEFAULT_ERROR_CLASSIFICATION_RULE, DEFAULT_HTTP_STATUS_RULE, DEFAULT_RETRY_BACKOFF_MULTIPLIER, DEFAULT_RETRY_INITIAL_DELAY_MS, DEFAULT_RETRY_JITTER_FACTOR, DEFAULT_RETRY_MAX_ATTEMPTS, DEFAULT_RETRY_MAX_DELAY_MS, DebounceManager, DebounceOptions, DedupeExecutor, DedupeExecutorOptions, ErrorClassificationRule, HttpStatusClassificationRule, IRequestExecutor, JSON_CODE_BLOCK_PATTERN, JSON_OBJECT_PATTERN, JsonResponseParser, LoggedError, NormalizedSseChunk, QueueExecutor, RetryExecutor, SSE_BRIDGE_EVENTS, SSE_DONE_MARKER, SSE_PREFIX, SseDeltaExtractor, SseResponseOptions, StreamingParserCallbacks, StreamingResponseParser, StructuredPromptBuilder, ThrottleManager, ThrottleOptions, USER_FRIENDLY_ERROR_MESSAGES, asObjectArray, asRecord, asStringArray, asTrimmedOptionalString, buildCacheKey, buildHttpStatusFallback, clampScore, classifyHttpStatus, createSseResponse, debounce, debounceManager, describeAIErrorType, extractErrorMessageFromJsonBody, extractErrorMessageFromResponse, extractJsonCandidate, extractJsonFromCodeFence, extractJsonObject, extractSseDataPayload, formatErrorForLogging, isAuthErrorType, isRetryableErrorType, isSseDataLine, isSseDoneMarker, isValidApiKey, normalizeSseChunk, oneOfCatalog, resolveUserFriendlyErrorMessage, resolveUserFriendlyMessage, splitSseLines, throttle, throttleManager, validateApiKey } from './core/index.cjs';
2
+ export { A as AIError, a as AIErrorMetadata, b as AIErrorType, T as TEXT_TIERS, c as TierModelMap, U as USER_FRIENDLY_ERROR_MESSAGES, i as isTextTier, m as mergeTierOverrides, r as resolveModel } from './index-DKHNcMbl.cjs';
3
+ export { AIErrorBody, ApiKeyValidationRule, CompositeExecutor, DEFAULT_API_KEY_RULE, DEFAULT_ERROR_CLASSIFICATION_RULE, DEFAULT_HTTP_STATUS_RULE, DEFAULT_RETRY_BACKOFF_MULTIPLIER, DEFAULT_RETRY_INITIAL_DELAY_MS, DEFAULT_RETRY_JITTER_FACTOR, DEFAULT_RETRY_MAX_ATTEMPTS, DEFAULT_RETRY_MAX_DELAY_MS, DebounceManager, DebounceOptions, DedupeExecutor, DedupeExecutorOptions, ErrorClassificationRule, HttpStatusClassificationRule, IRequestExecutor, JSON_CODE_BLOCK_PATTERN, JSON_OBJECT_PATTERN, JsonResponseParser, LoggedError, NormalizedSseChunk, QueueExecutor, RetryExecutor, SSE_BRIDGE_EVENTS, SSE_DONE_MARKER, SSE_PREFIX, SseDeltaExtractor, SseResponseOptions, StreamingParserCallbacks, StreamingResponseParser, StructuredPromptBuilder, ThrottleManager, ThrottleOptions, asObjectArray, asRecord, asStringArray, asTrimmedOptionalString, buildCacheKey, buildHttpStatusFallback, clampScore, classifyHttpStatus, createSseResponse, debounce, debounceManager, describeAIErrorType, extractErrorMessageFromJsonBody, extractErrorMessageFromResponse, extractJsonArray, extractJsonCandidate, extractJsonFromCodeFence, extractJsonObject, extractSseDataPayload, formatErrorForLogging, isAuthErrorType, isRetryableErrorType, isSseDataLine, isSseDoneMarker, isValidApiKey, normalizeSseChunk, oneOfCatalog, repairCommonJsonDefects, resolveUserFriendlyErrorMessage, resolveUserFriendlyMessage, splitSseLines, throttle, throttleManager, validateApiKey } from './core/index.cjs';
4
4
  export { C as CacheManager, a as CacheOptions, b as CacheStats, c as cacheManager } from './cache-manager-Df9LLYGA.cjs';
5
5
  export { Q as QueueOptions, R as RequestDeduplicator, a as RequestQueue, b as RetryManager, c as RetryOptions, r as requestDeduplicator, d as requestQueue, e as retryManager, w as withRetry } from './request-deduplicator.util-NDo0_n1y.cjs';
6
- export { A as AnyProvider, C as CostEstimateRequest, I as IMediaProvider, a as IProviderBase, b as ITextProvider, P as ProviderCapability, c as ProviderFactory, d as ProviderFactoryConfig, i as isMediaProvider, e as isTextProvider } from './provider.factory-COsnprLH.cjs';
6
+ export { A as AnyProvider, C as CostEstimateRequest, I as IMediaProvider, a as IProviderBase, b as ITextProvider, P as ProviderCapability, c as ProviderFactory, d as ProviderFactoryConfig, i as isMediaProvider, e as isTextProvider } from './provider.factory-BxsfK4WW.cjs';
7
7
  export { AnthropicHttpTransport, AnthropicProvider, AnthropicRequestBuilder, BaseProvider, BaseProviderConfig, FalProvider, GEMINI_TIERS, GROQ_MODELS, GROQ_TIERS, GeminiProvider, GroqChatRequestBuilder, GroqHttpClient, GroqHttpTransport, GroqProvider, ProviderError, PrunaProgressStage, PrunaProvider, PrunaRequest, consumeAnthropicStream, consumeGroqStream, createFalProvider, createGeminiProvider, createPrunaProvider, defaultEffortForModel, extractContentFromSsePayload, generateWithPruna, mapAnthropicStopReason, toGroqMessages } from './providers/index.cjs';
8
- export { A as AIProviderConfig, a as ANTHROPIC_API_VERSION, b as ANTHROPIC_DEFAULT_MAX_TOKENS, c as ANTHROPIC_MODELS, d as ANTHROPIC_TIERS, e as AnthropicEffort, f as AnthropicMessagesRequest, g as AnthropicMessagesResponse, h as AnthropicProviderConfig, i as AnthropicStopReason, j as AnthropicStreamEvent, G as GroqChatChunk, k as GroqChatRequest, l as GroqChatResponse, m as GroqMessage, n as GroqProviderConfig, o as createAI } from './create-ai-DGZFBOA1.cjs';
9
- export { C as ChatConfig, a as ChatConversation, b as ChatMessageSender, c as ChatMessageType, d as ChatService, e as ChatTokenUsage, f as ConversationMessage, D as DEFAULT_PROMPT_STRATEGY, I as IChatService, g as IChatStorage, h as IMessageFormatter, S as SendMessageInput, i as SendMessageResult, j as SystemPromptStrategy, U as UseChatOptions, k as UseChatReturn, l as extractTokenUsage } from './chat.service-DBKq9I2c.cjs';
8
+ export { A as AIProviderConfig, a as ANTHROPIC_API_VERSION, b as ANTHROPIC_DEFAULT_MAX_TOKENS, c as ANTHROPIC_MODELS, d as ANTHROPIC_TIERS, e as AnthropicEffort, f as AnthropicMessagesRequest, g as AnthropicMessagesResponse, h as AnthropicProviderConfig, i as AnthropicStopReason, j as AnthropicStreamEvent, G as GroqChatChunk, k as GroqChatRequest, l as GroqChatResponse, m as GroqMessage, n as GroqProviderConfig, o as createAI } from './create-ai-DOI9jD3v.cjs';
9
+ export { C as ChatConfig, a as ChatConversation, b as ChatMessageSender, c as ChatMessageType, d as ChatService, e as ChatTokenUsage, f as ConversationMessage, D as DEFAULT_PROMPT_STRATEGY, I as IChatService, g as IChatStorage, h as IMessageFormatter, S as SendMessageInput, i as SendMessageResult, j as SystemPromptStrategy, U as UseChatOptions, k as UseChatReturn, l as extractTokenUsage } from './chat.service-CL1qtYxe.cjs';
10
10
  export { ChatIdGenerator, chatIdGenerator, messageFormatter } from './chat/index.cjs';
11
- import './ProviderConfig-a55tLhWT.cjs';
11
+ import './ProviderConfig-DIFa9nmG.cjs';
package/dist/index.d.ts CHANGED
@@ -1,11 +1,11 @@
1
1
  export { C as ChatMessage, F as FinishReason, G as GenerationResult, P as ProviderHealth, S as StreamCallbacks, a as StructuredGeneration, b as StructuredTextRequest, T as TextRequest, c as TextTier, d as TokenUsage } from './index-fXjxTR5W.js';
2
- export { T as TEXT_TIERS, a as TierModelMap, i as isTextTier, m as mergeTierOverrides, r as resolveModel } from './index-DxLvE588.js';
3
- export { AIError, AIErrorBody, AIErrorMetadata, AIErrorType, ApiKeyValidationRule, CompositeExecutor, DEFAULT_API_KEY_RULE, DEFAULT_ERROR_CLASSIFICATION_RULE, DEFAULT_HTTP_STATUS_RULE, DEFAULT_RETRY_BACKOFF_MULTIPLIER, DEFAULT_RETRY_INITIAL_DELAY_MS, DEFAULT_RETRY_JITTER_FACTOR, DEFAULT_RETRY_MAX_ATTEMPTS, DEFAULT_RETRY_MAX_DELAY_MS, DebounceManager, DebounceOptions, DedupeExecutor, DedupeExecutorOptions, ErrorClassificationRule, HttpStatusClassificationRule, IRequestExecutor, JSON_CODE_BLOCK_PATTERN, JSON_OBJECT_PATTERN, JsonResponseParser, LoggedError, NormalizedSseChunk, QueueExecutor, RetryExecutor, SSE_BRIDGE_EVENTS, SSE_DONE_MARKER, SSE_PREFIX, SseDeltaExtractor, SseResponseOptions, StreamingParserCallbacks, StreamingResponseParser, StructuredPromptBuilder, ThrottleManager, ThrottleOptions, USER_FRIENDLY_ERROR_MESSAGES, asObjectArray, asRecord, asStringArray, asTrimmedOptionalString, buildCacheKey, buildHttpStatusFallback, clampScore, classifyHttpStatus, createSseResponse, debounce, debounceManager, describeAIErrorType, extractErrorMessageFromJsonBody, extractErrorMessageFromResponse, extractJsonCandidate, extractJsonFromCodeFence, extractJsonObject, extractSseDataPayload, formatErrorForLogging, isAuthErrorType, isRetryableErrorType, isSseDataLine, isSseDoneMarker, isValidApiKey, normalizeSseChunk, oneOfCatalog, resolveUserFriendlyErrorMessage, resolveUserFriendlyMessage, splitSseLines, throttle, throttleManager, validateApiKey } from './core/index.js';
2
+ export { A as AIError, a as AIErrorMetadata, b as AIErrorType, T as TEXT_TIERS, c as TierModelMap, U as USER_FRIENDLY_ERROR_MESSAGES, i as isTextTier, m as mergeTierOverrides, r as resolveModel } from './index-DIHz8_OJ.js';
3
+ export { AIErrorBody, ApiKeyValidationRule, CompositeExecutor, DEFAULT_API_KEY_RULE, DEFAULT_ERROR_CLASSIFICATION_RULE, DEFAULT_HTTP_STATUS_RULE, DEFAULT_RETRY_BACKOFF_MULTIPLIER, DEFAULT_RETRY_INITIAL_DELAY_MS, DEFAULT_RETRY_JITTER_FACTOR, DEFAULT_RETRY_MAX_ATTEMPTS, DEFAULT_RETRY_MAX_DELAY_MS, DebounceManager, DebounceOptions, DedupeExecutor, DedupeExecutorOptions, ErrorClassificationRule, HttpStatusClassificationRule, IRequestExecutor, JSON_CODE_BLOCK_PATTERN, JSON_OBJECT_PATTERN, JsonResponseParser, LoggedError, NormalizedSseChunk, QueueExecutor, RetryExecutor, SSE_BRIDGE_EVENTS, SSE_DONE_MARKER, SSE_PREFIX, SseDeltaExtractor, SseResponseOptions, StreamingParserCallbacks, StreamingResponseParser, StructuredPromptBuilder, ThrottleManager, ThrottleOptions, asObjectArray, asRecord, asStringArray, asTrimmedOptionalString, buildCacheKey, buildHttpStatusFallback, clampScore, classifyHttpStatus, createSseResponse, debounce, debounceManager, describeAIErrorType, extractErrorMessageFromJsonBody, extractErrorMessageFromResponse, extractJsonArray, extractJsonCandidate, extractJsonFromCodeFence, extractJsonObject, extractSseDataPayload, formatErrorForLogging, isAuthErrorType, isRetryableErrorType, isSseDataLine, isSseDoneMarker, isValidApiKey, normalizeSseChunk, oneOfCatalog, repairCommonJsonDefects, resolveUserFriendlyErrorMessage, resolveUserFriendlyMessage, splitSseLines, throttle, throttleManager, validateApiKey } from './core/index.js';
4
4
  export { C as CacheManager, a as CacheOptions, b as CacheStats, c as cacheManager } from './cache-manager-Df9LLYGA.js';
5
5
  export { Q as QueueOptions, R as RequestDeduplicator, a as RequestQueue, b as RetryManager, c as RetryOptions, r as requestDeduplicator, d as requestQueue, e as retryManager, w as withRetry } from './request-deduplicator.util-NDo0_n1y.js';
6
- export { A as AnyProvider, C as CostEstimateRequest, I as IMediaProvider, a as IProviderBase, b as ITextProvider, P as ProviderCapability, c as ProviderFactory, d as ProviderFactoryConfig, i as isMediaProvider, e as isTextProvider } from './provider.factory-CpWFyjbw.js';
6
+ export { A as AnyProvider, C as CostEstimateRequest, I as IMediaProvider, a as IProviderBase, b as ITextProvider, P as ProviderCapability, c as ProviderFactory, d as ProviderFactoryConfig, i as isMediaProvider, e as isTextProvider } from './provider.factory-DfDfk0dK.js';
7
7
  export { AnthropicHttpTransport, AnthropicProvider, AnthropicRequestBuilder, BaseProvider, BaseProviderConfig, FalProvider, GEMINI_TIERS, GROQ_MODELS, GROQ_TIERS, GeminiProvider, GroqChatRequestBuilder, GroqHttpClient, GroqHttpTransport, GroqProvider, ProviderError, PrunaProgressStage, PrunaProvider, PrunaRequest, consumeAnthropicStream, consumeGroqStream, createFalProvider, createGeminiProvider, createPrunaProvider, defaultEffortForModel, extractContentFromSsePayload, generateWithPruna, mapAnthropicStopReason, toGroqMessages } from './providers/index.js';
8
- export { A as AIProviderConfig, a as ANTHROPIC_API_VERSION, b as ANTHROPIC_DEFAULT_MAX_TOKENS, c as ANTHROPIC_MODELS, d as ANTHROPIC_TIERS, e as AnthropicEffort, f as AnthropicMessagesRequest, g as AnthropicMessagesResponse, h as AnthropicProviderConfig, i as AnthropicStopReason, j as AnthropicStreamEvent, G as GroqChatChunk, k as GroqChatRequest, l as GroqChatResponse, m as GroqMessage, n as GroqProviderConfig, o as createAI } from './create-ai-BhNaz86i.js';
9
- export { C as ChatConfig, a as ChatConversation, b as ChatMessageSender, c as ChatMessageType, d as ChatService, e as ChatTokenUsage, f as ConversationMessage, D as DEFAULT_PROMPT_STRATEGY, I as IChatService, g as IChatStorage, h as IMessageFormatter, S as SendMessageInput, i as SendMessageResult, j as SystemPromptStrategy, U as UseChatOptions, k as UseChatReturn, l as extractTokenUsage } from './chat.service-RQn8UTXD.js';
8
+ export { A as AIProviderConfig, a as ANTHROPIC_API_VERSION, b as ANTHROPIC_DEFAULT_MAX_TOKENS, c as ANTHROPIC_MODELS, d as ANTHROPIC_TIERS, e as AnthropicEffort, f as AnthropicMessagesRequest, g as AnthropicMessagesResponse, h as AnthropicProviderConfig, i as AnthropicStopReason, j as AnthropicStreamEvent, G as GroqChatChunk, k as GroqChatRequest, l as GroqChatResponse, m as GroqMessage, n as GroqProviderConfig, o as createAI } from './create-ai-DXEoke8-.js';
9
+ export { C as ChatConfig, a as ChatConversation, b as ChatMessageSender, c as ChatMessageType, d as ChatService, e as ChatTokenUsage, f as ConversationMessage, D as DEFAULT_PROMPT_STRATEGY, I as IChatService, g as IChatStorage, h as IMessageFormatter, S as SendMessageInput, i as SendMessageResult, j as SystemPromptStrategy, U as UseChatOptions, k as UseChatReturn, l as extractTokenUsage } from './chat.service-q05GnhEm.js';
10
10
  export { ChatIdGenerator, chatIdGenerator, messageFormatter } from './chat/index.js';
11
- import './ProviderConfig-a55tLhWT.js';
11
+ import './ProviderConfig-DIFa9nmG.js';
package/dist/index.js CHANGED
@@ -41,17 +41,80 @@ var USER_FRIENDLY_ERROR_MESSAGES = {
41
41
  };
42
42
 
43
43
  // src/core/errors/ai-error.ts
44
- var AIError = class extends Error {
44
+ var KNOWN_ERROR_TYPES = new Set(Object.values(AIErrorType));
45
+ function mapCodeToType(code) {
46
+ switch (code) {
47
+ case "VALIDATION_ERROR":
48
+ case "CLIENT_ERROR":
49
+ return "CLIENT_ERROR" /* CLIENT_ERROR */;
50
+ case "INVALID_API_KEY":
51
+ return "INVALID_API_KEY" /* INVALID_API_KEY */;
52
+ case "MISSING_CONFIG":
53
+ case "PROVIDER_UNAVAILABLE":
54
+ return "MISSING_CONFIG" /* MISSING_CONFIG */;
55
+ case "PROVIDER_QUOTA_EXHAUSTED":
56
+ case "RATE_LIMIT_ERROR":
57
+ return "RATE_LIMIT_ERROR" /* RATE_LIMIT_ERROR */;
58
+ case "NETWORK_ERROR":
59
+ case "TIMEOUT":
60
+ return "NETWORK_ERROR" /* NETWORK_ERROR */;
61
+ case "ABORT_ERROR":
62
+ case "ABORTED":
63
+ return "ABORT_ERROR" /* ABORT_ERROR */;
64
+ case "SERVER_ERROR":
65
+ case "PROVIDER_ERROR":
66
+ case "NO_RESULT":
67
+ return "SERVER_ERROR" /* SERVER_ERROR */;
68
+ default:
69
+ return "UNKNOWN_ERROR" /* UNKNOWN_ERROR */;
70
+ }
71
+ }
72
+ function mapMessageToCode(message, fallback = "UNKNOWN") {
73
+ const lower = message.toLowerCase();
74
+ if (lower.includes("validation")) return "VALIDATION_ERROR";
75
+ if (lower.includes("quota")) return "PROVIDER_QUOTA_EXHAUSTED";
76
+ if (lower.includes("unavailable")) return "PROVIDER_UNAVAILABLE";
77
+ if (lower.includes("timeout") || lower.includes("aborted")) {
78
+ return lower.includes("aborted") ? "ABORTED" : "TIMEOUT";
79
+ }
80
+ if (lower.includes("parse") || lower.includes("json")) return "PARSE_ERROR";
81
+ if (lower.includes("no result")) return "NO_RESULT";
82
+ if (lower.includes("network") || lower.includes("fetch")) return "NETWORK_ERROR";
83
+ return fallback;
84
+ }
85
+ var AIError = class _AIError extends Error {
45
86
  type;
87
+ code;
46
88
  cause;
47
89
  metadata;
48
- constructor(type, message, cause, metadata = {}) {
49
- super(message);
90
+ constructor(typeOrMessage, messageOrCode, cause, metadata = {}) {
91
+ let effectiveType;
92
+ let effectiveMessage;
93
+ let effectiveCode;
94
+ if (KNOWN_ERROR_TYPES.has(typeOrMessage)) {
95
+ effectiveType = typeOrMessage;
96
+ effectiveMessage = messageOrCode ?? "";
97
+ effectiveCode = effectiveType;
98
+ } else {
99
+ effectiveMessage = typeOrMessage;
100
+ effectiveCode = messageOrCode ?? "UNKNOWN";
101
+ effectiveType = mapCodeToType(effectiveCode);
102
+ }
103
+ super(effectiveMessage);
50
104
  this.name = "AIError";
51
- this.type = type;
105
+ this.type = effectiveType;
106
+ this.code = effectiveCode;
52
107
  this.cause = cause;
53
108
  this.metadata = metadata;
54
109
  }
110
+ static from(error, fallbackCode = "UNKNOWN") {
111
+ if (error instanceof _AIError) return error;
112
+ if (error instanceof Error) {
113
+ const code = mapMessageToCode(error.message, fallbackCode);
114
+ return new _AIError(error.message, code, error);
115
+ }
116
+ return new _AIError(String(error), fallbackCode, error);
117
+ }
55
118
  toString() {
56
119
  const statusPart = typeof this.metadata.status === "number" ? ` (HTTP ${this.metadata.status})` : "";
57
120
  return `${this.name} [${this.type}]: ${this.message}${statusPart}`;
@@ -60,6 +123,7 @@ var AIError = class extends Error {
60
123
  return {
61
124
  name: this.name,
62
125
  type: this.type,
126
+ code: this.code,
63
127
  message: this.message,
64
128
  metadata: this.metadata
65
129
  };
@@ -748,15 +812,22 @@ function oneOfCatalog(catalog, value) {
748
812
  // src/core/constants/protocol.constants.ts
749
813
  var SSE_PREFIX = "data: ";
750
814
  var SSE_DONE_MARKER = "[DONE]";
751
- var JSON_CODE_BLOCK_PATTERN = /```json\n([\s\S]*?)\n```/;
815
+ var JSON_CODE_BLOCK_PATTERN = /```(?:json)?\s*\n?([\s\S]*?)\n?```/;
752
816
  var JSON_OBJECT_PATTERN = /\{[\s\S]*\}/;
817
+ var JSON_ARRAY_PATTERN = /\[[\s\S]*\]/;
753
818
 
754
819
  // src/core/parsers/sse-lines.ts
755
820
  function isSseDataLine(line) {
756
- return line.startsWith(SSE_PREFIX);
821
+ return line.startsWith(SSE_PREFIX) || line.startsWith("data:");
757
822
  }
758
823
  function extractSseDataPayload(line) {
759
- return line.slice(SSE_PREFIX.length);
824
+ if (line.startsWith(SSE_PREFIX)) {
825
+ return line.slice(SSE_PREFIX.length);
826
+ }
827
+ if (line.startsWith("data:")) {
828
+ return line.slice(5);
829
+ }
830
+ return line;
760
831
  }
761
832
  function isSseDoneMarker(payload) {
762
833
  return payload === SSE_DONE_MARKER;
@@ -828,7 +899,7 @@ var StreamingResponseParser = class {
828
899
  // src/core/parsers/json-content-extractor.ts
829
900
  function extractJsonFromCodeFence(content) {
830
901
  const match = content.match(JSON_CODE_BLOCK_PATTERN);
831
- if (match && match[1]) return match[1];
902
+ if (match && match[1]) return match[1].trim();
832
903
  return null;
833
904
  }
834
905
  function extractJsonObject(content) {
@@ -836,8 +907,27 @@ function extractJsonObject(content) {
836
907
  if (match && match[0]) return match[0];
837
908
  return null;
838
909
  }
910
+ function extractJsonArray(content) {
911
+ const match = content.match(JSON_ARRAY_PATTERN);
912
+ if (match && match[0]) return match[0];
913
+ return null;
914
+ }
915
+ function repairCommonJsonDefects(text) {
916
+ return text.replace(/(:\s*-?\d+(?:\.\d+)?)\s*"/g, "$1").replace(/(:\s*"[^"]*")"/g, "$1");
917
+ }
839
918
  function extractJsonCandidate(content) {
840
- return extractJsonFromCodeFence(content) ?? extractJsonObject(content) ?? content;
919
+ const fromFence = extractJsonFromCodeFence(content);
920
+ if (fromFence) return fromFence;
921
+ const objectIndex = content.indexOf("{");
922
+ const arrayIndex = content.indexOf("[");
923
+ if (objectIndex !== -1 && (arrayIndex === -1 || objectIndex < arrayIndex)) {
924
+ const obj = extractJsonObject(content);
925
+ if (obj) return obj;
926
+ } else if (arrayIndex !== -1) {
927
+ const arr = extractJsonArray(content);
928
+ if (arr) return arr;
929
+ }
930
+ return content.trim();
841
931
  }
842
932
 
843
933
  // src/core/parsers/json-response.parser.ts
@@ -846,12 +936,17 @@ var JsonResponseParser = class {
846
936
  const candidate = extractJsonCandidate(rawContent);
847
937
  try {
848
938
  return JSON.parse(candidate);
849
- } catch (error) {
850
- throw new AIError(
851
- "UNKNOWN_ERROR" /* UNKNOWN_ERROR */,
852
- "Failed to parse structured response as JSON",
853
- error instanceof Error ? error : void 0
854
- );
939
+ } catch {
940
+ try {
941
+ return JSON.parse(repairCommonJsonDefects(candidate));
942
+ } catch (error) {
943
+ throw new AIError(
944
+ "UNKNOWN_ERROR" /* UNKNOWN_ERROR */,
945
+ "Failed to parse structured response as JSON",
946
+ error instanceof Error ? error : void 0,
947
+ { rawContent }
948
+ );
949
+ }
855
950
  }
856
951
  }
857
952
  };
@@ -977,38 +1072,6 @@ function isMediaProvider(provider) {
977
1072
  return provider.capabilities.includes("image") || provider.capabilities.includes("video");
978
1073
  }
979
1074
 
980
- // src/content/domain/errors/AIErrors.ts
981
- var AIError2 = class _AIError extends Error {
982
- code;
983
- cause;
984
- constructor(message, code, cause) {
985
- super(message);
986
- this.name = "AIError";
987
- this.code = code;
988
- this.cause = cause;
989
- }
990
- static from(error, fallbackCode = "UNKNOWN") {
991
- if (error instanceof _AIError) return error;
992
- if (error instanceof Error) {
993
- return new _AIError(error.message, mapMessageToCode(error.message, fallbackCode), error);
994
- }
995
- return new _AIError(String(error), fallbackCode, error);
996
- }
997
- };
998
- function mapMessageToCode(message, fallback) {
999
- const lower = message.toLowerCase();
1000
- if (lower.includes("validation")) return "VALIDATION_ERROR";
1001
- if (lower.includes("quota")) return "PROVIDER_QUOTA_EXHAUSTED";
1002
- if (lower.includes("unavailable")) return "PROVIDER_UNAVAILABLE";
1003
- if (lower.includes("timeout") || lower.includes("aborted")) {
1004
- return lower.includes("aborted") ? "ABORTED" : "TIMEOUT";
1005
- }
1006
- if (lower.includes("parse") || lower.includes("json")) return "PARSE_ERROR";
1007
- if (lower.includes("no result")) return "NO_RESULT";
1008
- if (lower.includes("network") || lower.includes("fetch")) return "NETWORK_ERROR";
1009
- return fallback;
1010
- }
1011
-
1012
1075
  // src/content/domain/limits/ProviderTimingConfig.ts
1013
1076
  var ProviderTimingConfig = {
1014
1077
  DEFAULT_TIMEOUT_MS: 3e4,
@@ -1073,7 +1136,7 @@ var BaseProvider = class {
1073
1136
  throw lastError || new Error("Retry attempts exhausted");
1074
1137
  }
1075
1138
  };
1076
- var ProviderError = class extends AIError2 {
1139
+ var ProviderError = class extends AIError {
1077
1140
  constructor(message, providerId, originalError) {
1078
1141
  super(message, "PROVIDER_ERROR", originalError);
1079
1142
  this.providerId = providerId;
@@ -1167,12 +1230,16 @@ var ProviderFactory = class {
1167
1230
  let wake = null;
1168
1231
  let finished = false;
1169
1232
  let failure;
1233
+ const controller = new AbortController();
1234
+ const onAbort = () => controller.abort();
1235
+ request.signal?.addEventListener("abort", onAbort);
1236
+ const effectiveRequest = { ...request, signal: controller.signal };
1170
1237
  const notify = () => {
1171
1238
  const resolve = wake;
1172
1239
  wake = null;
1173
1240
  resolve?.();
1174
1241
  };
1175
- const completion = this.chatStream(request, {
1242
+ const completion = this.chatStream(effectiveRequest, {
1176
1243
  onChunk: (chunk) => {
1177
1244
  queue.push(chunk);
1178
1245
  notify();
@@ -1188,18 +1255,23 @@ var ProviderFactory = class {
1188
1255
  notify();
1189
1256
  }
1190
1257
  );
1191
- while (!finished || queue.length > 0) {
1192
- if (queue.length === 0 && !finished) {
1193
- await new Promise((resolve) => {
1194
- wake = resolve;
1195
- });
1196
- }
1197
- while (queue.length > 0) {
1198
- yield queue.shift();
1258
+ try {
1259
+ while (!finished || queue.length > 0) {
1260
+ if (queue.length === 0 && !finished) {
1261
+ await new Promise((resolve) => {
1262
+ wake = resolve;
1263
+ });
1264
+ }
1265
+ while (queue.length > 0) {
1266
+ yield queue.shift();
1267
+ }
1268
+ if (failure) throw failure;
1199
1269
  }
1200
- if (failure) throw failure;
1270
+ await completion;
1271
+ } finally {
1272
+ controller.abort();
1273
+ request.signal?.removeEventListener("abort", onAbort);
1201
1274
  }
1202
- await completion;
1203
1275
  }
1204
1276
  async generateJson(request) {
1205
1277
  const effective = request.model || request.tier ? request : { ...request, tier: this.defaultTier };
@@ -1608,11 +1680,14 @@ async function consumeAnthropicStream(stream, callbacks) {
1608
1680
  break;
1609
1681
  case "message_stop":
1610
1682
  break;
1611
- case "error":
1683
+ case "error": {
1684
+ const errType = event.error.type;
1685
+ const mappedType = errType === "rate_limit_error" ? "RATE_LIMIT_ERROR" /* RATE_LIMIT_ERROR */ : errType === "authentication_error" ? "INVALID_API_KEY" /* INVALID_API_KEY */ : errType === "invalid_request_error" ? "CLIENT_ERROR" /* CLIENT_ERROR */ : "SERVER_ERROR" /* SERVER_ERROR */;
1612
1686
  throw new AIError(
1613
- event.error.type === "rate_limit_error" ? "RATE_LIMIT_ERROR" /* RATE_LIMIT_ERROR */ : "SERVER_ERROR" /* SERVER_ERROR */,
1687
+ mappedType,
1614
1688
  event.error.message || "Anthropic stream failed mid-flight"
1615
1689
  );
1690
+ }
1616
1691
  }
1617
1692
  };
1618
1693
  try {
@@ -2070,6 +2145,13 @@ async function consumeGroqStream(stream, callbacks) {
2070
2145
  } catch {
2071
2146
  return;
2072
2147
  }
2148
+ const errorBody = chunk.error;
2149
+ if (errorBody) {
2150
+ throw new AIError(
2151
+ errorBody.message?.toLowerCase().includes("rate limit") ? "RATE_LIMIT_ERROR" /* RATE_LIMIT_ERROR */ : "SERVER_ERROR" /* SERVER_ERROR */,
2152
+ errorBody.message || "Groq stream failed mid-flight"
2153
+ );
2154
+ }
2073
2155
  if (chunk.model) model = chunk.model;
2074
2156
  const choice = chunk.choices?.[0];
2075
2157
  const delta = choice?.delta?.content;
@@ -2084,13 +2166,6 @@ async function consumeGroqStream(stream, callbacks) {
2084
2166
  if (tailUsage) {
2085
2167
  usage = mapGroqUsage(tailUsage);
2086
2168
  }
2087
- const errorBody = chunk.error;
2088
- if (errorBody) {
2089
- throw new AIError(
2090
- "SERVER_ERROR" /* SERVER_ERROR */,
2091
- errorBody.message || "Groq stream failed mid-flight"
2092
- );
2093
- }
2094
2169
  };
2095
2170
  try {
2096
2171
  while (true) {
@@ -2357,7 +2432,9 @@ var GeminiProvider = class extends BaseProvider {
2357
2432
  headers: this.authHeaders()
2358
2433
  }
2359
2434
  );
2360
- return response.ok ? "healthy" : "unavailable";
2435
+ if (response.ok) return "healthy";
2436
+ if (response.status === 401 || response.status === 403) return "unavailable";
2437
+ return "degraded";
2361
2438
  } catch {
2362
2439
  return "unavailable";
2363
2440
  }
@@ -2368,6 +2445,8 @@ var GeminiProvider = class extends BaseProvider {
2368
2445
  async generate(request) {
2369
2446
  try {
2370
2447
  const model = request.model ?? this.resolveModel(request.tier ?? "balanced");
2448
+ const systemMessages = request.messages.filter((m) => m.role === "system");
2449
+ const systemPrompt = request.systemPrompt && request.systemPrompt.length > 0 ? request.systemPrompt : systemMessages.length > 0 ? systemMessages.map((m) => m.content).join("\n") : void 0;
2371
2450
  const response = await this.withRetry(async () => {
2372
2451
  return await this.fetchWithTimeout(
2373
2452
  `${this.config.baseUrl}/models/${model}:generateContent`,
@@ -2375,22 +2454,28 @@ var GeminiProvider = class extends BaseProvider {
2375
2454
  method: "POST",
2376
2455
  headers: this.authHeaders(),
2377
2456
  body: JSON.stringify({
2378
- systemInstruction: request.systemPrompt && request.systemPrompt.length > 0 ? { parts: [{ text: request.systemPrompt }] } : void 0,
2457
+ systemInstruction: systemPrompt && systemPrompt.length > 0 ? { parts: [{ text: systemPrompt }] } : void 0,
2379
2458
  contents: toGeminiContents(request.messages),
2380
2459
  generationConfig: {
2381
- temperature: request.temperature || 0.7,
2382
- maxOutputTokens: request.maxTokens || 2048,
2383
- topP: request.topP || 0.9
2460
+ temperature: request.temperature ?? 0.7,
2461
+ maxOutputTokens: request.maxTokens ?? 2048,
2462
+ topP: request.topP ?? 0.9
2384
2463
  }
2385
2464
  })
2386
2465
  }
2387
2466
  );
2388
2467
  });
2389
2468
  if (!response.ok) {
2390
- throw new Error(`Gemini API error: ${response.statusText}`);
2469
+ const message = await extractErrorMessageFromResponse(response);
2470
+ throw new AIError(
2471
+ classifyHttpStatus(response.status),
2472
+ `Gemini API error (${response.status}): ${message}`,
2473
+ void 0,
2474
+ { status: response.status, model }
2475
+ );
2391
2476
  }
2392
2477
  const data = await response.json();
2393
- const text = data.candidates[0]?.content?.parts?.map((part) => part.text ?? "").join("") ?? "";
2478
+ const text = data.candidates?.[0]?.content?.parts?.map((part) => part.text ?? "").join("") ?? "";
2394
2479
  if (text.length === 0) {
2395
2480
  throw new AIError("SERVER_ERROR" /* SERVER_ERROR */, "No content generated from Gemini API", void 0, { model });
2396
2481
  }
@@ -2403,7 +2488,7 @@ var GeminiProvider = class extends BaseProvider {
2403
2488
  } : void 0,
2404
2489
  model,
2405
2490
  providerId: this.id,
2406
- finishReason: mapGeminiFinishReason(data.candidates[0]?.finishReason)
2491
+ finishReason: mapGeminiFinishReason(data.candidates?.[0]?.finishReason)
2407
2492
  };
2408
2493
  } catch (error) {
2409
2494
  if (error instanceof AIError) throw error;
@@ -2455,12 +2540,18 @@ var GeminiProvider = class extends BaseProvider {
2455
2540
  );
2456
2541
  });
2457
2542
  if (!response.ok) {
2458
- throw new Error(`Gemini API error: ${response.statusText}`);
2543
+ const message = await extractErrorMessageFromResponse(response);
2544
+ throw new AIError(
2545
+ classifyHttpStatus(response.status),
2546
+ `Gemini image generation error (${response.status}): ${message}`,
2547
+ void 0,
2548
+ { status: response.status }
2549
+ );
2459
2550
  }
2460
2551
  const data = await response.json();
2461
- const imageData = data.candidates[0]?.content?.parts[0]?.inlineData;
2552
+ const imageData = data.candidates?.[0]?.content?.parts?.[0]?.inlineData;
2462
2553
  if (!imageData) {
2463
- throw new Error("No image data in response");
2554
+ throw new AIError("SERVER_ERROR" /* SERVER_ERROR */, "No image data in Gemini response");
2464
2555
  }
2465
2556
  const url = `data:${imageData.mimeType};base64,${imageData.data}`;
2466
2557
  return {
@@ -2779,17 +2870,70 @@ var PrunaProvider = class {
2779
2870
  async estimateCost(_request) {
2780
2871
  return 1;
2781
2872
  }
2782
- async generateImage(_request) {
2783
- throw new AIError("UNKNOWN_ERROR" /* UNKNOWN_ERROR */, "Use generateWithPruna instead");
2873
+ async generateImage(request) {
2874
+ let finalUrl;
2875
+ const model = this.config.models?.textToImage;
2876
+ for await (const stage of generateWithPruna(
2877
+ { prompt: request.prompt, model, quality: request.quality },
2878
+ this.config.apiKey
2879
+ )) {
2880
+ if (stage.error) throw stage.error;
2881
+ if (stage.result?.url) finalUrl = stage.result.url;
2882
+ }
2883
+ if (!finalUrl) {
2884
+ throw new AIError("SERVER_ERROR" /* SERVER_ERROR */, "No image generated by Pruna AI");
2885
+ }
2886
+ return {
2887
+ id: Date.now().toString(),
2888
+ type: "image",
2889
+ url: finalUrl,
2890
+ metadata: { provider: this.id, model: model ?? "p-image" },
2891
+ createdAt: (/* @__PURE__ */ new Date()).toISOString()
2892
+ };
2784
2893
  }
2785
- async generateVideo(_request) {
2786
- throw new AIError("UNKNOWN_ERROR" /* UNKNOWN_ERROR */, "Use generateWithPruna instead");
2894
+ async generateVideo(request) {
2895
+ let finalUrl;
2896
+ const model = this.config.models?.textToVideo;
2897
+ for await (const stage of generateWithPruna(
2898
+ { prompt: request.prompt, model, duration: request.duration, aspectRatio: request.aspectRatio },
2899
+ this.config.apiKey
2900
+ )) {
2901
+ if (stage.error) throw stage.error;
2902
+ if (stage.result?.url) finalUrl = stage.result.url;
2903
+ }
2904
+ if (!finalUrl) {
2905
+ throw new AIError("SERVER_ERROR" /* SERVER_ERROR */, "No video generated by Pruna AI");
2906
+ }
2907
+ return {
2908
+ id: Date.now().toString(),
2909
+ type: "video",
2910
+ url: finalUrl,
2911
+ metadata: { provider: this.id, model: model ?? "p-video" },
2912
+ createdAt: (/* @__PURE__ */ new Date()).toISOString()
2913
+ };
2787
2914
  }
2788
- async imageToVideo(_request) {
2789
- throw new AIError("UNKNOWN_ERROR" /* UNKNOWN_ERROR */, "Use generateWithPruna instead");
2915
+ async imageToVideo(request) {
2916
+ let finalUrl;
2917
+ for await (const stage of generateWithPruna(
2918
+ { image: request.imageUrl, prompt: request.prompt, duration: request.duration, motion: request.motion },
2919
+ this.config.apiKey
2920
+ )) {
2921
+ if (stage.error) throw stage.error;
2922
+ if (stage.result?.url) finalUrl = stage.result.url;
2923
+ }
2924
+ if (!finalUrl) {
2925
+ throw new AIError("SERVER_ERROR" /* SERVER_ERROR */, "No video generated from image by Pruna AI");
2926
+ }
2927
+ return {
2928
+ id: Date.now().toString(),
2929
+ type: "video",
2930
+ url: finalUrl,
2931
+ metadata: { provider: this.id, model: "p-image-to-video" },
2932
+ createdAt: (/* @__PURE__ */ new Date()).toISOString()
2933
+ };
2790
2934
  }
2791
2935
  async videoToVideo(_request) {
2792
- throw new AIError("UNKNOWN_ERROR" /* UNKNOWN_ERROR */, "Use generateWithPruna instead");
2936
+ throw new AIError("CLIENT_ERROR" /* CLIENT_ERROR */, "Pruna AI provider does not support video-to-video conversion");
2793
2937
  }
2794
2938
  };
2795
2939
  function createPrunaProvider(config) {
@@ -2941,9 +3085,12 @@ var ChatService = class {
2941
3085
  };
2942
3086
  }
2943
3087
  async getConversations() {
3088
+ if (this.storage && "getConversations" in this.storage && typeof this.storage.getConversations === "function") {
3089
+ return this.storage.getConversations();
3090
+ }
2944
3091
  return [];
2945
3092
  }
2946
- async sendMessage(input) {
3093
+ async sendMessage(input, signal) {
2947
3094
  const userMessage = {
2948
3095
  ...messageFormatter.toChatMessage(input.text, "user"),
2949
3096
  type: input.type ?? "text",
@@ -2952,13 +3099,14 @@ var ChatService = class {
2952
3099
  const aiResponse = await this.generateAIResponse(
2953
3100
  input.companionId,
2954
3101
  input.text,
2955
- []
3102
+ [],
3103
+ signal
2956
3104
  );
2957
3105
  return { userMessage, aiResponse };
2958
3106
  }
2959
- async generateAIResponse(companionId, userMessage, context = []) {
3107
+ async generateAIResponse(companionId, userMessage, context = [], signal) {
2960
3108
  const result = await this.run({
2961
- ...this.buildRequest(userMessage, context)
3109
+ ...this.buildRequest(userMessage, context, signal)
2962
3110
  });
2963
3111
  return {
2964
3112
  ...messageFormatter.toChatMessage(result.text, "assistant"),
@@ -2974,12 +3122,12 @@ var ChatService = class {
2974
3122
  }
2975
3123
  };
2976
3124
  }
2977
- async generateStreamingResponse(userMessage, context, onChunk) {
2978
- const request = this.buildRequest(userMessage, context);
3125
+ async generateStreamingResponse(userMessage, context, onChunk, signal) {
3126
+ const request = this.buildRequest(userMessage, context, signal);
2979
3127
  const result = await this.runStream(request, { onChunk });
2980
3128
  return result.text;
2981
3129
  }
2982
- buildRequest(userMessage, context) {
3130
+ buildRequest(userMessage, context, signal) {
2983
3131
  const messages = messageFormatter.toCoreMessages(context);
2984
3132
  messages.push({ role: "user", content: userMessage });
2985
3133
  return {
@@ -2988,7 +3136,8 @@ var ChatService = class {
2988
3136
  model: this.config.model,
2989
3137
  tier: this.config.tier,
2990
3138
  temperature: this.config.temperature,
2991
- maxTokens: this.config.maxTokens
3139
+ maxTokens: this.config.maxTokens,
3140
+ ...signal !== void 0 ? { signal } : {}
2992
3141
  };
2993
3142
  }
2994
3143
  resolveSystemPrompt() {
@@ -3043,6 +3192,6 @@ function readNumber(source, keys) {
3043
3192
  return null;
3044
3193
  }
3045
3194
 
3046
- export { AIError, AIErrorType, ANTHROPIC_API_VERSION, ANTHROPIC_DEFAULT_MAX_TOKENS, ANTHROPIC_MODELS, ANTHROPIC_TIERS, AnthropicHttpTransport, AnthropicProvider, AnthropicRequestBuilder, BaseProvider, CacheManager, ChatIdGenerator, ChatService, CompositeExecutor, DEFAULT_API_KEY_RULE, DEFAULT_ERROR_CLASSIFICATION_RULE, DEFAULT_HTTP_STATUS_RULE, DEFAULT_PROMPT_STRATEGY, DEFAULT_RETRY_BACKOFF_MULTIPLIER, DEFAULT_RETRY_INITIAL_DELAY_MS, DEFAULT_RETRY_JITTER_FACTOR, DEFAULT_RETRY_MAX_ATTEMPTS, DEFAULT_RETRY_MAX_DELAY_MS, DebounceManager, DedupeExecutor, FalProvider, GEMINI_TIERS, GROQ_MODELS, GROQ_TIERS, GeminiProvider, GroqChatRequestBuilder, GroqHttpClient, GroqHttpTransport, GroqProvider, JSON_CODE_BLOCK_PATTERN, JSON_OBJECT_PATTERN, JsonResponseParser, ProviderError, ProviderFactory, PrunaProvider, QueueExecutor, RequestDeduplicator, RequestQueue, RetryExecutor, RetryManager, SSE_BRIDGE_EVENTS, SSE_DONE_MARKER, SSE_PREFIX, StreamingResponseParser, StructuredPromptBuilder, TEXT_TIERS, ThrottleManager, USER_FRIENDLY_ERROR_MESSAGES, asObjectArray, asRecord, asStringArray, asTrimmedOptionalString, buildCacheKey, buildHttpStatusFallback, cacheManager, chatIdGenerator, clampScore, classifyHttpStatus, consumeAnthropicStream, consumeGroqStream, createAI, createFalProvider, createGeminiProvider, createPrunaProvider, createSseResponse, debounce, debounceManager, defaultEffortForModel, describeAIErrorType, extractContentFromSsePayload, extractErrorMessageFromJsonBody, extractErrorMessageFromResponse, extractJsonCandidate, extractJsonFromCodeFence, extractJsonObject, extractSseDataPayload, extractTokenUsage, formatErrorForLogging, generateWithPruna, isAuthErrorType, isMediaProvider, isRetryableErrorType, isSseDataLine, isSseDoneMarker, isTextProvider, isTextTier, isValidApiKey, mapAnthropicStopReason, mergeTierOverrides, messageFormatter, normalizeSseChunk, oneOfCatalog, requestDeduplicator, requestQueue, resolveModel, resolveUserFriendlyErrorMessage, resolveUserFriendlyMessage, retryManager, splitSseLines, throttle, throttleManager, toGroqMessages, validateApiKey, withRetry };
3195
+ export { AIError, AIErrorType, ANTHROPIC_API_VERSION, ANTHROPIC_DEFAULT_MAX_TOKENS, ANTHROPIC_MODELS, ANTHROPIC_TIERS, AnthropicHttpTransport, AnthropicProvider, AnthropicRequestBuilder, BaseProvider, CacheManager, ChatIdGenerator, ChatService, CompositeExecutor, DEFAULT_API_KEY_RULE, DEFAULT_ERROR_CLASSIFICATION_RULE, DEFAULT_HTTP_STATUS_RULE, DEFAULT_PROMPT_STRATEGY, DEFAULT_RETRY_BACKOFF_MULTIPLIER, DEFAULT_RETRY_INITIAL_DELAY_MS, DEFAULT_RETRY_JITTER_FACTOR, DEFAULT_RETRY_MAX_ATTEMPTS, DEFAULT_RETRY_MAX_DELAY_MS, DebounceManager, DedupeExecutor, FalProvider, GEMINI_TIERS, GROQ_MODELS, GROQ_TIERS, GeminiProvider, GroqChatRequestBuilder, GroqHttpClient, GroqHttpTransport, GroqProvider, JSON_CODE_BLOCK_PATTERN, JSON_OBJECT_PATTERN, JsonResponseParser, ProviderError, ProviderFactory, PrunaProvider, QueueExecutor, RequestDeduplicator, RequestQueue, RetryExecutor, RetryManager, SSE_BRIDGE_EVENTS, SSE_DONE_MARKER, SSE_PREFIX, StreamingResponseParser, StructuredPromptBuilder, TEXT_TIERS, ThrottleManager, USER_FRIENDLY_ERROR_MESSAGES, asObjectArray, asRecord, asStringArray, asTrimmedOptionalString, buildCacheKey, buildHttpStatusFallback, cacheManager, chatIdGenerator, clampScore, classifyHttpStatus, consumeAnthropicStream, consumeGroqStream, createAI, createFalProvider, createGeminiProvider, createPrunaProvider, createSseResponse, debounce, debounceManager, defaultEffortForModel, describeAIErrorType, extractContentFromSsePayload, extractErrorMessageFromJsonBody, extractErrorMessageFromResponse, extractJsonArray, extractJsonCandidate, extractJsonFromCodeFence, extractJsonObject, extractSseDataPayload, extractTokenUsage, formatErrorForLogging, generateWithPruna, isAuthErrorType, isMediaProvider, isRetryableErrorType, isSseDataLine, isSseDoneMarker, isTextProvider, isTextTier, isValidApiKey, mapAnthropicStopReason, mergeTierOverrides, messageFormatter, normalizeSseChunk, oneOfCatalog, repairCommonJsonDefects, requestDeduplicator, requestQueue, resolveModel, resolveUserFriendlyErrorMessage, resolveUserFriendlyMessage, retryManager, splitSseLines, throttle, throttleManager, toGroqMessages, validateApiKey, withRetry };
3047
3196
  //# sourceMappingURL=index.js.map
3048
3197
  //# sourceMappingURL=index.js.map