@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.
Files changed (41) hide show
  1. package/CHANGELOG.md +272 -0
  2. package/README.md +196 -2
  3. package/config/pricing.json +32 -4
  4. package/dist/providers/base-provider.d.ts +10 -2
  5. package/dist/providers/base-provider.d.ts.map +1 -1
  6. package/dist/providers/base-provider.js +53 -3
  7. package/dist/providers/base-provider.js.map +1 -1
  8. package/dist/providers/index.d.ts +2 -0
  9. package/dist/providers/index.d.ts.map +1 -1
  10. package/dist/providers/index.js +40 -2
  11. package/dist/providers/index.js.map +1 -1
  12. package/dist/providers/zai/zai-provider.d.ts +22 -0
  13. package/dist/providers/zai/zai-provider.d.ts.map +1 -0
  14. package/dist/providers/zai/zai-provider.js +154 -0
  15. package/dist/providers/zai/zai-provider.js.map +1 -0
  16. package/dist/quality/index.d.ts +1 -0
  17. package/dist/quality/index.d.ts.map +1 -1
  18. package/dist/quality/index.js +1 -0
  19. package/dist/quality/index.js.map +1 -1
  20. package/dist/quality/model-tester.d.ts +87 -0
  21. package/dist/quality/model-tester.d.ts.map +1 -0
  22. package/dist/quality/model-tester.js +357 -0
  23. package/dist/quality/model-tester.js.map +1 -0
  24. package/dist/server/mcp-server.d.ts +5 -0
  25. package/dist/server/mcp-server.d.ts.map +1 -1
  26. package/dist/server/mcp-server.js +371 -5
  27. package/dist/server/mcp-server.js.map +1 -1
  28. package/dist/types/generation.d.ts +1 -1
  29. package/dist/types/generation.d.ts.map +1 -1
  30. package/dist/types/provider.d.ts +28 -1
  31. package/dist/types/provider.d.ts.map +1 -1
  32. package/dist/utils/index.d.ts +1 -0
  33. package/dist/utils/index.d.ts.map +1 -1
  34. package/dist/utils/index.js +1 -0
  35. package/dist/utils/index.js.map +1 -1
  36. package/dist/utils/user-config-manager.d.ts +68 -0
  37. package/dist/utils/user-config-manager.d.ts.map +1 -0
  38. package/dist/utils/user-config-manager.js +131 -0
  39. package/dist/utils/user-config-manager.js.map +1 -0
  40. package/docs/guides/comprehensive-guide.md +1552 -0
  41. package/package.json +2 -2
@@ -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;;OAEG;IACH,YAAY,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,CAAC;IAEtC;;OAEG;IACH,YAAY,IAAI,OAAO,CAAC;IAExB;;OAEG;IACH,eAAe,IAAI,oBAAoB,CAAC;IAExC;;;OAGG;IACH,cAAc,IAAI,OAAO,CAAC;QACxB,OAAO,EAAE,OAAO,CAAC;QACjB,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC,CAAC;CACJ;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,CAAC,EAAE,UAAU,GAAG,IAAI,GAAG,MAAM,GAAG,MAAM,CAAC;IAC9C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,qBAAqB;IACpC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED,MAAM,WAAW,oBAAoB;IACnC,aAAa,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IACjD,qBAAqB,EAAE,MAAM,EAAE,CAAC;IAChC,gBAAgB,EAAE,KAAK,CAAC,KAAK,GAAG,KAAK,GAAG,MAAM,CAAC,CAAC;IAChD,UAAU,EAAE,OAAO,CAAC;IACpB,oBAAoB,EAAE,OAAO,CAAC;IAC9B,oBAAoB,EAAE,OAAO,CAAC;IAC9B,qBAAqB,EAAE,OAAO,CAAC;IAC/B,qBAAqB,EAAE,MAAM,CAAC;CAC/B;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,YAAY,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,IAAI,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,YAAY,CAAC;IACvB,SAAS,EAAE,OAAO,CAAC;IACnB,WAAW,EAAE,IAAI,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB"}
1
+ {"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../src/types/provider.ts"],"names":[],"mappings":"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"}
@@ -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"}
@@ -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.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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"}