ai.matey.utils 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. package/LICENSE +21 -0
  2. package/dist/cjs/conversation-history.js +139 -0
  3. package/dist/cjs/conversation-history.js.map +1 -0
  4. package/dist/cjs/index.js +42 -0
  5. package/dist/cjs/index.js.map +1 -0
  6. package/dist/cjs/model-cache.js +163 -0
  7. package/dist/cjs/model-cache.js.map +1 -0
  8. package/dist/cjs/parameter-normalizer.js +451 -0
  9. package/dist/cjs/parameter-normalizer.js.map +1 -0
  10. package/dist/cjs/streaming-modes.js +277 -0
  11. package/dist/cjs/streaming-modes.js.map +1 -0
  12. package/dist/cjs/streaming.js +892 -0
  13. package/dist/cjs/streaming.js.map +1 -0
  14. package/dist/cjs/structured-output.js +398 -0
  15. package/dist/cjs/structured-output.js.map +1 -0
  16. package/dist/cjs/system-message.js +222 -0
  17. package/dist/cjs/system-message.js.map +1 -0
  18. package/dist/cjs/validation.js +534 -0
  19. package/dist/cjs/validation.js.map +1 -0
  20. package/dist/cjs/warnings.js +301 -0
  21. package/dist/cjs/warnings.js.map +1 -0
  22. package/dist/esm/conversation-history.js +134 -0
  23. package/dist/esm/conversation-history.js.map +1 -0
  24. package/dist/esm/index.js +26 -0
  25. package/dist/esm/index.js.map +1 -0
  26. package/dist/esm/model-cache.js +158 -0
  27. package/dist/esm/model-cache.js.map +1 -0
  28. package/dist/esm/parameter-normalizer.js +434 -0
  29. package/dist/esm/parameter-normalizer.js.map +1 -0
  30. package/dist/esm/streaming-modes.js +265 -0
  31. package/dist/esm/streaming-modes.js.map +1 -0
  32. package/dist/esm/streaming.js +860 -0
  33. package/dist/esm/streaming.js.map +1 -0
  34. package/dist/esm/structured-output.js +387 -0
  35. package/dist/esm/structured-output.js.map +1 -0
  36. package/dist/esm/system-message.js +213 -0
  37. package/dist/esm/system-message.js.map +1 -0
  38. package/dist/esm/validation.js +523 -0
  39. package/dist/esm/validation.js.map +1 -0
  40. package/dist/esm/warnings.js +284 -0
  41. package/dist/esm/warnings.js.map +1 -0
  42. package/dist/types/conversation-history.d.ts +70 -0
  43. package/dist/types/conversation-history.d.ts.map +1 -0
  44. package/dist/types/index.d.ts +17 -0
  45. package/dist/types/index.d.ts.map +1 -0
  46. package/dist/types/model-cache.d.ts +88 -0
  47. package/dist/types/model-cache.d.ts.map +1 -0
  48. package/dist/types/parameter-normalizer.d.ts +154 -0
  49. package/dist/types/parameter-normalizer.d.ts.map +1 -0
  50. package/dist/types/streaming-modes.d.ts +139 -0
  51. package/dist/types/streaming-modes.d.ts.map +1 -0
  52. package/dist/types/streaming.d.ts +384 -0
  53. package/dist/types/streaming.d.ts.map +1 -0
  54. package/dist/types/structured-output.d.ts +157 -0
  55. package/dist/types/structured-output.d.ts.map +1 -0
  56. package/dist/types/system-message.d.ts +78 -0
  57. package/dist/types/system-message.d.ts.map +1 -0
  58. package/dist/types/validation.d.ts +46 -0
  59. package/dist/types/validation.d.ts.map +1 -0
  60. package/dist/types/warnings.d.ts +149 -0
  61. package/dist/types/warnings.d.ts.map +1 -0
  62. package/package.json +75 -0
  63. package/readme.md +280 -0
@@ -0,0 +1,301 @@
1
+ "use strict";
2
+ /**
3
+ * Warning Utilities
4
+ *
5
+ * Helpers for creating, formatting, and managing semantic drift warnings.
6
+ *
7
+ * @module
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.createWarning = createWarning;
11
+ exports.createNormalizationWarning = createNormalizationWarning;
12
+ exports.createClampingWarning = createClampingWarning;
13
+ exports.createUnsupportedParameterWarning = createUnsupportedParameterWarning;
14
+ exports.createUnsupportedCapabilityWarning = createUnsupportedCapabilityWarning;
15
+ exports.createTokenLimitWarning = createTokenLimitWarning;
16
+ exports.createStopSequencesTruncatedWarning = createStopSequencesTruncatedWarning;
17
+ exports.mergeWarnings = mergeWarnings;
18
+ exports.filterWarningsBySeverity = filterWarningsBySeverity;
19
+ exports.filterWarningsByCategory = filterWarningsByCategory;
20
+ exports.groupWarningsByCategory = groupWarningsByCategory;
21
+ exports.hasWarning = hasWarning;
22
+ exports.formatWarning = formatWarning;
23
+ exports.formatWarnings = formatWarnings;
24
+ exports.getWarningSummary = getWarningSummary;
25
+ // ============================================================================
26
+ // Warning Creation
27
+ // ============================================================================
28
+ /**
29
+ * Create a warning object.
30
+ *
31
+ * @param category Warning category
32
+ * @param message Human-readable message
33
+ * @param options Additional warning options
34
+ * @returns Warning object
35
+ */
36
+ function createWarning(category, message, options = {}) {
37
+ return {
38
+ category,
39
+ severity: options.severity ?? 'warning',
40
+ message,
41
+ field: options.field,
42
+ originalValue: options.originalValue,
43
+ transformedValue: options.transformedValue,
44
+ source: options.source,
45
+ details: options.details,
46
+ };
47
+ }
48
+ /**
49
+ * Create a parameter normalization warning.
50
+ *
51
+ * @param field Parameter field name
52
+ * @param originalValue Original value
53
+ * @param transformedValue Transformed value
54
+ * @param message Optional custom message
55
+ * @param source Source adapter
56
+ * @returns Warning object
57
+ */
58
+ function createNormalizationWarning(field, originalValue, transformedValue, message, source) {
59
+ return createWarning('parameter-normalized', message ||
60
+ `Parameter '${field}' normalized from ${String(originalValue)} to ${String(transformedValue)}`, {
61
+ severity: 'info',
62
+ field,
63
+ originalValue,
64
+ transformedValue,
65
+ source,
66
+ });
67
+ }
68
+ /**
69
+ * Create a parameter clamping warning.
70
+ *
71
+ * @param field Parameter field name
72
+ * @param originalValue Original value
73
+ * @param clampedValue Clamped value
74
+ * @param min Minimum allowed value
75
+ * @param max Maximum allowed value
76
+ * @param source Source adapter
77
+ * @returns Warning object
78
+ */
79
+ function createClampingWarning(field, originalValue, clampedValue, min, max, source) {
80
+ return createWarning('parameter-clamped', `Parameter '${field}' clamped from ${String(originalValue)} to ${String(clampedValue)} (valid range: ${min}-${max})`, {
81
+ severity: 'warning',
82
+ field,
83
+ originalValue,
84
+ transformedValue: clampedValue,
85
+ source,
86
+ details: { min, max },
87
+ });
88
+ }
89
+ /**
90
+ * Create an unsupported parameter warning.
91
+ *
92
+ * @param field Parameter field name
93
+ * @param value Parameter value
94
+ * @param source Source adapter
95
+ * @returns Warning object
96
+ */
97
+ function createUnsupportedParameterWarning(field, value, source) {
98
+ return createWarning('parameter-unsupported', `Parameter '${field}' is not supported by provider (value: ${String(value)})`, {
99
+ severity: 'warning',
100
+ field,
101
+ originalValue: value,
102
+ source,
103
+ });
104
+ }
105
+ /**
106
+ * Create a capability unsupported warning.
107
+ *
108
+ * @param capability Capability name
109
+ * @param source Source adapter
110
+ * @returns Warning object
111
+ */
112
+ function createUnsupportedCapabilityWarning(capability, source) {
113
+ return createWarning('capability-unsupported', `Capability '${capability}' is not supported by provider`, {
114
+ severity: 'warning',
115
+ field: capability,
116
+ source,
117
+ });
118
+ }
119
+ /**
120
+ * Create a token limit exceeded warning.
121
+ *
122
+ * @param estimatedTokens Estimated token count
123
+ * @param maxTokens Maximum tokens allowed
124
+ * @param source Source adapter
125
+ * @returns Warning object
126
+ */
127
+ function createTokenLimitWarning(estimatedTokens, maxTokens, source) {
128
+ return createWarning('token-limit-exceeded', `Estimated tokens (${estimatedTokens}) may exceed provider limit (${maxTokens})`, {
129
+ severity: 'warning',
130
+ source,
131
+ details: { estimatedTokens, maxTokens },
132
+ });
133
+ }
134
+ /**
135
+ * Create a stop sequences truncated warning.
136
+ *
137
+ * @param originalCount Original number of stop sequences
138
+ * @param maxCount Maximum allowed
139
+ * @param source Source adapter
140
+ * @returns Warning object
141
+ */
142
+ function createStopSequencesTruncatedWarning(originalCount, maxCount, source) {
143
+ return createWarning('stop-sequences-truncated', `Stop sequences truncated from ${originalCount} to ${maxCount} (provider limit)`, {
144
+ severity: 'warning',
145
+ field: 'stopSequences',
146
+ originalValue: originalCount,
147
+ transformedValue: maxCount,
148
+ source,
149
+ });
150
+ }
151
+ // ============================================================================
152
+ // Warning Manipulation
153
+ // ============================================================================
154
+ /**
155
+ * Merge warning arrays, removing duplicates.
156
+ *
157
+ * @param warningArrays Arrays of warnings to merge
158
+ * @returns Merged and deduplicated warnings
159
+ */
160
+ function mergeWarnings(...warningArrays) {
161
+ const warnings = [];
162
+ const seen = new Set();
163
+ for (const array of warningArrays) {
164
+ if (!array) {
165
+ continue;
166
+ }
167
+ for (const warning of array) {
168
+ // Create a key for deduplication
169
+ const key = `${warning.category}:${warning.field}:${warning.message}`;
170
+ if (!seen.has(key)) {
171
+ seen.add(key);
172
+ warnings.push(warning);
173
+ }
174
+ }
175
+ }
176
+ return warnings;
177
+ }
178
+ /**
179
+ * Filter warnings by severity.
180
+ *
181
+ * @param warnings Warnings to filter
182
+ * @param minSeverity Minimum severity level
183
+ * @returns Filtered warnings
184
+ */
185
+ function filterWarningsBySeverity(warnings, minSeverity) {
186
+ const severityOrder = {
187
+ info: 0,
188
+ warning: 1,
189
+ error: 2,
190
+ };
191
+ const minLevel = severityOrder[minSeverity];
192
+ return warnings.filter((w) => severityOrder[w.severity] >= minLevel);
193
+ }
194
+ /**
195
+ * Filter warnings by category.
196
+ *
197
+ * @param warnings Warnings to filter
198
+ * @param categories Categories to include
199
+ * @returns Filtered warnings
200
+ */
201
+ function filterWarningsByCategory(warnings, categories) {
202
+ const categorySet = new Set(categories);
203
+ return warnings.filter((w) => categorySet.has(w.category));
204
+ }
205
+ /**
206
+ * Group warnings by category.
207
+ *
208
+ * @param warnings Warnings to group
209
+ * @returns Map of category to warnings
210
+ */
211
+ function groupWarningsByCategory(warnings) {
212
+ const groups = new Map();
213
+ for (const warning of warnings) {
214
+ const group = groups.get(warning.category) || [];
215
+ group.push(warning);
216
+ groups.set(warning.category, group);
217
+ }
218
+ return groups;
219
+ }
220
+ /**
221
+ * Check if warnings array contains a specific warning type.
222
+ *
223
+ * @param warnings Warnings to check
224
+ * @param category Warning category to look for
225
+ * @param field Optional field name to match
226
+ * @returns true if warning exists
227
+ */
228
+ function hasWarning(warnings, category, field) {
229
+ if (!warnings) {
230
+ return false;
231
+ }
232
+ return warnings.some((w) => w.category === category && (field === undefined || w.field === field));
233
+ }
234
+ // ============================================================================
235
+ // Warning Formatting
236
+ // ============================================================================
237
+ /**
238
+ * Format a single warning as a string.
239
+ *
240
+ * @param warning Warning to format
241
+ * @param includeDetails Include full details
242
+ * @returns Formatted warning string
243
+ */
244
+ function formatWarning(warning, includeDetails = false) {
245
+ const prefix = `[${warning.severity.toUpperCase()}]`;
246
+ const source = warning.source ? ` (${warning.source})` : '';
247
+ if (!includeDetails) {
248
+ return `${prefix} ${warning.message}${source}`;
249
+ }
250
+ const parts = [
251
+ `${prefix} ${warning.message}${source}`,
252
+ warning.field ? ` Field: ${warning.field}` : null,
253
+ warning.originalValue !== undefined
254
+ ? ` Original: ${JSON.stringify(warning.originalValue)}`
255
+ : null,
256
+ warning.transformedValue !== undefined
257
+ ? ` Transformed: ${JSON.stringify(warning.transformedValue)}`
258
+ : null,
259
+ warning.details ? ` Details: ${JSON.stringify(warning.details)}` : null,
260
+ ].filter(Boolean);
261
+ return parts.join('\n');
262
+ }
263
+ /**
264
+ * Format multiple warnings as a string.
265
+ *
266
+ * @param warnings Warnings to format
267
+ * @param includeDetails Include full details
268
+ * @returns Formatted warnings string
269
+ */
270
+ function formatWarnings(warnings, includeDetails = false) {
271
+ if (warnings.length === 0) {
272
+ return 'No warnings';
273
+ }
274
+ const formatted = warnings.map((w) => formatWarning(w, includeDetails));
275
+ return formatted.join('\n');
276
+ }
277
+ /**
278
+ * Get a summary of warnings by category.
279
+ *
280
+ * @param warnings Warnings to summarize
281
+ * @returns Summary object with counts
282
+ */
283
+ function getWarningSummary(warnings) {
284
+ const summary = {
285
+ total: warnings.length,
286
+ byCategory: {},
287
+ bySeverity: {
288
+ info: 0,
289
+ warning: 0,
290
+ error: 0,
291
+ },
292
+ };
293
+ for (const warning of warnings) {
294
+ // Count by category
295
+ summary.byCategory[warning.category] = (summary.byCategory[warning.category] || 0) + 1;
296
+ // Count by severity
297
+ summary.bySeverity[warning.severity]++;
298
+ }
299
+ return summary;
300
+ }
301
+ //# sourceMappingURL=warnings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"warnings.js","sourceRoot":"","sources":["../../src/warnings.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,134 @@
1
+ /**
2
+ * Conversation History Management Utilities
3
+ *
4
+ * Utilities for managing conversation history with configurable trimming strategies.
5
+ * Used by both middleware and wrappers for consistent history management.
6
+ *
7
+ * @module
8
+ */
9
+ /**
10
+ * Trim conversation history to keep only the most recent messages.
11
+ *
12
+ * @param history - Current conversation history
13
+ * @param maxHistorySize - Maximum number of message pairs to keep
14
+ * - 0: Return empty array (no history)
15
+ * - -1: Return full history (no trimming)
16
+ * - N > 0: Keep last N user/assistant pairs
17
+ * @param strategy - Trimming strategy
18
+ * - 'fifo': First-in-first-out, remove oldest messages
19
+ * - 'smart': Preserve system messages, trim user/assistant pairs
20
+ * @returns Trimmed history
21
+ *
22
+ * @example
23
+ * ```typescript
24
+ * const history = [
25
+ * { role: 'system', content: 'You are helpful' },
26
+ * { role: 'user', content: 'Hi' },
27
+ * { role: 'assistant', content: 'Hello!' },
28
+ * { role: 'user', content: 'How are you?' },
29
+ * { role: 'assistant', content: 'I am well!' },
30
+ * ];
31
+ *
32
+ * // Keep last 1 pair + system message
33
+ * const trimmed = trimHistory(history, 1, 'smart');
34
+ * // Result: system message + last user/assistant pair
35
+ * ```
36
+ */
37
+ export function trimHistory(history, maxHistorySize, strategy = 'fifo') {
38
+ // No history
39
+ if (maxHistorySize === 0) {
40
+ return [];
41
+ }
42
+ // Unlimited history
43
+ if (maxHistorySize < 0) {
44
+ return Array.from(history);
45
+ }
46
+ // No trimming needed
47
+ if (history.length === 0) {
48
+ return [];
49
+ }
50
+ if (strategy === 'smart') {
51
+ return trimHistorySmart(history, maxHistorySize);
52
+ }
53
+ // FIFO strategy: keep last N pairs (2N messages)
54
+ return trimHistoryFifo(history, maxHistorySize);
55
+ }
56
+ /**
57
+ * FIFO trimming: Keep last N message pairs
58
+ */
59
+ function trimHistoryFifo(history, maxPairs) {
60
+ const maxMessages = maxPairs * 2;
61
+ if (history.length <= maxMessages) {
62
+ return Array.from(history);
63
+ }
64
+ // Keep last 2N messages
65
+ return Array.from(history.slice(-maxMessages));
66
+ }
67
+ /**
68
+ * Smart trimming: Preserve system messages, trim user/assistant pairs
69
+ */
70
+ function trimHistorySmart(history, maxPairs) {
71
+ // Separate system messages from conversation
72
+ const systemMessages = [];
73
+ const conversationMessages = [];
74
+ for (const message of history) {
75
+ if (message.role === 'system') {
76
+ systemMessages.push(message);
77
+ }
78
+ else {
79
+ conversationMessages.push(message);
80
+ }
81
+ }
82
+ // Trim conversation to last N pairs
83
+ const maxConversationMessages = maxPairs * 2;
84
+ const trimmedConversation = conversationMessages.length <= maxConversationMessages
85
+ ? conversationMessages
86
+ : conversationMessages.slice(-maxConversationMessages);
87
+ // Combine: system messages first, then conversation
88
+ return [...systemMessages, ...trimmedConversation];
89
+ }
90
+ /**
91
+ * Count message pairs in history (excluding system messages)
92
+ *
93
+ * @param history - Conversation history
94
+ * @returns Number of user/assistant pairs
95
+ *
96
+ * @example
97
+ * ```typescript
98
+ * const history = [
99
+ * { role: 'system', content: 'You are helpful' },
100
+ * { role: 'user', content: 'Hi' },
101
+ * { role: 'assistant', content: 'Hello!' },
102
+ * ];
103
+ *
104
+ * countMessagePairs(history); // 1
105
+ * ```
106
+ */
107
+ export function countMessagePairs(history) {
108
+ const nonSystemMessages = history.filter((m) => m.role !== 'system');
109
+ return Math.floor(nonSystemMessages.length / 2);
110
+ }
111
+ /**
112
+ * Check if history needs trimming
113
+ *
114
+ * @param history - Current history
115
+ * @param maxHistorySize - Maximum pairs to keep
116
+ * @param strategy - Trimming strategy
117
+ * @returns True if history exceeds limit
118
+ */
119
+ export function shouldTrimHistory(history, maxHistorySize, strategy = 'fifo') {
120
+ if (maxHistorySize === 0) {
121
+ return history.length > 0;
122
+ }
123
+ if (maxHistorySize < 0) {
124
+ return false;
125
+ }
126
+ if (strategy === 'smart') {
127
+ const pairs = countMessagePairs(history);
128
+ return pairs > maxHistorySize;
129
+ }
130
+ // FIFO: check total message count
131
+ const maxMessages = maxHistorySize * 2;
132
+ return history.length > maxMessages;
133
+ }
134
+ //# sourceMappingURL=conversation-history.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversation-history.js","sourceRoot":"","sources":["../../src/conversation-history.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Utility Functions
3
+ *
4
+ * Collection of utility functions for validation, normalization, and streaming.
5
+ *
6
+ * @module
7
+ */
8
+ // Validation utilities
9
+ export * from './validation.js';
10
+ // System message utilities
11
+ export * from './system-message.js';
12
+ // Parameter normalization utilities
13
+ export * from './parameter-normalizer.js';
14
+ // Streaming utilities
15
+ export * from './streaming.js';
16
+ // Streaming mode conversion utilities
17
+ export * from './streaming-modes.js';
18
+ // Warning utilities
19
+ export * from './warnings.js';
20
+ // Conversation history utilities
21
+ export * from './conversation-history.js';
22
+ // Model cache utilities
23
+ export * from './model-cache.js';
24
+ // Structured output utilities (Zod integration)
25
+ export * from './structured-output.js';
26
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,uBAAuB;AACvB,cAAc,iBAAiB,CAAC;AAEhC,2BAA2B;AAC3B,cAAc,qBAAqB,CAAC;AAEpC,oCAAoC;AACpC,cAAc,2BAA2B,CAAC;AAE1C,sBAAsB;AACtB,cAAc,gBAAgB,CAAC;AAE/B,sCAAsC;AACtC,cAAc,sBAAsB,CAAC;AAErC,oBAAoB;AACpB,cAAc,eAAe,CAAC;AAE9B,iCAAiC;AACjC,cAAc,2BAA2B,CAAC;AAE1C,wBAAwB;AACxB,cAAc,kBAAkB,CAAC;AAEjC,gDAAgD;AAChD,cAAc,wBAAwB,CAAC"}
@@ -0,0 +1,158 @@
1
+ /**
2
+ * Model Cache
3
+ *
4
+ * In-memory caching for model lists to reduce API calls.
5
+ * Supports both global (shared) and instance-scoped caches.
6
+ *
7
+ * @module
8
+ */
9
+ // ============================================================================
10
+ // Model Cache Implementation
11
+ // ============================================================================
12
+ /**
13
+ * In-memory cache for model lists with TTL-based expiration.
14
+ *
15
+ * Usage:
16
+ * ```typescript
17
+ * const cache = new ModelCache();
18
+ *
19
+ * // Set with 1 hour TTL
20
+ * cache.set('openai-backend', modelResult, 3600000);
21
+ *
22
+ * // Get (returns null if expired or not found)
23
+ * const cached = cache.get('openai-backend');
24
+ *
25
+ * // Invalidate specific backend
26
+ * cache.invalidate('openai-backend');
27
+ *
28
+ * // Clear all
29
+ * cache.clear();
30
+ * ```
31
+ */
32
+ export class ModelCache {
33
+ cache;
34
+ constructor() {
35
+ this.cache = new Map();
36
+ }
37
+ /**
38
+ * Get cached model list for a backend.
39
+ *
40
+ * @param backendName Unique backend identifier
41
+ * @returns Cached result or null if not found/expired
42
+ */
43
+ get(backendName) {
44
+ const entry = this.cache.get(backendName);
45
+ if (!entry) {
46
+ return null;
47
+ }
48
+ // Check if expired
49
+ if (Date.now() > entry.expiresAt) {
50
+ this.cache.delete(backendName);
51
+ return null;
52
+ }
53
+ // Return cached result with updated source
54
+ return {
55
+ ...entry.result,
56
+ source: 'cache',
57
+ };
58
+ }
59
+ /**
60
+ * Cache a model list result.
61
+ *
62
+ * @param backendName Unique backend identifier
63
+ * @param result Model list result to cache
64
+ * @param ttl Time to live in milliseconds
65
+ */
66
+ set(backendName, result, ttl) {
67
+ const expiresAt = Date.now() + ttl;
68
+ this.cache.set(backendName, {
69
+ result,
70
+ expiresAt,
71
+ });
72
+ }
73
+ /**
74
+ * Check if backend has cached models.
75
+ *
76
+ * @param backendName Unique backend identifier
77
+ * @returns true if cache exists and not expired
78
+ */
79
+ has(backendName) {
80
+ return this.get(backendName) !== null;
81
+ }
82
+ /**
83
+ * Invalidate (remove) cached models for a backend.
84
+ *
85
+ * @param backendName Unique backend identifier
86
+ */
87
+ invalidate(backendName) {
88
+ this.cache.delete(backendName);
89
+ }
90
+ /**
91
+ * Clear all cached model lists.
92
+ */
93
+ clear() {
94
+ this.cache.clear();
95
+ }
96
+ /**
97
+ * Get number of cached backends.
98
+ */
99
+ size() {
100
+ // Count only non-expired entries
101
+ let count = 0;
102
+ const now = Date.now();
103
+ for (const [key, entry] of this.cache.entries()) {
104
+ if (now <= entry.expiresAt) {
105
+ count++;
106
+ }
107
+ else {
108
+ // Clean up expired entry
109
+ this.cache.delete(key);
110
+ }
111
+ }
112
+ return count;
113
+ }
114
+ /**
115
+ * Get all cached backend names (excluding expired).
116
+ */
117
+ keys() {
118
+ const keys = [];
119
+ const now = Date.now();
120
+ for (const [key, entry] of this.cache.entries()) {
121
+ if (now <= entry.expiresAt) {
122
+ keys.push(key);
123
+ }
124
+ else {
125
+ // Clean up expired entry
126
+ this.cache.delete(key);
127
+ }
128
+ }
129
+ return keys;
130
+ }
131
+ }
132
+ // ============================================================================
133
+ // Global Cache Instance
134
+ // ============================================================================
135
+ /**
136
+ * Global model cache shared across all adapter instances.
137
+ *
138
+ * This is the default cache used when `modelsCacheScope: 'global'`.
139
+ * Reduces redundant API calls when multiple adapters share the same backend.
140
+ */
141
+ export const globalModelCache = new ModelCache();
142
+ // ============================================================================
143
+ // Cache Factory
144
+ // ============================================================================
145
+ /**
146
+ * Create or get model cache based on scope strategy.
147
+ *
148
+ * @param scope Cache scope strategy
149
+ * @returns Model cache instance
150
+ */
151
+ export function getModelCache(scope = 'global') {
152
+ if (scope === 'global') {
153
+ return globalModelCache;
154
+ }
155
+ // Create new instance-scoped cache
156
+ return new ModelCache();
157
+ }
158
+ //# sourceMappingURL=model-cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-cache.js","sourceRoot":"","sources":["../../src/model-cache.ts"],"names":[],"mappings":"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"}