@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
@@ -43,17 +43,80 @@ var USER_FRIENDLY_ERROR_MESSAGES = {
43
43
  };
44
44
 
45
45
  // src/core/errors/ai-error.ts
46
- var AIError = class extends Error {
46
+ var KNOWN_ERROR_TYPES = new Set(Object.values(AIErrorType));
47
+ function mapCodeToType(code) {
48
+ switch (code) {
49
+ case "VALIDATION_ERROR":
50
+ case "CLIENT_ERROR":
51
+ return "CLIENT_ERROR" /* CLIENT_ERROR */;
52
+ case "INVALID_API_KEY":
53
+ return "INVALID_API_KEY" /* INVALID_API_KEY */;
54
+ case "MISSING_CONFIG":
55
+ case "PROVIDER_UNAVAILABLE":
56
+ return "MISSING_CONFIG" /* MISSING_CONFIG */;
57
+ case "PROVIDER_QUOTA_EXHAUSTED":
58
+ case "RATE_LIMIT_ERROR":
59
+ return "RATE_LIMIT_ERROR" /* RATE_LIMIT_ERROR */;
60
+ case "NETWORK_ERROR":
61
+ case "TIMEOUT":
62
+ return "NETWORK_ERROR" /* NETWORK_ERROR */;
63
+ case "ABORT_ERROR":
64
+ case "ABORTED":
65
+ return "ABORT_ERROR" /* ABORT_ERROR */;
66
+ case "SERVER_ERROR":
67
+ case "PROVIDER_ERROR":
68
+ case "NO_RESULT":
69
+ return "SERVER_ERROR" /* SERVER_ERROR */;
70
+ default:
71
+ return "UNKNOWN_ERROR" /* UNKNOWN_ERROR */;
72
+ }
73
+ }
74
+ function mapMessageToCode(message, fallback = "UNKNOWN") {
75
+ const lower = message.toLowerCase();
76
+ if (lower.includes("validation")) return "VALIDATION_ERROR";
77
+ if (lower.includes("quota")) return "PROVIDER_QUOTA_EXHAUSTED";
78
+ if (lower.includes("unavailable")) return "PROVIDER_UNAVAILABLE";
79
+ if (lower.includes("timeout") || lower.includes("aborted")) {
80
+ return lower.includes("aborted") ? "ABORTED" : "TIMEOUT";
81
+ }
82
+ if (lower.includes("parse") || lower.includes("json")) return "PARSE_ERROR";
83
+ if (lower.includes("no result")) return "NO_RESULT";
84
+ if (lower.includes("network") || lower.includes("fetch")) return "NETWORK_ERROR";
85
+ return fallback;
86
+ }
87
+ var AIError = class _AIError extends Error {
47
88
  type;
89
+ code;
48
90
  cause;
49
91
  metadata;
50
- constructor(type, message, cause, metadata = {}) {
51
- super(message);
92
+ constructor(typeOrMessage, messageOrCode, cause, metadata = {}) {
93
+ let effectiveType;
94
+ let effectiveMessage;
95
+ let effectiveCode;
96
+ if (KNOWN_ERROR_TYPES.has(typeOrMessage)) {
97
+ effectiveType = typeOrMessage;
98
+ effectiveMessage = messageOrCode ?? "";
99
+ effectiveCode = effectiveType;
100
+ } else {
101
+ effectiveMessage = typeOrMessage;
102
+ effectiveCode = messageOrCode ?? "UNKNOWN";
103
+ effectiveType = mapCodeToType(effectiveCode);
104
+ }
105
+ super(effectiveMessage);
52
106
  this.name = "AIError";
53
- this.type = type;
107
+ this.type = effectiveType;
108
+ this.code = effectiveCode;
54
109
  this.cause = cause;
55
110
  this.metadata = metadata;
56
111
  }
112
+ static from(error, fallbackCode = "UNKNOWN") {
113
+ if (error instanceof _AIError) return error;
114
+ if (error instanceof Error) {
115
+ const code = mapMessageToCode(error.message, fallbackCode);
116
+ return new _AIError(error.message, code, error);
117
+ }
118
+ return new _AIError(String(error), fallbackCode, error);
119
+ }
57
120
  toString() {
58
121
  const statusPart = typeof this.metadata.status === "number" ? ` (HTTP ${this.metadata.status})` : "";
59
122
  return `${this.name} [${this.type}]: ${this.message}${statusPart}`;
@@ -62,6 +125,7 @@ var AIError = class extends Error {
62
125
  return {
63
126
  name: this.name,
64
127
  type: this.type,
128
+ code: this.code,
65
129
  message: this.message,
66
130
  metadata: this.metadata
67
131
  };
@@ -745,15 +809,22 @@ function oneOfCatalog(catalog, value) {
745
809
  // src/core/constants/protocol.constants.ts
746
810
  var SSE_PREFIX = "data: ";
747
811
  var SSE_DONE_MARKER = "[DONE]";
748
- var JSON_CODE_BLOCK_PATTERN = /```json\n([\s\S]*?)\n```/;
812
+ var JSON_CODE_BLOCK_PATTERN = /```(?:json)?\s*\n?([\s\S]*?)\n?```/;
749
813
  var JSON_OBJECT_PATTERN = /\{[\s\S]*\}/;
814
+ var JSON_ARRAY_PATTERN = /\[[\s\S]*\]/;
750
815
 
751
816
  // src/core/parsers/sse-lines.ts
752
817
  function isSseDataLine(line) {
753
- return line.startsWith(SSE_PREFIX);
818
+ return line.startsWith(SSE_PREFIX) || line.startsWith("data:");
754
819
  }
755
820
  function extractSseDataPayload(line) {
756
- return line.slice(SSE_PREFIX.length);
821
+ if (line.startsWith(SSE_PREFIX)) {
822
+ return line.slice(SSE_PREFIX.length);
823
+ }
824
+ if (line.startsWith("data:")) {
825
+ return line.slice(5);
826
+ }
827
+ return line;
757
828
  }
758
829
  function isSseDoneMarker(payload) {
759
830
  return payload === SSE_DONE_MARKER;
@@ -825,7 +896,7 @@ var StreamingResponseParser = class {
825
896
  // src/core/parsers/json-content-extractor.ts
826
897
  function extractJsonFromCodeFence(content) {
827
898
  const match = content.match(JSON_CODE_BLOCK_PATTERN);
828
- if (match && match[1]) return match[1];
899
+ if (match && match[1]) return match[1].trim();
829
900
  return null;
830
901
  }
831
902
  function extractJsonObject(content) {
@@ -833,8 +904,27 @@ function extractJsonObject(content) {
833
904
  if (match && match[0]) return match[0];
834
905
  return null;
835
906
  }
907
+ function extractJsonArray(content) {
908
+ const match = content.match(JSON_ARRAY_PATTERN);
909
+ if (match && match[0]) return match[0];
910
+ return null;
911
+ }
912
+ function repairCommonJsonDefects(text) {
913
+ return text.replace(/(:\s*-?\d+(?:\.\d+)?)\s*"/g, "$1").replace(/(:\s*"[^"]*")"/g, "$1");
914
+ }
836
915
  function extractJsonCandidate(content) {
837
- return extractJsonFromCodeFence(content) ?? extractJsonObject(content) ?? content;
916
+ const fromFence = extractJsonFromCodeFence(content);
917
+ if (fromFence) return fromFence;
918
+ const objectIndex = content.indexOf("{");
919
+ const arrayIndex = content.indexOf("[");
920
+ if (objectIndex !== -1 && (arrayIndex === -1 || objectIndex < arrayIndex)) {
921
+ const obj = extractJsonObject(content);
922
+ if (obj) return obj;
923
+ } else if (arrayIndex !== -1) {
924
+ const arr = extractJsonArray(content);
925
+ if (arr) return arr;
926
+ }
927
+ return content.trim();
838
928
  }
839
929
 
840
930
  // src/core/parsers/json-response.parser.ts
@@ -843,12 +933,17 @@ var JsonResponseParser = class {
843
933
  const candidate = extractJsonCandidate(rawContent);
844
934
  try {
845
935
  return JSON.parse(candidate);
846
- } catch (error) {
847
- throw new AIError(
848
- "UNKNOWN_ERROR" /* UNKNOWN_ERROR */,
849
- "Failed to parse structured response as JSON",
850
- error instanceof Error ? error : void 0
851
- );
936
+ } catch {
937
+ try {
938
+ return JSON.parse(repairCommonJsonDefects(candidate));
939
+ } catch (error) {
940
+ throw new AIError(
941
+ "UNKNOWN_ERROR" /* UNKNOWN_ERROR */,
942
+ "Failed to parse structured response as JSON",
943
+ error instanceof Error ? error : void 0,
944
+ { rawContent }
945
+ );
946
+ }
852
947
  }
853
948
  }
854
949
  };
@@ -1011,6 +1106,7 @@ exports.debounceManager = debounceManager;
1011
1106
  exports.describeAIErrorType = describeAIErrorType;
1012
1107
  exports.extractErrorMessageFromJsonBody = extractErrorMessageFromJsonBody;
1013
1108
  exports.extractErrorMessageFromResponse = extractErrorMessageFromResponse;
1109
+ exports.extractJsonArray = extractJsonArray;
1014
1110
  exports.extractJsonCandidate = extractJsonCandidate;
1015
1111
  exports.extractJsonFromCodeFence = extractJsonFromCodeFence;
1016
1112
  exports.extractJsonObject = extractJsonObject;
@@ -1025,6 +1121,7 @@ exports.isValidApiKey = isValidApiKey;
1025
1121
  exports.mergeTierOverrides = mergeTierOverrides;
1026
1122
  exports.normalizeSseChunk = normalizeSseChunk;
1027
1123
  exports.oneOfCatalog = oneOfCatalog;
1124
+ exports.repairCommonJsonDefects = repairCommonJsonDefects;
1028
1125
  exports.requestDeduplicator = requestDeduplicator;
1029
1126
  exports.requestQueue = requestQueue;
1030
1127
  exports.resolveModel = resolveModel;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/core/tiers/index.ts","../../src/core/errors/ai-error-types.ts","../../src/core/errors/ai-error.ts","../../src/core/errors/error-classifier.ts","../../src/core/errors/http-status-classifier.ts","../../src/core/errors/user-friendly-error-resolver.ts","../../src/core/errors/error-resolver.ts","../../src/core/errors/response-error-message-extractor.ts","../../src/core/executor/retry-executor.strategy.ts","../../src/core/executor/queue-executor.strategy.ts","../../src/core/executor/dedupe-executor.strategy.ts","../../src/core/executor/composite-executor.strategy.ts","../../src/core/calculations/lru-key-selector.ts","../../src/core/calculations/cache-hit-rate.ts","../../src/core/utils/cache-key-builder.ts","../../src/core/utils/cache-manager.ts","../../src/core/calculations/exponential-backoff.ts","../../src/core/constants/identifier.constants.ts","../../src/core/utils/retry.ts","../../src/core/utils/request-queue.util.ts","../../src/core/utils/request-deduplicator.util.ts","../../src/core/calculations/timing-window.ts","../../src/core/utils/debounce.ts","../../src/core/utils/api-key-validator.ts","../../src/core/utils/coercion.util.ts","../../src/core/constants/protocol.constants.ts","../../src/core/parsers/sse-lines.ts","../../src/core/parsers/streaming-response.parser.ts","../../src/core/parsers/json-content-extractor.ts","../../src/core/parsers/json-response.parser.ts","../../src/core/parsers/structured-prompt.builder.ts","../../src/core/sse/sse-response.service.ts"],"names":["AIErrorType","retryManager"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { TextTier } from \"../types\";\n\n/**\n * Per-provider default model per tier. Config can override any slot; an\n * explicit `model` on a request overrides everything. This table is the knob\n * that turns \"switch from Claude to Groq\" into a config edit.\n */\nexport type TierModelMap = Readonly<Partial<Record<TextTier, string>>>;\n\nexport const TEXT_TIERS: ReadonlyArray<TextTier> = [\"fast\", \"balanced\", \"powerful\"];\n\nexport function isTextTier(value: unknown): value is TextTier {\n return typeof value === \"string\" && (TEXT_TIERS as readonly string[]).includes(value);\n}\n\nexport function resolveModel(\n tiers: TierModelMap,\n tier: TextTier,\n providerId: string,\n): string {\n const model = tiers[tier] ?? tiers.balanced;\n if (!model) {\n throw new Error(\n `${providerId} has no model configured for tier \"${tier}\" — pass an explicit model or configure the tier map`,\n );\n }\n return model;\n}\n\nexport function mergeTierOverrides(\n defaults: TierModelMap,\n overrides?: TierModelMap,\n): TierModelMap {\n if (!overrides) return defaults;\n return { ...defaults, ...overrides };\n}\n","\nexport enum AIErrorType {\n INVALID_API_KEY = \"INVALID_API_KEY\",\n MISSING_CONFIG = \"MISSING_CONFIG\",\n NETWORK_ERROR = \"NETWORK_ERROR\",\n ABORT_ERROR = \"ABORT_ERROR\",\n RATE_LIMIT_ERROR = \"RATE_LIMIT_ERROR\",\n SERVER_ERROR = \"SERVER_ERROR\",\n CLIENT_ERROR = \"CLIENT_ERROR\",\n UNKNOWN_ERROR = \"UNKNOWN_ERROR\",\n}\n\nexport const USER_FRIENDLY_ERROR_MESSAGES: Readonly<Record<AIErrorType, string>> = {\n [AIErrorType.INVALID_API_KEY]: \"Please check your API key and try again.\",\n [AIErrorType.MISSING_CONFIG]: \"The provider is not configured. Please create a provider with createAI first.\",\n [AIErrorType.NETWORK_ERROR]: \"Network error. Please check your connection and try again.\",\n [AIErrorType.ABORT_ERROR]: \"Request was cancelled.\",\n [AIErrorType.RATE_LIMIT_ERROR]: \"You've reached the rate limit. Please wait a moment and try again.\",\n [AIErrorType.SERVER_ERROR]: \"The AI service is temporarily unavailable. Please try again later.\",\n [AIErrorType.CLIENT_ERROR]: \"The request was invalid. Please check your input and try again.\",\n [AIErrorType.UNKNOWN_ERROR]: \"An unexpected error occurred. Please try again.\",\n};\n","\nimport { AIErrorType } from \"./ai-error-types\";\n\nexport interface AIErrorMetadata {\n readonly status?: number;\n readonly url?: string;\n readonly [key: string]: unknown;\n}\n\nexport class AIError extends Error {\n public readonly type: AIErrorType;\n public readonly cause?: Error;\n public readonly metadata: AIErrorMetadata;\n\n constructor(\n type: AIErrorType,\n message: string,\n cause?: Error,\n metadata: AIErrorMetadata = {},\n ) {\n super(message);\n this.name = \"AIError\";\n this.type = type;\n this.cause = cause;\n this.metadata = metadata;\n }\n\n override toString(): string {\n const statusPart =\n typeof this.metadata.status === \"number\" ? ` (HTTP ${this.metadata.status})` : \"\";\n return `${this.name} [${this.type}]: ${this.message}${statusPart}`;\n }\n\n toJSON(): {\n name: string;\n type: AIErrorType;\n message: string;\n metadata: AIErrorMetadata;\n } {\n return {\n name: this.name,\n type: this.type,\n message: this.message,\n metadata: this.metadata,\n };\n }\n}\n","\nimport { AIErrorType } from \"./ai-error-types\";\n\nconst DEFAULT_RETRYABLE_TYPES: ReadonlySet<AIErrorType> = new Set([\n AIErrorType.NETWORK_ERROR,\n AIErrorType.RATE_LIMIT_ERROR,\n AIErrorType.SERVER_ERROR,\n]);\n\nconst DEFAULT_AUTH_TYPES: ReadonlySet<AIErrorType> = new Set([\n AIErrorType.INVALID_API_KEY,\n]);\n\nexport interface ErrorClassificationRule {\n readonly retryable: ReadonlySet<AIErrorType>;\n readonly auth: ReadonlySet<AIErrorType>;\n}\n\nexport const DEFAULT_ERROR_CLASSIFICATION_RULE: ErrorClassificationRule = {\n retryable: DEFAULT_RETRYABLE_TYPES,\n auth: DEFAULT_AUTH_TYPES,\n};\n\nexport function isRetryableErrorType(\n type: AIErrorType,\n rule: ErrorClassificationRule = DEFAULT_ERROR_CLASSIFICATION_RULE,\n): boolean {\n return rule.retryable.has(type);\n}\n\nexport function isAuthErrorType(\n type: AIErrorType,\n rule: ErrorClassificationRule = DEFAULT_ERROR_CLASSIFICATION_RULE,\n): boolean {\n return rule.auth.has(type);\n}\n","\nimport { AIErrorType } from \"./ai-error-types\";\n\nexport interface HttpStatusClassificationRule {\n readonly unauthorizedStatuses: ReadonlySet<number>;\n readonly rateLimitedStatus: number;\n readonly serverErrorThreshold: number;\n readonly clientErrorThreshold: number;\n}\n\nexport const DEFAULT_HTTP_STATUS_RULE: HttpStatusClassificationRule = {\n unauthorizedStatuses: new Set([401, 403]),\n rateLimitedStatus: 429,\n serverErrorThreshold: 500,\n clientErrorThreshold: 400,\n};\n\nexport function classifyHttpStatus(\n status: number,\n rule: HttpStatusClassificationRule = DEFAULT_HTTP_STATUS_RULE,\n): AIErrorType {\n if (rule.unauthorizedStatuses.has(status)) return AIErrorType.INVALID_API_KEY;\n if (status === rule.rateLimitedStatus) return AIErrorType.RATE_LIMIT_ERROR;\n if (status >= rule.serverErrorThreshold) return AIErrorType.SERVER_ERROR;\n if (status >= rule.clientErrorThreshold) return AIErrorType.CLIENT_ERROR;\n return AIErrorType.UNKNOWN_ERROR;\n}\n","\nimport { AIError } from \"./ai-error\";\nimport { AIErrorType, USER_FRIENDLY_ERROR_MESSAGES } from \"./ai-error-types\";\n\nconst KEYWORD_FALLBACK_RULES: ReadonlyArray<{ keywords: ReadonlyArray<string>; type: AIErrorType }> = [\n { keywords: [\"api key\", \"unauthorized\"], type: AIErrorType.INVALID_API_KEY },\n { keywords: [\"rate limit\"], type: AIErrorType.RATE_LIMIT_ERROR },\n { keywords: [\"network\", \"fetch\"], type: AIErrorType.NETWORK_ERROR },\n { keywords: [\"abort\"], type: AIErrorType.ABORT_ERROR },\n];\n\nexport function resolveUserFriendlyErrorMessage(error: unknown): string {\n if (error instanceof AIError) {\n return USER_FRIENDLY_ERROR_MESSAGES[error.type];\n }\n\n if (error instanceof Error) {\n const lower = error.message.toLowerCase();\n for (const rule of KEYWORD_FALLBACK_RULES) {\n if (rule.keywords.some((kw) => lower.includes(kw))) {\n return USER_FRIENDLY_ERROR_MESSAGES[rule.type];\n }\n }\n if (error.message.length > 0) return error.message;\n }\n\n return USER_FRIENDLY_ERROR_MESSAGES[AIErrorType.UNKNOWN_ERROR];\n}\n","\nimport { resolveUserFriendlyErrorMessage } from \"./user-friendly-error-resolver\";\nimport { AIError } from \"./ai-error\";\nimport { AIErrorType, USER_FRIENDLY_ERROR_MESSAGES } from \"./ai-error-types\";\nimport type { AIErrorMetadata } from \"./ai-error\";\n\nexport const resolveUserFriendlyMessage = resolveUserFriendlyErrorMessage;\n\nexport interface LoggedError {\n readonly message: string;\n readonly type: string;\n readonly stack?: string;\n readonly metadata?: AIErrorMetadata;\n}\n\nexport function formatErrorForLogging(error: unknown): LoggedError {\n if (error instanceof AIError) {\n return {\n message: error.message,\n type: error.type,\n stack: error.stack,\n metadata: error.metadata,\n };\n }\n if (error instanceof Error) {\n return { message: error.message, type: error.name, stack: error.stack };\n }\n return { message: String(error), type: typeof error };\n}\n\nexport { AIErrorType, USER_FRIENDLY_ERROR_MESSAGES };\n","\nimport { AIErrorType } from \"./ai-error-types\";\n\nexport interface AIErrorBody {\n readonly error?: { readonly message?: string };\n readonly message?: string;\n}\n\nexport function extractErrorMessageFromJsonBody(body: unknown): string | null {\n if (!body || typeof body !== \"object\") return null;\n const candidate = body as AIErrorBody;\n const message = candidate.error?.message ?? candidate.message;\n if (typeof message === \"string\" && message.length > 0) return message;\n return null;\n}\n\nexport function buildHttpStatusFallback(status: number, statusText: string): string {\n const trimmedStatusText = statusText.trim();\n if (trimmedStatusText.length > 0) {\n return `HTTP ${status}: ${trimmedStatusText}`;\n }\n return `HTTP ${status}`;\n}\n\nexport async function extractErrorMessageFromResponse(response: Response): Promise<string> {\n const body: unknown = await response.json().catch(() => null);\n const fromBody = extractErrorMessageFromJsonBody(body);\n if (fromBody) return fromBody;\n return buildHttpStatusFallback(response.status, response.statusText);\n}\n\nexport function describeAIErrorType(type: AIErrorType): string {\n return `AIError[${type}]`;\n}\n","\nimport type { IRequestExecutor } from \"./request-executor.strategy\";\nimport { RetryManager, RetryOptions } from \"../utils/retry\";\n\nexport class RetryExecutor<TArgs extends unknown[], TResult>\n implements IRequestExecutor<TArgs, TResult>\n{\n constructor(\n private readonly retryManager: RetryManager,\n private readonly options?: RetryOptions,\n ) {}\n\n execute(fn: (...args: TArgs) => Promise<TResult>, ...args: TArgs): Promise<TResult> {\n return this.retryManager.execute(() => fn(...args), this.options);\n }\n}\n","\nimport type { IRequestExecutor } from \"./request-executor.strategy\";\nimport { RequestQueue } from \"../utils/request-queue.util\";\n\nexport class QueueExecutor<TArgs extends unknown[], TResult>\n implements IRequestExecutor<TArgs, TResult>\n{\n constructor(\n private readonly queue: RequestQueue,\n private readonly priority: number,\n ) {}\n\n execute(fn: (...args: TArgs) => Promise<TResult>, ...args: TArgs): Promise<TResult> {\n return this.queue.add(() => fn(...args), this.priority);\n }\n}\n","\nimport type { IRequestExecutor } from \"./request-executor.strategy\";\nimport type { RequestDeduplicator } from \"../utils/request-deduplicator.util\";\n\nexport type KeyGenerator<TArgs extends unknown[]> = (...args: TArgs) => string;\n\nexport interface DedupeExecutorOptions<TArgs extends unknown[]> {\n readonly generateKey: KeyGenerator<TArgs>;\n}\n\nexport class DedupeExecutor<TArgs extends unknown[], TResult>\n implements IRequestExecutor<TArgs, TResult>\n{\n constructor(\n private readonly deduplicator: RequestDeduplicator,\n private readonly options: DedupeExecutorOptions<TArgs>,\n ) {}\n\n execute(fn: (...args: TArgs) => Promise<TResult>, ...args: TArgs): Promise<TResult> {\n const key = this.options.generateKey(...args);\n return this.deduplicator.execute(key, () => fn(...args));\n }\n}\n","\nimport type { IRequestExecutor } from \"./request-executor.strategy\";\n\ntype AnyExecutor = IRequestExecutor<unknown[], unknown>;\n\nexport class CompositeExecutor<TArgs extends unknown[], TResult>\n implements IRequestExecutor<TArgs, TResult>\n{\n private readonly executors: ReadonlyArray<AnyExecutor>;\n\n constructor(executors: ReadonlyArray<IRequestExecutor<TArgs, TResult>>) {\n this.executors = executors as unknown as ReadonlyArray<AnyExecutor>;\n }\n\n execute(fn: (...args: TArgs) => Promise<TResult>, ...args: TArgs): Promise<TResult> {\n const composed = this.compress(fn as unknown as (...a: unknown[]) => Promise<unknown>);\n return composed(...args) as Promise<TResult>;\n }\n\n private compress(fn: (...args: unknown[]) => Promise<unknown>): (...args: unknown[]) => Promise<unknown> {\n return this.executors.reduceRight(\n (innerFn, executor) => (...a: unknown[]) => executor.execute(innerFn, ...a),\n fn,\n );\n }\n}\n","\nexport interface AccessTimestamped {\n readonly lastAccess: number;\n}\n\nexport function selectLeastRecentlyUsedKey<K, V extends AccessTimestamped>(\n entries: ReadonlyMap<K, V>,\n): K | null {\n let oldestKey: K | null = null;\n let oldestAccess = Number.POSITIVE_INFINITY;\n\n for (const [key, entry] of entries.entries()) {\n if (entry.lastAccess < oldestAccess) {\n oldestAccess = entry.lastAccess;\n oldestKey = key;\n }\n }\n\n return oldestKey;\n}\n","\nexport interface AccessCounted {\n readonly accessCount: number;\n}\n\nexport function calculateCacheHitRate(\n entries: ReadonlyArray<AccessCounted>,\n): number {\n if (entries.length === 0) return 0;\n const totalAccess = entries.reduce((sum, e) => sum + e.accessCount, 0);\n return totalAccess / entries.length;\n}\n","\nexport function buildCacheKey(params: Readonly<Record<string, unknown>>): string {\n const sortedKeys = Object.keys(params).sort();\n const sortedParams: Record<string, unknown> = {};\n for (const key of sortedKeys) {\n sortedParams[key] = params[key];\n }\n return JSON.stringify(sortedParams);\n}\n","\nimport { selectLeastRecentlyUsedKey } from \"../calculations/lru-key-selector\";\nimport { calculateCacheHitRate } from \"../calculations/cache-hit-rate\";\nimport { buildCacheKey } from \"./cache-key-builder\";\n\ninterface CacheEntry<T> {\n readonly value: T;\n readonly timestamp: number;\n accessCount: number;\n lastAccess: number;\n}\n\nexport interface CacheOptions {\n readonly maxSize?: number;\n readonly ttl?: number;\n}\n\nconst DEFAULT_CACHE_MAX_SIZE = 100;\nconst DEFAULT_CACHE_TTL_MS = 300_000;\n\nexport class CacheManager {\n private readonly cache = new Map<string, CacheEntry<unknown>>();\n private readonly maxSize: number;\n private readonly ttl: number;\n\n constructor(options: CacheOptions = {}) {\n this.maxSize = options.maxSize ?? DEFAULT_CACHE_MAX_SIZE;\n this.ttl = options.ttl ?? DEFAULT_CACHE_TTL_MS;\n }\n\n get<T>(key: string): T | null {\n const entry = this.cache.get(key);\n if (!entry) return null;\n if (this.isExpired(entry)) {\n this.cache.delete(key);\n return null;\n }\n entry.accessCount += 1;\n entry.lastAccess = Date.now();\n return entry.value as T;\n }\n\n set<T>(key: string, value: T): void {\n if (this.cache.size >= this.maxSize && !this.cache.has(key)) {\n const lruKey = selectLeastRecentlyUsedKey(this.cache);\n if (lruKey !== null) this.cache.delete(lruKey);\n }\n this.cache.set(key, {\n value,\n timestamp: Date.now(),\n accessCount: 1,\n lastAccess: Date.now(),\n });\n }\n\n has(key: string): boolean {\n const entry = this.cache.get(key);\n return entry !== undefined && !this.isExpired(entry);\n }\n\n delete(key: string): boolean {\n return this.cache.delete(key);\n }\n\n clear(): void {\n this.cache.clear();\n }\n\n generateKey(params: Readonly<Record<string, unknown>>): string {\n return buildCacheKey(params);\n }\n\n getStats(): CacheStats {\n const now = Date.now();\n const entries = Array.from(this.cache.entries()).map(([key, entry]) => ({\n key,\n accessCount: entry.accessCount,\n ageMs: now - entry.timestamp,\n }));\n const hitRate = calculateCacheHitRate(\n Array.from(this.cache.values()).map((e) => ({ accessCount: e.accessCount })),\n );\n return {\n size: this.cache.size,\n maxSize: this.maxSize,\n hitRate,\n entries,\n };\n }\n\n private isExpired(entry: CacheEntry<unknown>): boolean {\n return Date.now() - entry.timestamp > this.ttl;\n }\n}\n\nexport interface CacheStats {\n readonly size: number;\n readonly maxSize: number;\n readonly hitRate: number;\n readonly entries: ReadonlyArray<{\n readonly key: string;\n readonly accessCount: number;\n readonly ageMs: number;\n }>;\n}\n\nexport const cacheManager = new CacheManager();\n","\nexport interface ExponentialBackoffParams {\n readonly attempt: number;\n readonly initialDelay: number;\n readonly maxDelay: number;\n readonly backoffMultiplier: number;\n readonly jitterFactor: number;\n readonly random?: () => number;\n}\n\nexport function calculateExponentialBackoff(params: ExponentialBackoffParams): number {\n const {\n attempt,\n initialDelay,\n maxDelay,\n backoffMultiplier,\n jitterFactor,\n random = Math.random,\n } = params;\n\n const base = initialDelay * Math.pow(backoffMultiplier, Math.max(0, attempt - 1));\n const capped = Math.min(base, maxDelay);\n const jitterMultiplier = random() * 2 - 1;\n const jitter = capped * jitterFactor * jitterMultiplier;\n\n return Math.max(0, capped + jitter);\n}\n","\nexport const MESSAGE_ID_PREFIX = \"msg-\" as const;\nexport const CHAT_MESSAGE_ID_SUFFIX_LENGTH = 9;\nexport const CACHE_KEY_TYPE_COMPLETION = \"completion\" as const;\nexport const CACHE_KEY_TYPE_CHAT = \"chat\" as const;\nexport const CACHE_KEY_TYPE_RESPONSE = \"response\" as const;\nexport const SYSTEM_PROMPT_CACHE_PREFIX = \"system-prompt\" as const;\n\nexport const USER_ROLE = \"user\" as const;\nexport const ASSISTANT_ROLE = \"assistant\" as const;\nexport const SYSTEM_ROLE = \"system\" as const;\n\nexport const QUEUE_PRIORITY_USER_REQUEST = 10;\nexport const DEFAULT_RETRY_MAX_ATTEMPTS = 3;\nexport const DEFAULT_RETRY_INITIAL_DELAY_MS = 1000;\nexport const DEFAULT_RETRY_MAX_DELAY_MS = 10000;\nexport const DEFAULT_RETRY_BACKOFF_MULTIPLIER = 2;\nexport const DEFAULT_RETRY_JITTER_FACTOR = 0.1;\n","\nimport { AIError } from \"../errors/ai-error\";\nimport { calculateExponentialBackoff } from \"../calculations/exponential-backoff\";\nimport {\n isRetryableErrorType,\n DEFAULT_ERROR_CLASSIFICATION_RULE,\n} from \"../errors/error-classifier\";\nimport {\n DEFAULT_RETRY_MAX_ATTEMPTS,\n DEFAULT_RETRY_INITIAL_DELAY_MS,\n DEFAULT_RETRY_MAX_DELAY_MS,\n DEFAULT_RETRY_BACKOFF_MULTIPLIER,\n DEFAULT_RETRY_JITTER_FACTOR,\n} from \"../constants/identifier.constants\";\n\nexport interface RetryOptions {\n readonly maxAttempts?: number;\n readonly initialDelay?: number;\n readonly maxDelay?: number;\n readonly backoffMultiplier?: number;\n readonly jitterFactor?: number;\n readonly shouldRetry?: (error: Error) => boolean;\n}\n\nconst RETRYABLE_MESSAGE_KEYWORDS: ReadonlyArray<string> = [\n \"network\",\n \"timeout\",\n \"econnrefused\",\n \"enotfound\",\n \"etimedout\",\n];\n\nexport class RetryManager {\n private readonly defaults: Required<\n Pick<RetryOptions, \"maxAttempts\" | \"initialDelay\" | \"maxDelay\" | \"backoffMultiplier\" | \"jitterFactor\">\n >;\n\n constructor() {\n this.defaults = {\n maxAttempts: DEFAULT_RETRY_MAX_ATTEMPTS,\n initialDelay: DEFAULT_RETRY_INITIAL_DELAY_MS,\n maxDelay: DEFAULT_RETRY_MAX_DELAY_MS,\n backoffMultiplier: DEFAULT_RETRY_BACKOFF_MULTIPLIER,\n jitterFactor: DEFAULT_RETRY_JITTER_FACTOR,\n };\n }\n\n async execute<T>(fn: () => Promise<T>, options: RetryOptions = {}): Promise<T> {\n const maxAttempts = options.maxAttempts ?? this.defaults.maxAttempts;\n let lastError: Error | undefined;\n\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n try {\n return await fn();\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error));\n\n if (attempt >= maxAttempts || !this.shouldRetry(lastError, options)) {\n throw lastError;\n }\n\n const delay = calculateExponentialBackoff({\n attempt,\n initialDelay: options.initialDelay ?? this.defaults.initialDelay,\n maxDelay: options.maxDelay ?? this.defaults.maxDelay,\n backoffMultiplier: options.backoffMultiplier ?? this.defaults.backoffMultiplier,\n jitterFactor: options.jitterFactor ?? this.defaults.jitterFactor,\n });\n await this.delay(delay);\n }\n }\n\n throw lastError ?? new Error(\"Retry loop exited without result\");\n }\n\n private shouldRetry(error: Error, options: RetryOptions): boolean {\n if (options.shouldRetry) return options.shouldRetry(error);\n\n if (error instanceof AIError) {\n return isRetryableErrorType(error.type, DEFAULT_ERROR_CLASSIFICATION_RULE);\n }\n\n const lower = error.message.toLowerCase();\n return RETRYABLE_MESSAGE_KEYWORDS.some((kw) => lower.includes(kw));\n }\n\n private delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n}\n\nexport const retryManager = new RetryManager();\n\nexport async function withRetry<T>(fn: () => Promise<T>, options?: RetryOptions): Promise<T> {\n return retryManager.execute(fn, options);\n}\n","\ninterface QueuedRequest<T> {\n readonly id: string;\n readonly priority: number;\n readonly requestFn: () => Promise<T>;\n readonly resolve: (value: T) => void;\n readonly reject: (reason: unknown) => void;\n readonly timestamp: number;\n}\n\nexport interface QueueOptions {\n readonly maxConcurrent?: number;\n readonly defaultPriority?: number;\n readonly requestTimeout?: number;\n}\n\nconst DEFAULT_MAX_CONCURRENT = 3;\nconst DEFAULT_PRIORITY = 0;\nconst DEFAULT_REQUEST_TIMEOUT_MS = 30_000;\n\nexport class RequestQueue {\n private queue: QueuedRequest<unknown>[] = [];\n private readonly activeRequests = new Set<string>();\n private readonly maxConcurrent: number;\n private readonly defaultPriority: number;\n private readonly requestTimeout: number;\n private requestIdCounter = 0;\n\n constructor(options: QueueOptions = {}) {\n this.maxConcurrent = options.maxConcurrent ?? DEFAULT_MAX_CONCURRENT;\n this.defaultPriority = options.defaultPriority ?? DEFAULT_PRIORITY;\n this.requestTimeout = options.requestTimeout ?? DEFAULT_REQUEST_TIMEOUT_MS;\n }\n\n add<T>(requestFn: () => Promise<T>, priority?: number): Promise<T> {\n return new Promise((resolve, reject) => {\n const id = `req-${++this.requestIdCounter}`;\n const queuedRequest: QueuedRequest<T> = {\n id,\n priority: priority ?? this.defaultPriority,\n requestFn,\n resolve: resolve as (value: unknown) => void,\n reject,\n timestamp: Date.now(),\n };\n\n this.queue.push(queuedRequest as QueuedRequest<unknown>);\n this.sortQueue();\n this.process();\n });\n }\n\n cancelAll(): void {\n for (const request of this.queue) {\n request.reject(new Error(\"Request was cancelled\"));\n }\n this.queue = [];\n }\n\n private sortQueue(): void {\n this.queue.sort((a, b) => {\n if (a.priority !== b.priority) {\n return b.priority - a.priority;\n }\n return a.timestamp - b.timestamp;\n });\n }\n\n private process(): void {\n while (this.queue.length > 0 && this.activeRequests.size < this.maxConcurrent) {\n const request = this.queue.shift();\n if (!request) break;\n this.executeRequest(request);\n }\n }\n\n private executeRequest<T>(request: QueuedRequest<T>): void {\n this.activeRequests.add(request.id);\n\n const timeoutId = setTimeout(() => {\n this.activeRequests.delete(request.id);\n request.reject(new Error(`Request ${request.id} timed out`));\n this.process();\n }, this.requestTimeout);\n\n request.requestFn()\n .then((result) => {\n clearTimeout(timeoutId);\n request.resolve(result);\n })\n .catch((error: unknown) => {\n clearTimeout(timeoutId);\n request.reject(error);\n })\n .finally(() => {\n this.activeRequests.delete(request.id);\n this.process();\n });\n }\n}\n\nexport const requestQueue = new RequestQueue();\n","\ninterface PendingRequest<T> {\n readonly promise: Promise<T>;\n readonly timestamp: number;\n}\n\nconst DEFAULT_DEDUPE_TTL_MS = 30_000;\n\nexport class RequestDeduplicator {\n private readonly pendingRequests = new Map<string, PendingRequest<unknown>>();\n private readonly ttl: number;\n\n constructor(ttl: number = DEFAULT_DEDUPE_TTL_MS) {\n this.ttl = ttl;\n }\n\n execute<T>(key: string, requestFn: () => Promise<T>): Promise<T> {\n this.cleanup();\n\n const existing = this.pendingRequests.get(key);\n if (existing) {\n return existing.promise as Promise<T>;\n }\n\n const promise = requestFn();\n this.pendingRequests.set(key, {\n promise,\n timestamp: Date.now(),\n });\n\n // The cleanup chain must swallow its own rejection: callers handle the\n // original `promise`, and an unhandled `.finally` derivative would crash\n // hosts that treat unhandled rejections as fatal (Workers, vitest).\n promise\n .catch(() => undefined)\n .then(() => {\n this.pendingRequests.delete(key);\n });\n\n return promise;\n }\n\n cancelAll(): void {\n this.pendingRequests.clear();\n }\n\n private cleanup(): void {\n const now = Date.now();\n for (const [key, request] of this.pendingRequests.entries()) {\n if (now - request.timestamp > this.ttl) {\n this.pendingRequests.delete(key);\n }\n }\n }\n}\n\nexport const requestDeduplicator = new RequestDeduplicator();\n","\nexport interface LeadingEdgeParams {\n readonly now: number;\n readonly lastCallTime: number;\n readonly interval: number;\n readonly leadingEnabled: boolean;\n readonly isThrottled: boolean;\n}\n\nexport function shouldCallOnLeadingEdge(params: LeadingEdgeParams): boolean {\n const { now, lastCallTime, interval, leadingEnabled, isThrottled } = params;\n if (!leadingEnabled) return false;\n if (isThrottled) return false;\n return now - lastCallTime >= interval;\n}\n\nexport interface TrailingDelayParams {\n readonly interval: number;\n readonly timeSinceLastCall: number;\n}\n\nexport function calculateTrailingDelay(params: TrailingDelayParams): number {\n return Math.max(0, params.interval - params.timeSinceLastCall);\n}\n\nexport function isWithinWindow(now: number, lastCallTime: number, interval: number): boolean {\n return now - lastCallTime < interval;\n}\n","\nimport {\n shouldCallOnLeadingEdge,\n calculateTrailingDelay,\n} from \"../calculations/timing-window\";\n\ntype TimerHandle = ReturnType<typeof setTimeout>;\n\nexport interface DebounceOptions {\n readonly delay?: number;\n readonly leading?: boolean;\n readonly trailing?: boolean;\n}\n\nexport interface ThrottleOptions {\n readonly interval?: number;\n readonly leading?: boolean;\n readonly trailing?: boolean;\n}\n\nconst DEFAULT_DEBOUNCE_DELAY_MS = 300;\nconst DEFAULT_THROTTLE_INTERVAL_MS = 1000;\n\nexport class DebounceManager {\n private readonly timers = new Map<string, TimerHandle>();\n private readonly lastArgs = new Map<string, readonly unknown[]>();\n\n debounce<T extends (...args: never[]) => unknown>(\n fn: T,\n options: DebounceOptions = {},\n ): T {\n const delay = options.delay ?? DEFAULT_DEBOUNCE_DELAY_MS;\n const leading = options.leading ?? false;\n const trailing = options.trailing ?? true;\n\n let timer: TimerHandle | null = null;\n let lastCallTime = 0;\n let lastResult: unknown;\n\n return ((...args: never[]) => {\n const now = Date.now();\n const shouldCallLeading = shouldCallOnLeadingEdge({\n now,\n lastCallTime,\n interval: delay,\n leadingEnabled: leading,\n isThrottled: timer !== null,\n });\n\n if (timer) {\n clearTimeout(timer);\n timer = null;\n }\n\n if (shouldCallLeading) {\n lastCallTime = now;\n lastResult = fn(...args);\n return lastResult;\n }\n\n if (trailing) {\n timer = setTimeout(() => {\n timer = null;\n lastCallTime = Date.now();\n lastResult = fn(...args);\n }, delay);\n }\n\n return lastResult;\n }) as T;\n }\n\n debounceByKey<T extends (...args: never[]) => unknown>(\n key: string,\n fn: T,\n delay: number = DEFAULT_DEBOUNCE_DELAY_MS,\n ): T {\n return ((...args: never[]) => {\n this.lastArgs.set(key, args);\n const existingTimer = this.timers.get(key);\n if (existingTimer) clearTimeout(existingTimer);\n\n const timer = setTimeout(() => {\n this.timers.delete(key);\n const pendingArgs = this.lastArgs.get(key);\n this.lastArgs.delete(key);\n if (pendingArgs) fn(...(pendingArgs as never[]));\n }, delay);\n\n this.timers.set(key, timer);\n }) as T;\n }\n\n cancelDebounce(key: string): void {\n const timer = this.timers.get(key);\n if (timer) {\n clearTimeout(timer);\n this.timers.delete(key);\n }\n this.lastArgs.delete(key);\n }\n\n flushDebounce<T extends (...args: never[]) => unknown>(\n key: string,\n fn: T,\n ): void {\n this.cancelDebounce(key);\n const args = this.lastArgs.get(key);\n if (args) {\n fn(...(args as never[]));\n this.lastArgs.delete(key);\n }\n }\n}\n\nexport class ThrottleManager {\n private readonly timers = new Map<string, TimerHandle>();\n private readonly lastArgs = new Map<string, readonly unknown[]>();\n\n throttle<T extends (...args: never[]) => unknown>(\n fn: T,\n options: ThrottleOptions = {},\n ): T {\n const interval = options.interval ?? DEFAULT_THROTTLE_INTERVAL_MS;\n const leading = options.leading ?? true;\n const trailing = options.trailing ?? false;\n\n let timer: TimerHandle | null = null;\n let lastCallTime = 0;\n let lastResult: unknown;\n let pendingArgs: readonly unknown[] | null = null;\n\n return ((...args: never[]) => {\n const now = Date.now();\n const timeSinceLastCall = now - lastCallTime;\n const shouldCall = shouldCallOnLeadingEdge({\n now,\n lastCallTime,\n interval,\n leadingEnabled: leading,\n isThrottled: timer !== null,\n });\n pendingArgs = args;\n\n if (shouldCall) {\n lastCallTime = now;\n lastResult = fn(...args);\n return lastResult;\n }\n\n if (trailing && !timer) {\n const delay = calculateTrailingDelay({ interval, timeSinceLastCall });\n timer = setTimeout(() => {\n timer = null;\n lastCallTime = Date.now();\n if (pendingArgs) {\n lastResult = fn(...(pendingArgs as never[]));\n pendingArgs = null;\n }\n }, delay);\n }\n\n return lastResult;\n }) as T;\n }\n\n throttleByKey<T extends (...args: never[]) => unknown>(\n key: string,\n fn: T,\n interval: number = DEFAULT_THROTTLE_INTERVAL_MS,\n ): T {\n return ((...args: never[]) => {\n const existingTimer = this.timers.get(key);\n if (existingTimer) {\n this.lastArgs.set(key, args);\n return;\n }\n\n fn(...args);\n\n const timer = setTimeout(() => {\n this.timers.delete(key);\n const pendingArgs = this.lastArgs.get(key);\n if (pendingArgs) {\n this.lastArgs.delete(key);\n fn(...(pendingArgs as never[]));\n const nextTimer = setTimeout(() => {\n this.timers.delete(key);\n }, interval);\n this.timers.set(key, nextTimer);\n }\n }, interval);\n\n this.timers.set(key, timer);\n }) as T;\n }\n\n cancelThrottle(key: string): void {\n const timer = this.timers.get(key);\n if (timer) {\n clearTimeout(timer);\n this.timers.delete(key);\n }\n this.lastArgs.delete(key);\n }\n\n isThrottled(key: string): boolean {\n return this.timers.has(key);\n }\n}\n\nexport const debounceManager = new DebounceManager();\nexport const throttleManager = new ThrottleManager();\n\nexport function debounce<T extends (...args: never[]) => unknown>(\n fn: T,\n delay?: number,\n): T {\n return debounceManager.debounce(fn, { delay });\n}\n\nexport function throttle<T extends (...args: never[]) => unknown>(\n fn: T,\n interval?: number,\n): T {\n return throttleManager.throttle(fn, { interval });\n}\n","\nexport interface ApiKeyValidationRule {\n readonly minLength: number;\n}\n\nexport const DEFAULT_API_KEY_RULE: ApiKeyValidationRule = {\n minLength: 10,\n};\n\nexport function isValidApiKey(\n apiKey: string | undefined | null,\n rule: ApiKeyValidationRule = DEFAULT_API_KEY_RULE,\n): apiKey is string {\n if (!apiKey) return false;\n return apiKey.trim().length >= rule.minLength;\n}\n\nexport function validateApiKey(\n apiKey: string | undefined | null,\n rule: ApiKeyValidationRule = DEFAULT_API_KEY_RULE,\n): { valid: boolean; reason?: string } {\n if (!apiKey) {\n return { valid: false, reason: \"API key is required\" };\n }\n const trimmed = apiKey.trim();\n if (trimmed.length === 0) {\n return { valid: false, reason: \"API key cannot be empty\" };\n }\n if (trimmed.length < rule.minLength) {\n return {\n valid: false,\n reason: `API key must be at least ${rule.minLength} characters`,\n };\n }\n return { valid: true };\n}\n","export function asRecord(value: unknown): Record<string, unknown> {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) return {};\n return value as Record<string, unknown>;\n}\n\nexport function asStringArray(value: unknown, max: number): string[] {\n if (!Array.isArray(value)) return [];\n return value\n .filter((entry): entry is string => typeof entry === \"string\" && entry.trim().length > 0)\n .slice(0, max);\n}\n\nexport function asObjectArray(value: unknown): Record<string, unknown>[] {\n if (!Array.isArray(value)) return [];\n return value.filter(\n (entry): entry is Record<string, unknown> =>\n typeof entry === \"object\" && entry !== null && !Array.isArray(entry),\n );\n}\n\nexport function asTrimmedOptionalString(value: unknown): string | undefined {\n if (typeof value !== \"string\") return undefined;\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n}\n\nexport function clampScore(value: unknown, min: number, max: number): number | null {\n if (typeof value !== \"number\" || !Number.isFinite(value)) return null;\n return Math.max(min, Math.min(max, Math.round(value)));\n}\n\nexport function oneOfCatalog<T extends readonly string[]>(\n catalog: T,\n value: unknown,\n): T[number] | null {\n return catalog.includes(value as T[number]) ? (value as T[number]) : null;\n}\n","export const SSE_PREFIX = \"data: \" as const;\nexport const SSE_DONE_MARKER = \"[DONE]\" as const;\n\nexport const JSON_CODE_BLOCK_PATTERN = /```json\\n([\\s\\S]*?)\\n```/;\nexport const JSON_OBJECT_PATTERN = /\\{[\\s\\S]*\\}/;\n","import { SSE_DONE_MARKER, SSE_PREFIX } from \"../constants/protocol.constants\";\n\nexport function isSseDataLine(line: string): boolean {\n return line.startsWith(SSE_PREFIX);\n}\n\nexport function extractSseDataPayload(line: string): string {\n return line.slice(SSE_PREFIX.length);\n}\n\nexport function isSseDoneMarker(payload: string): boolean {\n return payload === SSE_DONE_MARKER;\n}\n\nexport function splitSseLines(rawChunk: string): ReadonlyArray<string> {\n return rawChunk.split(\"\\n\").map((l) => l.trim()).filter((l) => l.length > 0);\n}\n\nexport interface NormalizedSseChunk {\n readonly payload: string;\n readonly isDone: boolean;\n}\n\nexport function normalizeSseChunk(rawChunk: string): ReadonlyArray<NormalizedSseChunk> {\n const lines = splitSseLines(rawChunk);\n const result: NormalizedSseChunk[] = [];\n for (const line of lines) {\n if (!isSseDataLine(line)) continue;\n const payload = extractSseDataPayload(line);\n result.push({ payload, isDone: isSseDoneMarker(payload) });\n }\n return result;\n}\n","import { AIError } from \"../errors/ai-error\";\nimport { AIErrorType } from \"../errors/ai-error-types\";\nimport {\n isSseDataLine,\n extractSseDataPayload,\n isSseDoneMarker,\n} from \"./sse-lines\";\n\n/**\n * Extracts the text delta from a single SSE `data:` payload, or null when the\n * payload carries no displayable text. Provider-specific: each provider passes\n * its own extractor so the line-buffering machinery below stays generic.\n */\nexport type SseDeltaExtractor = (payload: string) => string | null;\n\nexport interface StreamingParserCallbacks {\n readonly onChunk: (content: string) => void;\n}\n\nexport class StreamingResponseParser {\n private readonly decoder = new TextDecoder();\n\n constructor(\n private readonly callbacks: StreamingParserCallbacks,\n private readonly extractDelta: SseDeltaExtractor,\n ) {}\n\n async parse(stream: ReadableStream<Uint8Array>): Promise<string> {\n const reader = stream.getReader();\n const contentChunks: string[] = [];\n let buffer = \"\";\n\n const consumeLine = (rawLine: string): void => {\n const line = rawLine.endsWith(\"\\r\") ? rawLine.slice(0, -1) : rawLine;\n const trimmed = line.trim();\n if (trimmed.length === 0 || !isSseDataLine(trimmed)) return;\n const payload = extractSseDataPayload(trimmed);\n if (isSseDoneMarker(payload)) return;\n const content = this.extractDelta(payload);\n if (content !== null) {\n contentChunks.push(content);\n this.callbacks.onChunk(content);\n }\n };\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += this.decoder.decode(value, { stream: true });\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop() ?? \"\";\n for (const line of lines) consumeLine(line);\n }\n\n buffer += this.decoder.decode();\n if (buffer.length > 0) consumeLine(buffer);\n } catch (error) {\n if (error instanceof AIError) throw error;\n throw new AIError(\n AIErrorType.NETWORK_ERROR,\n \"Stream was interrupted\",\n error instanceof Error ? error : undefined,\n );\n } finally {\n reader.releaseLock();\n }\n\n return contentChunks.join(\"\");\n }\n}\n","\nimport { JSON_CODE_BLOCK_PATTERN, JSON_OBJECT_PATTERN } from \"../constants/protocol.constants\";\n\nexport function extractJsonFromCodeFence(content: string): string | null {\n const match = content.match(JSON_CODE_BLOCK_PATTERN);\n if (match && match[1]) return match[1];\n return null;\n}\n\nexport function extractJsonObject(content: string): string | null {\n const match = content.match(JSON_OBJECT_PATTERN);\n if (match && match[0]) return match[0];\n return null;\n}\n\nexport function extractJsonCandidate(content: string): string {\n return (\n extractJsonFromCodeFence(content) ??\n extractJsonObject(content) ??\n content\n );\n}\n","\nimport { AIError } from \"../errors/ai-error\";\nimport { AIErrorType } from \"../errors/ai-error-types\";\nimport { extractJsonCandidate } from \"./json-content-extractor\";\n\nexport class JsonResponseParser {\n parse<T>(rawContent: string): T {\n const candidate = extractJsonCandidate(rawContent);\n try {\n return JSON.parse(candidate) as T;\n } catch (error) {\n throw new AIError(\n AIErrorType.UNKNOWN_ERROR,\n \"Failed to parse structured response as JSON\",\n error instanceof Error ? error : undefined,\n );\n }\n }\n}\n","\nexport class StructuredPromptBuilder {\n private schema: Record<string, unknown> | undefined;\n private request: string;\n\n constructor(request: string) {\n this.request = request;\n }\n\n static for(request: string): StructuredPromptBuilder {\n return new StructuredPromptBuilder(request);\n }\n\n withSchema(schema: Record<string, unknown> | undefined): this {\n this.schema = schema;\n return this;\n }\n\n build(): string {\n const schemaSection = this.schema\n ? `Expected JSON schema:\\n${JSON.stringify(this.schema, null, 2)}\\n\\n`\n : \"\";\n\n return (\n \"Please generate a JSON response for the following request.\\n\\n\" +\n schemaSection +\n `Request:\\n${this.request}\\n\\n` +\n \"Respond only with valid JSON, formatted as:\\n```json\\n{...}\\n```\"\n );\n }\n}\n","import {\n extractSseDataPayload,\n isSseDataLine,\n isSseDoneMarker,\n} from \"../parsers/sse-lines\";\nimport type { SseDeltaExtractor } from \"../parsers/streaming-response.parser\";\n\nexport const SSE_BRIDGE_EVENTS = {\n delta: \"delta\",\n done: \"done\",\n error: \"error\",\n} as const;\n\nexport interface SseResponseOptions {\n readonly donePayload: unknown;\n readonly errorCode: (error: unknown) => string;\n readonly onStreamFailure?: (error: unknown) => Promise<void> | void;\n /** Provider-specific: pulls the displayable text delta out of an SSE payload. */\n readonly extractDelta: SseDeltaExtractor;\n}\n\nexport function createSseResponse(\n openUpstream: () => Promise<ReadableStream<Uint8Array>>,\n options: SseResponseOptions,\n): Response {\n const encoder = new TextEncoder();\n const decoder = new TextDecoder();\n const stream = new ReadableStream<Uint8Array>({\n async start(controller) {\n let closed = false;\n const emit = (event: string, data: unknown) => {\n if (closed) return;\n try {\n controller.enqueue(\n encoder.encode(`event: ${event}\\ndata: ${JSON.stringify(data)}\\n\\n`),\n );\n } catch {\n closed = true;\n }\n };\n const finish = () => {\n if (closed) return;\n closed = true;\n try {\n controller.close();\n } catch {\n closed = true;\n }\n };\n let delivered = false;\n const consumeLine = (line: string): boolean => {\n const trimmed = line.trim();\n if (!isSseDataLine(trimmed)) return false;\n const payload = extractSseDataPayload(trimmed);\n if (isSseDoneMarker(payload)) return true;\n const text = options.extractDelta(payload);\n if (text) {\n delivered = true;\n emit(SSE_BRIDGE_EVENTS.delta, { text });\n }\n return false;\n };\n try {\n const upstream = await openUpstream();\n const reader = upstream.getReader();\n let buffer = \"\";\n let finished = false;\n while (!finished) {\n const { value, done: readerDone } = await reader.read();\n if (readerDone) break;\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop() ?? \"\";\n for (const line of lines) {\n finished = consumeLine(line);\n if (finished) break;\n }\n }\n if (!finished && buffer.length > 0) consumeLine(buffer);\n emit(SSE_BRIDGE_EVENTS.done, options.donePayload);\n finish();\n } catch (err) {\n if (!delivered && options.onStreamFailure) {\n await options.onStreamFailure(err);\n }\n emit(SSE_BRIDGE_EVENTS.error, { code: options.errorCode(err) });\n finish();\n }\n },\n });\n return new Response(stream, {\n headers: {\n \"content-type\": \"text/event-stream; charset=utf-8\",\n \"cache-control\": \"no-cache, no-transform\",\n \"x-accel-buffering\": \"no\",\n },\n });\n}\n"]}
1
+ {"version":3,"sources":["../../src/core/tiers/index.ts","../../src/core/errors/ai-error-types.ts","../../src/core/errors/ai-error.ts","../../src/core/errors/error-classifier.ts","../../src/core/errors/http-status-classifier.ts","../../src/core/errors/user-friendly-error-resolver.ts","../../src/core/errors/error-resolver.ts","../../src/core/errors/response-error-message-extractor.ts","../../src/core/executor/retry-executor.strategy.ts","../../src/core/executor/queue-executor.strategy.ts","../../src/core/executor/dedupe-executor.strategy.ts","../../src/core/executor/composite-executor.strategy.ts","../../src/core/calculations/lru-key-selector.ts","../../src/core/calculations/cache-hit-rate.ts","../../src/core/utils/cache-key-builder.ts","../../src/core/utils/cache-manager.ts","../../src/core/calculations/exponential-backoff.ts","../../src/core/constants/identifier.constants.ts","../../src/core/utils/retry.ts","../../src/core/utils/request-queue.util.ts","../../src/core/utils/request-deduplicator.util.ts","../../src/core/calculations/timing-window.ts","../../src/core/utils/debounce.ts","../../src/core/utils/api-key-validator.ts","../../src/core/utils/coercion.util.ts","../../src/core/constants/protocol.constants.ts","../../src/core/parsers/sse-lines.ts","../../src/core/parsers/streaming-response.parser.ts","../../src/core/parsers/json-content-extractor.ts","../../src/core/parsers/json-response.parser.ts","../../src/core/parsers/structured-prompt.builder.ts","../../src/core/sse/sse-response.service.ts"],"names":["AIErrorType","retryManager"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { TextTier } from \"../types\";\n\n/**\n * Per-provider default model per tier. Config can override any slot; an\n * explicit `model` on a request overrides everything. This table is the knob\n * that turns \"switch from Claude to Groq\" into a config edit.\n */\nexport type TierModelMap = Readonly<Partial<Record<TextTier, string>>>;\n\nexport const TEXT_TIERS: ReadonlyArray<TextTier> = [\"fast\", \"balanced\", \"powerful\"];\n\nexport function isTextTier(value: unknown): value is TextTier {\n return typeof value === \"string\" && (TEXT_TIERS as readonly string[]).includes(value);\n}\n\nexport function resolveModel(\n tiers: TierModelMap,\n tier: TextTier,\n providerId: string,\n): string {\n const model = tiers[tier] ?? tiers.balanced;\n if (!model) {\n throw new Error(\n `${providerId} has no model configured for tier \"${tier}\" — pass an explicit model or configure the tier map`,\n );\n }\n return model;\n}\n\nexport function mergeTierOverrides(\n defaults: TierModelMap,\n overrides?: TierModelMap,\n): TierModelMap {\n if (!overrides) return defaults;\n return { ...defaults, ...overrides };\n}\n","\nexport enum AIErrorType {\n INVALID_API_KEY = \"INVALID_API_KEY\",\n MISSING_CONFIG = \"MISSING_CONFIG\",\n NETWORK_ERROR = \"NETWORK_ERROR\",\n ABORT_ERROR = \"ABORT_ERROR\",\n RATE_LIMIT_ERROR = \"RATE_LIMIT_ERROR\",\n SERVER_ERROR = \"SERVER_ERROR\",\n CLIENT_ERROR = \"CLIENT_ERROR\",\n UNKNOWN_ERROR = \"UNKNOWN_ERROR\",\n}\n\nexport const USER_FRIENDLY_ERROR_MESSAGES: Readonly<Record<AIErrorType, string>> = {\n [AIErrorType.INVALID_API_KEY]: \"Please check your API key and try again.\",\n [AIErrorType.MISSING_CONFIG]: \"The provider is not configured. Please create a provider with createAI first.\",\n [AIErrorType.NETWORK_ERROR]: \"Network error. Please check your connection and try again.\",\n [AIErrorType.ABORT_ERROR]: \"Request was cancelled.\",\n [AIErrorType.RATE_LIMIT_ERROR]: \"You've reached the rate limit. Please wait a moment and try again.\",\n [AIErrorType.SERVER_ERROR]: \"The AI service is temporarily unavailable. Please try again later.\",\n [AIErrorType.CLIENT_ERROR]: \"The request was invalid. Please check your input and try again.\",\n [AIErrorType.UNKNOWN_ERROR]: \"An unexpected error occurred. Please try again.\",\n};\n","\nimport { AIErrorType } from \"./ai-error-types\";\n\nexport interface AIErrorMetadata {\n readonly status?: number;\n readonly url?: string;\n readonly [key: string]: unknown;\n}\n\nconst KNOWN_ERROR_TYPES = new Set<string>(Object.values(AIErrorType));\n\nfunction mapCodeToType(code: string): AIErrorType {\n switch (code) {\n case \"VALIDATION_ERROR\":\n case \"CLIENT_ERROR\":\n return AIErrorType.CLIENT_ERROR;\n case \"INVALID_API_KEY\":\n return AIErrorType.INVALID_API_KEY;\n case \"MISSING_CONFIG\":\n case \"PROVIDER_UNAVAILABLE\":\n return AIErrorType.MISSING_CONFIG;\n case \"PROVIDER_QUOTA_EXHAUSTED\":\n case \"RATE_LIMIT_ERROR\":\n return AIErrorType.RATE_LIMIT_ERROR;\n case \"NETWORK_ERROR\":\n case \"TIMEOUT\":\n return AIErrorType.NETWORK_ERROR;\n case \"ABORT_ERROR\":\n case \"ABORTED\":\n return AIErrorType.ABORT_ERROR;\n case \"SERVER_ERROR\":\n case \"PROVIDER_ERROR\":\n case \"NO_RESULT\":\n return AIErrorType.SERVER_ERROR;\n default:\n return AIErrorType.UNKNOWN_ERROR;\n }\n}\n\nfunction mapMessageToCode(message: string, fallback: string = \"UNKNOWN\"): string {\n const lower = message.toLowerCase();\n if (lower.includes(\"validation\")) return \"VALIDATION_ERROR\";\n if (lower.includes(\"quota\")) return \"PROVIDER_QUOTA_EXHAUSTED\";\n if (lower.includes(\"unavailable\")) return \"PROVIDER_UNAVAILABLE\";\n if (lower.includes(\"timeout\") || lower.includes(\"aborted\")) {\n return lower.includes(\"aborted\") ? \"ABORTED\" : \"TIMEOUT\";\n }\n if (lower.includes(\"parse\") || lower.includes(\"json\")) return \"PARSE_ERROR\";\n if (lower.includes(\"no result\")) return \"NO_RESULT\";\n if (lower.includes(\"network\") || lower.includes(\"fetch\")) return \"NETWORK_ERROR\";\n return fallback;\n}\n\nexport class AIError extends Error {\n public readonly type: AIErrorType;\n public readonly code: string;\n public readonly cause?: unknown;\n public readonly metadata: AIErrorMetadata;\n\n constructor(\n typeOrMessage: AIErrorType | string,\n messageOrCode?: string,\n cause?: unknown,\n metadata: AIErrorMetadata = {},\n ) {\n let effectiveType: AIErrorType;\n let effectiveMessage: string;\n let effectiveCode: string;\n\n if (KNOWN_ERROR_TYPES.has(typeOrMessage)) {\n effectiveType = typeOrMessage as AIErrorType;\n effectiveMessage = messageOrCode ?? \"\";\n effectiveCode = effectiveType;\n } else {\n effectiveMessage = typeOrMessage;\n effectiveCode = messageOrCode ?? \"UNKNOWN\";\n effectiveType = mapCodeToType(effectiveCode);\n }\n\n super(effectiveMessage);\n this.name = \"AIError\";\n this.type = effectiveType;\n this.code = effectiveCode;\n this.cause = cause;\n this.metadata = metadata;\n }\n\n static from(error: unknown, fallbackCode: string = \"UNKNOWN\"): AIError {\n if (error instanceof AIError) return error;\n if (error instanceof Error) {\n const code = mapMessageToCode(error.message, fallbackCode);\n return new AIError(error.message, code, error);\n }\n return new AIError(String(error), fallbackCode, error);\n }\n\n override toString(): string {\n const statusPart =\n typeof this.metadata.status === \"number\" ? ` (HTTP ${this.metadata.status})` : \"\";\n return `${this.name} [${this.type}]: ${this.message}${statusPart}`;\n }\n\n toJSON(): {\n name: string;\n type: AIErrorType;\n code: string;\n message: string;\n metadata: AIErrorMetadata;\n } {\n return {\n name: this.name,\n type: this.type,\n code: this.code,\n message: this.message,\n metadata: this.metadata,\n };\n }\n}\n","\nimport { AIErrorType } from \"./ai-error-types\";\n\nconst DEFAULT_RETRYABLE_TYPES: ReadonlySet<AIErrorType> = new Set([\n AIErrorType.NETWORK_ERROR,\n AIErrorType.RATE_LIMIT_ERROR,\n AIErrorType.SERVER_ERROR,\n]);\n\nconst DEFAULT_AUTH_TYPES: ReadonlySet<AIErrorType> = new Set([\n AIErrorType.INVALID_API_KEY,\n]);\n\nexport interface ErrorClassificationRule {\n readonly retryable: ReadonlySet<AIErrorType>;\n readonly auth: ReadonlySet<AIErrorType>;\n}\n\nexport const DEFAULT_ERROR_CLASSIFICATION_RULE: ErrorClassificationRule = {\n retryable: DEFAULT_RETRYABLE_TYPES,\n auth: DEFAULT_AUTH_TYPES,\n};\n\nexport function isRetryableErrorType(\n type: AIErrorType,\n rule: ErrorClassificationRule = DEFAULT_ERROR_CLASSIFICATION_RULE,\n): boolean {\n return rule.retryable.has(type);\n}\n\nexport function isAuthErrorType(\n type: AIErrorType,\n rule: ErrorClassificationRule = DEFAULT_ERROR_CLASSIFICATION_RULE,\n): boolean {\n return rule.auth.has(type);\n}\n","\nimport { AIErrorType } from \"./ai-error-types\";\n\nexport interface HttpStatusClassificationRule {\n readonly unauthorizedStatuses: ReadonlySet<number>;\n readonly rateLimitedStatus: number;\n readonly serverErrorThreshold: number;\n readonly clientErrorThreshold: number;\n}\n\nexport const DEFAULT_HTTP_STATUS_RULE: HttpStatusClassificationRule = {\n unauthorizedStatuses: new Set([401, 403]),\n rateLimitedStatus: 429,\n serverErrorThreshold: 500,\n clientErrorThreshold: 400,\n};\n\nexport function classifyHttpStatus(\n status: number,\n rule: HttpStatusClassificationRule = DEFAULT_HTTP_STATUS_RULE,\n): AIErrorType {\n if (rule.unauthorizedStatuses.has(status)) return AIErrorType.INVALID_API_KEY;\n if (status === rule.rateLimitedStatus) return AIErrorType.RATE_LIMIT_ERROR;\n if (status >= rule.serverErrorThreshold) return AIErrorType.SERVER_ERROR;\n if (status >= rule.clientErrorThreshold) return AIErrorType.CLIENT_ERROR;\n return AIErrorType.UNKNOWN_ERROR;\n}\n","\nimport { AIError } from \"./ai-error\";\nimport { AIErrorType, USER_FRIENDLY_ERROR_MESSAGES } from \"./ai-error-types\";\n\nconst KEYWORD_FALLBACK_RULES: ReadonlyArray<{ keywords: ReadonlyArray<string>; type: AIErrorType }> = [\n { keywords: [\"api key\", \"unauthorized\"], type: AIErrorType.INVALID_API_KEY },\n { keywords: [\"rate limit\"], type: AIErrorType.RATE_LIMIT_ERROR },\n { keywords: [\"network\", \"fetch\"], type: AIErrorType.NETWORK_ERROR },\n { keywords: [\"abort\"], type: AIErrorType.ABORT_ERROR },\n];\n\nexport function resolveUserFriendlyErrorMessage(error: unknown): string {\n if (error instanceof AIError) {\n return USER_FRIENDLY_ERROR_MESSAGES[error.type];\n }\n\n if (error instanceof Error) {\n const lower = error.message.toLowerCase();\n for (const rule of KEYWORD_FALLBACK_RULES) {\n if (rule.keywords.some((kw) => lower.includes(kw))) {\n return USER_FRIENDLY_ERROR_MESSAGES[rule.type];\n }\n }\n if (error.message.length > 0) return error.message;\n }\n\n return USER_FRIENDLY_ERROR_MESSAGES[AIErrorType.UNKNOWN_ERROR];\n}\n","\nimport { resolveUserFriendlyErrorMessage } from \"./user-friendly-error-resolver\";\nimport { AIError } from \"./ai-error\";\nimport { AIErrorType, USER_FRIENDLY_ERROR_MESSAGES } from \"./ai-error-types\";\nimport type { AIErrorMetadata } from \"./ai-error\";\n\nexport const resolveUserFriendlyMessage = resolveUserFriendlyErrorMessage;\n\nexport interface LoggedError {\n readonly message: string;\n readonly type: string;\n readonly stack?: string;\n readonly metadata?: AIErrorMetadata;\n}\n\nexport function formatErrorForLogging(error: unknown): LoggedError {\n if (error instanceof AIError) {\n return {\n message: error.message,\n type: error.type,\n stack: error.stack,\n metadata: error.metadata,\n };\n }\n if (error instanceof Error) {\n return { message: error.message, type: error.name, stack: error.stack };\n }\n return { message: String(error), type: typeof error };\n}\n\nexport { AIErrorType, USER_FRIENDLY_ERROR_MESSAGES };\n","\nimport { AIErrorType } from \"./ai-error-types\";\n\nexport interface AIErrorBody {\n readonly error?: { readonly message?: string };\n readonly message?: string;\n}\n\nexport function extractErrorMessageFromJsonBody(body: unknown): string | null {\n if (!body || typeof body !== \"object\") return null;\n const candidate = body as AIErrorBody;\n const message = candidate.error?.message ?? candidate.message;\n if (typeof message === \"string\" && message.length > 0) return message;\n return null;\n}\n\nexport function buildHttpStatusFallback(status: number, statusText: string): string {\n const trimmedStatusText = statusText.trim();\n if (trimmedStatusText.length > 0) {\n return `HTTP ${status}: ${trimmedStatusText}`;\n }\n return `HTTP ${status}`;\n}\n\nexport async function extractErrorMessageFromResponse(response: Response): Promise<string> {\n const body: unknown = await response.json().catch(() => null);\n const fromBody = extractErrorMessageFromJsonBody(body);\n if (fromBody) return fromBody;\n return buildHttpStatusFallback(response.status, response.statusText);\n}\n\nexport function describeAIErrorType(type: AIErrorType): string {\n return `AIError[${type}]`;\n}\n","\nimport type { IRequestExecutor } from \"./request-executor.strategy\";\nimport { RetryManager, RetryOptions } from \"../utils/retry\";\n\nexport class RetryExecutor<TArgs extends unknown[], TResult>\n implements IRequestExecutor<TArgs, TResult>\n{\n constructor(\n private readonly retryManager: RetryManager,\n private readonly options?: RetryOptions,\n ) {}\n\n execute(fn: (...args: TArgs) => Promise<TResult>, ...args: TArgs): Promise<TResult> {\n return this.retryManager.execute(() => fn(...args), this.options);\n }\n}\n","\nimport type { IRequestExecutor } from \"./request-executor.strategy\";\nimport { RequestQueue } from \"../utils/request-queue.util\";\n\nexport class QueueExecutor<TArgs extends unknown[], TResult>\n implements IRequestExecutor<TArgs, TResult>\n{\n constructor(\n private readonly queue: RequestQueue,\n private readonly priority: number,\n ) {}\n\n execute(fn: (...args: TArgs) => Promise<TResult>, ...args: TArgs): Promise<TResult> {\n return this.queue.add(() => fn(...args), this.priority);\n }\n}\n","\nimport type { IRequestExecutor } from \"./request-executor.strategy\";\nimport type { RequestDeduplicator } from \"../utils/request-deduplicator.util\";\n\nexport type KeyGenerator<TArgs extends unknown[]> = (...args: TArgs) => string;\n\nexport interface DedupeExecutorOptions<TArgs extends unknown[]> {\n readonly generateKey: KeyGenerator<TArgs>;\n}\n\nexport class DedupeExecutor<TArgs extends unknown[], TResult>\n implements IRequestExecutor<TArgs, TResult>\n{\n constructor(\n private readonly deduplicator: RequestDeduplicator,\n private readonly options: DedupeExecutorOptions<TArgs>,\n ) {}\n\n execute(fn: (...args: TArgs) => Promise<TResult>, ...args: TArgs): Promise<TResult> {\n const key = this.options.generateKey(...args);\n return this.deduplicator.execute(key, () => fn(...args));\n }\n}\n","\nimport type { IRequestExecutor } from \"./request-executor.strategy\";\n\ntype AnyExecutor = IRequestExecutor<unknown[], unknown>;\n\nexport class CompositeExecutor<TArgs extends unknown[], TResult>\n implements IRequestExecutor<TArgs, TResult>\n{\n private readonly executors: ReadonlyArray<AnyExecutor>;\n\n constructor(executors: ReadonlyArray<IRequestExecutor<TArgs, TResult>>) {\n this.executors = executors as unknown as ReadonlyArray<AnyExecutor>;\n }\n\n execute(fn: (...args: TArgs) => Promise<TResult>, ...args: TArgs): Promise<TResult> {\n const composed = this.compress(fn as unknown as (...a: unknown[]) => Promise<unknown>);\n return composed(...args) as Promise<TResult>;\n }\n\n private compress(fn: (...args: unknown[]) => Promise<unknown>): (...args: unknown[]) => Promise<unknown> {\n return this.executors.reduceRight(\n (innerFn, executor) => (...a: unknown[]) => executor.execute(innerFn, ...a),\n fn,\n );\n }\n}\n","\nexport interface AccessTimestamped {\n readonly lastAccess: number;\n}\n\nexport function selectLeastRecentlyUsedKey<K, V extends AccessTimestamped>(\n entries: ReadonlyMap<K, V>,\n): K | null {\n let oldestKey: K | null = null;\n let oldestAccess = Number.POSITIVE_INFINITY;\n\n for (const [key, entry] of entries.entries()) {\n if (entry.lastAccess < oldestAccess) {\n oldestAccess = entry.lastAccess;\n oldestKey = key;\n }\n }\n\n return oldestKey;\n}\n","\nexport interface AccessCounted {\n readonly accessCount: number;\n}\n\nexport function calculateCacheHitRate(\n entries: ReadonlyArray<AccessCounted>,\n): number {\n if (entries.length === 0) return 0;\n const totalAccess = entries.reduce((sum, e) => sum + e.accessCount, 0);\n return totalAccess / entries.length;\n}\n","\nexport function buildCacheKey(params: Readonly<Record<string, unknown>>): string {\n const sortedKeys = Object.keys(params).sort();\n const sortedParams: Record<string, unknown> = {};\n for (const key of sortedKeys) {\n sortedParams[key] = params[key];\n }\n return JSON.stringify(sortedParams);\n}\n","\nimport { selectLeastRecentlyUsedKey } from \"../calculations/lru-key-selector\";\nimport { calculateCacheHitRate } from \"../calculations/cache-hit-rate\";\nimport { buildCacheKey } from \"./cache-key-builder\";\n\ninterface CacheEntry<T> {\n readonly value: T;\n readonly timestamp: number;\n accessCount: number;\n lastAccess: number;\n}\n\nexport interface CacheOptions {\n readonly maxSize?: number;\n readonly ttl?: number;\n}\n\nconst DEFAULT_CACHE_MAX_SIZE = 100;\nconst DEFAULT_CACHE_TTL_MS = 300_000;\n\nexport class CacheManager {\n private readonly cache = new Map<string, CacheEntry<unknown>>();\n private readonly maxSize: number;\n private readonly ttl: number;\n\n constructor(options: CacheOptions = {}) {\n this.maxSize = options.maxSize ?? DEFAULT_CACHE_MAX_SIZE;\n this.ttl = options.ttl ?? DEFAULT_CACHE_TTL_MS;\n }\n\n get<T>(key: string): T | null {\n const entry = this.cache.get(key);\n if (!entry) return null;\n if (this.isExpired(entry)) {\n this.cache.delete(key);\n return null;\n }\n entry.accessCount += 1;\n entry.lastAccess = Date.now();\n return entry.value as T;\n }\n\n set<T>(key: string, value: T): void {\n if (this.cache.size >= this.maxSize && !this.cache.has(key)) {\n const lruKey = selectLeastRecentlyUsedKey(this.cache);\n if (lruKey !== null) this.cache.delete(lruKey);\n }\n this.cache.set(key, {\n value,\n timestamp: Date.now(),\n accessCount: 1,\n lastAccess: Date.now(),\n });\n }\n\n has(key: string): boolean {\n const entry = this.cache.get(key);\n return entry !== undefined && !this.isExpired(entry);\n }\n\n delete(key: string): boolean {\n return this.cache.delete(key);\n }\n\n clear(): void {\n this.cache.clear();\n }\n\n generateKey(params: Readonly<Record<string, unknown>>): string {\n return buildCacheKey(params);\n }\n\n getStats(): CacheStats {\n const now = Date.now();\n const entries = Array.from(this.cache.entries()).map(([key, entry]) => ({\n key,\n accessCount: entry.accessCount,\n ageMs: now - entry.timestamp,\n }));\n const hitRate = calculateCacheHitRate(\n Array.from(this.cache.values()).map((e) => ({ accessCount: e.accessCount })),\n );\n return {\n size: this.cache.size,\n maxSize: this.maxSize,\n hitRate,\n entries,\n };\n }\n\n private isExpired(entry: CacheEntry<unknown>): boolean {\n return Date.now() - entry.timestamp > this.ttl;\n }\n}\n\nexport interface CacheStats {\n readonly size: number;\n readonly maxSize: number;\n readonly hitRate: number;\n readonly entries: ReadonlyArray<{\n readonly key: string;\n readonly accessCount: number;\n readonly ageMs: number;\n }>;\n}\n\nexport const cacheManager = new CacheManager();\n","\nexport interface ExponentialBackoffParams {\n readonly attempt: number;\n readonly initialDelay: number;\n readonly maxDelay: number;\n readonly backoffMultiplier: number;\n readonly jitterFactor: number;\n readonly random?: () => number;\n}\n\nexport function calculateExponentialBackoff(params: ExponentialBackoffParams): number {\n const {\n attempt,\n initialDelay,\n maxDelay,\n backoffMultiplier,\n jitterFactor,\n random = Math.random,\n } = params;\n\n const base = initialDelay * Math.pow(backoffMultiplier, Math.max(0, attempt - 1));\n const capped = Math.min(base, maxDelay);\n const jitterMultiplier = random() * 2 - 1;\n const jitter = capped * jitterFactor * jitterMultiplier;\n\n return Math.max(0, capped + jitter);\n}\n","\nexport const MESSAGE_ID_PREFIX = \"msg-\" as const;\nexport const CHAT_MESSAGE_ID_SUFFIX_LENGTH = 9;\nexport const CACHE_KEY_TYPE_COMPLETION = \"completion\" as const;\nexport const CACHE_KEY_TYPE_CHAT = \"chat\" as const;\nexport const CACHE_KEY_TYPE_RESPONSE = \"response\" as const;\nexport const SYSTEM_PROMPT_CACHE_PREFIX = \"system-prompt\" as const;\n\nexport const USER_ROLE = \"user\" as const;\nexport const ASSISTANT_ROLE = \"assistant\" as const;\nexport const SYSTEM_ROLE = \"system\" as const;\n\nexport const QUEUE_PRIORITY_USER_REQUEST = 10;\nexport const DEFAULT_RETRY_MAX_ATTEMPTS = 3;\nexport const DEFAULT_RETRY_INITIAL_DELAY_MS = 1000;\nexport const DEFAULT_RETRY_MAX_DELAY_MS = 10000;\nexport const DEFAULT_RETRY_BACKOFF_MULTIPLIER = 2;\nexport const DEFAULT_RETRY_JITTER_FACTOR = 0.1;\n","\nimport { AIError } from \"../errors/ai-error\";\nimport { calculateExponentialBackoff } from \"../calculations/exponential-backoff\";\nimport {\n isRetryableErrorType,\n DEFAULT_ERROR_CLASSIFICATION_RULE,\n} from \"../errors/error-classifier\";\nimport {\n DEFAULT_RETRY_MAX_ATTEMPTS,\n DEFAULT_RETRY_INITIAL_DELAY_MS,\n DEFAULT_RETRY_MAX_DELAY_MS,\n DEFAULT_RETRY_BACKOFF_MULTIPLIER,\n DEFAULT_RETRY_JITTER_FACTOR,\n} from \"../constants/identifier.constants\";\n\nexport interface RetryOptions {\n readonly maxAttempts?: number;\n readonly initialDelay?: number;\n readonly maxDelay?: number;\n readonly backoffMultiplier?: number;\n readonly jitterFactor?: number;\n readonly shouldRetry?: (error: Error) => boolean;\n}\n\nconst RETRYABLE_MESSAGE_KEYWORDS: ReadonlyArray<string> = [\n \"network\",\n \"timeout\",\n \"econnrefused\",\n \"enotfound\",\n \"etimedout\",\n];\n\nexport class RetryManager {\n private readonly defaults: Required<\n Pick<RetryOptions, \"maxAttempts\" | \"initialDelay\" | \"maxDelay\" | \"backoffMultiplier\" | \"jitterFactor\">\n >;\n\n constructor() {\n this.defaults = {\n maxAttempts: DEFAULT_RETRY_MAX_ATTEMPTS,\n initialDelay: DEFAULT_RETRY_INITIAL_DELAY_MS,\n maxDelay: DEFAULT_RETRY_MAX_DELAY_MS,\n backoffMultiplier: DEFAULT_RETRY_BACKOFF_MULTIPLIER,\n jitterFactor: DEFAULT_RETRY_JITTER_FACTOR,\n };\n }\n\n async execute<T>(fn: () => Promise<T>, options: RetryOptions = {}): Promise<T> {\n const maxAttempts = options.maxAttempts ?? this.defaults.maxAttempts;\n let lastError: Error | undefined;\n\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n try {\n return await fn();\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error));\n\n if (attempt >= maxAttempts || !this.shouldRetry(lastError, options)) {\n throw lastError;\n }\n\n const delay = calculateExponentialBackoff({\n attempt,\n initialDelay: options.initialDelay ?? this.defaults.initialDelay,\n maxDelay: options.maxDelay ?? this.defaults.maxDelay,\n backoffMultiplier: options.backoffMultiplier ?? this.defaults.backoffMultiplier,\n jitterFactor: options.jitterFactor ?? this.defaults.jitterFactor,\n });\n await this.delay(delay);\n }\n }\n\n throw lastError ?? new Error(\"Retry loop exited without result\");\n }\n\n private shouldRetry(error: Error, options: RetryOptions): boolean {\n if (options.shouldRetry) return options.shouldRetry(error);\n\n if (error instanceof AIError) {\n return isRetryableErrorType(error.type, DEFAULT_ERROR_CLASSIFICATION_RULE);\n }\n\n const lower = error.message.toLowerCase();\n return RETRYABLE_MESSAGE_KEYWORDS.some((kw) => lower.includes(kw));\n }\n\n private delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n}\n\nexport const retryManager = new RetryManager();\n\nexport async function withRetry<T>(fn: () => Promise<T>, options?: RetryOptions): Promise<T> {\n return retryManager.execute(fn, options);\n}\n","\ninterface QueuedRequest<T> {\n readonly id: string;\n readonly priority: number;\n readonly requestFn: () => Promise<T>;\n readonly resolve: (value: T) => void;\n readonly reject: (reason: unknown) => void;\n readonly timestamp: number;\n}\n\nexport interface QueueOptions {\n readonly maxConcurrent?: number;\n readonly defaultPriority?: number;\n readonly requestTimeout?: number;\n}\n\nconst DEFAULT_MAX_CONCURRENT = 3;\nconst DEFAULT_PRIORITY = 0;\nconst DEFAULT_REQUEST_TIMEOUT_MS = 30_000;\n\nexport class RequestQueue {\n private queue: QueuedRequest<unknown>[] = [];\n private readonly activeRequests = new Set<string>();\n private readonly maxConcurrent: number;\n private readonly defaultPriority: number;\n private readonly requestTimeout: number;\n private requestIdCounter = 0;\n\n constructor(options: QueueOptions = {}) {\n this.maxConcurrent = options.maxConcurrent ?? DEFAULT_MAX_CONCURRENT;\n this.defaultPriority = options.defaultPriority ?? DEFAULT_PRIORITY;\n this.requestTimeout = options.requestTimeout ?? DEFAULT_REQUEST_TIMEOUT_MS;\n }\n\n add<T>(requestFn: () => Promise<T>, priority?: number): Promise<T> {\n return new Promise((resolve, reject) => {\n const id = `req-${++this.requestIdCounter}`;\n const queuedRequest: QueuedRequest<T> = {\n id,\n priority: priority ?? this.defaultPriority,\n requestFn,\n resolve: resolve as (value: unknown) => void,\n reject,\n timestamp: Date.now(),\n };\n\n this.queue.push(queuedRequest as QueuedRequest<unknown>);\n this.sortQueue();\n this.process();\n });\n }\n\n cancelAll(): void {\n for (const request of this.queue) {\n request.reject(new Error(\"Request was cancelled\"));\n }\n this.queue = [];\n }\n\n private sortQueue(): void {\n this.queue.sort((a, b) => {\n if (a.priority !== b.priority) {\n return b.priority - a.priority;\n }\n return a.timestamp - b.timestamp;\n });\n }\n\n private process(): void {\n while (this.queue.length > 0 && this.activeRequests.size < this.maxConcurrent) {\n const request = this.queue.shift();\n if (!request) break;\n this.executeRequest(request);\n }\n }\n\n private executeRequest<T>(request: QueuedRequest<T>): void {\n this.activeRequests.add(request.id);\n\n const timeoutId = setTimeout(() => {\n this.activeRequests.delete(request.id);\n request.reject(new Error(`Request ${request.id} timed out`));\n this.process();\n }, this.requestTimeout);\n\n request.requestFn()\n .then((result) => {\n clearTimeout(timeoutId);\n request.resolve(result);\n })\n .catch((error: unknown) => {\n clearTimeout(timeoutId);\n request.reject(error);\n })\n .finally(() => {\n this.activeRequests.delete(request.id);\n this.process();\n });\n }\n}\n\nexport const requestQueue = new RequestQueue();\n","\ninterface PendingRequest<T> {\n readonly promise: Promise<T>;\n readonly timestamp: number;\n}\n\nconst DEFAULT_DEDUPE_TTL_MS = 30_000;\n\nexport class RequestDeduplicator {\n private readonly pendingRequests = new Map<string, PendingRequest<unknown>>();\n private readonly ttl: number;\n\n constructor(ttl: number = DEFAULT_DEDUPE_TTL_MS) {\n this.ttl = ttl;\n }\n\n execute<T>(key: string, requestFn: () => Promise<T>): Promise<T> {\n this.cleanup();\n\n const existing = this.pendingRequests.get(key);\n if (existing) {\n return existing.promise as Promise<T>;\n }\n\n const promise = requestFn();\n this.pendingRequests.set(key, {\n promise,\n timestamp: Date.now(),\n });\n\n // The cleanup chain must swallow its own rejection: callers handle the\n // original `promise`, and an unhandled `.finally` derivative would crash\n // hosts that treat unhandled rejections as fatal (Workers, vitest).\n promise\n .catch(() => undefined)\n .then(() => {\n this.pendingRequests.delete(key);\n });\n\n return promise;\n }\n\n cancelAll(): void {\n this.pendingRequests.clear();\n }\n\n private cleanup(): void {\n const now = Date.now();\n for (const [key, request] of this.pendingRequests.entries()) {\n if (now - request.timestamp > this.ttl) {\n this.pendingRequests.delete(key);\n }\n }\n }\n}\n\nexport const requestDeduplicator = new RequestDeduplicator();\n","\nexport interface LeadingEdgeParams {\n readonly now: number;\n readonly lastCallTime: number;\n readonly interval: number;\n readonly leadingEnabled: boolean;\n readonly isThrottled: boolean;\n}\n\nexport function shouldCallOnLeadingEdge(params: LeadingEdgeParams): boolean {\n const { now, lastCallTime, interval, leadingEnabled, isThrottled } = params;\n if (!leadingEnabled) return false;\n if (isThrottled) return false;\n return now - lastCallTime >= interval;\n}\n\nexport interface TrailingDelayParams {\n readonly interval: number;\n readonly timeSinceLastCall: number;\n}\n\nexport function calculateTrailingDelay(params: TrailingDelayParams): number {\n return Math.max(0, params.interval - params.timeSinceLastCall);\n}\n\nexport function isWithinWindow(now: number, lastCallTime: number, interval: number): boolean {\n return now - lastCallTime < interval;\n}\n","\nimport {\n shouldCallOnLeadingEdge,\n calculateTrailingDelay,\n} from \"../calculations/timing-window\";\n\ntype TimerHandle = ReturnType<typeof setTimeout>;\n\nexport interface DebounceOptions {\n readonly delay?: number;\n readonly leading?: boolean;\n readonly trailing?: boolean;\n}\n\nexport interface ThrottleOptions {\n readonly interval?: number;\n readonly leading?: boolean;\n readonly trailing?: boolean;\n}\n\nconst DEFAULT_DEBOUNCE_DELAY_MS = 300;\nconst DEFAULT_THROTTLE_INTERVAL_MS = 1000;\n\nexport class DebounceManager {\n private readonly timers = new Map<string, TimerHandle>();\n private readonly lastArgs = new Map<string, readonly unknown[]>();\n\n debounce<T extends (...args: never[]) => unknown>(\n fn: T,\n options: DebounceOptions = {},\n ): T {\n const delay = options.delay ?? DEFAULT_DEBOUNCE_DELAY_MS;\n const leading = options.leading ?? false;\n const trailing = options.trailing ?? true;\n\n let timer: TimerHandle | null = null;\n let lastCallTime = 0;\n let lastResult: unknown;\n\n return ((...args: never[]) => {\n const now = Date.now();\n const shouldCallLeading = shouldCallOnLeadingEdge({\n now,\n lastCallTime,\n interval: delay,\n leadingEnabled: leading,\n isThrottled: timer !== null,\n });\n\n if (timer) {\n clearTimeout(timer);\n timer = null;\n }\n\n if (shouldCallLeading) {\n lastCallTime = now;\n lastResult = fn(...args);\n return lastResult;\n }\n\n if (trailing) {\n timer = setTimeout(() => {\n timer = null;\n lastCallTime = Date.now();\n lastResult = fn(...args);\n }, delay);\n }\n\n return lastResult;\n }) as T;\n }\n\n debounceByKey<T extends (...args: never[]) => unknown>(\n key: string,\n fn: T,\n delay: number = DEFAULT_DEBOUNCE_DELAY_MS,\n ): T {\n return ((...args: never[]) => {\n this.lastArgs.set(key, args);\n const existingTimer = this.timers.get(key);\n if (existingTimer) clearTimeout(existingTimer);\n\n const timer = setTimeout(() => {\n this.timers.delete(key);\n const pendingArgs = this.lastArgs.get(key);\n this.lastArgs.delete(key);\n if (pendingArgs) fn(...(pendingArgs as never[]));\n }, delay);\n\n this.timers.set(key, timer);\n }) as T;\n }\n\n cancelDebounce(key: string): void {\n const timer = this.timers.get(key);\n if (timer) {\n clearTimeout(timer);\n this.timers.delete(key);\n }\n this.lastArgs.delete(key);\n }\n\n flushDebounce<T extends (...args: never[]) => unknown>(\n key: string,\n fn: T,\n ): void {\n this.cancelDebounce(key);\n const args = this.lastArgs.get(key);\n if (args) {\n fn(...(args as never[]));\n this.lastArgs.delete(key);\n }\n }\n}\n\nexport class ThrottleManager {\n private readonly timers = new Map<string, TimerHandle>();\n private readonly lastArgs = new Map<string, readonly unknown[]>();\n\n throttle<T extends (...args: never[]) => unknown>(\n fn: T,\n options: ThrottleOptions = {},\n ): T {\n const interval = options.interval ?? DEFAULT_THROTTLE_INTERVAL_MS;\n const leading = options.leading ?? true;\n const trailing = options.trailing ?? false;\n\n let timer: TimerHandle | null = null;\n let lastCallTime = 0;\n let lastResult: unknown;\n let pendingArgs: readonly unknown[] | null = null;\n\n return ((...args: never[]) => {\n const now = Date.now();\n const timeSinceLastCall = now - lastCallTime;\n const shouldCall = shouldCallOnLeadingEdge({\n now,\n lastCallTime,\n interval,\n leadingEnabled: leading,\n isThrottled: timer !== null,\n });\n pendingArgs = args;\n\n if (shouldCall) {\n lastCallTime = now;\n lastResult = fn(...args);\n return lastResult;\n }\n\n if (trailing && !timer) {\n const delay = calculateTrailingDelay({ interval, timeSinceLastCall });\n timer = setTimeout(() => {\n timer = null;\n lastCallTime = Date.now();\n if (pendingArgs) {\n lastResult = fn(...(pendingArgs as never[]));\n pendingArgs = null;\n }\n }, delay);\n }\n\n return lastResult;\n }) as T;\n }\n\n throttleByKey<T extends (...args: never[]) => unknown>(\n key: string,\n fn: T,\n interval: number = DEFAULT_THROTTLE_INTERVAL_MS,\n ): T {\n return ((...args: never[]) => {\n const existingTimer = this.timers.get(key);\n if (existingTimer) {\n this.lastArgs.set(key, args);\n return;\n }\n\n fn(...args);\n\n const timer = setTimeout(() => {\n this.timers.delete(key);\n const pendingArgs = this.lastArgs.get(key);\n if (pendingArgs) {\n this.lastArgs.delete(key);\n fn(...(pendingArgs as never[]));\n const nextTimer = setTimeout(() => {\n this.timers.delete(key);\n }, interval);\n this.timers.set(key, nextTimer);\n }\n }, interval);\n\n this.timers.set(key, timer);\n }) as T;\n }\n\n cancelThrottle(key: string): void {\n const timer = this.timers.get(key);\n if (timer) {\n clearTimeout(timer);\n this.timers.delete(key);\n }\n this.lastArgs.delete(key);\n }\n\n isThrottled(key: string): boolean {\n return this.timers.has(key);\n }\n}\n\nexport const debounceManager = new DebounceManager();\nexport const throttleManager = new ThrottleManager();\n\nexport function debounce<T extends (...args: never[]) => unknown>(\n fn: T,\n delay?: number,\n): T {\n return debounceManager.debounce(fn, { delay });\n}\n\nexport function throttle<T extends (...args: never[]) => unknown>(\n fn: T,\n interval?: number,\n): T {\n return throttleManager.throttle(fn, { interval });\n}\n","\nexport interface ApiKeyValidationRule {\n readonly minLength: number;\n}\n\nexport const DEFAULT_API_KEY_RULE: ApiKeyValidationRule = {\n minLength: 10,\n};\n\nexport function isValidApiKey(\n apiKey: string | undefined | null,\n rule: ApiKeyValidationRule = DEFAULT_API_KEY_RULE,\n): apiKey is string {\n if (!apiKey) return false;\n return apiKey.trim().length >= rule.minLength;\n}\n\nexport function validateApiKey(\n apiKey: string | undefined | null,\n rule: ApiKeyValidationRule = DEFAULT_API_KEY_RULE,\n): { valid: boolean; reason?: string } {\n if (!apiKey) {\n return { valid: false, reason: \"API key is required\" };\n }\n const trimmed = apiKey.trim();\n if (trimmed.length === 0) {\n return { valid: false, reason: \"API key cannot be empty\" };\n }\n if (trimmed.length < rule.minLength) {\n return {\n valid: false,\n reason: `API key must be at least ${rule.minLength} characters`,\n };\n }\n return { valid: true };\n}\n","export function asRecord(value: unknown): Record<string, unknown> {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) return {};\n return value as Record<string, unknown>;\n}\n\nexport function asStringArray(value: unknown, max: number): string[] {\n if (!Array.isArray(value)) return [];\n return value\n .filter((entry): entry is string => typeof entry === \"string\" && entry.trim().length > 0)\n .slice(0, max);\n}\n\nexport function asObjectArray(value: unknown): Record<string, unknown>[] {\n if (!Array.isArray(value)) return [];\n return value.filter(\n (entry): entry is Record<string, unknown> =>\n typeof entry === \"object\" && entry !== null && !Array.isArray(entry),\n );\n}\n\nexport function asTrimmedOptionalString(value: unknown): string | undefined {\n if (typeof value !== \"string\") return undefined;\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n}\n\nexport function clampScore(value: unknown, min: number, max: number): number | null {\n if (typeof value !== \"number\" || !Number.isFinite(value)) return null;\n return Math.max(min, Math.min(max, Math.round(value)));\n}\n\nexport function oneOfCatalog<T extends readonly string[]>(\n catalog: T,\n value: unknown,\n): T[number] | null {\n return catalog.includes(value as T[number]) ? (value as T[number]) : null;\n}\n","export const SSE_PREFIX = \"data: \" as const;\nexport const SSE_DONE_MARKER = \"[DONE]\" as const;\n\nexport const JSON_CODE_BLOCK_PATTERN = /```(?:json)?\\s*\\n?([\\s\\S]*?)\\n?```/;\nexport const JSON_OBJECT_PATTERN = /\\{[\\s\\S]*\\}/;\nexport const JSON_ARRAY_PATTERN = /\\[[\\s\\S]*\\]/;\n","import { SSE_DONE_MARKER, SSE_PREFIX } from \"../constants/protocol.constants\";\n\nexport function isSseDataLine(line: string): boolean {\n return line.startsWith(SSE_PREFIX) || line.startsWith(\"data:\");\n}\n\nexport function extractSseDataPayload(line: string): string {\n if (line.startsWith(SSE_PREFIX)) {\n return line.slice(SSE_PREFIX.length);\n }\n if (line.startsWith(\"data:\")) {\n return line.slice(5);\n }\n return line;\n}\n\nexport function isSseDoneMarker(payload: string): boolean {\n return payload === SSE_DONE_MARKER;\n}\n\nexport function splitSseLines(rawChunk: string): ReadonlyArray<string> {\n return rawChunk.split(\"\\n\").map((l) => l.trim()).filter((l) => l.length > 0);\n}\n\nexport interface NormalizedSseChunk {\n readonly payload: string;\n readonly isDone: boolean;\n}\n\nexport function normalizeSseChunk(rawChunk: string): ReadonlyArray<NormalizedSseChunk> {\n const lines = splitSseLines(rawChunk);\n const result: NormalizedSseChunk[] = [];\n for (const line of lines) {\n if (!isSseDataLine(line)) continue;\n const payload = extractSseDataPayload(line);\n result.push({ payload, isDone: isSseDoneMarker(payload) });\n }\n return result;\n}\n","import { AIError } from \"../errors/ai-error\";\nimport { AIErrorType } from \"../errors/ai-error-types\";\nimport {\n isSseDataLine,\n extractSseDataPayload,\n isSseDoneMarker,\n} from \"./sse-lines\";\n\n/**\n * Extracts the text delta from a single SSE `data:` payload, or null when the\n * payload carries no displayable text. Provider-specific: each provider passes\n * its own extractor so the line-buffering machinery below stays generic.\n */\nexport type SseDeltaExtractor = (payload: string) => string | null;\n\nexport interface StreamingParserCallbacks {\n readonly onChunk: (content: string) => void;\n}\n\nexport class StreamingResponseParser {\n private readonly decoder = new TextDecoder();\n\n constructor(\n private readonly callbacks: StreamingParserCallbacks,\n private readonly extractDelta: SseDeltaExtractor,\n ) {}\n\n async parse(stream: ReadableStream<Uint8Array>): Promise<string> {\n const reader = stream.getReader();\n const contentChunks: string[] = [];\n let buffer = \"\";\n\n const consumeLine = (rawLine: string): void => {\n const line = rawLine.endsWith(\"\\r\") ? rawLine.slice(0, -1) : rawLine;\n const trimmed = line.trim();\n if (trimmed.length === 0 || !isSseDataLine(trimmed)) return;\n const payload = extractSseDataPayload(trimmed);\n if (isSseDoneMarker(payload)) return;\n const content = this.extractDelta(payload);\n if (content !== null) {\n contentChunks.push(content);\n this.callbacks.onChunk(content);\n }\n };\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += this.decoder.decode(value, { stream: true });\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop() ?? \"\";\n for (const line of lines) consumeLine(line);\n }\n\n buffer += this.decoder.decode();\n if (buffer.length > 0) consumeLine(buffer);\n } catch (error) {\n if (error instanceof AIError) throw error;\n throw new AIError(\n AIErrorType.NETWORK_ERROR,\n \"Stream was interrupted\",\n error instanceof Error ? error : undefined,\n );\n } finally {\n reader.releaseLock();\n }\n\n return contentChunks.join(\"\");\n }\n}\n","\nimport {\n JSON_ARRAY_PATTERN,\n JSON_CODE_BLOCK_PATTERN,\n JSON_OBJECT_PATTERN,\n} from \"../constants/protocol.constants\";\n\nexport function extractJsonFromCodeFence(content: string): string | null {\n const match = content.match(JSON_CODE_BLOCK_PATTERN);\n if (match && match[1]) return match[1].trim();\n return null;\n}\n\nexport function extractJsonObject(content: string): string | null {\n const match = content.match(JSON_OBJECT_PATTERN);\n if (match && match[0]) return match[0];\n return null;\n}\n\nexport function extractJsonArray(content: string): string | null {\n const match = content.match(JSON_ARRAY_PATTERN);\n if (match && match[0]) return match[0];\n return null;\n}\n\nexport function repairCommonJsonDefects(text: string): string {\n return text\n .replace(/(:\\s*-?\\d+(?:\\.\\d+)?)\\s*\"/g, \"$1\")\n .replace(/(:\\s*\"[^\"]*\")\"/g, \"$1\");\n}\n\nexport function extractJsonCandidate(content: string): string {\n const fromFence = extractJsonFromCodeFence(content);\n if (fromFence) return fromFence;\n\n const objectIndex = content.indexOf(\"{\");\n const arrayIndex = content.indexOf(\"[\");\n\n if (objectIndex !== -1 && (arrayIndex === -1 || objectIndex < arrayIndex)) {\n const obj = extractJsonObject(content);\n if (obj) return obj;\n } else if (arrayIndex !== -1) {\n const arr = extractJsonArray(content);\n if (arr) return arr;\n }\n\n return content.trim();\n}\n","\nimport { AIError } from \"../errors/ai-error\";\nimport { AIErrorType } from \"../errors/ai-error-types\";\nimport { extractJsonCandidate, repairCommonJsonDefects } from \"./json-content-extractor\";\n\nexport class JsonResponseParser {\n parse<T>(rawContent: string): T {\n const candidate = extractJsonCandidate(rawContent);\n try {\n return JSON.parse(candidate) as T;\n } catch {\n try {\n return JSON.parse(repairCommonJsonDefects(candidate)) as T;\n } catch (error) {\n throw new AIError(\n AIErrorType.UNKNOWN_ERROR,\n \"Failed to parse structured response as JSON\",\n error instanceof Error ? error : undefined,\n { rawContent },\n );\n }\n }\n }\n}\n","\nexport class StructuredPromptBuilder {\n private schema: Record<string, unknown> | undefined;\n private request: string;\n\n constructor(request: string) {\n this.request = request;\n }\n\n static for(request: string): StructuredPromptBuilder {\n return new StructuredPromptBuilder(request);\n }\n\n withSchema(schema: Record<string, unknown> | undefined): this {\n this.schema = schema;\n return this;\n }\n\n build(): string {\n const schemaSection = this.schema\n ? `Expected JSON schema:\\n${JSON.stringify(this.schema, null, 2)}\\n\\n`\n : \"\";\n\n return (\n \"Please generate a JSON response for the following request.\\n\\n\" +\n schemaSection +\n `Request:\\n${this.request}\\n\\n` +\n \"Respond only with valid JSON, formatted as:\\n```json\\n{...}\\n```\"\n );\n }\n}\n","import {\n extractSseDataPayload,\n isSseDataLine,\n isSseDoneMarker,\n} from \"../parsers/sse-lines\";\nimport type { SseDeltaExtractor } from \"../parsers/streaming-response.parser\";\n\nexport const SSE_BRIDGE_EVENTS = {\n delta: \"delta\",\n done: \"done\",\n error: \"error\",\n} as const;\n\nexport interface SseResponseOptions {\n readonly donePayload: unknown;\n readonly errorCode: (error: unknown) => string;\n readonly onStreamFailure?: (error: unknown) => Promise<void> | void;\n /** Provider-specific: pulls the displayable text delta out of an SSE payload. */\n readonly extractDelta: SseDeltaExtractor;\n}\n\nexport function createSseResponse(\n openUpstream: () => Promise<ReadableStream<Uint8Array>>,\n options: SseResponseOptions,\n): Response {\n const encoder = new TextEncoder();\n const decoder = new TextDecoder();\n const stream = new ReadableStream<Uint8Array>({\n async start(controller) {\n let closed = false;\n const emit = (event: string, data: unknown) => {\n if (closed) return;\n try {\n controller.enqueue(\n encoder.encode(`event: ${event}\\ndata: ${JSON.stringify(data)}\\n\\n`),\n );\n } catch {\n closed = true;\n }\n };\n const finish = () => {\n if (closed) return;\n closed = true;\n try {\n controller.close();\n } catch {\n closed = true;\n }\n };\n let delivered = false;\n const consumeLine = (line: string): boolean => {\n const trimmed = line.trim();\n if (!isSseDataLine(trimmed)) return false;\n const payload = extractSseDataPayload(trimmed);\n if (isSseDoneMarker(payload)) return true;\n const text = options.extractDelta(payload);\n if (text) {\n delivered = true;\n emit(SSE_BRIDGE_EVENTS.delta, { text });\n }\n return false;\n };\n try {\n const upstream = await openUpstream();\n const reader = upstream.getReader();\n let buffer = \"\";\n let finished = false;\n while (!finished) {\n const { value, done: readerDone } = await reader.read();\n if (readerDone) break;\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop() ?? \"\";\n for (const line of lines) {\n finished = consumeLine(line);\n if (finished) break;\n }\n }\n if (!finished && buffer.length > 0) consumeLine(buffer);\n emit(SSE_BRIDGE_EVENTS.done, options.donePayload);\n finish();\n } catch (err) {\n if (!delivered && options.onStreamFailure) {\n await options.onStreamFailure(err);\n }\n emit(SSE_BRIDGE_EVENTS.error, { code: options.errorCode(err) });\n finish();\n }\n },\n });\n return new Response(stream, {\n headers: {\n \"content-type\": \"text/event-stream; charset=utf-8\",\n \"cache-control\": \"no-cache, no-transform\",\n \"x-accel-buffering\": \"no\",\n },\n });\n}\n"]}