yuangs 1.3.39 → 1.3.45
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/README.md +44 -0
- package/dist/ai/client.d.ts +9 -0
- package/dist/ai/client.js +118 -0
- package/dist/ai/client.js.map +1 -0
- package/dist/ai/prompt.d.ts +3 -0
- package/dist/ai/prompt.js +56 -0
- package/dist/ai/prompt.js.map +1 -0
- package/dist/ai/types.d.ts +5 -0
- package/dist/ai/types.js +3 -0
- package/dist/ai/types.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +142 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/handleAIChat.d.ts +1 -0
- package/dist/commands/handleAIChat.js +111 -0
- package/dist/commands/handleAIChat.js.map +1 -0
- package/dist/commands/handleAICommand.d.ts +4 -0
- package/dist/commands/handleAICommand.js +97 -0
- package/dist/commands/handleAICommand.js.map +1 -0
- package/dist/commands/handleConfig.d.ts +1 -0
- package/dist/commands/handleConfig.js +73 -0
- package/dist/commands/handleConfig.js.map +1 -0
- package/dist/core/apps.d.ts +7 -0
- package/dist/core/apps.js +64 -0
- package/dist/core/apps.js.map +1 -0
- package/dist/core/autofix.d.ts +3 -0
- package/dist/core/autofix.js +24 -0
- package/dist/core/autofix.js.map +1 -0
- package/dist/core/executor.d.ts +6 -0
- package/dist/core/executor.js +28 -0
- package/dist/core/executor.js.map +1 -0
- package/dist/core/macros.d.ts +9 -0
- package/dist/core/macros.js +51 -0
- package/dist/core/macros.js.map +1 -0
- package/dist/core/os.d.ts +7 -0
- package/dist/core/os.js +36 -0
- package/dist/core/os.js.map +1 -0
- package/dist/core/risk.d.ts +1 -0
- package/dist/core/risk.js +11 -0
- package/dist/core/risk.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/dist/utils/confirm.d.ts +1 -0
- package/dist/utils/confirm.js +55 -0
- package/dist/utils/confirm.js.map +1 -0
- package/dist/utils/history.d.ts +10 -0
- package/dist/utils/history.js +31 -0
- package/dist/utils/history.js.map +1 -0
- package/package.json +24 -8
- package/cli.js +0 -597
- package/index.js +0 -361
- package/test/index.test.js +0 -78
- package/test/macros.test.js +0 -91
- package/test_interactive_history.js +0 -66
- package/test_interactive_history_multi.js +0 -67
- package/yuangs.config.example.json +0 -11
- package/yuangs.config.example.yaml +0 -23
- 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":";;;;;AASA,4DAKC;AAED,4DAEC;AAED,wDAEC;AAED,sCAOC;AAED,sBA4BC;AAED,sCAoDC;AAnHD,kDAA0B;AAC1B,4CAAoB;AACpB,gDAAwB;AACxB,4CAAoB;AAEpB,MAAM,WAAW,GAAG,cAAI,CAAC,IAAI,CAAC,YAAE,CAAC,OAAO,EAAE,EAAE,cAAc,CAAC,CAAC;AAE5D,IAAI,mBAAmB,GAAwC,EAAE,CAAC;AAElE,SAAgB,wBAAwB,CAAC,IAAY,EAAE,OAAe;IAClE,mBAAmB,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;IAC5C,IAAI,mBAAmB,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;QAClC,mBAAmB,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;IACzD,CAAC;AACL,CAAC;AAED,SAAgB,wBAAwB;IACpC,mBAAmB,GAAG,EAAE,CAAC;AAC7B,CAAC;AAED,SAAgB,sBAAsB;IAClC,OAAO,mBAAmB,CAAC;AAC/B,CAAC;AAED,SAAgB,aAAa;IACzB,IAAI,YAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC7B,IAAI,CAAC;YACD,OAAO,IAAI,CAAC,KAAK,CAAC,YAAE,CAAC,YAAY,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC;QAC5D,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;IACnB,CAAC;IACD,OAAO,EAAE,CAAC;AACd,CAAC;AAEM,KAAK,UAAU,KAAK,CAAC,MAAc,EAAE,KAAc;IACtD,MAAM,MAAM,GAAG,aAAa,EAAE,CAAC;IAC/B,MAAM,GAAG,GAAG,MAAM,CAAC,UAAU,IAAI,8CAA8C,CAAC;IAEhF,MAAM,OAAO,GAAG;QACZ,cAAc,EAAE,kBAAkB;QAClC,aAAa,EAAE,YAAY;QAC3B,QAAQ,EAAE,sBAAsB;QAChC,SAAS,EAAE,uBAAuB;QAClC,SAAS,EAAE,MAAM,CAAC,WAAW,IAAI,MAAM;QACvC,YAAY,EAAE,yIAAyI;QACvJ,QAAQ,EAAE,kBAAkB;KAC/B,CAAC;IAEF,MAAM,IAAI,GAAG;QACT,KAAK,EAAE,KAAK,IAAI,MAAM,CAAC,YAAY,IAAI,WAAW;QAClD,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;QAC7C,MAAM,EAAE,KAAK;KAChB,CAAC;IAEF,IAAI,CAAC;QACD,MAAM,QAAQ,GAAG,MAAM,eAAK,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;QAC1D,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC;QAC9D,OAAO,OAAO,IAAI,EAAE,CAAC;IACzB,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QAClB,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,IAAI,KAAK,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,IAAI,KAAK,CAAC,OAAO,IAAI,MAAM,CAAC;QAClH,MAAM,IAAI,KAAK,CAAC,YAAY,QAAQ,EAAE,CAAC,CAAC;IAC5C,CAAC;AACL,CAAC;AAEM,KAAK,UAAU,aAAa,CAAC,QAAe,EAAE,KAAyB,EAAE,OAAkC;IAC9G,MAAM,MAAM,GAAG,aAAa,EAAE,CAAC;IAC/B,MAAM,GAAG,GAAG,MAAM,CAAC,UAAU,IAAI,8CAA8C,CAAC;IAEhF,MAAM,QAAQ,GAAG,MAAM,IAAA,eAAK,EAAC;QACzB,MAAM,EAAE,MAAM;QACd,GAAG,EAAE,GAAG;QACR,IAAI,EAAE;YACF,KAAK,EAAE,KAAK,IAAI,MAAM,CAAC,YAAY,IAAI,WAAW;YAClD,QAAQ,EAAE,QAAQ;YAClB,MAAM,EAAE,IAAI;SACf;QACD,YAAY,EAAE,QAAQ;QACtB,OAAO,EAAE;YACL,cAAc,EAAE,kBAAkB;YAClC,aAAa,EAAE,YAAY;YAC3B,QAAQ,EAAE,sBAAsB;YAChC,SAAS,EAAE,uBAAuB;YAClC,SAAS,EAAE,MAAM,CAAC,WAAW,IAAI,MAAM;YACvC,YAAY,EAAE,yIAAyI;YACvJ,QAAQ,EAAE,kBAAkB;SAC/B;KACJ,CAAC,CAAC;IAEH,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACnC,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;YACvC,MAAM,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;YAC3B,IAAI,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC/B,MAAM,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;YAE3B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACvB,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;gBAChC,IAAI,WAAW,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;oBACnC,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;oBAClC,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;wBACpB,OAAO,EAAE,CAAC;wBACV,OAAO;oBACX,CAAC;oBACD,IAAI,CAAC;wBACD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;wBAChC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,IAAI,EAAE,CAAC;wBACxD,IAAI,OAAO;4BAAE,OAAO,CAAC,OAAO,CAAC,CAAC;oBAClC,CAAC;oBAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;gBACnB,CAAC;YACL,CAAC;QACL,CAAC,CAAC,CAAC;QACH,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAClC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE;YACzB,OAAO,EAAE,CAAC;QACd,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -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"}
|
package/dist/ai/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/ai/types.ts"],"names":[],"mappings":""}
|
package/dist/cli.d.ts
ADDED
package/dist/cli.js
ADDED
|
@@ -0,0 +1,142 @@
|
|
|
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 readStdin() {
|
|
33
|
+
if (process.stdin.isTTY)
|
|
34
|
+
return '';
|
|
35
|
+
return new Promise((resolve) => {
|
|
36
|
+
let data = '';
|
|
37
|
+
process.stdin.setEncoding('utf8');
|
|
38
|
+
process.stdin.on('data', chunk => data += chunk);
|
|
39
|
+
process.stdin.on('end', () => resolve(data));
|
|
40
|
+
// Safety timeout
|
|
41
|
+
setTimeout(() => resolve(data), 2000);
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
async function main() {
|
|
45
|
+
const apps = (0, apps_1.loadAppsConfig)();
|
|
46
|
+
const stdinData = await readStdin();
|
|
47
|
+
switch (command) {
|
|
48
|
+
case 'ai':
|
|
49
|
+
const aiArgs = args.slice(1);
|
|
50
|
+
const isExecMode = aiArgs.includes('-e');
|
|
51
|
+
const questionParts = aiArgs.filter(a => a !== '-e');
|
|
52
|
+
let question = questionParts.join(' ').trim();
|
|
53
|
+
if (stdinData) {
|
|
54
|
+
question = `以下是输入内容:\n\n${stdinData}\n\n我的问题是:${question || '分析以上内容'}`;
|
|
55
|
+
}
|
|
56
|
+
if (isExecMode) {
|
|
57
|
+
await (0, handleAICommand_1.handleAICommand)(question, { execute: false });
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
await (0, handleAIChat_1.handleAIChat)(question || null);
|
|
61
|
+
}
|
|
62
|
+
break;
|
|
63
|
+
case 'list':
|
|
64
|
+
console.log(chalk_1.default.bold.cyan('\n📱 应用列表\n'));
|
|
65
|
+
Object.entries(apps).forEach(([key, url]) => {
|
|
66
|
+
console.log(` ${chalk_1.default.green('●')} ${chalk_1.default.bold(key.padEnd(10))} ${chalk_1.default.blue(url)}`);
|
|
67
|
+
});
|
|
68
|
+
break;
|
|
69
|
+
case 'shici':
|
|
70
|
+
case 'dict':
|
|
71
|
+
case 'pong':
|
|
72
|
+
const url = apps[command] || apps_1.DEFAULT_APPS[command];
|
|
73
|
+
console.log(chalk_1.default.green(`✓ 正在打开 ${command}...`));
|
|
74
|
+
(0, apps_1.openUrl)(url);
|
|
75
|
+
break;
|
|
76
|
+
case 'history':
|
|
77
|
+
const history = (0, history_1.getCommandHistory)();
|
|
78
|
+
if (history.length === 0) {
|
|
79
|
+
console.log(chalk_1.default.gray('暂无命令历史\n'));
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
console.log(chalk_1.default.bold.cyan('\n📋 命令历史\n'));
|
|
83
|
+
history.forEach((item, index) => {
|
|
84
|
+
console.log(`${index + 1}. ${chalk_1.default.white(item.command)}`);
|
|
85
|
+
console.log(chalk_1.default.gray(` 问题: ${item.question}\n`));
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
break;
|
|
89
|
+
case 'config':
|
|
90
|
+
(0, handleConfig_1.handleConfig)(args.slice(1));
|
|
91
|
+
break;
|
|
92
|
+
case 'macros':
|
|
93
|
+
const allMacros = (0, macros_1.getMacros)();
|
|
94
|
+
console.log(chalk_1.default.bold.cyan('\n🚀 快捷指令列表\n'));
|
|
95
|
+
Object.keys(allMacros).forEach(name => {
|
|
96
|
+
console.log(` ${chalk_1.default.white(name)}: ${chalk_1.default.gray(allMacros[name].commands)}`);
|
|
97
|
+
});
|
|
98
|
+
break;
|
|
99
|
+
case 'save':
|
|
100
|
+
const macroName = args[1];
|
|
101
|
+
if (!macroName) {
|
|
102
|
+
console.log(chalk_1.default.red('\n错误: 请指定快捷指令名称'));
|
|
103
|
+
break;
|
|
104
|
+
}
|
|
105
|
+
const rlSave = require('node:readline/promises').createInterface({
|
|
106
|
+
input: process.stdin,
|
|
107
|
+
output: process.stdout
|
|
108
|
+
});
|
|
109
|
+
const cmd = await rlSave.question(chalk_1.default.cyan('请输入要保存的命令: '));
|
|
110
|
+
(0, macros_1.saveMacro)(macroName, cmd);
|
|
111
|
+
console.log(chalk_1.default.green(`✓ 快捷指令 "${macroName}" 已保存`));
|
|
112
|
+
rlSave.close();
|
|
113
|
+
break;
|
|
114
|
+
case 'run':
|
|
115
|
+
const runName = args[1];
|
|
116
|
+
if (!runName)
|
|
117
|
+
break;
|
|
118
|
+
if ((0, macros_1.runMacro)(runName)) {
|
|
119
|
+
console.log(chalk_1.default.green(`✓ 正在执行 "${runName}"...`));
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
console.log(chalk_1.default.red(`错误: 快捷指令 "${runName}" 不存在`));
|
|
123
|
+
}
|
|
124
|
+
break;
|
|
125
|
+
case 'help':
|
|
126
|
+
case '--help':
|
|
127
|
+
case '-h':
|
|
128
|
+
default:
|
|
129
|
+
if (command && apps[command]) {
|
|
130
|
+
(0, apps_1.openUrl)(apps[command]);
|
|
131
|
+
}
|
|
132
|
+
else {
|
|
133
|
+
printHelp();
|
|
134
|
+
}
|
|
135
|
+
break;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
main().catch(err => {
|
|
139
|
+
console.error(chalk_1.default.red('Fatal Error:'), err);
|
|
140
|
+
process.exit(1);
|
|
141
|
+
});
|
|
142
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -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(initialQuestion: string | null, model?: string): Promise<void>;
|
|
@@ -0,0 +1,111 @@
|
|
|
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 readline_1 = __importDefault(require("readline"));
|
|
10
|
+
const client_1 = require("../ai/client");
|
|
11
|
+
async function handleAIChat(initialQuestion, model) {
|
|
12
|
+
if (initialQuestion) {
|
|
13
|
+
await askOnceStream(initialQuestion, model);
|
|
14
|
+
if (!process.stdin.isTTY)
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
console.log(chalk_1.default.bold.cyan('\n🤖 进入 AI 交互模式 (输入 exit 退出)\n'));
|
|
18
|
+
const rl = readline_1.default.createInterface({
|
|
19
|
+
input: process.stdin,
|
|
20
|
+
output: process.stdout,
|
|
21
|
+
terminal: true
|
|
22
|
+
});
|
|
23
|
+
// Helper to wrap rl.question in a Promise
|
|
24
|
+
const ask = (query) => {
|
|
25
|
+
return new Promise((resolve) => {
|
|
26
|
+
rl.question(query, (answer) => {
|
|
27
|
+
resolve(answer);
|
|
28
|
+
});
|
|
29
|
+
});
|
|
30
|
+
};
|
|
31
|
+
try {
|
|
32
|
+
while (true) {
|
|
33
|
+
const input = await ask(chalk_1.default.green('你:'));
|
|
34
|
+
const trimmed = input.trim();
|
|
35
|
+
// Handle Exit
|
|
36
|
+
if (['exit', 'quit', 'bye'].includes(trimmed.toLowerCase())) {
|
|
37
|
+
console.log(chalk_1.default.cyan('👋 再见!'));
|
|
38
|
+
break;
|
|
39
|
+
}
|
|
40
|
+
// Handle Commands
|
|
41
|
+
if (trimmed === '/clear') {
|
|
42
|
+
(0, client_1.clearConversationHistory)();
|
|
43
|
+
console.log(chalk_1.default.yellow('✓ 对话历史已清空\n'));
|
|
44
|
+
continue;
|
|
45
|
+
}
|
|
46
|
+
if (trimmed === '/history') {
|
|
47
|
+
const history = (0, client_1.getConversationHistory)();
|
|
48
|
+
if (history.length === 0) {
|
|
49
|
+
console.log(chalk_1.default.gray('暂无对话历史\n'));
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
history.forEach((msg) => {
|
|
53
|
+
const prefix = msg.role === 'user' ? chalk_1.default.green('你: ') : chalk_1.default.blue('AI: ');
|
|
54
|
+
console.log(prefix + msg.content);
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
continue;
|
|
58
|
+
}
|
|
59
|
+
if (!trimmed)
|
|
60
|
+
continue;
|
|
61
|
+
// Handle AI Request
|
|
62
|
+
try {
|
|
63
|
+
// Pause input while AI is processing to avoid interference
|
|
64
|
+
rl.pause();
|
|
65
|
+
await askOnceStream(trimmed, model);
|
|
66
|
+
}
|
|
67
|
+
catch (err) {
|
|
68
|
+
console.error(chalk_1.default.red(`\n[AI execution error]: ${err.message}`));
|
|
69
|
+
}
|
|
70
|
+
finally {
|
|
71
|
+
// Always resume input
|
|
72
|
+
rl.resume();
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
catch (criticalErr) {
|
|
77
|
+
console.error(chalk_1.default.red(`\n[Critical Loop Error]: ${criticalErr.message}`));
|
|
78
|
+
}
|
|
79
|
+
finally {
|
|
80
|
+
rl.close();
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
async function askOnceStream(question, model) {
|
|
84
|
+
const startTime = Date.now();
|
|
85
|
+
const messages = [...(0, client_1.getConversationHistory)()];
|
|
86
|
+
messages.push({ role: 'user', content: question });
|
|
87
|
+
const spinner = (0, ora_1.default)(chalk_1.default.cyan('AI 正在思考...')).start();
|
|
88
|
+
let fullResponse = '';
|
|
89
|
+
try {
|
|
90
|
+
await (0, client_1.callAI_Stream)(messages, model, (chunk) => {
|
|
91
|
+
if (spinner.isSpinning) {
|
|
92
|
+
spinner.stop();
|
|
93
|
+
process.stdout.write(chalk_1.default.bold.blue('🤖 AI:'));
|
|
94
|
+
}
|
|
95
|
+
fullResponse += chunk;
|
|
96
|
+
process.stdout.write(chunk);
|
|
97
|
+
});
|
|
98
|
+
(0, client_1.addToConversationHistory)('user', question);
|
|
99
|
+
(0, client_1.addToConversationHistory)('assistant', fullResponse);
|
|
100
|
+
const elapsed = (Date.now() - startTime) / 1000;
|
|
101
|
+
process.stdout.write('\n' + chalk_1.default.gray(`─`.repeat(20) + ` (耗时: ${elapsed.toFixed(2)}s) ` + `─`.repeat(20) + '\n\n'));
|
|
102
|
+
}
|
|
103
|
+
catch (error) {
|
|
104
|
+
if (spinner.isSpinning) {
|
|
105
|
+
spinner.stop();
|
|
106
|
+
}
|
|
107
|
+
// Re-throw to be caught by the loop
|
|
108
|
+
throw error;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=handleAIChat.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handleAIChat.js","sourceRoot":"","sources":["../../src/commands/handleAIChat.ts"],"names":[],"mappings":";;;;;AAKA,oCAyEC;AA9ED,kDAA0B;AAC1B,8CAAsB;AACtB,wDAAgC;AAChC,yCAAyH;AAElH,KAAK,UAAU,YAAY,CAAC,eAA8B,EAAE,KAAc;IAC7E,IAAI,eAAe,EAAE,CAAC;QAClB,MAAM,aAAa,CAAC,eAAe,EAAE,KAAK,CAAC,CAAC;QAC5C,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK;YAAE,OAAO;IACrC,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC,CAAC;IAE/D,MAAM,EAAE,GAAG,kBAAQ,CAAC,eAAe,CAAC;QAChC,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,QAAQ,EAAE,IAAI;KACjB,CAAC,CAAC;IAEH,0CAA0C;IAC1C,MAAM,GAAG,GAAG,CAAC,KAAa,EAAmB,EAAE;QAC3C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC3B,EAAE,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,EAAE;gBAC1B,OAAO,CAAC,MAAM,CAAC,CAAC;YACpB,CAAC,CAAC,CAAC;QACP,CAAC,CAAC,CAAC;IACP,CAAC,CAAC;IAEF,IAAI,CAAC;QACD,OAAO,IAAI,EAAE,CAAC;YACV,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;YAC3C,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;YAE7B,cAAc;YACd,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC;gBAC1D,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;gBAClC,MAAM;YACV,CAAC;YAED,kBAAkB;YAClB,IAAI,OAAO,KAAK,QAAQ,EAAE,CAAC;gBACvB,IAAA,iCAAwB,GAAE,CAAC;gBAC3B,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC;gBACzC,SAAS;YACb,CAAC;YAED,IAAI,OAAO,KAAK,UAAU,EAAE,CAAC;gBACzB,MAAM,OAAO,GAAG,IAAA,+BAAsB,GAAE,CAAC;gBACzC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBACvB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;gBACxC,CAAC;qBAAM,CAAC;oBACJ,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;wBACpB,MAAM,MAAM,GAAG,GAAG,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,eAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,eAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;wBAC7E,OAAO,CAAC,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,CAAC;oBACtC,CAAC,CAAC,CAAC;gBACP,CAAC;gBACD,SAAS;YACb,CAAC;YAED,IAAI,CAAC,OAAO;gBAAE,SAAS;YAEvB,oBAAoB;YACpB,IAAI,CAAC;gBACD,2DAA2D;gBAC3D,EAAE,CAAC,KAAK,EAAE,CAAC;gBACX,MAAM,aAAa,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YACxC,CAAC;YAAC,OAAO,GAAQ,EAAE,CAAC;gBAChB,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,2BAA2B,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YACvE,CAAC;oBAAS,CAAC;gBACP,sBAAsB;gBACtB,EAAE,CAAC,MAAM,EAAE,CAAC;YAChB,CAAC;QACL,CAAC;IACL,CAAC;IAAC,OAAO,WAAgB,EAAE,CAAC;QACxB,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,4BAA4B,WAAW,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IAChF,CAAC;YAAS,CAAC;QACP,EAAE,CAAC,KAAK,EAAE,CAAC;IACf,CAAC;AACL,CAAC;AAED,KAAK,UAAU,aAAa,CAAC,QAAgB,EAAE,KAAc;IACzD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC7B,MAAM,QAAQ,GAAG,CAAC,GAAG,IAAA,+BAAsB,GAAE,CAAC,CAAC;IAC/C,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC;IAEnD,MAAM,OAAO,GAAG,IAAA,aAAG,EAAC,eAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;IACtD,IAAI,YAAY,GAAG,EAAE,CAAC;IAEtB,IAAI,CAAC;QACD,MAAM,IAAA,sBAAa,EAAC,QAAQ,EAAE,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE;YAC3C,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;gBACrB,OAAO,CAAC,IAAI,EAAE,CAAC;gBACf,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,eAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;YACpD,CAAC;YACD,YAAY,IAAI,KAAK,CAAC;YACtB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAChC,CAAC,CAAC,CAAC;QAEH,IAAA,iCAAwB,EAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAC3C,IAAA,iCAAwB,EAAC,WAAW,EAAE,YAAY,CAAC,CAAC;QAEpD,MAAM,OAAO,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,GAAG,IAAI,CAAC;QAChD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,GAAG,eAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,SAAS,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC;IACzH,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QAClB,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;YACrB,OAAO,CAAC,IAAI,EAAE,CAAC;QACnB,CAAC;QACD,oCAAoC;QACpC,MAAM,KAAK,CAAC;IAChB,CAAC;AACL,CAAC"}
|
|
@@ -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
|