family-ai-agent 1.0.2 → 1.0.3
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/dist/cli/commands/config.d.ts +7 -0
- package/dist/cli/commands/config.d.ts.map +1 -0
- package/dist/cli/commands/config.js +300 -0
- package/dist/cli/commands/config.js.map +1 -0
- package/dist/cli/index.js +113 -15
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/setup-wizard.d.ts +19 -0
- package/dist/cli/setup-wizard.d.ts.map +1 -0
- package/dist/cli/setup-wizard.js +294 -0
- package/dist/cli/setup-wizard.js.map +1 -0
- package/dist/config/index.d.ts +6 -3
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +114 -5
- package/dist/config/index.js.map +1 -1
- package/dist/config/user-config.d.ts +203 -0
- package/dist/config/user-config.d.ts.map +1 -0
- package/dist/config/user-config.js +267 -0
- package/dist/config/user-config.js.map +1 -0
- package/package.json +1 -1
- package/src/cli/commands/config.ts +358 -0
- package/src/cli/index.ts +127 -17
- package/src/cli/setup-wizard.ts +343 -0
- package/src/config/index.ts +164 -5
- package/src/config/user-config.ts +323 -0
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
declare const CustomModelSchema: z.ZodObject<{
|
|
3
|
+
id: z.ZodString;
|
|
4
|
+
name: z.ZodString;
|
|
5
|
+
contextWindow: z.ZodDefault<z.ZodNumber>;
|
|
6
|
+
maxOutput: z.ZodDefault<z.ZodNumber>;
|
|
7
|
+
description: z.ZodOptional<z.ZodString>;
|
|
8
|
+
}, "strip", z.ZodTypeAny, {
|
|
9
|
+
name: string;
|
|
10
|
+
id: string;
|
|
11
|
+
contextWindow: number;
|
|
12
|
+
maxOutput: number;
|
|
13
|
+
description?: string | undefined;
|
|
14
|
+
}, {
|
|
15
|
+
name: string;
|
|
16
|
+
id: string;
|
|
17
|
+
description?: string | undefined;
|
|
18
|
+
contextWindow?: number | undefined;
|
|
19
|
+
maxOutput?: number | undefined;
|
|
20
|
+
}>;
|
|
21
|
+
export type CustomModel = z.infer<typeof CustomModelSchema>;
|
|
22
|
+
declare const UserConfigSchema: z.ZodObject<{
|
|
23
|
+
apiKey: z.ZodString;
|
|
24
|
+
baseUrl: z.ZodDefault<z.ZodString>;
|
|
25
|
+
defaultModel: z.ZodDefault<z.ZodString>;
|
|
26
|
+
fastModel: z.ZodDefault<z.ZodString>;
|
|
27
|
+
embeddingModel: z.ZodDefault<z.ZodString>;
|
|
28
|
+
customModels: z.ZodDefault<z.ZodArray<z.ZodObject<{
|
|
29
|
+
id: z.ZodString;
|
|
30
|
+
name: z.ZodString;
|
|
31
|
+
contextWindow: z.ZodDefault<z.ZodNumber>;
|
|
32
|
+
maxOutput: z.ZodDefault<z.ZodNumber>;
|
|
33
|
+
description: z.ZodOptional<z.ZodString>;
|
|
34
|
+
}, "strip", z.ZodTypeAny, {
|
|
35
|
+
name: string;
|
|
36
|
+
id: string;
|
|
37
|
+
contextWindow: number;
|
|
38
|
+
maxOutput: number;
|
|
39
|
+
description?: string | undefined;
|
|
40
|
+
}, {
|
|
41
|
+
name: string;
|
|
42
|
+
id: string;
|
|
43
|
+
description?: string | undefined;
|
|
44
|
+
contextWindow?: number | undefined;
|
|
45
|
+
maxOutput?: number | undefined;
|
|
46
|
+
}>, "many">>;
|
|
47
|
+
temperature: z.ZodOptional<z.ZodNumber>;
|
|
48
|
+
maxTokens: z.ZodOptional<z.ZodNumber>;
|
|
49
|
+
enableSafetyFilters: z.ZodDefault<z.ZodBoolean>;
|
|
50
|
+
enableAuditLogging: z.ZodDefault<z.ZodBoolean>;
|
|
51
|
+
database: z.ZodOptional<z.ZodObject<{
|
|
52
|
+
host: z.ZodDefault<z.ZodString>;
|
|
53
|
+
port: z.ZodDefault<z.ZodNumber>;
|
|
54
|
+
user: z.ZodDefault<z.ZodString>;
|
|
55
|
+
password: z.ZodDefault<z.ZodString>;
|
|
56
|
+
name: z.ZodDefault<z.ZodString>;
|
|
57
|
+
}, "strip", z.ZodTypeAny, {
|
|
58
|
+
host: string;
|
|
59
|
+
port: number;
|
|
60
|
+
user: string;
|
|
61
|
+
password: string;
|
|
62
|
+
name: string;
|
|
63
|
+
}, {
|
|
64
|
+
host?: string | undefined;
|
|
65
|
+
port?: number | undefined;
|
|
66
|
+
user?: string | undefined;
|
|
67
|
+
password?: string | undefined;
|
|
68
|
+
name?: string | undefined;
|
|
69
|
+
}>>;
|
|
70
|
+
createdAt: z.ZodOptional<z.ZodString>;
|
|
71
|
+
updatedAt: z.ZodOptional<z.ZodString>;
|
|
72
|
+
}, "strip", z.ZodTypeAny, {
|
|
73
|
+
apiKey: string;
|
|
74
|
+
baseUrl: string;
|
|
75
|
+
defaultModel: string;
|
|
76
|
+
fastModel: string;
|
|
77
|
+
embeddingModel: string;
|
|
78
|
+
enableSafetyFilters: boolean;
|
|
79
|
+
enableAuditLogging: boolean;
|
|
80
|
+
customModels: {
|
|
81
|
+
name: string;
|
|
82
|
+
id: string;
|
|
83
|
+
contextWindow: number;
|
|
84
|
+
maxOutput: number;
|
|
85
|
+
description?: string | undefined;
|
|
86
|
+
}[];
|
|
87
|
+
database?: {
|
|
88
|
+
host: string;
|
|
89
|
+
port: number;
|
|
90
|
+
user: string;
|
|
91
|
+
password: string;
|
|
92
|
+
name: string;
|
|
93
|
+
} | undefined;
|
|
94
|
+
temperature?: number | undefined;
|
|
95
|
+
maxTokens?: number | undefined;
|
|
96
|
+
createdAt?: string | undefined;
|
|
97
|
+
updatedAt?: string | undefined;
|
|
98
|
+
}, {
|
|
99
|
+
apiKey: string;
|
|
100
|
+
baseUrl?: string | undefined;
|
|
101
|
+
defaultModel?: string | undefined;
|
|
102
|
+
fastModel?: string | undefined;
|
|
103
|
+
embeddingModel?: string | undefined;
|
|
104
|
+
enableSafetyFilters?: boolean | undefined;
|
|
105
|
+
enableAuditLogging?: boolean | undefined;
|
|
106
|
+
database?: {
|
|
107
|
+
host?: string | undefined;
|
|
108
|
+
port?: number | undefined;
|
|
109
|
+
user?: string | undefined;
|
|
110
|
+
password?: string | undefined;
|
|
111
|
+
name?: string | undefined;
|
|
112
|
+
} | undefined;
|
|
113
|
+
temperature?: number | undefined;
|
|
114
|
+
maxTokens?: number | undefined;
|
|
115
|
+
createdAt?: string | undefined;
|
|
116
|
+
updatedAt?: string | undefined;
|
|
117
|
+
customModels?: {
|
|
118
|
+
name: string;
|
|
119
|
+
id: string;
|
|
120
|
+
description?: string | undefined;
|
|
121
|
+
contextWindow?: number | undefined;
|
|
122
|
+
maxOutput?: number | undefined;
|
|
123
|
+
}[] | undefined;
|
|
124
|
+
}>;
|
|
125
|
+
export type UserConfig = z.infer<typeof UserConfigSchema>;
|
|
126
|
+
export type PartialUserConfig = Partial<Omit<UserConfig, 'createdAt' | 'updatedAt'>>;
|
|
127
|
+
/**
|
|
128
|
+
* Get the config directory path
|
|
129
|
+
*/
|
|
130
|
+
export declare function getConfigDir(): string;
|
|
131
|
+
/**
|
|
132
|
+
* Get the config file path
|
|
133
|
+
*/
|
|
134
|
+
export declare function getConfigPath(): string;
|
|
135
|
+
/**
|
|
136
|
+
* Check if config file exists
|
|
137
|
+
*/
|
|
138
|
+
export declare function configExists(): boolean;
|
|
139
|
+
/**
|
|
140
|
+
* Ensure config directory exists
|
|
141
|
+
*/
|
|
142
|
+
export declare function ensureConfigDir(): void;
|
|
143
|
+
/**
|
|
144
|
+
* Load user config from file
|
|
145
|
+
*/
|
|
146
|
+
export declare function loadUserConfig(): UserConfig | null;
|
|
147
|
+
/**
|
|
148
|
+
* Save user config to file
|
|
149
|
+
*/
|
|
150
|
+
export declare function saveUserConfig(config: PartialUserConfig): UserConfig;
|
|
151
|
+
/**
|
|
152
|
+
* Update specific config values
|
|
153
|
+
*/
|
|
154
|
+
export declare function updateUserConfig(updates: PartialUserConfig): UserConfig;
|
|
155
|
+
/**
|
|
156
|
+
* Delete config file
|
|
157
|
+
*/
|
|
158
|
+
export declare function deleteUserConfig(): boolean;
|
|
159
|
+
/**
|
|
160
|
+
* Get a specific config value
|
|
161
|
+
*/
|
|
162
|
+
export declare function getConfigValue<K extends keyof UserConfig>(key: K): UserConfig[K] | undefined;
|
|
163
|
+
/**
|
|
164
|
+
* Add a custom model
|
|
165
|
+
*/
|
|
166
|
+
export declare function addCustomModel(model: CustomModel): UserConfig;
|
|
167
|
+
/**
|
|
168
|
+
* Remove a custom model
|
|
169
|
+
*/
|
|
170
|
+
export declare function removeCustomModel(modelId: string): UserConfig;
|
|
171
|
+
/**
|
|
172
|
+
* Get all available models (built-in + custom)
|
|
173
|
+
*/
|
|
174
|
+
export declare function getAllModels(): Array<{
|
|
175
|
+
id: string;
|
|
176
|
+
name: string;
|
|
177
|
+
isCustom: boolean;
|
|
178
|
+
}>;
|
|
179
|
+
/**
|
|
180
|
+
* Mask API key for display
|
|
181
|
+
*/
|
|
182
|
+
export declare function maskApiKey(apiKey: string): string;
|
|
183
|
+
/**
|
|
184
|
+
* Get config for display (with masked API key)
|
|
185
|
+
*/
|
|
186
|
+
export declare function getDisplayConfig(): Record<string, unknown> | null;
|
|
187
|
+
declare const _default: {
|
|
188
|
+
getConfigDir: typeof getConfigDir;
|
|
189
|
+
getConfigPath: typeof getConfigPath;
|
|
190
|
+
configExists: typeof configExists;
|
|
191
|
+
loadUserConfig: typeof loadUserConfig;
|
|
192
|
+
saveUserConfig: typeof saveUserConfig;
|
|
193
|
+
updateUserConfig: typeof updateUserConfig;
|
|
194
|
+
deleteUserConfig: typeof deleteUserConfig;
|
|
195
|
+
getConfigValue: typeof getConfigValue;
|
|
196
|
+
addCustomModel: typeof addCustomModel;
|
|
197
|
+
removeCustomModel: typeof removeCustomModel;
|
|
198
|
+
getAllModels: typeof getAllModels;
|
|
199
|
+
maskApiKey: typeof maskApiKey;
|
|
200
|
+
getDisplayConfig: typeof getDisplayConfig;
|
|
201
|
+
};
|
|
202
|
+
export default _default;
|
|
203
|
+
//# sourceMappingURL=user-config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user-config.d.ts","sourceRoot":"","sources":["../../src/config/user-config.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAUxB,QAAA,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;EAMrB,CAAC;AAEH,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAG5D,QAAA,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAiCpB,CAAC;AAEH,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAG1D,MAAM,MAAM,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,WAAW,GAAG,WAAW,CAAC,CAAC,CAAC;AAErF;;GAEG;AACH,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,OAAO,CAEtC;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,IAAI,CAMtC;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,UAAU,GAAG,IAAI,CA4BlD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,iBAAiB,GAAG,UAAU,CA8BpE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,iBAAiB,GAAG,UAAU,CAWvE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,OAAO,CAiB1C;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,CAAC,SAAS,MAAM,UAAU,EACvD,GAAG,EAAE,CAAC,GACL,UAAU,CAAC,CAAC,CAAC,GAAG,SAAS,CAG3B;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,WAAW,GAAG,UAAU,CAmB7D;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,CAU7D;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,KAAK,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAA;CAAE,CAAC,CA0BrF;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAKjD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAWjE;;;;;;;;;;;;;;;;AAED,wBAcE"}
|
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
import { homedir } from 'os';
|
|
2
|
+
import { join } from 'path';
|
|
3
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync, unlinkSync } from 'fs';
|
|
4
|
+
import { z } from 'zod';
|
|
5
|
+
import { createLogger } from '../utils/logger.js';
|
|
6
|
+
const logger = createLogger('UserConfig');
|
|
7
|
+
// Config directory and file paths
|
|
8
|
+
const CONFIG_DIR_NAME = '.family-ai-agent';
|
|
9
|
+
const CONFIG_FILE_NAME = 'config.json';
|
|
10
|
+
// Custom model schema
|
|
11
|
+
const CustomModelSchema = z.object({
|
|
12
|
+
id: z.string().min(1),
|
|
13
|
+
name: z.string().min(1),
|
|
14
|
+
contextWindow: z.number().positive().default(8192),
|
|
15
|
+
maxOutput: z.number().positive().default(4096),
|
|
16
|
+
description: z.string().optional(),
|
|
17
|
+
});
|
|
18
|
+
// User config schema
|
|
19
|
+
const UserConfigSchema = z.object({
|
|
20
|
+
// API Configuration
|
|
21
|
+
apiKey: z.string().min(1, 'API key is required'),
|
|
22
|
+
baseUrl: z.string().url().default('https://openrouter.ai/api/v1'),
|
|
23
|
+
// Model Configuration
|
|
24
|
+
defaultModel: z.string().default('anthropic/claude-3.5-sonnet'),
|
|
25
|
+
fastModel: z.string().default('anthropic/claude-3-haiku'),
|
|
26
|
+
embeddingModel: z.string().default('openai/text-embedding-3-small'),
|
|
27
|
+
// Custom Models
|
|
28
|
+
customModels: z.array(CustomModelSchema).default([]),
|
|
29
|
+
// Optional Settings
|
|
30
|
+
temperature: z.number().min(0).max(2).optional(),
|
|
31
|
+
maxTokens: z.number().positive().optional(),
|
|
32
|
+
// Feature Flags
|
|
33
|
+
enableSafetyFilters: z.boolean().default(true),
|
|
34
|
+
enableAuditLogging: z.boolean().default(true),
|
|
35
|
+
// Database (optional - uses defaults if not set)
|
|
36
|
+
database: z.object({
|
|
37
|
+
host: z.string().default('localhost'),
|
|
38
|
+
port: z.number().default(5432),
|
|
39
|
+
user: z.string().default('familyai'),
|
|
40
|
+
password: z.string().default('familyai123'),
|
|
41
|
+
name: z.string().default('familyai'),
|
|
42
|
+
}).optional(),
|
|
43
|
+
// Metadata
|
|
44
|
+
createdAt: z.string().datetime().optional(),
|
|
45
|
+
updatedAt: z.string().datetime().optional(),
|
|
46
|
+
});
|
|
47
|
+
/**
|
|
48
|
+
* Get the config directory path
|
|
49
|
+
*/
|
|
50
|
+
export function getConfigDir() {
|
|
51
|
+
return join(homedir(), CONFIG_DIR_NAME);
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Get the config file path
|
|
55
|
+
*/
|
|
56
|
+
export function getConfigPath() {
|
|
57
|
+
return join(getConfigDir(), CONFIG_FILE_NAME);
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Check if config file exists
|
|
61
|
+
*/
|
|
62
|
+
export function configExists() {
|
|
63
|
+
return existsSync(getConfigPath());
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Ensure config directory exists
|
|
67
|
+
*/
|
|
68
|
+
export function ensureConfigDir() {
|
|
69
|
+
const configDir = getConfigDir();
|
|
70
|
+
if (!existsSync(configDir)) {
|
|
71
|
+
mkdirSync(configDir, { recursive: true });
|
|
72
|
+
logger.debug('Config directory created', { path: configDir });
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Load user config from file
|
|
77
|
+
*/
|
|
78
|
+
export function loadUserConfig() {
|
|
79
|
+
const configPath = getConfigPath();
|
|
80
|
+
if (!existsSync(configPath)) {
|
|
81
|
+
logger.debug('Config file not found', { path: configPath });
|
|
82
|
+
return null;
|
|
83
|
+
}
|
|
84
|
+
try {
|
|
85
|
+
const fileContent = readFileSync(configPath, 'utf-8');
|
|
86
|
+
const rawConfig = JSON.parse(fileContent);
|
|
87
|
+
const parsed = UserConfigSchema.safeParse(rawConfig);
|
|
88
|
+
if (!parsed.success) {
|
|
89
|
+
logger.warn('Config file validation failed', {
|
|
90
|
+
errors: parsed.error.format(),
|
|
91
|
+
});
|
|
92
|
+
return null;
|
|
93
|
+
}
|
|
94
|
+
logger.debug('Config loaded successfully');
|
|
95
|
+
return parsed.data;
|
|
96
|
+
}
|
|
97
|
+
catch (error) {
|
|
98
|
+
logger.error('Failed to load config file', {
|
|
99
|
+
error: error instanceof Error ? error.message : 'Unknown error',
|
|
100
|
+
});
|
|
101
|
+
return null;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Save user config to file
|
|
106
|
+
*/
|
|
107
|
+
export function saveUserConfig(config) {
|
|
108
|
+
ensureConfigDir();
|
|
109
|
+
const configPath = getConfigPath();
|
|
110
|
+
// Load existing config if present
|
|
111
|
+
const existingConfig = loadUserConfig();
|
|
112
|
+
// Merge with existing config
|
|
113
|
+
const mergedConfig = {
|
|
114
|
+
...existingConfig,
|
|
115
|
+
...config,
|
|
116
|
+
updatedAt: new Date().toISOString(),
|
|
117
|
+
};
|
|
118
|
+
// Add createdAt if new config
|
|
119
|
+
if (!existingConfig) {
|
|
120
|
+
mergedConfig.createdAt = new Date().toISOString();
|
|
121
|
+
}
|
|
122
|
+
// Validate merged config
|
|
123
|
+
const parsed = UserConfigSchema.safeParse(mergedConfig);
|
|
124
|
+
if (!parsed.success) {
|
|
125
|
+
throw new Error(`Invalid config: ${JSON.stringify(parsed.error.format())}`);
|
|
126
|
+
}
|
|
127
|
+
// Write to file
|
|
128
|
+
writeFileSync(configPath, JSON.stringify(parsed.data, null, 2), 'utf-8');
|
|
129
|
+
logger.info('Config saved successfully', { path: configPath });
|
|
130
|
+
return parsed.data;
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Update specific config values
|
|
134
|
+
*/
|
|
135
|
+
export function updateUserConfig(updates) {
|
|
136
|
+
const existingConfig = loadUserConfig();
|
|
137
|
+
if (!existingConfig) {
|
|
138
|
+
throw new Error('No config file found. Run setup first.');
|
|
139
|
+
}
|
|
140
|
+
return saveUserConfig({
|
|
141
|
+
...existingConfig,
|
|
142
|
+
...updates,
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Delete config file
|
|
147
|
+
*/
|
|
148
|
+
export function deleteUserConfig() {
|
|
149
|
+
const configPath = getConfigPath();
|
|
150
|
+
if (!existsSync(configPath)) {
|
|
151
|
+
return false;
|
|
152
|
+
}
|
|
153
|
+
try {
|
|
154
|
+
unlinkSync(configPath);
|
|
155
|
+
logger.info('Config deleted', { path: configPath });
|
|
156
|
+
return true;
|
|
157
|
+
}
|
|
158
|
+
catch (error) {
|
|
159
|
+
logger.error('Failed to delete config', {
|
|
160
|
+
error: error instanceof Error ? error.message : 'Unknown error',
|
|
161
|
+
});
|
|
162
|
+
return false;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Get a specific config value
|
|
167
|
+
*/
|
|
168
|
+
export function getConfigValue(key) {
|
|
169
|
+
const config = loadUserConfig();
|
|
170
|
+
return config?.[key];
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Add a custom model
|
|
174
|
+
*/
|
|
175
|
+
export function addCustomModel(model) {
|
|
176
|
+
const config = loadUserConfig();
|
|
177
|
+
if (!config) {
|
|
178
|
+
throw new Error('No config file found. Run setup first.');
|
|
179
|
+
}
|
|
180
|
+
// Check if model already exists
|
|
181
|
+
const existingIndex = config.customModels.findIndex((m) => m.id === model.id);
|
|
182
|
+
if (existingIndex >= 0) {
|
|
183
|
+
// Update existing model
|
|
184
|
+
config.customModels[existingIndex] = model;
|
|
185
|
+
}
|
|
186
|
+
else {
|
|
187
|
+
// Add new model
|
|
188
|
+
config.customModels.push(model);
|
|
189
|
+
}
|
|
190
|
+
return saveUserConfig(config);
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Remove a custom model
|
|
194
|
+
*/
|
|
195
|
+
export function removeCustomModel(modelId) {
|
|
196
|
+
const config = loadUserConfig();
|
|
197
|
+
if (!config) {
|
|
198
|
+
throw new Error('No config file found. Run setup first.');
|
|
199
|
+
}
|
|
200
|
+
config.customModels = config.customModels.filter((m) => m.id !== modelId);
|
|
201
|
+
return saveUserConfig(config);
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Get all available models (built-in + custom)
|
|
205
|
+
*/
|
|
206
|
+
export function getAllModels() {
|
|
207
|
+
const config = loadUserConfig();
|
|
208
|
+
// Built-in models from OpenRouter
|
|
209
|
+
const builtInModels = [
|
|
210
|
+
{ id: 'anthropic/claude-3.5-sonnet', name: 'Claude 3.5 Sonnet', isCustom: false },
|
|
211
|
+
{ id: 'anthropic/claude-3-haiku', name: 'Claude 3 Haiku', isCustom: false },
|
|
212
|
+
{ id: 'anthropic/claude-3-opus', name: 'Claude 3 Opus', isCustom: false },
|
|
213
|
+
{ id: 'openai/gpt-4-turbo', name: 'GPT-4 Turbo', isCustom: false },
|
|
214
|
+
{ id: 'openai/gpt-4o', name: 'GPT-4o', isCustom: false },
|
|
215
|
+
{ id: 'openai/gpt-4o-mini', name: 'GPT-4o Mini', isCustom: false },
|
|
216
|
+
{ id: 'google/gemini-pro-1.5', name: 'Gemini Pro 1.5', isCustom: false },
|
|
217
|
+
{ id: 'meta-llama/llama-3.1-70b-instruct', name: 'Llama 3.1 70B', isCustom: false },
|
|
218
|
+
{ id: 'meta-llama/llama-3.1-8b-instruct', name: 'Llama 3.1 8B', isCustom: false },
|
|
219
|
+
{ id: 'mistralai/mistral-large', name: 'Mistral Large', isCustom: false },
|
|
220
|
+
{ id: 'deepseek/deepseek-chat', name: 'DeepSeek Chat', isCustom: false },
|
|
221
|
+
];
|
|
222
|
+
// Add custom models
|
|
223
|
+
const customModels = (config?.customModels || []).map((m) => ({
|
|
224
|
+
id: m.id,
|
|
225
|
+
name: m.name,
|
|
226
|
+
isCustom: true,
|
|
227
|
+
}));
|
|
228
|
+
return [...builtInModels, ...customModels];
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* Mask API key for display
|
|
232
|
+
*/
|
|
233
|
+
export function maskApiKey(apiKey) {
|
|
234
|
+
if (apiKey.length <= 8) {
|
|
235
|
+
return '****';
|
|
236
|
+
}
|
|
237
|
+
return `${apiKey.slice(0, 4)}...${apiKey.slice(-4)}`;
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* Get config for display (with masked API key)
|
|
241
|
+
*/
|
|
242
|
+
export function getDisplayConfig() {
|
|
243
|
+
const config = loadUserConfig();
|
|
244
|
+
if (!config) {
|
|
245
|
+
return null;
|
|
246
|
+
}
|
|
247
|
+
return {
|
|
248
|
+
...config,
|
|
249
|
+
apiKey: maskApiKey(config.apiKey),
|
|
250
|
+
};
|
|
251
|
+
}
|
|
252
|
+
export default {
|
|
253
|
+
getConfigDir,
|
|
254
|
+
getConfigPath,
|
|
255
|
+
configExists,
|
|
256
|
+
loadUserConfig,
|
|
257
|
+
saveUserConfig,
|
|
258
|
+
updateUserConfig,
|
|
259
|
+
deleteUserConfig,
|
|
260
|
+
getConfigValue,
|
|
261
|
+
addCustomModel,
|
|
262
|
+
removeCustomModel,
|
|
263
|
+
getAllModels,
|
|
264
|
+
maskApiKey,
|
|
265
|
+
getDisplayConfig,
|
|
266
|
+
};
|
|
267
|
+
//# sourceMappingURL=user-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user-config.js","sourceRoot":"","sources":["../../src/config/user-config.ts"],"names":[],"mappings":"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"}
|