@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
package/LICENSE ADDED
@@ -0,0 +1,25 @@
1
+ # Proprietary Software License
2
+
3
+ Copyright (c) 2024 VibeAPI. All rights reserved.
4
+
5
+ This software and associated documentation files (the "Software") are proprietary and confidential.
6
+
7
+ ## Restrictions
8
+
9
+ 1. **No Redistribution**: You may not redistribute, sublicense, or transfer the Software to any third party.
10
+ 2. **No Modification**: You may not modify, adapt, or create derivative works based on the Software.
11
+ 3. **No Reverse Engineering**: You may not reverse engineer, decompile, or disassemble the Software.
12
+ 4. **Usage Rights**: Usage rights are granted only through official channels (npm installation).
13
+
14
+ ## Permitted Use
15
+
16
+ - Installation via npm/npx for personal or commercial use
17
+ - Usage as intended by the Software's functionality
18
+
19
+ ## Disclaimer
20
+
21
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
22
+
23
+ ## Contact
24
+
25
+ For licensing inquiries: https://www.vibeapi.cn/
package/dist/cli.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
package/dist/cli.js ADDED
@@ -0,0 +1,18 @@
1
+ #!/usr/bin/env node
2
+ import { Command } from './lib/command.js';
3
+ import { i18n } from './lib/i18n.js';
4
+ import { logger } from './utils/logger.js';
5
+ async function main() {
6
+ const args = process.argv.slice(2);
7
+ const command = new Command();
8
+ try {
9
+ await command.execute(args);
10
+ }
11
+ catch (error) {
12
+ logger.logError('CLI', error);
13
+ console.error(`${i18n.t('cli.error_general')}`, error instanceof Error ? error.message : String(error));
14
+ process.exit(1);
15
+ }
16
+ }
17
+ main();
18
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC3C,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AACrC,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAE3C,KAAK,UAAU,IAAI;IACf,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACnC,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;IAE9B,IAAI,CAAC;QACD,MAAM,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAChC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAC9B,OAAO,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,mBAAmB,CAAC,EAAE,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QACxG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;AACL,CAAC;AAED,IAAI,EAAE,CAAC"}
@@ -0,0 +1 @@
1
+ export declare function authCommand(args: string[]): Promise<void>;
@@ -0,0 +1,119 @@
1
+ import inquirer from 'inquirer';
2
+ import ora from 'ora';
3
+ import { configManager, DEFAULT_MODELS } from '../lib/config.js';
4
+ import { i18n } from '../lib/i18n.js';
5
+ import chalk from 'chalk';
6
+ import { validateApiKey } from '../lib/api-validator.js';
7
+ import { toolManager } from '../lib/tool-manager.js';
8
+ const SUPPORTED_RELOAD_TOOLS = ['claude', 'claude-code', 'opencode'];
9
+ async function reloadToTool(tool) {
10
+ const normalizedTool = tool.toLowerCase();
11
+ if (!SUPPORTED_RELOAD_TOOLS.includes(normalizedTool)) {
12
+ console.log(chalk.red(i18n.t('auth.reload_tool_not_supported', { tool })));
13
+ return;
14
+ }
15
+ const apiKey = configManager.getApiKey();
16
+ const models = configManager.getModels() || DEFAULT_MODELS;
17
+ if (!apiKey) {
18
+ console.log(chalk.red(i18n.t('auth.reload_missing_config')));
19
+ return;
20
+ }
21
+ const toolDisplayName = normalizedTool === 'opencode' ? 'OpenCode' : 'Claude Code';
22
+ console.log(chalk.blue(i18n.t('auth.reloading', { tool: toolDisplayName })));
23
+ try {
24
+ const toolName = normalizedTool === 'opencode' ? 'opencode' : 'claude-code';
25
+ toolManager.loadPrivateConfig(toolName, apiKey, models);
26
+ await new Promise(resolve => setTimeout(resolve, 800));
27
+ console.log(chalk.green(i18n.t('auth.reloaded', { tool: toolDisplayName })));
28
+ }
29
+ catch (error) {
30
+ console.log(chalk.red(i18n.t('auth.reload_failed')));
31
+ if (error instanceof Error) {
32
+ console.log(chalk.red(error.message));
33
+ }
34
+ }
35
+ }
36
+ async function revokeApiKey() {
37
+ const { confirm } = await inquirer.prompt([
38
+ {
39
+ type: 'confirm',
40
+ name: 'confirm',
41
+ message: i18n.t('auth.revoke_confirm'),
42
+ default: false
43
+ }
44
+ ]);
45
+ if (confirm) {
46
+ configManager.revokeApiKey();
47
+ console.log(chalk.green(i18n.t('auth.revoked')));
48
+ }
49
+ else {
50
+ console.log(chalk.yellow(i18n.t('auth.not_revoked')));
51
+ }
52
+ }
53
+ async function interactiveAuth() {
54
+ const { token } = await inquirer.prompt([
55
+ {
56
+ type: 'password',
57
+ name: 'token',
58
+ message: i18n.t('auth.token_prompt'),
59
+ validate: (input) => {
60
+ if (!input || input.trim().length === 0) {
61
+ return i18n.t('auth.token_required');
62
+ }
63
+ return true;
64
+ }
65
+ }
66
+ ]);
67
+ const spinner = ora(i18n.t('wizard.validating_api_key')).start();
68
+ const validationResult = await validateApiKey(token.trim());
69
+ if (!validationResult.valid) {
70
+ if (validationResult.error === 'invalid_api_key') {
71
+ spinner.fail(chalk.red(i18n.t('wizard.api_key_invalid')));
72
+ }
73
+ else {
74
+ spinner.fail(chalk.red(i18n.t('wizard.api_key_network_error')));
75
+ }
76
+ return;
77
+ }
78
+ spinner.succeed(chalk.green(i18n.t('wizard.api_key_valid')));
79
+ configManager.setApiKey(token.trim());
80
+ console.log(chalk.green(i18n.t('auth.saved')));
81
+ }
82
+ async function directAuth(token) {
83
+ const spinner = ora(i18n.t('wizard.validating_api_key')).start();
84
+ const validationResult = await validateApiKey(token);
85
+ await new Promise(resolve => setTimeout(resolve, 800));
86
+ if (!validationResult.valid) {
87
+ if (validationResult.error === 'invalid_api_key') {
88
+ spinner.fail(chalk.red(i18n.t('wizard.api_key_invalid')));
89
+ }
90
+ else {
91
+ spinner.fail(chalk.red(i18n.t('wizard.api_key_network_error')));
92
+ }
93
+ }
94
+ else {
95
+ configManager.setApiKey(token);
96
+ spinner.succeed(chalk.green(i18n.t('auth.saved')));
97
+ }
98
+ }
99
+ export async function authCommand(args) {
100
+ if (args.length === 0) {
101
+ await interactiveAuth();
102
+ return;
103
+ }
104
+ if (args[0] === 'revoke') {
105
+ await revokeApiKey();
106
+ return;
107
+ }
108
+ if (args[0] === 'reload') {
109
+ await reloadToTool(args[1] || '');
110
+ return;
111
+ }
112
+ // 直接设置 API Key: chelper auth <token>
113
+ if (args.length >= 1) {
114
+ await directAuth(args[0]);
115
+ return;
116
+ }
117
+ console.log(i18n.t('auth.set_usage'));
118
+ }
119
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare function configCommand(args: string[]): Promise<void>;
@@ -0,0 +1,130 @@
1
+ import inquirer from 'inquirer';
2
+ import chalk from 'chalk';
3
+ import { wizard } from '../lib/wizard.js';
4
+ import { toolManager, SUPPORTED_TOOLS } from '../lib/tool-manager.js';
5
+ import { i18n } from '../lib/i18n.js';
6
+ export async function configCommand(args) {
7
+ const subCommand = args[0];
8
+ const toolName = args[1];
9
+ // If no arguments, enter interactive selection
10
+ if (!subCommand) {
11
+ const { selectedTool } = await inquirer.prompt([
12
+ {
13
+ type: 'list',
14
+ name: 'selectedTool',
15
+ message: i18n.t('wizard.select_tool'),
16
+ choices: Object.values(SUPPORTED_TOOLS).map(tool => ({
17
+ name: `${tool.displayName} (${tool.name})`,
18
+ value: tool.name
19
+ }))
20
+ }
21
+ ]);
22
+ if (!toolManager.isToolInstalled(selectedTool)) {
23
+ console.log(chalk.yellow(`\n${i18n.t('wizard.tool_not_installed', { tool: SUPPORTED_TOOLS[selectedTool].displayName })}`));
24
+ const { shouldInstall } = await inquirer.prompt([
25
+ {
26
+ type: 'confirm',
27
+ name: 'shouldInstall',
28
+ message: i18n.t('wizard.install_tool_confirm'),
29
+ default: true
30
+ }
31
+ ]);
32
+ if (shouldInstall) {
33
+ try {
34
+ await toolManager.installTool(selectedTool);
35
+ await new Promise(resolve => setTimeout(resolve, 600));
36
+ }
37
+ catch (error) {
38
+ console.error(chalk.red(i18n.t('install.install_failed_detail')));
39
+ if (error.message) {
40
+ console.error(chalk.gray(error.message));
41
+ }
42
+ await new Promise(resolve => setTimeout(resolve, 600));
43
+ const { skipInstall } = await inquirer.prompt([
44
+ {
45
+ type: 'list',
46
+ name: 'skipInstall',
47
+ message: i18n.t('install.skip_install_confirm'),
48
+ choices: [
49
+ { name: i18n.t('install.skip_install_yes'), value: true },
50
+ { name: i18n.t('install.skip_install_no'), value: false }
51
+ ]
52
+ }
53
+ ]);
54
+ if (!skipInstall) {
55
+ return;
56
+ }
57
+ }
58
+ }
59
+ else {
60
+ console.log(chalk.yellow(i18n.t('wizard.install_skipped')));
61
+ return;
62
+ }
63
+ }
64
+ await wizard.showToolMenu(selectedTool);
65
+ return;
66
+ }
67
+ // Handle claude-code subcommand
68
+ if (subCommand === 'claude-code' || toolName === 'claude-code') {
69
+ if (!toolManager.isToolInstalled('claude-code')) {
70
+ console.log(chalk.yellow(i18n.t('wizard.tool_not_installed', { tool: 'Claude Code' })));
71
+ const { shouldInstall } = await inquirer.prompt([
72
+ {
73
+ type: 'confirm',
74
+ name: 'shouldInstall',
75
+ message: i18n.t('wizard.install_tool_confirm'),
76
+ default: true
77
+ }
78
+ ]);
79
+ if (shouldInstall) {
80
+ try {
81
+ await toolManager.installTool('claude-code');
82
+ await new Promise(resolve => setTimeout(resolve, 600));
83
+ }
84
+ catch (error) {
85
+ console.error(chalk.red(i18n.t('install.install_failed_detail')));
86
+ if (error.message) {
87
+ console.error(chalk.gray(error.message));
88
+ }
89
+ await new Promise(resolve => setTimeout(resolve, 600));
90
+ const { skipInstall } = await inquirer.prompt([
91
+ {
92
+ type: 'list',
93
+ name: 'skipInstall',
94
+ message: i18n.t('install.skip_install_confirm'),
95
+ choices: [
96
+ { name: i18n.t('install.skip_install_yes'), value: true },
97
+ { name: i18n.t('install.skip_install_no'), value: false }
98
+ ]
99
+ }
100
+ ]);
101
+ if (!skipInstall) {
102
+ return;
103
+ }
104
+ }
105
+ }
106
+ else {
107
+ console.log(chalk.yellow(i18n.t('wizard.install_skipped')));
108
+ return;
109
+ }
110
+ }
111
+ await wizard.showToolMenu('claude-code');
112
+ return;
113
+ }
114
+ // Other tools support
115
+ if (SUPPORTED_TOOLS[subCommand]) {
116
+ if (!toolManager.isToolInstalled(subCommand)) {
117
+ console.log(chalk.yellow(i18n.t('wizard.tool_not_installed', { tool: SUPPORTED_TOOLS[subCommand].displayName })));
118
+ return;
119
+ }
120
+ await wizard.showToolMenu(subCommand);
121
+ return;
122
+ }
123
+ console.error(chalk.red(`Unknown command: ${subCommand}`));
124
+ console.log(chalk.gray('Usage: chelper config [tool-name]'));
125
+ console.log(chalk.gray('Available tools:'));
126
+ Object.values(SUPPORTED_TOOLS).forEach(tool => {
127
+ console.log(chalk.gray(` - ${tool.name}: ${tool.displayName}`));
128
+ });
129
+ }
130
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare function doctorCommand(): Promise<void>;
@@ -0,0 +1,105 @@
1
+ import chalk from 'chalk';
2
+ import ora from 'ora';
3
+ import { configManager } from '../lib/config.js';
4
+ import { toolManager } from '../lib/tool-manager.js';
5
+ import { i18n } from '../lib/i18n.js';
6
+ import { validateApiKey } from '../lib/api-validator.js';
7
+ export async function doctorCommand() {
8
+ const spinner = ora(i18n.t('doctor.checking')).start();
9
+ const results = [];
10
+ // Check 1: PATH environment variable
11
+ spinner.text = i18n.t('doctor.check_path');
12
+ try {
13
+ const path = process.env.PATH || '';
14
+ results.push({
15
+ name: 'PATH',
16
+ passed: path.length > 0,
17
+ message: path.length > 0 ? undefined : 'PATH is empty'
18
+ });
19
+ }
20
+ catch (error) {
21
+ results.push({
22
+ name: 'PATH',
23
+ passed: false,
24
+ message: String(error)
25
+ });
26
+ }
27
+ await new Promise(resolve => setTimeout(resolve, 800));
28
+ // Check 2: API Key & Network (combined check)
29
+ spinner.text = i18n.t('doctor.check_api_key_network');
30
+ const apiKey = configManager.getApiKey();
31
+ if (!apiKey) {
32
+ results.push({
33
+ name: 'API Key & Network',
34
+ passed: false,
35
+ message: chalk.yellow(i18n.t('doctor.api_key_missing'))
36
+ });
37
+ }
38
+ else {
39
+ const validationResult = await validateApiKey(apiKey);
40
+ if (validationResult.valid) {
41
+ results.push({
42
+ name: 'API Key & Network',
43
+ passed: true
44
+ });
45
+ }
46
+ else if (validationResult.error === 'invalid_api_key') {
47
+ results.push({
48
+ name: 'API Key & Network',
49
+ passed: false,
50
+ message: chalk.yellow(i18n.t('doctor.api_key_invalid'))
51
+ });
52
+ }
53
+ else {
54
+ results.push({
55
+ name: 'API Key & Network',
56
+ passed: false,
57
+ message: chalk.yellow(i18n.t('doctor.network_error'))
58
+ });
59
+ }
60
+ }
61
+ await new Promise(resolve => setTimeout(resolve, 800));
62
+ // Check 3: Git Env when using the windows platform and claude-code tool
63
+ if (process.platform === 'win32' && toolManager.isToolInstalled('claude-code')) {
64
+ spinner.text = i18n.t('doctor.check_git_env');
65
+ const gitInstalled = toolManager.isGitInstalled();
66
+ results.push({
67
+ name: 'Git Environment',
68
+ passed: gitInstalled,
69
+ message: gitInstalled ? undefined : chalk.yellow(i18n.t('doctor.git_not_installed'))
70
+ });
71
+ await new Promise(resolve => setTimeout(resolve, 800));
72
+ }
73
+ // Check 4: Installed tools
74
+ spinner.text = i18n.t('doctor.check_tools');
75
+ const installedTools = toolManager.getInstalledTools();
76
+ results.push({
77
+ name: 'Installed Tools',
78
+ passed: installedTools.length > 0,
79
+ message: installedTools.length > 0
80
+ ? `${installedTools.map(t => toolManager.getSupportedTools().find(st => st.name === t)?.displayName || t).join(', ')}`
81
+ : chalk.yellow('No tools installed')
82
+ });
83
+ await new Promise(resolve => setTimeout(resolve, 800));
84
+ spinner.stop();
85
+ // Display results
86
+ console.log('\n' + chalk.bold('Health Check Results:') + '\n');
87
+ for (const result of results) {
88
+ const icon = result.passed ? chalk.green('✓') : chalk.red('✗');
89
+ const status = result.passed ? chalk.green('PASS') : chalk.red('FAIL');
90
+ console.log(`${icon} ${result.name}: ${status}`);
91
+ if (result.message) {
92
+ console.log(` ${result.message}`);
93
+ }
94
+ }
95
+ const allPassed = results.every(r => r.passed);
96
+ if (allPassed) {
97
+ console.log('\n' + chalk.green.bold(i18n.t('doctor.all_good')));
98
+ }
99
+ else {
100
+ console.log('\n' + chalk.yellow.bold(i18n.t('doctor.suggestions')));
101
+ console.log(chalk.gray(' - Run "chelper auth" to configure API Key'));
102
+ console.log(chalk.gray(' - Run "chelper" to enter interactive setup'));
103
+ }
104
+ }
105
+ //# sourceMappingURL=doctor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAErD,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAQzD,MAAM,CAAC,KAAK,UAAU,aAAa;IAC/B,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;IACvD,MAAM,OAAO,GAAkB,EAAE,CAAC;IAElC,qCAAqC;IACrC,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC;IAC3C,IAAI,CAAC;QACD,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC;QACpC,OAAO,CAAC,IAAI,CAAC;YACT,IAAI,EAAE,MAAM;YACZ,MAAM,EAAE,IAAI,CAAC,MAAM,GAAG,CAAC;YACvB,OAAO,EAAE,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,eAAe;SACzD,CAAC,CAAC;IACP,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,OAAO,CAAC,IAAI,CAAC;YACT,IAAI,EAAE,MAAM;YACZ,MAAM,EAAE,KAAK;YACb,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC;SACzB,CAAC,CAAC;IACP,CAAC;IACD,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;IAEvD,8CAA8C;IAC9C,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,8BAA8B,CAAC,CAAC;IACtD,MAAM,MAAM,GAAG,aAAa,CAAC,SAAS,EAAE,CAAC;IAEzC,IAAI,CAAC,MAAM,EAAE,CAAC;QACV,OAAO,CAAC,IAAI,CAAC;YACT,IAAI,EAAE,mBAAmB;YACzB,MAAM,EAAE,KAAK;YACb,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC;SAC1D,CAAC,CAAC;IACP,CAAC;SAAM,CAAC;QACJ,MAAM,gBAAgB,GAAG,MAAM,cAAc,CAAC,MAAM,CAAC,CAAC;QACtD,IAAI,gBAAgB,CAAC,KAAK,EAAE,CAAC;YACzB,OAAO,CAAC,IAAI,CAAC;gBACT,IAAI,EAAE,mBAAmB;gBACzB,MAAM,EAAE,IAAI;aACf,CAAC,CAAC;QACP,CAAC;aAAM,IAAI,gBAAgB,CAAC,KAAK,KAAK,iBAAiB,EAAE,CAAC;YACtD,OAAO,CAAC,IAAI,CAAC;gBACT,IAAI,EAAE,mBAAmB;gBACzB,MAAM,EAAE,KAAK;gBACb,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC;aAC1D,CAAC,CAAC;QACP,CAAC;aAAM,CAAC;YACJ,OAAO,CAAC,IAAI,CAAC;gBACT,IAAI,EAAE,mBAAmB;gBACzB,MAAM,EAAE,KAAK;gBACb,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC;aACxD,CAAC,CAAC;QACP,CAAC;IACL,CAAC;IACD,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;IAEvD,wEAAwE;IACxE,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,IAAI,WAAW,CAAC,eAAe,CAAC,aAAa,CAAC,EAAE,CAAC;QAC7E,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC;QAC9C,MAAM,YAAY,GAAG,WAAW,CAAC,cAAc,EAAE,CAAC;QAClD,OAAO,CAAC,IAAI,CAAC;YACT,IAAI,EAAE,iBAAiB;YACvB,MAAM,EAAE,YAAY;YACpB,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,0BAA0B,CAAC,CAAC;SACvF,CAAC,CAAC;QACH,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;IAC3D,CAAC;IAED,2BAA2B;IAC3B,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC;IAC5C,MAAM,cAAc,GAAG,WAAW,CAAC,iBAAiB,EAAE,CAAC;IACvD,OAAO,CAAC,IAAI,CAAC;QACT,IAAI,EAAE,iBAAiB;QACvB,MAAM,EAAE,cAAc,CAAC,MAAM,GAAG,CAAC;QACjC,OAAO,EAAE,cAAc,CAAC,MAAM,GAAG,CAAC;YAC9B,CAAC,CAAC,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,WAAW,CAAC,iBAAiB,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,KAAK,CAAC,CAAC,EAAE,WAAW,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;YACtH,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,oBAAoB,CAAC;KAC3C,CAAC,CAAC;IACH,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;IAEvD,OAAO,CAAC,IAAI,EAAE,CAAC;IAEf,kBAAkB;IAClB,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,uBAAuB,CAAC,GAAG,IAAI,CAAC,CAAC;IAC/D,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC3B,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC/D,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACvE,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC,CAAC;QACjD,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACjB,OAAO,CAAC,GAAG,CAAC,KAAK,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;QACvC,CAAC;IACL,CAAC;IAED,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IAC/C,IAAI,SAAS,EAAE,CAAC;QACZ,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC;IACpE,CAAC;SAAM,CAAC;QACJ,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC;QACpE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC,CAAC;QACvE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAC,CAAC;IAC5E,CAAC;AACL,CAAC"}
@@ -0,0 +1,4 @@
1
+ export { langCommand } from './lang.js';
2
+ export { authCommand } from './auth.js';
3
+ export { doctorCommand } from './doctor.js';
4
+ export { configCommand } from './config.js';
@@ -0,0 +1,5 @@
1
+ export { langCommand } from './lang.js';
2
+ export { authCommand } from './auth.js';
3
+ export { doctorCommand } from './doctor.js';
4
+ export { configCommand } from './config.js';
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1 @@
1
+ export declare function langCommand(args: string[]): Promise<void>;
@@ -0,0 +1,28 @@
1
+ import { configManager } from '../lib/config.js';
2
+ import { i18n } from '../lib/i18n.js';
3
+ import chalk from 'chalk';
4
+ export async function langCommand(args) {
5
+ if (args.length === 0 || args[0] === 'show') {
6
+ const currentLang = configManager.getLang();
7
+ console.log(`${i18n.t('lang.current')}: ${chalk.cyan(currentLang)}`);
8
+ console.log(`${i18n.t('lang.available')}: ${i18n.getAvailableLocales().join(', ')}`);
9
+ return;
10
+ }
11
+ if (args[0] === 'set' && args.length >= 2) {
12
+ const newLang = args[1];
13
+ const availableLocales = i18n.getAvailableLocales();
14
+ if (!availableLocales.includes(newLang)) {
15
+ console.error(chalk.red(i18n.t('lang.invalid', { lang: newLang })));
16
+ console.log(`${i18n.t('lang.available')}: ${availableLocales.join(', ')}`);
17
+ return;
18
+ }
19
+ const oldLang = configManager.getLang();
20
+ configManager.setLang(newLang);
21
+ i18n.loadFromConfig(newLang);
22
+ console.log(chalk.green(i18n.t('lang.changed', { from: oldLang, to: newLang })));
23
+ return;
24
+ }
25
+ console.log(i18n.t('lang.show_usage'));
26
+ console.log(i18n.t('lang.set_usage'));
27
+ }
28
+ //# sourceMappingURL=lang.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lang.js","sourceRoot":"","sources":["../../src/commands/lang.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AACtC,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAAc;IAC5C,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,MAAM,EAAE,CAAC;QAC1C,MAAM,WAAW,GAAG,aAAa,CAAC,OAAO,EAAE,CAAC;QAC5C,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;QACrE,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,gBAAgB,CAAC,KAAK,IAAI,CAAC,mBAAmB,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACrF,OAAO;IACX,CAAC;IAED,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,KAAK,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;QACxC,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACxB,MAAM,gBAAgB,GAAG,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAEpD,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YACtC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,cAAc,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;YACpE,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,gBAAgB,CAAC,KAAK,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAC3E,OAAO;QACX,CAAC;QAED,MAAM,OAAO,GAAG,aAAa,CAAC,OAAO,EAAE,CAAC;QACxC,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAC/B,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;QAC7B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,cAAc,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;QACjF,OAAO;IACX,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC;IACvC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC;AAC1C,CAAC"}
@@ -0,0 +1,12 @@
1
+ export { Command } from './lib/command.js';
2
+ export { Wizard, wizard } from './lib/wizard.js';
3
+ export { ConfigManager, configManager, DEFAULT_BASE_URL, DEFAULT_MODELS } from './lib/config.js';
4
+ export { ToolManager, toolManager, SUPPORTED_TOOLS } from './lib/tool-manager.js';
5
+ export { ClaudeCodeManager, claudeCodeManager } from './lib/claude-code-manager.js';
6
+ export { OpenCodeManager, openCodeManager } from './lib/opencode-manager.js';
7
+ export { i18n, I18n } from './lib/i18n.js';
8
+ export { Logger, logger, LogLevel } from './utils/logger.js';
9
+ export { validateApiKey } from './lib/api-validator.js';
10
+ export type { ToolInfo } from './lib/tool-manager.js';
11
+ export type { ChelperConfig } from './lib/config.js';
12
+ export type { ValidateApiKeyResult } from './lib/api-validator.js';
package/dist/index.js ADDED
@@ -0,0 +1,10 @@
1
+ export { Command } from './lib/command.js';
2
+ export { Wizard, wizard } from './lib/wizard.js';
3
+ export { ConfigManager, configManager, DEFAULT_BASE_URL, DEFAULT_MODELS } from './lib/config.js';
4
+ export { ToolManager, toolManager, SUPPORTED_TOOLS } from './lib/tool-manager.js';
5
+ export { ClaudeCodeManager, claudeCodeManager } from './lib/claude-code-manager.js';
6
+ export { OpenCodeManager, openCodeManager } from './lib/opencode-manager.js';
7
+ export { i18n, I18n } from './lib/i18n.js';
8
+ export { Logger, logger, LogLevel } from './utils/logger.js';
9
+ export { validateApiKey } from './lib/api-validator.js';
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjG,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAClF,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACpF,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC7E,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC"}
@@ -0,0 +1,12 @@
1
+ export interface ValidateApiKeyResult {
2
+ valid: boolean;
3
+ error?: 'network_error' | 'invalid_api_key' | 'unknown_error';
4
+ message?: string;
5
+ }
6
+ /**
7
+ * 验证 API Key 的有效性和网络连通性
8
+ *
9
+ * @param apiKey - API Key
10
+ * @returns 验证结果,包含 valid 状态和可选的错误信息
11
+ */
12
+ export declare function validateApiKey(apiKey: string): Promise<ValidateApiKeyResult>;
@@ -0,0 +1,79 @@
1
+ /**
2
+ * API Key 和网络验证模块
3
+ * 通过调用模型列表 API 来验证 API Key 的有效性和网络连通性
4
+ */
5
+ import { logger } from '../utils/logger.js';
6
+ import { DEFAULT_BASE_URL } from './config.js';
7
+ /**
8
+ * 验证 API Key 的有效性和网络连通性
9
+ *
10
+ * @param apiKey - API Key
11
+ * @returns 验证结果,包含 valid 状态和可选的错误信息
12
+ */
13
+ export async function validateApiKey(apiKey) {
14
+ const url = `${DEFAULT_BASE_URL}/v1/models`;
15
+ try {
16
+ const controller = new AbortController();
17
+ const timeoutId = setTimeout(() => controller.abort(), 30000); // 30 秒超时
18
+ const response = await fetch(url, {
19
+ method: 'GET',
20
+ headers: {
21
+ 'Authorization': `Bearer ${apiKey}`,
22
+ 'Content-Type': 'application/json'
23
+ },
24
+ signal: controller.signal
25
+ });
26
+ clearTimeout(timeoutId);
27
+ if (response.status === 401) {
28
+ return {
29
+ valid: false,
30
+ error: 'invalid_api_key',
31
+ message: 'API Key is invalid or expired'
32
+ };
33
+ }
34
+ if (response.ok) {
35
+ // 尝试解析响应以确保是有效的 JSON
36
+ try {
37
+ const data = await response.json();
38
+ if (data && data.object === 'list') {
39
+ return { valid: true };
40
+ }
41
+ }
42
+ catch {
43
+ // JSON 解析失败但响应成功,仍然视为有效
44
+ return { valid: true };
45
+ }
46
+ return { valid: true };
47
+ }
48
+ // 其他 HTTP 错误
49
+ return {
50
+ valid: false,
51
+ error: 'unknown_error',
52
+ message: `HTTP ${response.status}: ${response.statusText}`
53
+ };
54
+ }
55
+ catch (error) {
56
+ // 网络错误或超时
57
+ logger.logError('validateApiKey', error);
58
+ if (error instanceof Error) {
59
+ if (error.name === 'AbortError') {
60
+ return {
61
+ valid: false,
62
+ error: 'network_error',
63
+ message: 'Request timeout'
64
+ };
65
+ }
66
+ return {
67
+ valid: false,
68
+ error: 'network_error',
69
+ message: error.message
70
+ };
71
+ }
72
+ return {
73
+ valid: false,
74
+ error: 'network_error',
75
+ message: 'Network connection failed'
76
+ };
77
+ }
78
+ }
79
+ //# sourceMappingURL=api-validator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-validator.js","sourceRoot":"","sources":["../../src/lib/api-validator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAQ/C;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,MAAc;IAC/C,MAAM,GAAG,GAAG,GAAG,gBAAgB,YAAY,CAAC;IAE5C,IAAI,CAAC;QACD,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC,SAAS;QAExE,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAC9B,MAAM,EAAE,KAAK;YACb,OAAO,EAAE;gBACL,eAAe,EAAE,UAAU,MAAM,EAAE;gBACnC,cAAc,EAAE,kBAAkB;aACrC;YACD,MAAM,EAAE,UAAU,CAAC,MAAM;SAC5B,CAAC,CAAC;QACH,YAAY,CAAC,SAAS,CAAC,CAAC;QAExB,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YAC1B,OAAO;gBACH,KAAK,EAAE,KAAK;gBACZ,KAAK,EAAE,iBAAiB;gBACxB,OAAO,EAAE,+BAA+B;aAC3C,CAAC;QACN,CAAC;QAED,IAAI,QAAQ,CAAC,EAAE,EAAE,CAAC;YACd,qBAAqB;YACrB,IAAI,CAAC;gBACD,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;gBACnC,IAAI,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;oBACjC,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;gBAC3B,CAAC;YACL,CAAC;YAAC,MAAM,CAAC;gBACL,wBAAwB;gBACxB,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;YAC3B,CAAC;YACD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;QAC3B,CAAC;QAED,aAAa;QACb,OAAO;YACH,KAAK,EAAE,KAAK;YACZ,KAAK,EAAE,eAAe;YACtB,OAAO,EAAE,QAAQ,QAAQ,CAAC,MAAM,KAAK,QAAQ,CAAC,UAAU,EAAE;SAC7D,CAAC;IACN,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,UAAU;QACV,MAAM,CAAC,QAAQ,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC;QACzC,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;YACzB,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;gBAC9B,OAAO;oBACH,KAAK,EAAE,KAAK;oBACZ,KAAK,EAAE,eAAe;oBACtB,OAAO,EAAE,iBAAiB;iBAC7B,CAAC;YACN,CAAC;YACD,OAAO;gBACH,KAAK,EAAE,KAAK;gBACZ,KAAK,EAAE,eAAe;gBACtB,OAAO,EAAE,KAAK,CAAC,OAAO;aACzB,CAAC;QACN,CAAC;QACD,OAAO;YACH,KAAK,EAAE,KAAK;YACZ,KAAK,EAAE,eAAe;YACtB,OAAO,EAAE,2BAA2B;SACvC,CAAC;IACN,CAAC;AACL,CAAC"}