@vibeapi/api-helper 2.0.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 (55) hide show
  1. package/LICENSE +25 -0
  2. package/dist/cli.d.ts +2 -0
  3. package/dist/cli.js +18 -0
  4. package/dist/cli.js.map +1 -0
  5. package/dist/commands/auth.d.ts +1 -0
  6. package/dist/commands/auth.js +119 -0
  7. package/dist/commands/auth.js.map +1 -0
  8. package/dist/commands/config.d.ts +1 -0
  9. package/dist/commands/config.js +130 -0
  10. package/dist/commands/config.js.map +1 -0
  11. package/dist/commands/doctor.d.ts +1 -0
  12. package/dist/commands/doctor.js +105 -0
  13. package/dist/commands/doctor.js.map +1 -0
  14. package/dist/commands/index.d.ts +4 -0
  15. package/dist/commands/index.js +5 -0
  16. package/dist/commands/index.js.map +1 -0
  17. package/dist/commands/lang.d.ts +1 -0
  18. package/dist/commands/lang.js +28 -0
  19. package/dist/commands/lang.js.map +1 -0
  20. package/dist/index.d.ts +12 -0
  21. package/dist/index.js +10 -0
  22. package/dist/index.js.map +1 -0
  23. package/dist/lib/api-validator.d.ts +12 -0
  24. package/dist/lib/api-validator.js +79 -0
  25. package/dist/lib/api-validator.js.map +1 -0
  26. package/dist/lib/claude-code-manager.d.ts +86 -0
  27. package/dist/lib/claude-code-manager.js +233 -0
  28. package/dist/lib/claude-code-manager.js.map +1 -0
  29. package/dist/lib/command.d.ts +10 -0
  30. package/dist/lib/command.js +168 -0
  31. package/dist/lib/command.js.map +1 -0
  32. package/dist/lib/config.d.ts +64 -0
  33. package/dist/lib/config.js +226 -0
  34. package/dist/lib/config.js.map +1 -0
  35. package/dist/lib/i18n.d.ts +20 -0
  36. package/dist/lib/i18n.js +149 -0
  37. package/dist/lib/i18n.js.map +1 -0
  38. package/dist/lib/opencode-manager.d.ts +55 -0
  39. package/dist/lib/opencode-manager.js +134 -0
  40. package/dist/lib/opencode-manager.js.map +1 -0
  41. package/dist/lib/tool-manager.d.ts +25 -0
  42. package/dist/lib/tool-manager.js +280 -0
  43. package/dist/lib/tool-manager.js.map +1 -0
  44. package/dist/lib/wizard.d.ts +23 -0
  45. package/dist/lib/wizard.js +360 -0
  46. package/dist/lib/wizard.js.map +1 -0
  47. package/dist/locales/en_US.json +146 -0
  48. package/dist/locales/zh_CN.json +146 -0
  49. package/dist/utils/logger.d.ts +55 -0
  50. package/dist/utils/logger.js +202 -0
  51. package/dist/utils/logger.js.map +1 -0
  52. package/dist/utils/string-width.d.ts +38 -0
  53. package/dist/utils/string-width.js +131 -0
  54. package/dist/utils/string-width.js.map +1 -0
  55. package/package.json +73 -0
@@ -0,0 +1,86 @@
1
+ import { DEFAULT_MODELS } from './config.js';
2
+ export interface ClaudeCodeSettingsConfig {
3
+ env?: {
4
+ ANTHROPIC_AUTH_TOKEN?: string;
5
+ ANTHROPIC_BASE_URL?: string;
6
+ ANTHROPIC_DEFAULT_HAIKU_MODEL?: string;
7
+ ANTHROPIC_DEFAULT_SONNET_MODEL?: string;
8
+ ANTHROPIC_DEFAULT_OPUS_MODEL?: string;
9
+ ANTHROPIC_MODEL?: string;
10
+ ANTHROPIC_REASONING_MODEL?: string;
11
+ API_TIMEOUT_MS?: string;
12
+ CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC?: number;
13
+ [key: string]: any;
14
+ };
15
+ [key: string]: any;
16
+ }
17
+ export interface ClaudeCodeMCPServerConfig {
18
+ type: 'stdio' | 'sse' | 'http';
19
+ command?: string;
20
+ args?: string[];
21
+ env?: Record<string, string>;
22
+ url?: string;
23
+ headers?: Record<string, string>;
24
+ }
25
+ export interface ClaudeCodeMCPConfig {
26
+ mcpServers?: Record<string, ClaudeCodeMCPServerConfig>;
27
+ hasOpusPlanDefault?: boolean;
28
+ lastReleaseNotesSeen?: string;
29
+ hasCompletedOnboarding?: boolean;
30
+ [key: string]: any;
31
+ }
32
+ export declare class ClaudeCodeManager {
33
+ private static instance;
34
+ private settingsPath;
35
+ private mcpConfigPath;
36
+ private constructor();
37
+ static getInstance(): ClaudeCodeManager;
38
+ /**
39
+ * 确保配置目录存在
40
+ */
41
+ private ensureConfigDir;
42
+ /**
43
+ * 读取 settings.json 配置
44
+ */
45
+ getSettings(): ClaudeCodeSettingsConfig;
46
+ /**
47
+ * 保存 settings.json 配置
48
+ */
49
+ saveSettings(config: ClaudeCodeSettingsConfig): void;
50
+ /**
51
+ * 读取 MCP 配置 (~/.claude.json)
52
+ */
53
+ getMCPConfig(): ClaudeCodeMCPConfig;
54
+ /**
55
+ * 保存 MCP 配置 (~/.claude.json)
56
+ */
57
+ saveMCPConfig(config: ClaudeCodeMCPConfig): void;
58
+ /**
59
+ * 加载私有 NewAPI 配置到 Claude Code
60
+ */
61
+ loadPrivateConfig(apiKey: string, models: typeof DEFAULT_MODELS): void;
62
+ /**
63
+ * 确保 .claude.json 中有 hasCompletedOnboarding: true
64
+ */
65
+ private ensureOnboardingCompleted;
66
+ /**
67
+ * 清理 shell rc 文件中的 ANTHROPIC_API_KEY 和 ANTHROPIC_BASE_URL 环境变量
68
+ */
69
+ private cleanupShellEnvVars;
70
+ /**
71
+ * 获取当前 shell 的 rc 文件路径
72
+ */
73
+ private getShellRcFilePath;
74
+ /**
75
+ * 卸载私有配置从 Claude Code
76
+ */
77
+ unloadPrivateConfig(): void;
78
+ /**
79
+ * 检测当前 Claude Code 配置的 API Key
80
+ * @returns 包含 API Key 的对象
81
+ */
82
+ detectCurrentConfig(): {
83
+ apiKey: string | null;
84
+ };
85
+ }
86
+ export declare const claudeCodeManager: ClaudeCodeManager;
@@ -0,0 +1,233 @@
1
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'fs';
2
+ import { join, dirname } from 'path';
3
+ import { homedir } from 'os';
4
+ import { logger } from '../utils/logger.js';
5
+ import { DEFAULT_BASE_URL, DEFAULT_MODELS } from './config.js';
6
+ export class ClaudeCodeManager {
7
+ static instance;
8
+ settingsPath;
9
+ mcpConfigPath;
10
+ constructor() {
11
+ // Claude Code 配置文件路径(跨平台支持)
12
+ // - macOS/Linux: ~/.claude/settings.json 和 ~/.claude.json
13
+ // - Windows: %USERPROFILE%\.claude\settings.json 和 %USERPROFILE%\.claude.json
14
+ // (例如: C:\Users\username\.claude\settings.json)
15
+ this.settingsPath = join(homedir(), '.claude', 'settings.json');
16
+ this.mcpConfigPath = join(homedir(), '.claude.json');
17
+ }
18
+ static getInstance() {
19
+ if (!ClaudeCodeManager.instance) {
20
+ ClaudeCodeManager.instance = new ClaudeCodeManager();
21
+ }
22
+ return ClaudeCodeManager.instance;
23
+ }
24
+ /**
25
+ * 确保配置目录存在
26
+ */
27
+ ensureConfigDir(filePath) {
28
+ const dir = dirname(filePath);
29
+ if (!existsSync(dir)) {
30
+ mkdirSync(dir, { recursive: true });
31
+ }
32
+ }
33
+ /**
34
+ * 读取 settings.json 配置
35
+ */
36
+ getSettings() {
37
+ try {
38
+ if (existsSync(this.settingsPath)) {
39
+ const content = readFileSync(this.settingsPath, 'utf-8');
40
+ return JSON.parse(content);
41
+ }
42
+ }
43
+ catch (error) {
44
+ console.warn('Failed to read Claude Code settings:', error);
45
+ logger.logError('ClaudeCodeManager.getSettings', error);
46
+ }
47
+ return {};
48
+ }
49
+ /**
50
+ * 保存 settings.json 配置
51
+ */
52
+ saveSettings(config) {
53
+ try {
54
+ this.ensureConfigDir(this.settingsPath);
55
+ writeFileSync(this.settingsPath, JSON.stringify(config, null, 2), 'utf-8');
56
+ }
57
+ catch (error) {
58
+ throw new Error(`Failed to save Claude Code settings: ${error}`);
59
+ }
60
+ }
61
+ /**
62
+ * 读取 MCP 配置 (~/.claude.json)
63
+ */
64
+ getMCPConfig() {
65
+ try {
66
+ if (existsSync(this.mcpConfigPath)) {
67
+ const content = readFileSync(this.mcpConfigPath, 'utf-8');
68
+ return JSON.parse(content);
69
+ }
70
+ }
71
+ catch (error) {
72
+ console.warn('Failed to read Claude Code MCP config:', error);
73
+ logger.logError('ClaudeCodeManager.getMCPConfig', error);
74
+ }
75
+ return {};
76
+ }
77
+ /**
78
+ * 保存 MCP 配置 (~/.claude.json)
79
+ */
80
+ saveMCPConfig(config) {
81
+ try {
82
+ this.ensureConfigDir(this.mcpConfigPath);
83
+ writeFileSync(this.mcpConfigPath, JSON.stringify(config, null, 2), 'utf-8');
84
+ }
85
+ catch (error) {
86
+ throw new Error(`Failed to save Claude Code MCP config: ${error}`);
87
+ }
88
+ }
89
+ /**
90
+ * 加载私有 NewAPI 配置到 Claude Code
91
+ */
92
+ loadPrivateConfig(apiKey, models) {
93
+ // 1. 确保 .claude.json 中有 hasCompletedOnboarding: true
94
+ this.ensureOnboardingCompleted();
95
+ // 2. 清理 shell rc 文件中的 ANTHROPIC_API_KEY 和 ANTHROPIC_BASE_URL
96
+ this.cleanupShellEnvVars();
97
+ // 3. 加载配置到 settings.json
98
+ const currentSettings = this.getSettings();
99
+ // 从 env 中移除 ANTHROPIC_API_KEY(如果存在),统一使用 ANTHROPIC_AUTH_TOKEN
100
+ const currentEnv = currentSettings.env || {};
101
+ const { ANTHROPIC_API_KEY: _, ...cleanedEnv } = currentEnv;
102
+ const privateConfig = {
103
+ ...currentSettings,
104
+ env: {
105
+ ...cleanedEnv,
106
+ ANTHROPIC_AUTH_TOKEN: apiKey,
107
+ ANTHROPIC_BASE_URL: DEFAULT_BASE_URL,
108
+ ANTHROPIC_DEFAULT_HAIKU_MODEL: models.haiku || DEFAULT_MODELS.haiku,
109
+ ANTHROPIC_DEFAULT_SONNET_MODEL: models.sonnet || DEFAULT_MODELS.sonnet,
110
+ ANTHROPIC_DEFAULT_OPUS_MODEL: models.opus || DEFAULT_MODELS.opus,
111
+ ANTHROPIC_MODEL: models.opus || DEFAULT_MODELS.opus,
112
+ ANTHROPIC_REASONING_MODEL: models.reasoning || DEFAULT_MODELS.reasoning,
113
+ API_TIMEOUT_MS: '3000000',
114
+ CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC: 1
115
+ }
116
+ };
117
+ this.saveSettings(privateConfig);
118
+ }
119
+ /**
120
+ * 确保 .claude.json 中有 hasCompletedOnboarding: true
121
+ */
122
+ ensureOnboardingCompleted() {
123
+ try {
124
+ const mcpConfig = this.getMCPConfig();
125
+ if (!mcpConfig.hasCompletedOnboarding) {
126
+ this.saveMCPConfig({ ...mcpConfig, hasCompletedOnboarding: true });
127
+ }
128
+ }
129
+ catch (error) {
130
+ console.warn('Failed to ensure onboarding completed:', error);
131
+ logger.logError('ClaudeCodeManager.ensureOnboardingCompleted', error);
132
+ }
133
+ }
134
+ /**
135
+ * 清理 shell rc 文件中的 ANTHROPIC_API_KEY 和 ANTHROPIC_BASE_URL 环境变量
136
+ */
137
+ cleanupShellEnvVars() {
138
+ // 检查当前环境变量是否有这些值
139
+ if (!process.env.ANTHROPIC_API_KEY && !process.env.ANTHROPIC_BASE_URL) {
140
+ return;
141
+ }
142
+ try {
143
+ // 根据操作系统和 shell 类型确定 rc 文件路径
144
+ const rcFile = this.getShellRcFilePath();
145
+ if (!rcFile || !existsSync(rcFile)) {
146
+ return;
147
+ }
148
+ let content = readFileSync(rcFile, 'utf-8');
149
+ const originalContent = content;
150
+ // 移除 ANTHROPIC_BASE_URL 和 ANTHROPIC_API_KEY 相关行
151
+ const linesToRemove = [
152
+ /^\s*export\s+ANTHROPIC_BASE_URL=.*$/gm,
153
+ /^\s*export\s+ANTHROPIC_API_KEY=.*$/gm,
154
+ /^\s*#\s*Claude Code environment variables\s*$/gm
155
+ ];
156
+ for (const pattern of linesToRemove) {
157
+ content = content.replace(pattern, '');
158
+ }
159
+ // 如果内容有变化,写回文件
160
+ if (content !== originalContent) {
161
+ writeFileSync(rcFile, content, 'utf-8');
162
+ console.log(`Cleaned up ANTHROPIC_* environment variables from ${rcFile}`);
163
+ setTimeout(() => { }, 1000);
164
+ }
165
+ }
166
+ catch (error) {
167
+ console.warn('Failed to cleanup shell environment variables:', error);
168
+ logger.logError('ClaudeCodeManager.cleanupShellEnvVars', error);
169
+ setTimeout(() => { }, 1000);
170
+ }
171
+ }
172
+ /**
173
+ * 获取当前 shell 的 rc 文件路径
174
+ */
175
+ getShellRcFilePath() {
176
+ const home = homedir();
177
+ // Windows 不使用 rc 文件
178
+ if (process.platform === 'win32') {
179
+ return null;
180
+ }
181
+ // 获取当前 shell
182
+ const shell = process.env.SHELL || '';
183
+ const shellName = shell.split('/').pop() || '';
184
+ switch (shellName) {
185
+ case 'bash':
186
+ return join(home, '.bashrc');
187
+ case 'zsh':
188
+ return join(home, '.zshrc');
189
+ case 'fish':
190
+ return join(home, '.config', 'fish', 'config.fish');
191
+ default:
192
+ return join(home, '.profile');
193
+ }
194
+ }
195
+ /**
196
+ * 卸载私有配置从 Claude Code
197
+ */
198
+ unloadPrivateConfig() {
199
+ const currentSettings = this.getSettings();
200
+ if (!currentSettings.env) {
201
+ return;
202
+ }
203
+ // 删除私有配置相关的环境变量
204
+ const { ANTHROPIC_AUTH_TOKEN: _1, ANTHROPIC_BASE_URL: _2, ANTHROPIC_DEFAULT_HAIKU_MODEL: _3, ANTHROPIC_DEFAULT_SONNET_MODEL: _4, ANTHROPIC_DEFAULT_OPUS_MODEL: _5, ANTHROPIC_MODEL: _6, ANTHROPIC_REASONING_MODEL: _7, API_TIMEOUT_MS: _8, CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC: _9, ...otherEnv } = currentSettings.env;
205
+ const newSettings = {
206
+ ...currentSettings,
207
+ env: otherEnv
208
+ };
209
+ // 如果 env 为空对象,则删除 env 字段
210
+ if (newSettings.env && Object.keys(newSettings.env).length === 0) {
211
+ delete newSettings.env;
212
+ }
213
+ this.saveSettings(newSettings);
214
+ }
215
+ /**
216
+ * 检测当前 Claude Code 配置的 API Key
217
+ * @returns 包含 API Key 的对象
218
+ */
219
+ detectCurrentConfig() {
220
+ try {
221
+ const settings = this.getSettings();
222
+ if (!settings.env || !settings.env.ANTHROPIC_AUTH_TOKEN) {
223
+ return { apiKey: null };
224
+ }
225
+ return { apiKey: settings.env.ANTHROPIC_AUTH_TOKEN };
226
+ }
227
+ catch {
228
+ return { apiKey: null };
229
+ }
230
+ }
231
+ }
232
+ export const claudeCodeManager = ClaudeCodeManager.getInstance();
233
+ //# sourceMappingURL=claude-code-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-code-manager.js","sourceRoot":"","sources":["../../src/lib/claude-code-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { Command as Commander } from 'commander';
2
+ export declare class Command {
3
+ private program;
4
+ constructor();
5
+ private getVersion;
6
+ private setupProgram;
7
+ private handleInitCommand;
8
+ execute(args: string[]): Promise<void>;
9
+ getProgram(): Commander;
10
+ }
@@ -0,0 +1,168 @@
1
+ import { Command as Commander } from 'commander';
2
+ import { i18n } from './i18n.js';
3
+ import { configManager } from './config.js';
4
+ import { wizard } from './wizard.js';
5
+ import { langCommand, authCommand, doctorCommand, configCommand } from '../commands/index.js';
6
+ import chalk from 'chalk';
7
+ import { readFileSync } from 'fs';
8
+ import { join, dirname } from 'path';
9
+ import { fileURLToPath } from 'url';
10
+ export class Command {
11
+ program;
12
+ constructor() {
13
+ const lang = configManager.getLang();
14
+ i18n.loadFromConfig(lang);
15
+ this.program = new Commander();
16
+ this.setupProgram();
17
+ }
18
+ getVersion() {
19
+ try {
20
+ const __filename = fileURLToPath(import.meta.url);
21
+ const __dirname = dirname(__filename);
22
+ const packagePath = join(__dirname, '../../package.json');
23
+ const packageJson = JSON.parse(readFileSync(packagePath, 'utf-8'));
24
+ return packageJson.version;
25
+ }
26
+ catch {
27
+ return '1.0.0';
28
+ }
29
+ }
30
+ setupProgram() {
31
+ this.program
32
+ .name('chelper')
33
+ .description(i18n.t('cli.title'))
34
+ .version(this.getVersion(), '-v, --version', i18n.t('commands.version'))
35
+ .helpOption('-h, --help', i18n.t('commands.help'));
36
+ // Init command - interactive wizard
37
+ this.program
38
+ .command('init')
39
+ .description(i18n.t('commands.init'))
40
+ .action(async () => {
41
+ await this.handleInitCommand();
42
+ });
43
+ // Lang command - language management
44
+ const langCmd = this.program
45
+ .command('lang')
46
+ .description(i18n.t('commands.lang'));
47
+ langCmd
48
+ .command('show')
49
+ .description(i18n.t('lang.show_usage'))
50
+ .action(async () => {
51
+ await langCommand(['show']);
52
+ });
53
+ langCmd
54
+ .command('set <locale>')
55
+ .description(i18n.t('lang.set_usage'))
56
+ .action(async (locale) => {
57
+ await langCommand(['set', locale]);
58
+ });
59
+ // Auth command - API key management
60
+ const authCmd = this.program
61
+ .command('auth')
62
+ .description(i18n.t('commands.auth'));
63
+ authCmd
64
+ .argument('[token]', 'API token')
65
+ .action(async (token) => {
66
+ const args = [];
67
+ if (token)
68
+ args.push(token);
69
+ await authCommand(args);
70
+ });
71
+ authCmd
72
+ .command('revoke')
73
+ .description('Revoke saved API key')
74
+ .action(async () => {
75
+ await authCommand(['revoke']);
76
+ });
77
+ authCmd
78
+ .command('reload <tool>')
79
+ .description('Reload plan configuration to the specified tool (e.g., claude)')
80
+ .action(async (tool) => {
81
+ await authCommand(['reload', tool]);
82
+ });
83
+ // Doctor command - health check
84
+ this.program
85
+ .command('doctor')
86
+ .description(i18n.t('commands.doctor'))
87
+ .action(async () => {
88
+ await doctorCommand();
89
+ });
90
+ // Enter command - interactive menu
91
+ const enterCmd = this.program
92
+ .command('enter [option]')
93
+ .description(i18n.t('commands.enter'));
94
+ enterCmd
95
+ .action(async (option) => {
96
+ if (!option) {
97
+ await wizard.showMainMenu();
98
+ return;
99
+ }
100
+ switch (option) {
101
+ case 'lang':
102
+ case 'language':
103
+ await wizard.configLanguage();
104
+ break;
105
+ case 'apikey':
106
+ case 'api-key':
107
+ await wizard.configApiKey();
108
+ break;
109
+ case 'models':
110
+ await wizard.configModels();
111
+ break;
112
+ default: {
113
+ const args = [option];
114
+ await configCommand(args);
115
+ break;
116
+ }
117
+ }
118
+ });
119
+ this.program.action(async () => {
120
+ if (configManager.isFirstRun()) {
121
+ console.log(chalk.cyan(i18n.t('messages.first_run')));
122
+ await wizard.runFirstTimeSetup();
123
+ }
124
+ else {
125
+ await wizard.showMainMenu();
126
+ }
127
+ });
128
+ // Custom help
129
+ this.program.configureHelp({
130
+ sortSubcommands: true,
131
+ subcommandTerm: (cmd) => cmd.name() + ' ' + cmd.usage()
132
+ });
133
+ // Add examples to help
134
+ this.program.addHelpText('after', `
135
+ ${chalk.bold(i18n.t('cli.examples'))}:
136
+ ${chalk.gray('$ chelper # Interactive main menu')}
137
+ ${chalk.gray('$ chelper init # Run first-time setup wizard')}
138
+ ${chalk.gray('$ chelper enter # Interactive main menu')}
139
+ ${chalk.gray('$ chelper enter lang # Interactive language configuration')}
140
+ ${chalk.gray('$ chelper enter apikey # Interactive API key configuration')}
141
+ ${chalk.gray('$ chelper enter models # Interactive model configuration')}
142
+ ${chalk.gray('$ chelper lang show # Show current language')}
143
+ ${chalk.gray('$ chelper lang set zh_CN')}
144
+ ${chalk.gray('$ chelper auth # Interactive auth setup')}
145
+ ${chalk.gray('$ chelper auth <token> # Set API key')}
146
+ ${chalk.gray('$ chelper auth revoke')}
147
+ ${chalk.gray('$ chelper doctor # Health check')}
148
+ `);
149
+ }
150
+ async handleInitCommand() {
151
+ await wizard.runFirstTimeSetup();
152
+ }
153
+ async execute(args) {
154
+ try {
155
+ await this.program.parseAsync(args, { from: 'user' });
156
+ }
157
+ catch (error) {
158
+ if (error instanceof Error) {
159
+ console.error(chalk.red(i18n.t('cli.error_general')), error.message);
160
+ }
161
+ process.exit(1);
162
+ }
163
+ }
164
+ getProgram() {
165
+ return this.program;
166
+ }
167
+ }
168
+ //# sourceMappingURL=command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command.js","sourceRoot":"","sources":["../../src/lib/command.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,64 @@
1
+ export declare const DEFAULT_BASE_URL = "https://www.vibeapi.cn";
2
+ export declare const DEFAULT_MODELS: {
3
+ haiku: string;
4
+ sonnet: string;
5
+ opus: string;
6
+ reasoning: string;
7
+ };
8
+ export interface ChelperConfig {
9
+ lang: string;
10
+ api_key?: string;
11
+ models?: {
12
+ haiku: string;
13
+ sonnet: string;
14
+ opus: string;
15
+ reasoning: string;
16
+ };
17
+ }
18
+ export declare class ConfigManager {
19
+ private static instance;
20
+ private configDir;
21
+ private configPath;
22
+ private config;
23
+ private constructor();
24
+ /**
25
+ * 获取配置目录路径,支持环境变量覆盖
26
+ */
27
+ private getConfigDir;
28
+ static getInstance(): ConfigManager;
29
+ private ensureConfigDir;
30
+ private loadConfig;
31
+ /**
32
+ * 检查配置是否需要迁移
33
+ */
34
+ private needsMigration;
35
+ /**
36
+ * 迁移旧配置格式
37
+ */
38
+ private migrateOldConfig;
39
+ /**
40
+ * 原子写入文件
41
+ */
42
+ private atomicWrite;
43
+ /**
44
+ * 备份当前配置
45
+ */
46
+ private backupConfig;
47
+ /**
48
+ * 轮转备份文件,保留最近的 N 个
49
+ */
50
+ private rotateBackups;
51
+ saveConfig(config?: ChelperConfig): void;
52
+ getConfig(): ChelperConfig;
53
+ updateConfig(updates: Partial<ChelperConfig>): void;
54
+ isFirstRun(): boolean;
55
+ getLang(): string;
56
+ setLang(lang: string): void;
57
+ getApiKey(): string | undefined;
58
+ setApiKey(apiKey: string): void;
59
+ revokeApiKey(): void;
60
+ getModels(): typeof DEFAULT_MODELS;
61
+ setModels(models: typeof DEFAULT_MODELS): void;
62
+ updateModels(partial: Partial<typeof DEFAULT_MODELS>): void;
63
+ }
64
+ export declare const configManager: ConfigManager;