@michelabboud/visual-forge-mcp 0.7.0 → 0.9.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.
- package/CHANGELOG.md +272 -0
- package/README.md +196 -2
- package/config/pricing.json +32 -4
- package/dist/providers/base-provider.d.ts +10 -2
- package/dist/providers/base-provider.d.ts.map +1 -1
- package/dist/providers/base-provider.js +53 -3
- package/dist/providers/base-provider.js.map +1 -1
- package/dist/providers/index.d.ts +2 -0
- package/dist/providers/index.d.ts.map +1 -1
- package/dist/providers/index.js +40 -2
- package/dist/providers/index.js.map +1 -1
- package/dist/providers/zai/zai-provider.d.ts +22 -0
- package/dist/providers/zai/zai-provider.d.ts.map +1 -0
- package/dist/providers/zai/zai-provider.js +154 -0
- package/dist/providers/zai/zai-provider.js.map +1 -0
- package/dist/quality/index.d.ts +1 -0
- package/dist/quality/index.d.ts.map +1 -1
- package/dist/quality/index.js +1 -0
- package/dist/quality/index.js.map +1 -1
- package/dist/quality/model-tester.d.ts +87 -0
- package/dist/quality/model-tester.d.ts.map +1 -0
- package/dist/quality/model-tester.js +357 -0
- package/dist/quality/model-tester.js.map +1 -0
- package/dist/server/mcp-server.d.ts +5 -0
- package/dist/server/mcp-server.d.ts.map +1 -1
- package/dist/server/mcp-server.js +371 -5
- package/dist/server/mcp-server.js.map +1 -1
- package/dist/types/generation.d.ts +1 -1
- package/dist/types/generation.d.ts.map +1 -1
- package/dist/types/provider.d.ts +28 -1
- package/dist/types/provider.d.ts.map +1 -1
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +1 -0
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/user-config-manager.d.ts +68 -0
- package/dist/utils/user-config-manager.d.ts.map +1 -0
- package/dist/utils/user-config-manager.js +131 -0
- package/dist/utils/user-config-manager.js.map +1 -0
- package/docs/guides/comprehensive-guide.md +1552 -0
- package/package.json +2 -2
package/dist/types/provider.d.ts
CHANGED
|
@@ -1,5 +1,20 @@
|
|
|
1
1
|
import { ImageSpec, GlobalContext } from './image-spec.js';
|
|
2
2
|
import { GeneratedImage, ProviderType } from './generation.js';
|
|
3
|
+
/**
|
|
4
|
+
* Provider Model - represents a specific model offered by a provider
|
|
5
|
+
*/
|
|
6
|
+
export interface ProviderModel {
|
|
7
|
+
id: string;
|
|
8
|
+
name: string;
|
|
9
|
+
costPerImage: number;
|
|
10
|
+
costPerImageHD?: number;
|
|
11
|
+
description?: string;
|
|
12
|
+
capabilities?: {
|
|
13
|
+
maxResolution?: string;
|
|
14
|
+
supportedStyles?: string[];
|
|
15
|
+
specialFeatures?: string[];
|
|
16
|
+
};
|
|
17
|
+
}
|
|
3
18
|
/**
|
|
4
19
|
* Base interface that all image providers must implement
|
|
5
20
|
*/
|
|
@@ -7,6 +22,14 @@ export interface IImageProvider {
|
|
|
7
22
|
readonly name: ProviderType;
|
|
8
23
|
readonly displayName: string;
|
|
9
24
|
readonly isAvailable: boolean;
|
|
25
|
+
/**
|
|
26
|
+
* Get available models for this provider
|
|
27
|
+
*/
|
|
28
|
+
getModels(): ProviderModel[];
|
|
29
|
+
/**
|
|
30
|
+
* Get default model for this provider
|
|
31
|
+
*/
|
|
32
|
+
getDefaultModel(): ProviderModel;
|
|
10
33
|
/**
|
|
11
34
|
* Generate an image from specification
|
|
12
35
|
*/
|
|
@@ -17,8 +40,10 @@ export interface IImageProvider {
|
|
|
17
40
|
adaptPrompt(prompt: string, context: GlobalContext): string | ProviderPromptPayload;
|
|
18
41
|
/**
|
|
19
42
|
* Estimate cost for generating an image
|
|
43
|
+
* @param spec Image specification
|
|
44
|
+
* @param modelId Optional model ID (uses default if not specified)
|
|
20
45
|
*/
|
|
21
|
-
estimateCost(spec: ImageSpec): number;
|
|
46
|
+
estimateCost(spec: ImageSpec, modelId?: string): number;
|
|
22
47
|
/**
|
|
23
48
|
* Check if provider is properly configured
|
|
24
49
|
*/
|
|
@@ -68,6 +93,8 @@ export interface ProviderConfig {
|
|
|
68
93
|
type: ProviderType;
|
|
69
94
|
apiKey: string;
|
|
70
95
|
endpoint: string;
|
|
96
|
+
models?: ProviderModel[];
|
|
97
|
+
defaultModel?: string;
|
|
71
98
|
model?: string;
|
|
72
99
|
costPerImage: number;
|
|
73
100
|
rateLimit: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../src/types/provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAE/D;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAC5B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;IAE9B;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;IAEhF;;OAEG;IACH,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,MAAM,GAAG,qBAAqB,CAAC;IAEpF
|
|
1
|
+
{"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../src/types/provider.ts"],"names":[],"mappings":"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"}
|
package/dist/utils/index.d.ts
CHANGED
|
@@ -6,6 +6,7 @@ export * from './logger.js';
|
|
|
6
6
|
export * from './rate-limiter.js';
|
|
7
7
|
export * from './http-client.js';
|
|
8
8
|
export * from './config-manager.js';
|
|
9
|
+
export * from './user-config-manager.js';
|
|
9
10
|
export * from './validation.js';
|
|
10
11
|
export * from './pricing-checker.js';
|
|
11
12
|
export * from './image-optimizer.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,iBAAiB,CAAC;AAChC,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,wBAAwB,CAAC;AACvC,cAAc,sBAAsB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,0BAA0B,CAAC;AACzC,cAAc,iBAAiB,CAAC;AAChC,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,wBAAwB,CAAC;AACvC,cAAc,sBAAsB,CAAC"}
|
package/dist/utils/index.js
CHANGED
|
@@ -6,6 +6,7 @@ export * from './logger.js';
|
|
|
6
6
|
export * from './rate-limiter.js';
|
|
7
7
|
export * from './http-client.js';
|
|
8
8
|
export * from './config-manager.js';
|
|
9
|
+
export * from './user-config-manager.js';
|
|
9
10
|
export * from './validation.js';
|
|
10
11
|
export * from './pricing-checker.js';
|
|
11
12
|
export * from './image-optimizer.js';
|
package/dist/utils/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,iBAAiB,CAAC;AAChC,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,wBAAwB,CAAC;AACvC,cAAc,sBAAsB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,0BAA0B,CAAC;AACzC,cAAc,iBAAiB,CAAC;AAChC,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,wBAAwB,CAAC;AACvC,cAAc,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* User Configuration Manager
|
|
3
|
+
* Manages user preferences and model selections
|
|
4
|
+
* Stored in ~/.visual-forge-mcp/user-config.json
|
|
5
|
+
*/
|
|
6
|
+
import { ProviderType } from '../types/index.js';
|
|
7
|
+
interface UserConfig {
|
|
8
|
+
version: string;
|
|
9
|
+
defaultModels: Partial<Record<ProviderType, string>>;
|
|
10
|
+
preferences: {
|
|
11
|
+
autoTestOnConfigure: boolean;
|
|
12
|
+
testQualityThreshold: number;
|
|
13
|
+
defaultProvider?: ProviderType;
|
|
14
|
+
};
|
|
15
|
+
testedModels: Record<string, {
|
|
16
|
+
testedAt: string;
|
|
17
|
+
qualityScore: number;
|
|
18
|
+
passed: boolean;
|
|
19
|
+
}>;
|
|
20
|
+
}
|
|
21
|
+
export declare class UserConfigManager {
|
|
22
|
+
private configPath;
|
|
23
|
+
private config;
|
|
24
|
+
constructor(configDir?: string);
|
|
25
|
+
/**
|
|
26
|
+
* Load user configuration from file
|
|
27
|
+
*/
|
|
28
|
+
load(): Promise<UserConfig>;
|
|
29
|
+
/**
|
|
30
|
+
* Save user configuration to file
|
|
31
|
+
*/
|
|
32
|
+
save(): Promise<void>;
|
|
33
|
+
/**
|
|
34
|
+
* Get default model for a provider
|
|
35
|
+
*/
|
|
36
|
+
getDefaultModel(provider: ProviderType): Promise<string | null>;
|
|
37
|
+
/**
|
|
38
|
+
* Set default model for a provider
|
|
39
|
+
*/
|
|
40
|
+
setDefaultModel(provider: ProviderType, modelId: string): Promise<void>;
|
|
41
|
+
/**
|
|
42
|
+
* Get preference value
|
|
43
|
+
*/
|
|
44
|
+
getPreference<K extends keyof UserConfig['preferences']>(key: K): Promise<UserConfig['preferences'][K]>;
|
|
45
|
+
/**
|
|
46
|
+
* Set preference value
|
|
47
|
+
*/
|
|
48
|
+
setPreference<K extends keyof UserConfig['preferences']>(key: K, value: UserConfig['preferences'][K]): Promise<void>;
|
|
49
|
+
/**
|
|
50
|
+
* Record model test result
|
|
51
|
+
*/
|
|
52
|
+
recordModelTest(provider: ProviderType, modelId: string, qualityScore: number, passed: boolean): Promise<void>;
|
|
53
|
+
/**
|
|
54
|
+
* Get model test result
|
|
55
|
+
*/
|
|
56
|
+
getModelTest(provider: ProviderType, modelId: string): Promise<{
|
|
57
|
+
testedAt: string;
|
|
58
|
+
qualityScore: number;
|
|
59
|
+
passed: boolean;
|
|
60
|
+
} | null>;
|
|
61
|
+
/**
|
|
62
|
+
* Get all default models
|
|
63
|
+
*/
|
|
64
|
+
getAllDefaultModels(): Promise<Partial<Record<ProviderType, string>>>;
|
|
65
|
+
}
|
|
66
|
+
export declare const userConfigManager: UserConfigManager;
|
|
67
|
+
export {};
|
|
68
|
+
//# sourceMappingURL=user-config-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user-config-manager.d.ts","sourceRoot":"","sources":["../../src/utils/user-config-manager.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,UAAU,UAAU;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,OAAO,CAAC,MAAM,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC,CAAC;IACrD,WAAW,EAAE;QACX,mBAAmB,EAAE,OAAO,CAAC;QAC7B,oBAAoB,EAAE,MAAM,CAAC;QAC7B,eAAe,CAAC,EAAE,YAAY,CAAC;KAChC,CAAC;IACF,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE;QAC3B,QAAQ,EAAE,MAAM,CAAC;QACjB,YAAY,EAAE,MAAM,CAAC;QACrB,MAAM,EAAE,OAAO,CAAC;KACjB,CAAC,CAAC;CACJ;AAYD,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,MAAM,CAA2B;gBAE7B,SAAS,CAAC,EAAE,MAAM;IAK9B;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,UAAU,CAAC;IAwBjC;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAiB3B;;OAEG;IACG,eAAe,CAAC,QAAQ,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAKrE;;OAEG;IACG,eAAe,CAAC,QAAQ,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAO7E;;OAEG;IACG,aAAa,CAAC,CAAC,SAAS,MAAM,UAAU,CAAC,aAAa,CAAC,EAC3D,GAAG,EAAE,CAAC,GACL,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;IAKxC;;OAEG;IACG,aAAa,CAAC,CAAC,SAAS,MAAM,UAAU,CAAC,aAAa,CAAC,EAC3D,GAAG,EAAE,CAAC,EACN,KAAK,EAAE,UAAU,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,GAClC,OAAO,CAAC,IAAI,CAAC;IAOhB;;OAEG;IACG,eAAe,CACnB,QAAQ,EAAE,YAAY,EACtB,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,MAAM,EACpB,MAAM,EAAE,OAAO,GACd,OAAO,CAAC,IAAI,CAAC;IAYhB;;OAEG;IACG,YAAY,CAAC,QAAQ,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC;QACnE,QAAQ,EAAE,MAAM,CAAC;QACjB,YAAY,EAAE,MAAM,CAAC;QACrB,MAAM,EAAE,OAAO,CAAC;KACjB,GAAG,IAAI,CAAC;IAMT;;OAEG;IACG,mBAAmB,IAAI,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC,CAAC;CAI5E;AAGD,eAAO,MAAM,iBAAiB,mBAA0B,CAAC"}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* User Configuration Manager
|
|
3
|
+
* Manages user preferences and model selections
|
|
4
|
+
* Stored in ~/.visual-forge-mcp/user-config.json
|
|
5
|
+
*/
|
|
6
|
+
import * as fs from 'fs/promises';
|
|
7
|
+
import * as path from 'path';
|
|
8
|
+
import { logger } from './logger.js';
|
|
9
|
+
const DEFAULT_CONFIG = {
|
|
10
|
+
version: '1.0.0',
|
|
11
|
+
defaultModels: {},
|
|
12
|
+
preferences: {
|
|
13
|
+
autoTestOnConfigure: false,
|
|
14
|
+
testQualityThreshold: 60,
|
|
15
|
+
},
|
|
16
|
+
testedModels: {},
|
|
17
|
+
};
|
|
18
|
+
export class UserConfigManager {
|
|
19
|
+
configPath;
|
|
20
|
+
config = null;
|
|
21
|
+
constructor(configDir) {
|
|
22
|
+
const baseDir = configDir || process.env.IMAGE_GEN_STATE_DIR || path.join(process.env.HOME || '~', '.visual-forge-mcp');
|
|
23
|
+
this.configPath = path.join(baseDir, 'user-config.json');
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Load user configuration from file
|
|
27
|
+
*/
|
|
28
|
+
async load() {
|
|
29
|
+
if (this.config) {
|
|
30
|
+
return this.config;
|
|
31
|
+
}
|
|
32
|
+
try {
|
|
33
|
+
const content = await fs.readFile(this.configPath, 'utf-8');
|
|
34
|
+
this.config = JSON.parse(content);
|
|
35
|
+
logger.debug('User config loaded', { configPath: this.configPath });
|
|
36
|
+
return this.config;
|
|
37
|
+
}
|
|
38
|
+
catch (error) {
|
|
39
|
+
if (error.code === 'ENOENT') {
|
|
40
|
+
// File doesn't exist, use defaults
|
|
41
|
+
logger.info('No user config found, creating with defaults', {
|
|
42
|
+
configPath: this.configPath,
|
|
43
|
+
});
|
|
44
|
+
this.config = { ...DEFAULT_CONFIG };
|
|
45
|
+
await this.save();
|
|
46
|
+
return this.config;
|
|
47
|
+
}
|
|
48
|
+
throw error;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Save user configuration to file
|
|
53
|
+
*/
|
|
54
|
+
async save() {
|
|
55
|
+
if (!this.config) {
|
|
56
|
+
throw new Error('Config not loaded');
|
|
57
|
+
}
|
|
58
|
+
// Ensure directory exists
|
|
59
|
+
const configDir = path.dirname(this.configPath);
|
|
60
|
+
await fs.mkdir(configDir, { recursive: true });
|
|
61
|
+
// Atomic write
|
|
62
|
+
const tempPath = `${this.configPath}.tmp`;
|
|
63
|
+
await fs.writeFile(tempPath, JSON.stringify(this.config, null, 2), 'utf-8');
|
|
64
|
+
await fs.rename(tempPath, this.configPath);
|
|
65
|
+
logger.debug('User config saved', { configPath: this.configPath });
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Get default model for a provider
|
|
69
|
+
*/
|
|
70
|
+
async getDefaultModel(provider) {
|
|
71
|
+
const config = await this.load();
|
|
72
|
+
return config.defaultModels[provider] || null;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Set default model for a provider
|
|
76
|
+
*/
|
|
77
|
+
async setDefaultModel(provider, modelId) {
|
|
78
|
+
const config = await this.load();
|
|
79
|
+
config.defaultModels[provider] = modelId;
|
|
80
|
+
await this.save();
|
|
81
|
+
logger.info(`Default model set for ${provider}`, { modelId });
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Get preference value
|
|
85
|
+
*/
|
|
86
|
+
async getPreference(key) {
|
|
87
|
+
const config = await this.load();
|
|
88
|
+
return config.preferences[key];
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Set preference value
|
|
92
|
+
*/
|
|
93
|
+
async setPreference(key, value) {
|
|
94
|
+
const config = await this.load();
|
|
95
|
+
config.preferences[key] = value;
|
|
96
|
+
await this.save();
|
|
97
|
+
logger.info(`Preference updated`, { key, value });
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Record model test result
|
|
101
|
+
*/
|
|
102
|
+
async recordModelTest(provider, modelId, qualityScore, passed) {
|
|
103
|
+
const config = await this.load();
|
|
104
|
+
const testKey = `${provider}-${modelId.replace(/[^a-z0-9]/gi, '-')}`;
|
|
105
|
+
config.testedModels[testKey] = {
|
|
106
|
+
testedAt: new Date().toISOString(),
|
|
107
|
+
qualityScore,
|
|
108
|
+
passed,
|
|
109
|
+
};
|
|
110
|
+
await this.save();
|
|
111
|
+
logger.info(`Model test recorded`, { provider, modelId, qualityScore, passed });
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Get model test result
|
|
115
|
+
*/
|
|
116
|
+
async getModelTest(provider, modelId) {
|
|
117
|
+
const config = await this.load();
|
|
118
|
+
const testKey = `${provider}-${modelId.replace(/[^a-z0-9]/gi, '-')}`;
|
|
119
|
+
return config.testedModels[testKey] || null;
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Get all default models
|
|
123
|
+
*/
|
|
124
|
+
async getAllDefaultModels() {
|
|
125
|
+
const config = await this.load();
|
|
126
|
+
return config.defaultModels;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
// Singleton instance
|
|
130
|
+
export const userConfigManager = new UserConfigManager();
|
|
131
|
+
//# sourceMappingURL=user-config-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user-config-manager.js","sourceRoot":"","sources":["../../src/utils/user-config-manager.ts"],"names":[],"mappings":"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"}
|