@cuijy/free-api 0.1.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/LICENSE +21 -0
- package/README.md +299 -0
- package/bin/freeapi +8 -0
- package/dist/cli/commands/chat.d.ts +3 -0
- package/dist/cli/commands/chat.d.ts.map +1 -0
- package/dist/cli/commands/chat.js +39 -0
- package/dist/cli/commands/chat.js.map +1 -0
- package/dist/cli/commands/config.d.ts +3 -0
- package/dist/cli/commands/config.d.ts.map +1 -0
- package/dist/cli/commands/config.js +289 -0
- package/dist/cli/commands/config.js.map +1 -0
- package/dist/cli/commands/init.d.ts +3 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +114 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/list.d.ts +3 -0
- package/dist/cli/commands/list.d.ts.map +1 -0
- package/dist/cli/commands/list.js +109 -0
- package/dist/cli/commands/list.js.map +1 -0
- package/dist/cli/commands/logs.d.ts +3 -0
- package/dist/cli/commands/logs.d.ts.map +1 -0
- package/dist/cli/commands/logs.js +51 -0
- package/dist/cli/commands/logs.js.map +1 -0
- package/dist/cli/commands/start.d.ts +3 -0
- package/dist/cli/commands/start.d.ts.map +1 -0
- package/dist/cli/commands/start.js +34 -0
- package/dist/cli/commands/start.js.map +1 -0
- package/dist/cli/commands/status.d.ts +3 -0
- package/dist/cli/commands/status.d.ts.map +1 -0
- package/dist/cli/commands/status.js +45 -0
- package/dist/cli/commands/status.js.map +1 -0
- package/dist/cli/commands/stop.d.ts +3 -0
- package/dist/cli/commands/stop.d.ts.map +1 -0
- package/dist/cli/commands/stop.js +54 -0
- package/dist/cli/commands/stop.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +79 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +17 -0
- package/dist/index.js.map +1 -0
- package/dist/services/base/index.d.ts +112 -0
- package/dist/services/base/index.d.ts.map +1 -0
- package/dist/services/base/index.js +51 -0
- package/dist/services/base/index.js.map +1 -0
- package/dist/services/base/types.d.ts +114 -0
- package/dist/services/base/types.d.ts.map +1 -0
- package/dist/services/base/types.js +7 -0
- package/dist/services/base/types.js.map +1 -0
- package/dist/services/chatgpt/api-client.d.ts +81 -0
- package/dist/services/chatgpt/api-client.d.ts.map +1 -0
- package/dist/services/chatgpt/api-client.js +325 -0
- package/dist/services/chatgpt/api-client.js.map +1 -0
- package/dist/services/chatgpt/cli-adapter.d.ts +108 -0
- package/dist/services/chatgpt/cli-adapter.d.ts.map +1 -0
- package/dist/services/chatgpt/cli-adapter.js +315 -0
- package/dist/services/chatgpt/cli-adapter.js.map +1 -0
- package/dist/services/chatgpt/config-manager.d.ts +87 -0
- package/dist/services/chatgpt/config-manager.d.ts.map +1 -0
- package/dist/services/chatgpt/config-manager.js +344 -0
- package/dist/services/chatgpt/config-manager.js.map +1 -0
- package/dist/services/chatgpt/config-wizard.d.ts +35 -0
- package/dist/services/chatgpt/config-wizard.d.ts.map +1 -0
- package/dist/services/chatgpt/config-wizard.js +524 -0
- package/dist/services/chatgpt/config-wizard.js.map +1 -0
- package/dist/services/chatgpt/error-handler.d.ts +94 -0
- package/dist/services/chatgpt/error-handler.d.ts.map +1 -0
- package/dist/services/chatgpt/error-handler.js +409 -0
- package/dist/services/chatgpt/error-handler.js.map +1 -0
- package/dist/services/chatgpt/exports.d.ts +71 -0
- package/dist/services/chatgpt/exports.d.ts.map +1 -0
- package/dist/services/chatgpt/exports.js +81 -0
- package/dist/services/chatgpt/exports.js.map +1 -0
- package/dist/services/chatgpt/index.d.ts +125 -0
- package/dist/services/chatgpt/index.d.ts.map +1 -0
- package/dist/services/chatgpt/index.js +394 -0
- package/dist/services/chatgpt/index.js.map +1 -0
- package/dist/services/chatgpt/service-adapter.d.ts +152 -0
- package/dist/services/chatgpt/service-adapter.d.ts.map +1 -0
- package/dist/services/chatgpt/service-adapter.js +430 -0
- package/dist/services/chatgpt/service-adapter.js.map +1 -0
- package/dist/services/chatgpt/session-manager.d.ts +113 -0
- package/dist/services/chatgpt/session-manager.d.ts.map +1 -0
- package/dist/services/chatgpt/session-manager.js +396 -0
- package/dist/services/chatgpt/session-manager.js.map +1 -0
- package/dist/services/chatgpt/types.d.ts +130 -0
- package/dist/services/chatgpt/types.d.ts.map +1 -0
- package/dist/services/chatgpt/types.js +19 -0
- package/dist/services/chatgpt/types.js.map +1 -0
- package/dist/utils/config.d.ts +61 -0
- package/dist/utils/config.d.ts.map +1 -0
- package/dist/utils/config.js +215 -0
- package/dist/utils/config.js.map +1 -0
- package/package.json +91 -0
|
@@ -0,0 +1,344 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* ChatGPT Configuration Manager
|
|
4
|
+
* Handles configuration loading, validation, and persistence
|
|
5
|
+
*/
|
|
6
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
7
|
+
if (k2 === undefined) k2 = k;
|
|
8
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
9
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
10
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
11
|
+
}
|
|
12
|
+
Object.defineProperty(o, k2, desc);
|
|
13
|
+
}) : (function(o, m, k, k2) {
|
|
14
|
+
if (k2 === undefined) k2 = k;
|
|
15
|
+
o[k2] = m[k];
|
|
16
|
+
}));
|
|
17
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
18
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
19
|
+
}) : function(o, v) {
|
|
20
|
+
o["default"] = v;
|
|
21
|
+
});
|
|
22
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
23
|
+
var ownKeys = function(o) {
|
|
24
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
25
|
+
var ar = [];
|
|
26
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
27
|
+
return ar;
|
|
28
|
+
};
|
|
29
|
+
return ownKeys(o);
|
|
30
|
+
};
|
|
31
|
+
return function (mod) {
|
|
32
|
+
if (mod && mod.__esModule) return mod;
|
|
33
|
+
var result = {};
|
|
34
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
35
|
+
__setModuleDefault(result, mod);
|
|
36
|
+
return result;
|
|
37
|
+
};
|
|
38
|
+
})();
|
|
39
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
40
|
+
exports.ChatGPTConfigManager = void 0;
|
|
41
|
+
const types_1 = require("./types");
|
|
42
|
+
const fs = __importStar(require("fs-extra"));
|
|
43
|
+
const path = __importStar(require("path"));
|
|
44
|
+
const os = __importStar(require("os"));
|
|
45
|
+
class ChatGPTConfigManager {
|
|
46
|
+
defaultConfig = {
|
|
47
|
+
mode: types_1.ChatGPTMode.PUBLIC,
|
|
48
|
+
enabled: true,
|
|
49
|
+
base_url: 'https://api.openai.com/v1/',
|
|
50
|
+
model: types_1.ChatGPTModel.GPT35_TURBO,
|
|
51
|
+
max_tokens: 4096,
|
|
52
|
+
temperature: 0.7,
|
|
53
|
+
top_p: 1,
|
|
54
|
+
frequency_penalty: 0,
|
|
55
|
+
presence_penalty: 0,
|
|
56
|
+
timeout: 30000,
|
|
57
|
+
max_retries: 3,
|
|
58
|
+
retry_delay: 1000,
|
|
59
|
+
requests_per_minute: 60,
|
|
60
|
+
tokens_per_minute: 150000
|
|
61
|
+
};
|
|
62
|
+
configDir;
|
|
63
|
+
configFile;
|
|
64
|
+
constructor(configDir) {
|
|
65
|
+
this.configDir = configDir || path.join(os.homedir(), '.freeapi', 'services', 'chatgpt');
|
|
66
|
+
this.configFile = path.join(this.configDir, 'config.json');
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Load configuration from file or create default
|
|
70
|
+
*/
|
|
71
|
+
async loadConfig() {
|
|
72
|
+
try {
|
|
73
|
+
await fs.ensureDir(this.configDir);
|
|
74
|
+
if (await fs.pathExists(this.configFile)) {
|
|
75
|
+
const configData = await fs.readJson(this.configFile);
|
|
76
|
+
const mergedConfig = this.mergeWithDefaults(configData);
|
|
77
|
+
const validation = this.validateConfig(mergedConfig);
|
|
78
|
+
if (!validation.valid) {
|
|
79
|
+
console.warn('Configuration validation warnings:', validation.warnings);
|
|
80
|
+
if (validation.errors.length > 0) {
|
|
81
|
+
throw new Error(`Invalid configuration: ${validation.errors.join(', ')}`);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
return mergedConfig;
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
// Create default config file
|
|
88
|
+
await this.saveConfig(this.defaultConfig);
|
|
89
|
+
return { ...this.defaultConfig };
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
catch (error) {
|
|
93
|
+
console.error('Failed to load configuration:', error);
|
|
94
|
+
return { ...this.defaultConfig };
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Save configuration to file
|
|
99
|
+
*/
|
|
100
|
+
async saveConfig(config) {
|
|
101
|
+
try {
|
|
102
|
+
await fs.ensureDir(this.configDir);
|
|
103
|
+
// Validate before saving
|
|
104
|
+
const validation = this.validateConfig(config);
|
|
105
|
+
if (!validation.valid) {
|
|
106
|
+
throw new Error(`Invalid configuration: ${validation.errors.join(', ')}`);
|
|
107
|
+
}
|
|
108
|
+
// Remove sensitive data if not in authenticated mode
|
|
109
|
+
const configToSave = { ...config };
|
|
110
|
+
if (configToSave.mode !== types_1.ChatGPTMode.AUTHENTICATED) {
|
|
111
|
+
delete configToSave.credentials;
|
|
112
|
+
}
|
|
113
|
+
await fs.writeJson(this.configFile, configToSave, { spaces: 2 });
|
|
114
|
+
}
|
|
115
|
+
catch (error) {
|
|
116
|
+
console.error('Failed to save configuration:', error);
|
|
117
|
+
throw error;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Merge user config with defaults
|
|
122
|
+
*/
|
|
123
|
+
mergeWithDefaults(userConfig) {
|
|
124
|
+
const merged = { ...this.defaultConfig, ...userConfig };
|
|
125
|
+
// Ensure mode-specific settings
|
|
126
|
+
if (merged.mode === types_1.ChatGPTMode.PUBLIC) {
|
|
127
|
+
// Public mode doesn't need credentials
|
|
128
|
+
delete merged.credentials;
|
|
129
|
+
}
|
|
130
|
+
else if (merged.mode === types_1.ChatGPTMode.AUTHENTICATED) {
|
|
131
|
+
// Authenticated mode needs proper base URL
|
|
132
|
+
if (!merged.base_url || merged.base_url === this.defaultConfig.base_url) {
|
|
133
|
+
merged.base_url = 'https://chat.openai.com/backend-api/';
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
return merged;
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Validate configuration
|
|
140
|
+
*/
|
|
141
|
+
validateConfig(config) {
|
|
142
|
+
const errors = [];
|
|
143
|
+
const warnings = [];
|
|
144
|
+
// Validate mode
|
|
145
|
+
if (!Object.values(types_1.ChatGPTMode).includes(config.mode)) {
|
|
146
|
+
errors.push(`Invalid mode: ${config.mode}. Must be one of: ${Object.values(types_1.ChatGPTMode).join(', ')}`);
|
|
147
|
+
}
|
|
148
|
+
// Validate base URL
|
|
149
|
+
if (!config.base_url || !this.isValidUrl(config.base_url)) {
|
|
150
|
+
errors.push('Invalid base URL');
|
|
151
|
+
}
|
|
152
|
+
// Validate model
|
|
153
|
+
if (!Object.values(types_1.ChatGPTModel).includes(config.model)) {
|
|
154
|
+
warnings.push(`Model ${config.model} may not be supported`);
|
|
155
|
+
}
|
|
156
|
+
// Validate numeric ranges
|
|
157
|
+
if (config.max_tokens < 1 || config.max_tokens > 16384) {
|
|
158
|
+
errors.push('max_tokens must be between 1 and 16384');
|
|
159
|
+
}
|
|
160
|
+
if (config.temperature < 0 || config.temperature > 2) {
|
|
161
|
+
errors.push('temperature must be between 0 and 2');
|
|
162
|
+
}
|
|
163
|
+
if (config.top_p < 0 || config.top_p > 1) {
|
|
164
|
+
errors.push('top_p must be between 0 and 1');
|
|
165
|
+
}
|
|
166
|
+
if (config.frequency_penalty < -2 || config.frequency_penalty > 2) {
|
|
167
|
+
errors.push('frequency_penalty must be between -2 and 2');
|
|
168
|
+
}
|
|
169
|
+
if (config.presence_penalty < -2 || config.presence_penalty > 2) {
|
|
170
|
+
errors.push('presence_penalty must be between -2 and 2');
|
|
171
|
+
}
|
|
172
|
+
// Validate timeout
|
|
173
|
+
if (config.timeout < 1000 || config.timeout > 300000) {
|
|
174
|
+
warnings.push('timeout should be between 1000 and 300000 ms');
|
|
175
|
+
}
|
|
176
|
+
// Validate authenticated mode requirements
|
|
177
|
+
if (config.mode === types_1.ChatGPTMode.AUTHENTICATED) {
|
|
178
|
+
if (!config.credentials?.email || !config.credentials?.password) {
|
|
179
|
+
errors.push('Authenticated mode requires email and password');
|
|
180
|
+
}
|
|
181
|
+
if (config.base_url === this.defaultConfig.base_url) {
|
|
182
|
+
warnings.push('Authenticated mode should use chat.openai.com backend URL');
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
// Validate rate limits
|
|
186
|
+
if (config.requests_per_minute < 1) {
|
|
187
|
+
warnings.push('requests_per_minute should be at least 1');
|
|
188
|
+
}
|
|
189
|
+
if (config.tokens_per_minute < 1000) {
|
|
190
|
+
warnings.push('tokens_per_minute should be at least 1000');
|
|
191
|
+
}
|
|
192
|
+
return {
|
|
193
|
+
valid: errors.length === 0,
|
|
194
|
+
errors,
|
|
195
|
+
warnings
|
|
196
|
+
};
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Check if string is a valid URL
|
|
200
|
+
*/
|
|
201
|
+
isValidUrl(url) {
|
|
202
|
+
try {
|
|
203
|
+
new URL(url);
|
|
204
|
+
return true;
|
|
205
|
+
}
|
|
206
|
+
catch {
|
|
207
|
+
return false;
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Get configuration file path
|
|
212
|
+
*/
|
|
213
|
+
getConfigFilePath() {
|
|
214
|
+
return this.configFile;
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Get configuration directory
|
|
218
|
+
*/
|
|
219
|
+
getConfigDir() {
|
|
220
|
+
return this.configDir;
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* Get default configuration
|
|
224
|
+
*/
|
|
225
|
+
getDefaultConfig() {
|
|
226
|
+
return { ...this.defaultConfig };
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Create configuration from user input
|
|
230
|
+
*/
|
|
231
|
+
createConfigFromInput(input) {
|
|
232
|
+
const config = {
|
|
233
|
+
...this.defaultConfig,
|
|
234
|
+
mode: input.mode,
|
|
235
|
+
model: input.model || this.defaultConfig.model,
|
|
236
|
+
max_tokens: input.max_tokens || this.defaultConfig.max_tokens,
|
|
237
|
+
temperature: input.temperature || this.defaultConfig.temperature
|
|
238
|
+
};
|
|
239
|
+
// Set base URL
|
|
240
|
+
if (input.base_url) {
|
|
241
|
+
config.base_url = input.base_url;
|
|
242
|
+
}
|
|
243
|
+
else if (input.mode === types_1.ChatGPTMode.AUTHENTICATED) {
|
|
244
|
+
config.base_url = 'https://chat.openai.com/backend-api/';
|
|
245
|
+
}
|
|
246
|
+
// Set API key for public mode
|
|
247
|
+
if (input.mode === types_1.ChatGPTMode.PUBLIC && input.api_key) {
|
|
248
|
+
config.api_key = input.api_key;
|
|
249
|
+
}
|
|
250
|
+
// Set credentials for authenticated mode
|
|
251
|
+
if (input.mode === types_1.ChatGPTMode.AUTHENTICATED && input.email && input.password) {
|
|
252
|
+
config.credentials = {
|
|
253
|
+
email: input.email,
|
|
254
|
+
password: input.password
|
|
255
|
+
};
|
|
256
|
+
}
|
|
257
|
+
return config;
|
|
258
|
+
}
|
|
259
|
+
/**
|
|
260
|
+
* Encrypt sensitive data in configuration
|
|
261
|
+
*/
|
|
262
|
+
encryptSensitiveData(config, encryptionKey) {
|
|
263
|
+
const encryptedConfig = { ...config };
|
|
264
|
+
// Simple XOR encryption for demo (in production use proper encryption)
|
|
265
|
+
if (encryptedConfig.api_key) {
|
|
266
|
+
encryptedConfig.api_key = this.xorEncrypt(encryptedConfig.api_key, encryptionKey);
|
|
267
|
+
}
|
|
268
|
+
if (encryptedConfig.credentials?.password) {
|
|
269
|
+
encryptedConfig.credentials.password = this.xorEncrypt(encryptedConfig.credentials.password, encryptionKey);
|
|
270
|
+
}
|
|
271
|
+
return encryptedConfig;
|
|
272
|
+
}
|
|
273
|
+
/**
|
|
274
|
+
* Decrypt sensitive data in configuration
|
|
275
|
+
*/
|
|
276
|
+
decryptSensitiveData(config, encryptionKey) {
|
|
277
|
+
const decryptedConfig = { ...config };
|
|
278
|
+
if (decryptedConfig.api_key) {
|
|
279
|
+
decryptedConfig.api_key = this.xorEncrypt(decryptedConfig.api_key, encryptionKey);
|
|
280
|
+
}
|
|
281
|
+
if (decryptedConfig.credentials?.password) {
|
|
282
|
+
decryptedConfig.credentials.password = this.xorEncrypt(decryptedConfig.credentials.password, encryptionKey);
|
|
283
|
+
}
|
|
284
|
+
return decryptedConfig;
|
|
285
|
+
}
|
|
286
|
+
/**
|
|
287
|
+
* Simple XOR encryption for demo purposes
|
|
288
|
+
* In production, use proper encryption like AES
|
|
289
|
+
*/
|
|
290
|
+
xorEncrypt(text, key) {
|
|
291
|
+
let result = '';
|
|
292
|
+
for (let i = 0; i < text.length; i++) {
|
|
293
|
+
const charCode = text.charCodeAt(i) ^ key.charCodeAt(i % key.length);
|
|
294
|
+
result += String.fromCharCode(charCode);
|
|
295
|
+
}
|
|
296
|
+
return Buffer.from(result).toString('base64');
|
|
297
|
+
}
|
|
298
|
+
/**
|
|
299
|
+
* Backup configuration
|
|
300
|
+
*/
|
|
301
|
+
async backupConfig(backupDir) {
|
|
302
|
+
const backupPath = backupDir || path.join(this.configDir, 'backups');
|
|
303
|
+
await fs.ensureDir(backupPath);
|
|
304
|
+
const timestamp = new Date().toISOString().replace(/[:.]/g, '-');
|
|
305
|
+
const backupFile = path.join(backupPath, `config-backup-${timestamp}.json`);
|
|
306
|
+
if (await fs.pathExists(this.configFile)) {
|
|
307
|
+
await fs.copy(this.configFile, backupFile);
|
|
308
|
+
}
|
|
309
|
+
return backupFile;
|
|
310
|
+
}
|
|
311
|
+
/**
|
|
312
|
+
* Restore configuration from backup
|
|
313
|
+
*/
|
|
314
|
+
async restoreConfig(backupFile) {
|
|
315
|
+
if (!(await fs.pathExists(backupFile))) {
|
|
316
|
+
throw new Error(`Backup file not found: ${backupFile}`);
|
|
317
|
+
}
|
|
318
|
+
const backupConfig = await fs.readJson(backupFile);
|
|
319
|
+
const mergedConfig = this.mergeWithDefaults(backupConfig);
|
|
320
|
+
const validation = this.validateConfig(mergedConfig);
|
|
321
|
+
if (!validation.valid) {
|
|
322
|
+
throw new Error(`Invalid backup configuration: ${validation.errors.join(', ')}`);
|
|
323
|
+
}
|
|
324
|
+
await this.saveConfig(mergedConfig);
|
|
325
|
+
return mergedConfig;
|
|
326
|
+
}
|
|
327
|
+
/**
|
|
328
|
+
* List available backups
|
|
329
|
+
*/
|
|
330
|
+
async listBackups(backupDir) {
|
|
331
|
+
const backupPath = backupDir || path.join(this.configDir, 'backups');
|
|
332
|
+
if (!(await fs.pathExists(backupPath))) {
|
|
333
|
+
return [];
|
|
334
|
+
}
|
|
335
|
+
const files = await fs.readdir(backupPath);
|
|
336
|
+
return files
|
|
337
|
+
.filter(file => file.startsWith('config-backup-') && file.endsWith('.json'))
|
|
338
|
+
.map(file => path.join(backupPath, file))
|
|
339
|
+
.sort()
|
|
340
|
+
.reverse(); // Most recent first
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
exports.ChatGPTConfigManager = ChatGPTConfigManager;
|
|
344
|
+
//# sourceMappingURL=config-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-manager.js","sourceRoot":"","sources":["../../../src/services/chatgpt/config-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ChatGPT Configuration Wizard
|
|
3
|
+
* Interactive wizard to help users configure ChatGPT service
|
|
4
|
+
*/
|
|
5
|
+
import { ChatGPTConfig } from './types';
|
|
6
|
+
export declare class ChatGPTConfigWizard {
|
|
7
|
+
private configManager;
|
|
8
|
+
constructor();
|
|
9
|
+
/**
|
|
10
|
+
* Run the configuration wizard
|
|
11
|
+
*/
|
|
12
|
+
run(): Promise<ChatGPTConfig>;
|
|
13
|
+
/**
|
|
14
|
+
* Test connection with current configuration
|
|
15
|
+
*/
|
|
16
|
+
private testConnection;
|
|
17
|
+
/**
|
|
18
|
+
* Save configuration
|
|
19
|
+
*/
|
|
20
|
+
private saveConfiguration;
|
|
21
|
+
/**
|
|
22
|
+
* Quick setup with minimal prompts
|
|
23
|
+
*/
|
|
24
|
+
quickSetup(): Promise<ChatGPTConfig>;
|
|
25
|
+
/**
|
|
26
|
+
* Edit existing configuration
|
|
27
|
+
*/
|
|
28
|
+
editConfig(): Promise<ChatGPTConfig>;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Run configuration wizard from CLI
|
|
32
|
+
*/
|
|
33
|
+
export declare function runConfigWizard(): Promise<void>;
|
|
34
|
+
export default ChatGPTConfigWizard;
|
|
35
|
+
//# sourceMappingURL=config-wizard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-wizard.d.ts","sourceRoot":"","sources":["../../../src/services/chatgpt/config-wizard.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,aAAa,EAAe,MAAM,SAAS,CAAC;AAGrD,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,aAAa,CAAuB;;IAM5C;;OAEG;IACG,GAAG,IAAI,OAAO,CAAC,aAAa,CAAC;IAsRnC;;OAEG;YACW,cAAc;IAqC5B;;OAEG;YACW,iBAAiB;IAyB/B;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,aAAa,CAAC;IAgE1C;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,aAAa,CAAC;CA0E3C;AAED;;GAEG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAyCrD;AAGD,eAAe,mBAAmB,CAAC"}
|