yuangs 1.3.39 → 1.3.41

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 (59) hide show
  1. package/README.md +44 -0
  2. package/dist/ai/client.d.ts +9 -0
  3. package/dist/ai/client.js +118 -0
  4. package/dist/ai/client.js.map +1 -0
  5. package/dist/ai/prompt.d.ts +3 -0
  6. package/dist/ai/prompt.js +56 -0
  7. package/dist/ai/prompt.js.map +1 -0
  8. package/dist/ai/types.d.ts +5 -0
  9. package/dist/ai/types.js +3 -0
  10. package/dist/ai/types.js.map +1 -0
  11. package/dist/cli.d.ts +2 -0
  12. package/dist/cli.js +125 -0
  13. package/dist/cli.js.map +1 -0
  14. package/dist/commands/handleAIChat.d.ts +1 -0
  15. package/dist/commands/handleAIChat.js +92 -0
  16. package/dist/commands/handleAIChat.js.map +1 -0
  17. package/dist/commands/handleAICommand.d.ts +4 -0
  18. package/dist/commands/handleAICommand.js +97 -0
  19. package/dist/commands/handleAICommand.js.map +1 -0
  20. package/dist/commands/handleConfig.d.ts +1 -0
  21. package/dist/commands/handleConfig.js +73 -0
  22. package/dist/commands/handleConfig.js.map +1 -0
  23. package/dist/core/apps.d.ts +7 -0
  24. package/dist/core/apps.js +64 -0
  25. package/dist/core/apps.js.map +1 -0
  26. package/dist/core/autofix.d.ts +3 -0
  27. package/dist/core/autofix.js +24 -0
  28. package/dist/core/autofix.js.map +1 -0
  29. package/dist/core/executor.d.ts +6 -0
  30. package/dist/core/executor.js +28 -0
  31. package/dist/core/executor.js.map +1 -0
  32. package/dist/core/macros.d.ts +9 -0
  33. package/dist/core/macros.js +51 -0
  34. package/dist/core/macros.js.map +1 -0
  35. package/dist/core/os.d.ts +7 -0
  36. package/dist/core/os.js +36 -0
  37. package/dist/core/os.js.map +1 -0
  38. package/dist/core/risk.d.ts +1 -0
  39. package/dist/core/risk.js +11 -0
  40. package/dist/core/risk.js.map +1 -0
  41. package/dist/index.d.ts +1 -0
  42. package/dist/index.js +3 -0
  43. package/dist/index.js.map +1 -0
  44. package/dist/utils/confirm.d.ts +1 -0
  45. package/dist/utils/confirm.js +21 -0
  46. package/dist/utils/confirm.js.map +1 -0
  47. package/dist/utils/history.d.ts +10 -0
  48. package/dist/utils/history.js +31 -0
  49. package/dist/utils/history.js.map +1 -0
  50. package/package.json +25 -9
  51. package/cli.js +0 -597
  52. package/index.js +0 -361
  53. package/test/index.test.js +0 -78
  54. package/test/macros.test.js +0 -91
  55. package/test_interactive_history.js +0 -66
  56. package/test_interactive_history_multi.js +0 -67
  57. package/yuangs.config.example.json +0 -11
  58. package/yuangs.config.example.yaml +0 -23
  59. package/yuangs.config.json +0 -9
package/README.md CHANGED
@@ -207,6 +207,50 @@ yuangs mail # 打开邮箱
207
207
  这样日常开发只需要专注写代码和推送到 `main`,发布和版本管理都由 CI 自动完成。
208
208
  本地开发前务必先:`git pull`,确保本地代码与远程仓库一致。
209
209
 
210
+ ## 开发与构建 (Development)
211
+
212
+ 本项目使用 TypeScript 开发,构建后发布到 npm。
213
+
214
+ ### 本地开发
215
+
216
+ ```bash
217
+ # 安装依赖
218
+ npm install
219
+
220
+ # 源码运行 (使用 ts-node)
221
+ npm run dev -- ai "你好"
222
+
223
+ # 执行所有测试
224
+ npm test
225
+ ```
226
+
227
+ ### 构建项目
228
+
229
+ ```bash
230
+ # 清理并构建 (输出到 dist 目录)
231
+ rm -rf dist
232
+ npm run build
233
+ ```
234
+
235
+ ### 本地测试 CLI
236
+
237
+ ```bash
238
+ # 将当前目录链接到全局命令
239
+ npm link
240
+
241
+ # 然后就可以在任何地方直接使用 yuangs 了
242
+ yuangs --help
243
+ ```
244
+
245
+ ### 发布前检查
246
+
247
+ ```bash
248
+ # 模拟打包查看内容
249
+ npm pack
250
+ tar -tf yuangs-*.tgz
251
+ ```
252
+
210
253
  ## 维护者
211
254
 
212
255
  @yuanguangshan
256
+
@@ -0,0 +1,9 @@
1
+ export declare function addToConversationHistory(role: string, content: string): void;
2
+ export declare function clearConversationHistory(): void;
3
+ export declare function getConversationHistory(): {
4
+ role: string;
5
+ content: string;
6
+ }[];
7
+ export declare function getUserConfig(): any;
8
+ export declare function askAI(prompt: string, model?: string): Promise<string>;
9
+ export declare function callAI_Stream(messages: any[], model: string | undefined, onChunk: (content: string) => void): Promise<void>;
@@ -0,0 +1,118 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.addToConversationHistory = addToConversationHistory;
7
+ exports.clearConversationHistory = clearConversationHistory;
8
+ exports.getConversationHistory = getConversationHistory;
9
+ exports.getUserConfig = getUserConfig;
10
+ exports.askAI = askAI;
11
+ exports.callAI_Stream = callAI_Stream;
12
+ const axios_1 = __importDefault(require("axios"));
13
+ const fs_1 = __importDefault(require("fs"));
14
+ const path_1 = __importDefault(require("path"));
15
+ const os_1 = __importDefault(require("os"));
16
+ const CONFIG_FILE = path_1.default.join(os_1.default.homedir(), '.yuangs.json');
17
+ let conversationHistory = [];
18
+ function addToConversationHistory(role, content) {
19
+ conversationHistory.push({ role, content });
20
+ if (conversationHistory.length > 20) {
21
+ conversationHistory = conversationHistory.slice(-20);
22
+ }
23
+ }
24
+ function clearConversationHistory() {
25
+ conversationHistory = [];
26
+ }
27
+ function getConversationHistory() {
28
+ return conversationHistory;
29
+ }
30
+ function getUserConfig() {
31
+ if (fs_1.default.existsSync(CONFIG_FILE)) {
32
+ try {
33
+ return JSON.parse(fs_1.default.readFileSync(CONFIG_FILE, 'utf8'));
34
+ }
35
+ catch (e) { }
36
+ }
37
+ return {};
38
+ }
39
+ async function askAI(prompt, model) {
40
+ const config = getUserConfig();
41
+ const url = config.aiProxyUrl || 'https://aiproxy.want.biz/v1/chat/completions';
42
+ const headers = {
43
+ 'Content-Type': 'application/json',
44
+ 'X-Client-ID': 'npm_yuangs',
45
+ 'Origin': 'https://cli.want.biz',
46
+ 'Referer': 'https://cli.want.biz/',
47
+ 'account': config.accountType || 'free',
48
+ 'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 18_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.5 Mobile/15E148 Safari/604.1',
49
+ 'Accept': 'application/json'
50
+ };
51
+ const data = {
52
+ model: model || config.defaultModel || 'Assistant',
53
+ messages: [{ role: 'user', content: prompt }],
54
+ stream: false
55
+ };
56
+ try {
57
+ const response = await axios_1.default.post(url, data, { headers });
58
+ const content = response.data?.choices?.[0]?.message?.content;
59
+ return content || '';
60
+ }
61
+ catch (error) {
62
+ const errorMsg = error.response?.data?.error?.message || error.response?.data?.message || error.message || '未知错误';
63
+ throw new Error(`AI 请求失败: ${errorMsg}`);
64
+ }
65
+ }
66
+ async function callAI_Stream(messages, model, onChunk) {
67
+ const config = getUserConfig();
68
+ const url = config.aiProxyUrl || 'https://aiproxy.want.biz/v1/chat/completions';
69
+ const response = await (0, axios_1.default)({
70
+ method: 'post',
71
+ url: url,
72
+ data: {
73
+ model: model || config.defaultModel || 'Assistant',
74
+ messages: messages,
75
+ stream: true
76
+ },
77
+ responseType: 'stream',
78
+ headers: {
79
+ 'Content-Type': 'application/json',
80
+ 'X-Client-ID': 'npm_yuangs',
81
+ 'Origin': 'https://cli.want.biz',
82
+ 'Referer': 'https://cli.want.biz/',
83
+ 'account': config.accountType || 'free',
84
+ 'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 18_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.5 Mobile/15E148 Safari/604.1',
85
+ 'Accept': 'application/json'
86
+ }
87
+ });
88
+ return new Promise((resolve, reject) => {
89
+ let buffer = '';
90
+ response.data.on('data', (chunk) => {
91
+ buffer += chunk.toString();
92
+ let lines = buffer.split('\n');
93
+ buffer = lines.pop() || '';
94
+ for (const line of lines) {
95
+ const trimmedLine = line.trim();
96
+ if (trimmedLine.startsWith('data: ')) {
97
+ const data = trimmedLine.slice(6);
98
+ if (data === '[DONE]') {
99
+ resolve();
100
+ return;
101
+ }
102
+ try {
103
+ const parsed = JSON.parse(data);
104
+ const content = parsed.choices[0]?.delta?.content || '';
105
+ if (content)
106
+ onChunk(content);
107
+ }
108
+ catch (e) { }
109
+ }
110
+ }
111
+ });
112
+ response.data.on('error', reject);
113
+ response.data.on('end', () => {
114
+ resolve();
115
+ });
116
+ });
117
+ }
118
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/ai/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { OSProfile } from '../core/os';
2
+ export declare function buildCommandPrompt(userInput: string, os: OSProfile): string;
3
+ export declare function buildFixPrompt(originalCmd: string, stderr: string, os: OSProfile): string;
@@ -0,0 +1,56 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.buildCommandPrompt = buildCommandPrompt;
4
+ exports.buildFixPrompt = buildFixPrompt;
5
+ function buildCommandPrompt(userInput, os) {
6
+ return `
7
+ 你是一个专业的命令行专家。
8
+
9
+ 【系统环境】
10
+ - 操作系统: ${os.name}
11
+ - Shell: ${os.shell}
12
+ - find 实现: ${os.find}
13
+ - stat 实现: ${os.stat}
14
+
15
+ 【规则】
16
+ - 命令必须与当前系统兼容。
17
+ - 如果是 macOS (BSD):
18
+ - 不允许使用 find -printf
19
+ - 优先使用 stat -f
20
+ - 如果是 Linux (GNU):
21
+ - 可使用 find -printf
22
+ - 默认不使用 sudo。
23
+ - 确保输出的命令是单行或者使用 && 连接。
24
+ - 不要解释,只输出符合以下 JSON 结构的文本。
25
+
26
+ 【输出 JSON 结构】
27
+ {
28
+ "plan": "简要说明你准备执行的步骤",
29
+ "command": "可直接执行的 shell 命令",
30
+ "risk": "low | medium | high"
31
+ }
32
+
33
+ 【用户需求】
34
+ ${userInput}
35
+ `;
36
+ }
37
+ function buildFixPrompt(originalCmd, stderr, os) {
38
+ return `
39
+ 该命令在 ${os.name} 上执行失败:
40
+
41
+ 命令:
42
+ ${originalCmd}
43
+
44
+ 错误信息:
45
+ ${stderr}
46
+
47
+ 请生成一个 **${os.name} 兼容** 的等价命令。
48
+ 依然只输出 JSON 格式。
49
+ {
50
+ "plan": "修复说明",
51
+ "command": "修复后的命令",
52
+ "risk": "low | medium | high"
53
+ }
54
+ `;
55
+ }
56
+ //# sourceMappingURL=prompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../src/ai/prompt.ts"],"names":[],"mappings":";;AAEA,gDAkCC;AAED,wCAsBC;AA1DD,SAAgB,kBAAkB,CAC9B,SAAiB,EACjB,EAAa;IAEb,OAAO;;;;UAID,EAAE,CAAC,IAAI;WACN,EAAE,CAAC,KAAK;aACN,EAAE,CAAC,IAAI;aACP,EAAE,CAAC,IAAI;;;;;;;;;;;;;;;;;;;;;EAqBlB,SAAS;CACV,CAAC;AACF,CAAC;AAED,SAAgB,cAAc,CAC1B,WAAmB,EACnB,MAAc,EACd,EAAa;IAEb,OAAO;OACJ,EAAE,CAAC,IAAI;;;EAGZ,WAAW;;;EAGX,MAAM;;UAEE,EAAE,CAAC,IAAI;;;;;;;CAOhB,CAAC;AACF,CAAC"}
@@ -0,0 +1,5 @@
1
+ export type AICommandPlan = {
2
+ plan: string;
3
+ command: string;
4
+ risk: 'low' | 'medium' | 'high';
5
+ };
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/ai/types.ts"],"names":[],"mappings":""}
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,125 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ var __importDefault = (this && this.__importDefault) || function (mod) {
4
+ return (mod && mod.__esModule) ? mod : { "default": mod };
5
+ };
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ const chalk_1 = __importDefault(require("chalk"));
8
+ const path_1 = __importDefault(require("path"));
9
+ const fs_1 = __importDefault(require("fs"));
10
+ const handleAICommand_1 = require("./commands/handleAICommand");
11
+ const handleAIChat_1 = require("./commands/handleAIChat");
12
+ const handleConfig_1 = require("./commands/handleConfig");
13
+ const apps_1 = require("./core/apps");
14
+ const macros_1 = require("./core/macros"); // I need to implement runMacro
15
+ const history_1 = require("./utils/history");
16
+ const packageJson = JSON.parse(fs_1.default.readFileSync(path_1.default.join(__dirname, '../package.json'), 'utf8'));
17
+ const version = packageJson.version;
18
+ const args = process.argv.slice(2);
19
+ const command = args[0];
20
+ function printHelp() {
21
+ console.log(chalk_1.default.bold.cyan('\n🎨 苑广山的个人应用启动器 (Modular TS版)\n'));
22
+ console.log(chalk_1.default.yellow(`当前版本: ${version}`));
23
+ console.log(chalk_1.default.white('使用方法:') + chalk_1.default.gray(' yuangs <命令> [参数]\n'));
24
+ console.log(chalk_1.default.bold('命令列表:'));
25
+ console.log(` ${chalk_1.default.green('ai')} "<问题>" 向 AI 提问`);
26
+ console.log(` ${chalk_1.default.gray('-e')} 生成并执行 Linux 命令 (OS 感知)`);
27
+ console.log(` ${chalk_1.default.green('list')} 列出所有应用`);
28
+ console.log(` ${chalk_1.default.green('history')} 查看命令历史`);
29
+ console.log(` ${chalk_1.default.green('config')} 管理本地配置 (~/.yuangs.json)`);
30
+ console.log(` ${chalk_1.default.green('help')} 显示帮助信息\n`);
31
+ }
32
+ async function main() {
33
+ const apps = (0, apps_1.loadAppsConfig)();
34
+ switch (command) {
35
+ case 'ai':
36
+ const aiArgs = args.slice(1);
37
+ const isExecMode = aiArgs.includes('-e');
38
+ const questionParts = aiArgs.filter(a => a !== '-e');
39
+ const question = questionParts.join(' ').trim();
40
+ if (isExecMode) {
41
+ await (0, handleAICommand_1.handleAICommand)(question, { execute: false });
42
+ }
43
+ else {
44
+ await (0, handleAIChat_1.handleAIChat)(question || null);
45
+ }
46
+ break;
47
+ case 'list':
48
+ console.log(chalk_1.default.bold.cyan('\n📱 应用列表\n'));
49
+ Object.entries(apps).forEach(([key, url]) => {
50
+ console.log(` ${chalk_1.default.green('●')} ${chalk_1.default.bold(key.padEnd(10))} ${chalk_1.default.blue(url)}`);
51
+ });
52
+ break;
53
+ case 'shici':
54
+ case 'dict':
55
+ case 'pong':
56
+ const url = apps[command] || apps_1.DEFAULT_APPS[command];
57
+ console.log(chalk_1.default.green(`✓ 正在打开 ${command}...`));
58
+ (0, apps_1.openUrl)(url);
59
+ break;
60
+ case 'history':
61
+ const history = (0, history_1.getCommandHistory)();
62
+ if (history.length === 0) {
63
+ console.log(chalk_1.default.gray('暂无命令历史\n'));
64
+ }
65
+ else {
66
+ console.log(chalk_1.default.bold.cyan('\n📋 命令历史\n'));
67
+ history.forEach((item, index) => {
68
+ console.log(`${index + 1}. ${chalk_1.default.white(item.command)}`);
69
+ console.log(chalk_1.default.gray(` 问题: ${item.question}\n`));
70
+ });
71
+ }
72
+ break;
73
+ case 'config':
74
+ (0, handleConfig_1.handleConfig)(args.slice(1));
75
+ break;
76
+ case 'macros':
77
+ const allMacros = (0, macros_1.getMacros)();
78
+ console.log(chalk_1.default.bold.cyan('\n🚀 快捷指令列表\n'));
79
+ Object.keys(allMacros).forEach(name => {
80
+ console.log(` ${chalk_1.default.white(name)}: ${chalk_1.default.gray(allMacros[name].commands)}`);
81
+ });
82
+ break;
83
+ case 'save':
84
+ const macroName = args[1];
85
+ if (!macroName) {
86
+ console.log(chalk_1.default.red('\n错误: 请指定快捷指令名称'));
87
+ break;
88
+ }
89
+ const readline = require('readline');
90
+ const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
91
+ rl.question(chalk_1.default.cyan('请输入要保存的命令: '), (cmd) => {
92
+ (0, macros_1.saveMacro)(macroName, cmd);
93
+ console.log(chalk_1.default.green(`✓ 快捷指令 "${macroName}" 已保存`));
94
+ rl.close();
95
+ });
96
+ break;
97
+ case 'run':
98
+ const runName = args[1];
99
+ if (!runName)
100
+ break;
101
+ if ((0, macros_1.runMacro)(runName)) {
102
+ console.log(chalk_1.default.green(`✓ 正在执行 "${runName}"...`));
103
+ }
104
+ else {
105
+ console.log(chalk_1.default.red(`错误: 快捷指令 "${runName}" 不存在`));
106
+ }
107
+ break;
108
+ case 'help':
109
+ case '--help':
110
+ case '-h':
111
+ default:
112
+ if (command && apps[command]) {
113
+ (0, apps_1.openUrl)(apps[command]);
114
+ }
115
+ else {
116
+ printHelp();
117
+ }
118
+ break;
119
+ }
120
+ }
121
+ main().catch(err => {
122
+ console.error(chalk_1.default.red('Fatal Error:'), err);
123
+ process.exit(1);
124
+ });
125
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare function handleAIChat(question: string | null, model?: string): Promise<void>;
@@ -0,0 +1,92 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.handleAIChat = handleAIChat;
7
+ const chalk_1 = __importDefault(require("chalk"));
8
+ const ora_1 = __importDefault(require("ora"));
9
+ const marked_1 = require("marked");
10
+ const marked_terminal_1 = __importDefault(require("marked-terminal"));
11
+ const readline_1 = __importDefault(require("readline"));
12
+ const client_1 = require("../ai/client");
13
+ // Configure marked
14
+ marked_1.marked.setOptions({
15
+ renderer: new marked_terminal_1.default({
16
+ code: chalk_1.default.yellow,
17
+ heading: chalk_1.default.magenta.bold,
18
+ firstHeading: chalk_1.default.magenta.underline.bold,
19
+ listitem: chalk_1.default.cyan,
20
+ table: chalk_1.default.white,
21
+ strong: chalk_1.default.bold.red,
22
+ em: chalk_1.default.italic
23
+ }) // marked-terminal has no official TS types, safe cast as per review
24
+ });
25
+ async function handleAIChat(question, model) {
26
+ if (!question) {
27
+ // Interactive mode
28
+ console.log(chalk_1.default.bold.cyan('\n🤖 进入 AI 交互模式 (输入 exit 退出)\n'));
29
+ const rl = readline_1.default.createInterface({
30
+ input: process.stdin,
31
+ output: process.stdout
32
+ });
33
+ const askLoop = () => {
34
+ rl.question(chalk_1.default.green('你:'), async (q) => {
35
+ const trimmed = q.trim();
36
+ if (['exit', 'quit', 'bye'].includes(trimmed.toLowerCase())) {
37
+ console.log(chalk_1.default.cyan('👋 再见!'));
38
+ rl.close();
39
+ return;
40
+ }
41
+ if (trimmed === '/clear') {
42
+ (0, client_1.clearConversationHistory)();
43
+ console.log(chalk_1.default.yellow('✓ 对话历史已清空\n'));
44
+ return askLoop();
45
+ }
46
+ if (trimmed === '/history') {
47
+ const history = (0, client_1.getConversationHistory)();
48
+ history.forEach((msg) => {
49
+ const prefix = msg.role === 'user' ? chalk_1.default.green('你: ') : chalk_1.default.blue('AI: ');
50
+ console.log(prefix + msg.content);
51
+ });
52
+ return askLoop();
53
+ }
54
+ if (!trimmed)
55
+ return askLoop();
56
+ await askOnceStream(trimmed, model);
57
+ askLoop();
58
+ });
59
+ };
60
+ askLoop();
61
+ }
62
+ else {
63
+ await askOnceStream(question, model);
64
+ }
65
+ }
66
+ async function askOnceStream(question, model) {
67
+ const startTime = Date.now();
68
+ const messages = [...(0, client_1.getConversationHistory)()];
69
+ messages.push({ role: 'user', content: question });
70
+ const spinner = (0, ora_1.default)(chalk_1.default.cyan('AI 正在思考...')).start();
71
+ let fullResponse = '';
72
+ try {
73
+ await (0, client_1.callAI_Stream)(messages, model, (chunk) => {
74
+ if (spinner.isSpinning)
75
+ spinner.stop();
76
+ fullResponse += chunk;
77
+ process.stdout.write(chunk);
78
+ });
79
+ (0, client_1.addToConversationHistory)('user', question);
80
+ (0, client_1.addToConversationHistory)('assistant', fullResponse);
81
+ console.log('\n' + chalk_1.default.gray('─'.repeat(80)));
82
+ console.log((0, marked_1.marked)(fullResponse));
83
+ const elapsed = (Date.now() - startTime) / 1000;
84
+ console.log(chalk_1.default.gray(`\n请求耗时: ${elapsed.toFixed(2)}s\n`));
85
+ }
86
+ catch (error) {
87
+ if (spinner.isSpinning)
88
+ spinner.fail(chalk_1.default.red('AI 响应出错'));
89
+ console.error(error.message);
90
+ }
91
+ }
92
+ //# sourceMappingURL=handleAIChat.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handleAIChat.js","sourceRoot":"","sources":["../../src/commands/handleAIChat.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export declare function handleAICommand(userInput: string, options: {
2
+ execute: boolean;
3
+ model?: string;
4
+ }): Promise<import("../core/executor").ExecResult | undefined>;
@@ -0,0 +1,97 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.handleAICommand = handleAICommand;
7
+ const chalk_1 = __importDefault(require("chalk"));
8
+ const ora_1 = __importDefault(require("ora"));
9
+ const os_1 = require("../core/os");
10
+ const prompt_1 = require("../ai/prompt");
11
+ const client_1 = require("../ai/client");
12
+ const executor_1 = require("../core/executor");
13
+ const risk_1 = require("../core/risk");
14
+ const autofix_1 = require("../core/autofix");
15
+ const confirm_1 = require("../utils/confirm");
16
+ const history_1 = require("../utils/history");
17
+ async function handleAICommand(userInput, options) {
18
+ const os = (0, os_1.getOSProfile)();
19
+ const spinner = (0, ora_1.default)(chalk_1.default.cyan('🧠 AI 正在规划中...')).start();
20
+ try {
21
+ // 1️⃣ 让 AI 出计划
22
+ const prompt = (0, prompt_1.buildCommandPrompt)(userInput, os);
23
+ const raw = await (0, client_1.askAI)(prompt, options.model);
24
+ spinner.stop();
25
+ let plan;
26
+ try {
27
+ // Extract JSON if AI wrapped it in triple backticks
28
+ let jsonContent = raw;
29
+ if (raw.includes('```json')) {
30
+ jsonContent = raw.split('```json')[1].split('```')[0].trim();
31
+ }
32
+ else if (raw.includes('```')) {
33
+ jsonContent = raw.split('```')[1].split('```')[0].trim();
34
+ }
35
+ plan = JSON.parse(jsonContent);
36
+ }
37
+ catch {
38
+ console.log(chalk_1.default.red('\n❌ AI 输出不是合法 JSON:'));
39
+ console.log(raw);
40
+ return;
41
+ }
42
+ // 2️⃣ 风险兜底
43
+ const finalRisk = (0, risk_1.assessRisk)(plan.command, plan.risk);
44
+ // 3️⃣ 展示给用户
45
+ console.log(chalk_1.default.bold.cyan('\n🧠 计划: ') + plan.plan);
46
+ console.log(chalk_1.default.bold.green('💻 命令: ') + chalk_1.default.yellow(plan.command));
47
+ const riskColor = finalRisk === 'high' ? chalk_1.default.red : (finalRisk === 'medium' ? chalk_1.default.yellow : chalk_1.default.green);
48
+ console.log(chalk_1.default.bold('⚠️ 风险: ') + riskColor(finalRisk.toUpperCase()));
49
+ // 4️⃣ 确认
50
+ let shouldExecute = options.execute;
51
+ if (!shouldExecute) {
52
+ shouldExecute = await (0, confirm_1.confirm)('是否执行该命令?');
53
+ }
54
+ if (!shouldExecute) {
55
+ console.log(chalk_1.default.gray('执行已取消。'));
56
+ return;
57
+ }
58
+ // 5️⃣ 执行
59
+ console.log(chalk_1.default.gray('\n执行中...\n'));
60
+ let result = await (0, executor_1.exec)(plan.command);
61
+ // 6️⃣ 自动修复(仅一次)
62
+ if (result.code !== 0 && result.code !== null) {
63
+ console.log(chalk_1.default.red('\n❌ 执行失败,尝试自动修复...'));
64
+ const fixedPlan = await (0, autofix_1.autoFixCommand)(plan.command, result.stderr, os, options.model);
65
+ if (fixedPlan) {
66
+ console.log(chalk_1.default.bold.cyan('🔁 修复方案: ') + fixedPlan.plan);
67
+ console.log(chalk_1.default.bold.green('💻 修复命令: ') + chalk_1.default.yellow(fixedPlan.command));
68
+ const retry = await (0, confirm_1.confirm)('是否执行修复后的命令?');
69
+ if (retry) {
70
+ console.log(chalk_1.default.gray('\n正在重试...\n'));
71
+ result = await (0, executor_1.exec)(fixedPlan.command);
72
+ if (result.code === 0) {
73
+ (0, history_1.saveHistory)({
74
+ question: userInput,
75
+ command: fixedPlan.command,
76
+ });
77
+ console.log(chalk_1.default.green('\n✓ 修复命令执行成功并已存入历史库'));
78
+ return result;
79
+ }
80
+ }
81
+ }
82
+ }
83
+ // 7️⃣ 记录历史
84
+ if (result.code === 0) {
85
+ (0, history_1.saveHistory)({
86
+ question: userInput,
87
+ command: plan.command,
88
+ });
89
+ console.log(chalk_1.default.green('\n✓ 执行成功并已存入历史库'));
90
+ }
91
+ return result;
92
+ }
93
+ catch (error) {
94
+ spinner.fail(chalk_1.default.red('发生错误: ' + error.message));
95
+ }
96
+ }
97
+ //# sourceMappingURL=handleAICommand.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handleAICommand.js","sourceRoot":"","sources":["../../src/commands/handleAICommand.ts"],"names":[],"mappings":";;;;;AAYA,0CAiGC;AA7GD,kDAA0B;AAC1B,8CAAsB;AACtB,mCAA0C;AAC1C,yCAAkD;AAClD,yCAAqC;AACrC,+CAAwC;AACxC,uCAA0C;AAC1C,6CAAiD;AACjD,8CAA2C;AAC3C,8CAA+C;AAGxC,KAAK,UAAU,eAAe,CACjC,SAAiB,EACjB,OAA6C;IAE7C,MAAM,EAAE,GAAG,IAAA,iBAAY,GAAE,CAAC;IAC1B,MAAM,OAAO,GAAG,IAAA,aAAG,EAAC,eAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;IAE1D,IAAI,CAAC;QACD,eAAe;QACf,MAAM,MAAM,GAAG,IAAA,2BAAkB,EAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QACjD,MAAM,GAAG,GAAG,MAAM,IAAA,cAAK,EAAC,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;QAC/C,OAAO,CAAC,IAAI,EAAE,CAAC;QAEf,IAAI,IAAmB,CAAC;QACxB,IAAI,CAAC;YACD,oDAAoD;YACpD,IAAI,WAAW,GAAG,GAAG,CAAC;YACtB,IAAI,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC1B,WAAW,GAAG,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YACjE,CAAC;iBAAM,IAAI,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC7B,WAAW,GAAG,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAC7D,CAAC;YACD,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QACnC,CAAC;QAAC,MAAM,CAAC;YACL,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC,CAAC;YAC9C,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACjB,OAAO;QACX,CAAC;QAED,WAAW;QACX,MAAM,SAAS,GAAG,IAAA,iBAAU,EAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QAEtD,YAAY;QACZ,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;QACtD,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,eAAK,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;QAEtE,MAAM,SAAS,GAAG,SAAS,KAAK,MAAM,CAAC,CAAC,CAAC,eAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,eAAK,CAAC,MAAM,CAAC,CAAC,CAAC,eAAK,CAAC,KAAK,CAAC,CAAC;QAC3G,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,SAAS,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;QAEzE,SAAS;QACT,IAAI,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC;QACpC,IAAI,CAAC,aAAa,EAAE,CAAC;YACjB,aAAa,GAAG,MAAM,IAAA,iBAAO,EAAC,UAAU,CAAC,CAAC;QAC9C,CAAC;QAED,IAAI,CAAC,aAAa,EAAE,CAAC;YACjB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;YAClC,OAAO;QACX,CAAC;QAED,SAAS;QACT,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC;QACtC,IAAI,MAAM,GAAG,MAAM,IAAA,eAAI,EAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAEtC,gBAAgB;QAChB,IAAI,MAAM,CAAC,IAAI,KAAK,CAAC,IAAI,MAAM,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;YAC5C,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC,CAAC;YAC7C,MAAM,SAAS,GAAG,MAAM,IAAA,wBAAc,EAClC,IAAI,CAAC,OAAO,EACZ,MAAM,CAAC,MAAM,EACb,EAAE,EACF,OAAO,CAAC,KAAK,CAChB,CAAC;YAEF,IAAI,SAAS,EAAE,CAAC;gBACZ,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;gBAC3D,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,eAAK,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;gBAE7E,MAAM,KAAK,GAAG,MAAM,IAAA,iBAAO,EAAC,aAAa,CAAC,CAAC;gBAC3C,IAAI,KAAK,EAAE,CAAC;oBACR,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;oBACvC,MAAM,GAAG,MAAM,IAAA,eAAI,EAAC,SAAS,CAAC,OAAO,CAAC,CAAC;oBACvC,IAAI,MAAM,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;wBACpB,IAAA,qBAAW,EAAC;4BACR,QAAQ,EAAE,SAAS;4BACnB,OAAO,EAAE,SAAS,CAAC,OAAO;yBAC7B,CAAC,CAAC;wBACH,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC,CAAC;wBAChD,OAAO,MAAM,CAAC;oBAClB,CAAC;gBACL,CAAC;YACL,CAAC;QACL,CAAC;QAED,WAAW;QACX,IAAI,MAAM,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;YACpB,IAAA,qBAAW,EAAC;gBACR,QAAQ,EAAE,SAAS;gBACnB,OAAO,EAAE,IAAI,CAAC,OAAO;aACxB,CAAC,CAAC;YACH,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC,CAAC;QAChD,CAAC;QAED,OAAO,MAAM,CAAC;IAClB,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QAClB,OAAO,CAAC,IAAI,CAAC,eAAK,CAAC,GAAG,CAAC,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;IACtD,CAAC;AACL,CAAC"}
@@ -0,0 +1 @@
1
+ export declare function handleConfig(args: string[]): void;