genai-lite 0.4.3 → 0.5.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.
- package/README.md +377 -16
- package/dist/adapters/image/ElectronDiffusionAdapter.d.ts +10 -0
- package/dist/adapters/image/ElectronDiffusionAdapter.js +11 -0
- package/dist/adapters/image/GenaiElectronImageAdapter.d.ts +69 -0
- package/dist/adapters/image/GenaiElectronImageAdapter.js +273 -0
- package/dist/adapters/image/MockImageAdapter.d.ts +23 -0
- package/dist/adapters/image/MockImageAdapter.js +55 -0
- package/dist/adapters/image/OpenAIImageAdapter.d.ts +62 -0
- package/dist/adapters/image/OpenAIImageAdapter.js +303 -0
- package/dist/config/image-presets.json +212 -0
- package/dist/config/llm-presets.json +326 -0
- package/dist/image/ImageService.d.ts +53 -0
- package/dist/image/ImageService.js +199 -0
- package/dist/image/config.d.ts +48 -0
- package/dist/image/config.js +221 -0
- package/dist/image/services/ImageAdapterRegistry.d.ts +61 -0
- package/dist/image/services/ImageAdapterRegistry.js +95 -0
- package/dist/image/services/ImageModelResolver.d.ts +26 -0
- package/dist/image/services/ImageModelResolver.js +98 -0
- package/dist/image/services/ImagePresetManager.d.ts +27 -0
- package/dist/image/services/ImagePresetManager.js +52 -0
- package/dist/image/services/ImageRequestValidator.d.ts +37 -0
- package/dist/image/services/ImageRequestValidator.js +133 -0
- package/dist/image/services/ImageSettingsResolver.d.ts +25 -0
- package/dist/image/services/ImageSettingsResolver.js +76 -0
- package/dist/index.d.ts +4 -2
- package/dist/index.js +5 -1
- package/dist/llm/LLMService.d.ts +3 -4
- package/dist/llm/LLMService.js +14 -4
- package/dist/llm/clients/AnthropicClientAdapter.js +2 -2
- package/dist/llm/clients/GeminiClientAdapter.js +2 -2
- package/dist/llm/clients/LlamaCppClientAdapter.d.ts +1 -1
- package/dist/llm/clients/LlamaCppClientAdapter.js +3 -3
- package/dist/llm/clients/OpenAIClientAdapter.js +2 -2
- package/dist/llm/config.js +4 -28
- package/dist/llm/services/ModelResolver.d.ts +6 -4
- package/dist/providers/fromEnvironment.d.ts +5 -1
- package/dist/providers/fromEnvironment.js +29 -4
- package/dist/shared/adapters/errorUtils.d.ts +26 -0
- package/dist/shared/adapters/errorUtils.js +107 -0
- package/dist/shared/services/AdapterRegistry.d.ts +89 -0
- package/dist/shared/services/AdapterRegistry.js +144 -0
- package/dist/shared/services/PresetManager.d.ts +33 -0
- package/dist/shared/services/PresetManager.js +56 -0
- package/dist/types/image.d.ts +399 -0
- package/dist/types/image.js +8 -0
- package/dist/types.d.ts +6 -0
- package/package.json +3 -2
- package/src/config/image-presets.json +212 -0
- /package/src/config/{presets.json → llm-presets.json} +0 -0
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// AI Summary: Centralized error mapping utility for LLM client adapters.
|
|
3
|
+
// Maps common HTTP status codes and network errors to standardized AdapterErrorCode and errorType.
|
|
4
|
+
// Reduces duplication across OpenAI, Anthropic and other provider adapters.
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.getCommonMappedErrorDetails = getCommonMappedErrorDetails;
|
|
7
|
+
const types_1 = require("../../llm/clients/types");
|
|
8
|
+
/**
|
|
9
|
+
* Maps common error patterns to standardized error codes and types
|
|
10
|
+
*
|
|
11
|
+
* This utility handles:
|
|
12
|
+
* - Common HTTP status codes (401, 402, 404, 429, 4xx, 5xx)
|
|
13
|
+
* - Network connection errors (ENOTFOUND, ECONNREFUSED, timeouts)
|
|
14
|
+
* - Generic JavaScript errors
|
|
15
|
+
*
|
|
16
|
+
* Individual adapters can further refine the mappings for provider-specific cases,
|
|
17
|
+
* particularly for 400 errors where message content determines the specific error type.
|
|
18
|
+
*
|
|
19
|
+
* @param error - The error object from the provider SDK or network layer
|
|
20
|
+
* @param providerMessageOverride - Optional override for the error message (e.g., from provider SDK)
|
|
21
|
+
* @returns Mapped error details with standardized codes and types
|
|
22
|
+
*/
|
|
23
|
+
function getCommonMappedErrorDetails(error, providerMessageOverride) {
|
|
24
|
+
let errorCode = types_1.ADAPTER_ERROR_CODES.UNKNOWN_ERROR;
|
|
25
|
+
let errorMessage = providerMessageOverride || error?.message || 'Unknown error occurred';
|
|
26
|
+
let errorType = 'server_error';
|
|
27
|
+
let status;
|
|
28
|
+
// Handle API errors with HTTP status codes
|
|
29
|
+
if (error && typeof error.status === 'number') {
|
|
30
|
+
const httpStatus = error.status;
|
|
31
|
+
status = httpStatus;
|
|
32
|
+
errorMessage = providerMessageOverride || error.message || `HTTP ${httpStatus} error`;
|
|
33
|
+
// Map common HTTP status codes
|
|
34
|
+
// TypeScript knows httpStatus is defined here due to the typeof check above
|
|
35
|
+
switch (httpStatus) {
|
|
36
|
+
case 400:
|
|
37
|
+
// Default mapping for 400 errors - adapters should refine based on message content
|
|
38
|
+
errorCode = types_1.ADAPTER_ERROR_CODES.PROVIDER_ERROR;
|
|
39
|
+
errorType = 'invalid_request_error';
|
|
40
|
+
break;
|
|
41
|
+
case 401:
|
|
42
|
+
errorCode = types_1.ADAPTER_ERROR_CODES.INVALID_API_KEY;
|
|
43
|
+
errorType = 'authentication_error';
|
|
44
|
+
break;
|
|
45
|
+
case 402:
|
|
46
|
+
errorCode = types_1.ADAPTER_ERROR_CODES.INSUFFICIENT_CREDITS;
|
|
47
|
+
errorType = 'rate_limit_error';
|
|
48
|
+
break;
|
|
49
|
+
case 404:
|
|
50
|
+
errorCode = types_1.ADAPTER_ERROR_CODES.MODEL_NOT_FOUND;
|
|
51
|
+
errorType = 'invalid_request_error';
|
|
52
|
+
break;
|
|
53
|
+
case 429:
|
|
54
|
+
errorCode = types_1.ADAPTER_ERROR_CODES.RATE_LIMIT_EXCEEDED;
|
|
55
|
+
errorType = 'rate_limit_error';
|
|
56
|
+
break;
|
|
57
|
+
case 500:
|
|
58
|
+
case 502:
|
|
59
|
+
case 503:
|
|
60
|
+
case 504:
|
|
61
|
+
errorCode = types_1.ADAPTER_ERROR_CODES.PROVIDER_ERROR;
|
|
62
|
+
errorType = 'server_error';
|
|
63
|
+
break;
|
|
64
|
+
default:
|
|
65
|
+
if (httpStatus >= 400 && httpStatus < 500) {
|
|
66
|
+
errorCode = types_1.ADAPTER_ERROR_CODES.PROVIDER_ERROR;
|
|
67
|
+
errorType = 'invalid_request_error';
|
|
68
|
+
}
|
|
69
|
+
else if (httpStatus >= 500) {
|
|
70
|
+
errorCode = types_1.ADAPTER_ERROR_CODES.PROVIDER_ERROR;
|
|
71
|
+
errorType = 'server_error';
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
errorCode = types_1.ADAPTER_ERROR_CODES.PROVIDER_ERROR;
|
|
75
|
+
errorType = 'server_error';
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
// Handle network connection errors
|
|
80
|
+
else if (error && (error.code === 'ENOTFOUND' ||
|
|
81
|
+
error.code === 'ECONNREFUSED' ||
|
|
82
|
+
error.code === 'ETIMEDOUT' ||
|
|
83
|
+
error.name === 'ConnectTimeoutError' ||
|
|
84
|
+
(error.type && error.type.includes('timeout')))) {
|
|
85
|
+
errorCode = types_1.ADAPTER_ERROR_CODES.NETWORK_ERROR;
|
|
86
|
+
errorType = 'connection_error';
|
|
87
|
+
errorMessage = providerMessageOverride || error.message || 'Network connection failed';
|
|
88
|
+
}
|
|
89
|
+
// Handle generic JavaScript errors
|
|
90
|
+
else if (error instanceof Error) {
|
|
91
|
+
errorMessage = providerMessageOverride || error.message || 'Client error occurred';
|
|
92
|
+
errorCode = types_1.ADAPTER_ERROR_CODES.UNKNOWN_ERROR;
|
|
93
|
+
errorType = 'client_error';
|
|
94
|
+
}
|
|
95
|
+
// Handle unknown error types
|
|
96
|
+
else {
|
|
97
|
+
errorMessage = providerMessageOverride || 'Unknown error occurred';
|
|
98
|
+
errorCode = types_1.ADAPTER_ERROR_CODES.UNKNOWN_ERROR;
|
|
99
|
+
errorType = 'server_error';
|
|
100
|
+
}
|
|
101
|
+
return {
|
|
102
|
+
errorCode,
|
|
103
|
+
errorMessage,
|
|
104
|
+
errorType,
|
|
105
|
+
status
|
|
106
|
+
};
|
|
107
|
+
}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Information about a registered adapter
|
|
3
|
+
*/
|
|
4
|
+
export interface AdapterInfo<TProviderId extends string> {
|
|
5
|
+
providerId: TProviderId;
|
|
6
|
+
hasAdapter: boolean;
|
|
7
|
+
adapterInfo?: {
|
|
8
|
+
name: string;
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Summary of provider availability
|
|
13
|
+
*/
|
|
14
|
+
export interface ProviderSummary {
|
|
15
|
+
totalProviders: number;
|
|
16
|
+
providersWithAdapters: number;
|
|
17
|
+
availableProviders: string[];
|
|
18
|
+
unavailableProviders: string[];
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Minimal provider information interface
|
|
22
|
+
*/
|
|
23
|
+
export interface MinimalProviderInfo<TProviderId extends string> {
|
|
24
|
+
id: TProviderId;
|
|
25
|
+
[key: string]: any;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Configuration for adapter initialization
|
|
29
|
+
*/
|
|
30
|
+
export interface AdapterRegistryConfig<TAdapter, TProviderId extends string> {
|
|
31
|
+
/** List of supported providers */
|
|
32
|
+
supportedProviders: readonly MinimalProviderInfo<TProviderId>[];
|
|
33
|
+
/** Map of provider IDs to adapter constructors */
|
|
34
|
+
adapterConstructors?: Partial<Record<string, new (config?: any) => TAdapter>>;
|
|
35
|
+
/** Map of provider IDs to adapter configurations */
|
|
36
|
+
adapterConfigs?: Record<string, any>;
|
|
37
|
+
/** Fallback adapter to use when no specific adapter is registered */
|
|
38
|
+
fallbackAdapter: TAdapter;
|
|
39
|
+
/** Optional custom adapters to register at initialization */
|
|
40
|
+
customAdapters?: Record<string, TAdapter>;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Generic registry for managing service adapters across different providers.
|
|
44
|
+
* Handles adapter initialization, registration, and retrieval.
|
|
45
|
+
*
|
|
46
|
+
* @template TAdapter - The adapter interface type
|
|
47
|
+
* @template TProviderId - The provider ID type (string union)
|
|
48
|
+
*/
|
|
49
|
+
export declare class AdapterRegistry<TAdapter, TProviderId extends string> {
|
|
50
|
+
private adapters;
|
|
51
|
+
private fallbackAdapter;
|
|
52
|
+
private supportedProviders;
|
|
53
|
+
/**
|
|
54
|
+
* Creates a new AdapterRegistry
|
|
55
|
+
*
|
|
56
|
+
* @param config - Configuration for the registry
|
|
57
|
+
*/
|
|
58
|
+
constructor(config: AdapterRegistryConfig<TAdapter, TProviderId>);
|
|
59
|
+
/**
|
|
60
|
+
* Initializes adapters for all supported providers using constructors
|
|
61
|
+
*/
|
|
62
|
+
private initializeAdapters;
|
|
63
|
+
/**
|
|
64
|
+
* Registers an adapter for a specific provider
|
|
65
|
+
*
|
|
66
|
+
* @param providerId - The provider ID
|
|
67
|
+
* @param adapter - The adapter implementation
|
|
68
|
+
*/
|
|
69
|
+
registerAdapter(providerId: TProviderId, adapter: TAdapter): void;
|
|
70
|
+
/**
|
|
71
|
+
* Gets the appropriate adapter for a provider
|
|
72
|
+
*
|
|
73
|
+
* @param providerId - The provider ID
|
|
74
|
+
* @returns The adapter to use
|
|
75
|
+
*/
|
|
76
|
+
getAdapter(providerId: TProviderId): TAdapter;
|
|
77
|
+
/**
|
|
78
|
+
* Gets information about registered adapters
|
|
79
|
+
*
|
|
80
|
+
* @returns Map of provider IDs to adapter info
|
|
81
|
+
*/
|
|
82
|
+
getRegisteredAdapters(): Map<TProviderId, AdapterInfo<TProviderId>>;
|
|
83
|
+
/**
|
|
84
|
+
* Gets a summary of available providers and their adapter status
|
|
85
|
+
*
|
|
86
|
+
* @returns Summary of provider availability
|
|
87
|
+
*/
|
|
88
|
+
getProviderSummary(): ProviderSummary;
|
|
89
|
+
}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.AdapterRegistry = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Generic registry for managing service adapters across different providers.
|
|
6
|
+
* Handles adapter initialization, registration, and retrieval.
|
|
7
|
+
*
|
|
8
|
+
* @template TAdapter - The adapter interface type
|
|
9
|
+
* @template TProviderId - The provider ID type (string union)
|
|
10
|
+
*/
|
|
11
|
+
class AdapterRegistry {
|
|
12
|
+
/**
|
|
13
|
+
* Creates a new AdapterRegistry
|
|
14
|
+
*
|
|
15
|
+
* @param config - Configuration for the registry
|
|
16
|
+
*/
|
|
17
|
+
constructor(config) {
|
|
18
|
+
this.adapters = new Map();
|
|
19
|
+
this.fallbackAdapter = config.fallbackAdapter;
|
|
20
|
+
this.supportedProviders = config.supportedProviders;
|
|
21
|
+
// Register custom adapters first if provided
|
|
22
|
+
if (config.customAdapters) {
|
|
23
|
+
for (const [providerId, adapter] of Object.entries(config.customAdapters)) {
|
|
24
|
+
this.registerAdapter(providerId, adapter);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
// Initialize adapters from constructors
|
|
28
|
+
if (config.adapterConstructors) {
|
|
29
|
+
this.initializeAdapters(config.adapterConstructors, config.adapterConfigs || {});
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Initializes adapters for all supported providers using constructors
|
|
34
|
+
*/
|
|
35
|
+
initializeAdapters(adapterConstructors, adapterConfigs) {
|
|
36
|
+
let registeredCount = 0;
|
|
37
|
+
const successfullyRegisteredProviders = [];
|
|
38
|
+
for (const provider of this.supportedProviders) {
|
|
39
|
+
const providerId = provider.id;
|
|
40
|
+
// Skip if adapter is already registered (from custom adapters)
|
|
41
|
+
if (this.adapters.has(providerId)) {
|
|
42
|
+
console.log(`AdapterRegistry: Skipping constructor initialization for '${provider.id}' ` +
|
|
43
|
+
`(custom adapter already registered)`);
|
|
44
|
+
continue;
|
|
45
|
+
}
|
|
46
|
+
const AdapterClass = adapterConstructors[provider.id];
|
|
47
|
+
if (AdapterClass) {
|
|
48
|
+
try {
|
|
49
|
+
const adapterConfig = adapterConfigs[provider.id];
|
|
50
|
+
const adapterInstance = new AdapterClass(adapterConfig);
|
|
51
|
+
this.registerAdapter(providerId, adapterInstance);
|
|
52
|
+
registeredCount++;
|
|
53
|
+
successfullyRegisteredProviders.push(provider.id);
|
|
54
|
+
}
|
|
55
|
+
catch (error) {
|
|
56
|
+
console.error(`AdapterRegistry: Failed to instantiate adapter for provider '${provider.id}'. ` +
|
|
57
|
+
`This provider will use the fallback adapter. Error:`, error);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
console.warn(`AdapterRegistry: No adapter constructor found for supported provider '${provider.id}'. ` +
|
|
62
|
+
`This provider will use the fallback adapter.`);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
if (registeredCount > 0) {
|
|
66
|
+
console.log(`AdapterRegistry: Initialized with ${registeredCount} dynamically registered adapter(s) ` +
|
|
67
|
+
`for: ${successfullyRegisteredProviders.join(', ')}.`);
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
console.log(`AdapterRegistry: No real adapters were dynamically registered. ` +
|
|
71
|
+
`All providers will use the fallback adapter.`);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Registers an adapter for a specific provider
|
|
76
|
+
*
|
|
77
|
+
* @param providerId - The provider ID
|
|
78
|
+
* @param adapter - The adapter implementation
|
|
79
|
+
*/
|
|
80
|
+
registerAdapter(providerId, adapter) {
|
|
81
|
+
this.adapters.set(providerId, adapter);
|
|
82
|
+
console.log(`AdapterRegistry: Registered adapter for provider: ${providerId}`);
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Gets the appropriate adapter for a provider
|
|
86
|
+
*
|
|
87
|
+
* @param providerId - The provider ID
|
|
88
|
+
* @returns The adapter to use
|
|
89
|
+
*/
|
|
90
|
+
getAdapter(providerId) {
|
|
91
|
+
// Check for registered real adapters first
|
|
92
|
+
const registeredAdapter = this.adapters.get(providerId);
|
|
93
|
+
if (registeredAdapter) {
|
|
94
|
+
console.log(`AdapterRegistry: Using registered adapter for provider: ${providerId}`);
|
|
95
|
+
return registeredAdapter;
|
|
96
|
+
}
|
|
97
|
+
// Fall back to fallback adapter for unsupported providers
|
|
98
|
+
console.log(`AdapterRegistry: No real adapter found for ${providerId}, using fallback adapter`);
|
|
99
|
+
return this.fallbackAdapter;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Gets information about registered adapters
|
|
103
|
+
*
|
|
104
|
+
* @returns Map of provider IDs to adapter info
|
|
105
|
+
*/
|
|
106
|
+
getRegisteredAdapters() {
|
|
107
|
+
const adapterInfo = new Map();
|
|
108
|
+
for (const [providerId, adapter] of this.adapters.entries()) {
|
|
109
|
+
// Try to get adapter info if the adapter has a getAdapterInfo method
|
|
110
|
+
const adapterInfoData = adapter.getAdapterInfo?.() ||
|
|
111
|
+
{ name: adapter.id || 'Unknown Adapter' };
|
|
112
|
+
adapterInfo.set(providerId, {
|
|
113
|
+
providerId,
|
|
114
|
+
hasAdapter: true,
|
|
115
|
+
adapterInfo: adapterInfoData,
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
return adapterInfo;
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Gets a summary of available providers and their adapter status
|
|
122
|
+
*
|
|
123
|
+
* @returns Summary of provider availability
|
|
124
|
+
*/
|
|
125
|
+
getProviderSummary() {
|
|
126
|
+
const availableProviders = [];
|
|
127
|
+
const unavailableProviders = [];
|
|
128
|
+
for (const provider of this.supportedProviders) {
|
|
129
|
+
if (this.adapters.has(provider.id)) {
|
|
130
|
+
availableProviders.push(provider.id);
|
|
131
|
+
}
|
|
132
|
+
else {
|
|
133
|
+
unavailableProviders.push(provider.id);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
return {
|
|
137
|
+
totalProviders: this.supportedProviders.length,
|
|
138
|
+
providersWithAdapters: availableProviders.length,
|
|
139
|
+
availableProviders,
|
|
140
|
+
unavailableProviders,
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
exports.AdapterRegistry = AdapterRegistry;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { PresetMode } from "../../types";
|
|
2
|
+
/**
|
|
3
|
+
* Generic preset manager for managing presets across different services.
|
|
4
|
+
* Handles loading, merging, and resolution of presets.
|
|
5
|
+
*
|
|
6
|
+
* @template TPreset - The preset type, must have an 'id' property
|
|
7
|
+
*/
|
|
8
|
+
export declare class PresetManager<TPreset extends {
|
|
9
|
+
id: string;
|
|
10
|
+
}> {
|
|
11
|
+
private presets;
|
|
12
|
+
/**
|
|
13
|
+
* Creates a new PresetManager
|
|
14
|
+
*
|
|
15
|
+
* @param defaultPresets - The default presets to load
|
|
16
|
+
* @param customPresets - Optional custom presets to add or override
|
|
17
|
+
* @param mode - How to handle custom presets ('extend' or 'replace')
|
|
18
|
+
*/
|
|
19
|
+
constructor(defaultPresets: TPreset[], customPresets?: TPreset[], mode?: PresetMode);
|
|
20
|
+
/**
|
|
21
|
+
* Gets all configured presets
|
|
22
|
+
*
|
|
23
|
+
* @returns Array of presets
|
|
24
|
+
*/
|
|
25
|
+
getPresets(): TPreset[];
|
|
26
|
+
/**
|
|
27
|
+
* Resolves a preset by ID
|
|
28
|
+
*
|
|
29
|
+
* @param presetId - The preset ID to resolve
|
|
30
|
+
* @returns The preset if found, null otherwise
|
|
31
|
+
*/
|
|
32
|
+
resolvePreset(presetId: string): TPreset | null;
|
|
33
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PresetManager = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Generic preset manager for managing presets across different services.
|
|
6
|
+
* Handles loading, merging, and resolution of presets.
|
|
7
|
+
*
|
|
8
|
+
* @template TPreset - The preset type, must have an 'id' property
|
|
9
|
+
*/
|
|
10
|
+
class PresetManager {
|
|
11
|
+
/**
|
|
12
|
+
* Creates a new PresetManager
|
|
13
|
+
*
|
|
14
|
+
* @param defaultPresets - The default presets to load
|
|
15
|
+
* @param customPresets - Optional custom presets to add or override
|
|
16
|
+
* @param mode - How to handle custom presets ('extend' or 'replace')
|
|
17
|
+
*/
|
|
18
|
+
constructor(defaultPresets, customPresets = [], mode = 'extend') {
|
|
19
|
+
// Initialize presets based on mode
|
|
20
|
+
const finalPresets = new Map();
|
|
21
|
+
if (mode === 'replace') {
|
|
22
|
+
// Replace Mode: Only use custom presets.
|
|
23
|
+
for (const preset of customPresets) {
|
|
24
|
+
finalPresets.set(preset.id, preset);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
// Extend Mode: Load defaults first, then add/override.
|
|
29
|
+
for (const preset of defaultPresets) {
|
|
30
|
+
finalPresets.set(preset.id, preset);
|
|
31
|
+
}
|
|
32
|
+
for (const preset of customPresets) {
|
|
33
|
+
finalPresets.set(preset.id, preset);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
this.presets = Array.from(finalPresets.values());
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Gets all configured presets
|
|
40
|
+
*
|
|
41
|
+
* @returns Array of presets
|
|
42
|
+
*/
|
|
43
|
+
getPresets() {
|
|
44
|
+
return [...this.presets]; // Return a copy to prevent external modification
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Resolves a preset by ID
|
|
48
|
+
*
|
|
49
|
+
* @param presetId - The preset ID to resolve
|
|
50
|
+
* @returns The preset if found, null otherwise
|
|
51
|
+
*/
|
|
52
|
+
resolvePreset(presetId) {
|
|
53
|
+
return this.presets.find(p => p.id === presetId) || null;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
exports.PresetManager = PresetManager;
|