xx-ai-cli 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +328 -0
- package/dist/commands/agent.d.ts +12 -0
- package/dist/commands/agent.d.ts.map +1 -0
- package/dist/commands/agent.js +311 -0
- package/dist/commands/agent.js.map +1 -0
- package/dist/commands/ask.d.ts +7 -0
- package/dist/commands/ask.d.ts.map +1 -0
- package/dist/commands/ask.js +52 -0
- package/dist/commands/ask.js.map +1 -0
- package/dist/commands/chat.d.ts +9 -0
- package/dist/commands/chat.d.ts.map +1 -0
- package/dist/commands/chat.js +129 -0
- package/dist/commands/chat.js.map +1 -0
- package/dist/commands/cmd.d.ts +6 -0
- package/dist/commands/cmd.d.ts.map +1 -0
- package/dist/commands/cmd.js +52 -0
- package/dist/commands/cmd.js.map +1 -0
- package/dist/commands/code.d.ts +8 -0
- package/dist/commands/code.d.ts.map +1 -0
- package/dist/commands/code.js +75 -0
- package/dist/commands/code.js.map +1 -0
- package/dist/commands/file.d.ts +7 -0
- package/dist/commands/file.d.ts.map +1 -0
- package/dist/commands/file.js +66 -0
- package/dist/commands/file.js.map +1 -0
- package/dist/commands/history.d.ts +5 -0
- package/dist/commands/history.d.ts.map +1 -0
- package/dist/commands/history.js +159 -0
- package/dist/commands/history.js.map +1 -0
- package/dist/commands/init.d.ts +2 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +144 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/install.d.ts +24 -0
- package/dist/commands/install.d.ts.map +1 -0
- package/dist/commands/install.js +328 -0
- package/dist/commands/install.js.map +1 -0
- package/dist/commands/model.d.ts +6 -0
- package/dist/commands/model.d.ts.map +1 -0
- package/dist/commands/model.js +128 -0
- package/dist/commands/model.js.map +1 -0
- package/dist/commands/pkg.d.ts +12 -0
- package/dist/commands/pkg.d.ts.map +1 -0
- package/dist/commands/pkg.js +132 -0
- package/dist/commands/pkg.js.map +1 -0
- package/dist/commands/run.d.ts +9 -0
- package/dist/commands/run.d.ts.map +1 -0
- package/dist/commands/run.js +185 -0
- package/dist/commands/run.js.map +1 -0
- package/dist/core/agentTask.d.ts +20 -0
- package/dist/core/agentTask.d.ts.map +1 -0
- package/dist/core/agentTask.js +81 -0
- package/dist/core/agentTask.js.map +1 -0
- package/dist/core/config.d.ts +41 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +153 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/executor.d.ts +20 -0
- package/dist/core/executor.d.ts.map +1 -0
- package/dist/core/executor.js +68 -0
- package/dist/core/executor.js.map +1 -0
- package/dist/core/files.d.ts +24 -0
- package/dist/core/files.d.ts.map +1 -0
- package/dist/core/files.js +95 -0
- package/dist/core/files.js.map +1 -0
- package/dist/core/github.d.ts +32 -0
- package/dist/core/github.d.ts.map +1 -0
- package/dist/core/github.js +82 -0
- package/dist/core/github.js.map +1 -0
- package/dist/core/prompt.d.ts +9 -0
- package/dist/core/prompt.d.ts.map +1 -0
- package/dist/core/prompt.js +44 -0
- package/dist/core/prompt.js.map +1 -0
- package/dist/core/router.d.ts +16 -0
- package/dist/core/router.d.ts.map +1 -0
- package/dist/core/router.js +182 -0
- package/dist/core/router.js.map +1 -0
- package/dist/core/search.d.ts +14 -0
- package/dist/core/search.d.ts.map +1 -0
- package/dist/core/search.js +179 -0
- package/dist/core/search.js.map +1 -0
- package/dist/core/session.d.ts +38 -0
- package/dist/core/session.d.ts.map +1 -0
- package/dist/core/session.js +172 -0
- package/dist/core/session.js.map +1 -0
- package/dist/core/stream.d.ts +15 -0
- package/dist/core/stream.d.ts.map +1 -0
- package/dist/core/stream.js +102 -0
- package/dist/core/stream.js.map +1 -0
- package/dist/core/tools.d.ts +343 -0
- package/dist/core/tools.d.ts.map +1 -0
- package/dist/core/tools.js +293 -0
- package/dist/core/tools.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +372 -0
- package/dist/index.js.map +1 -0
- package/dist/ui/renderer.d.ts +17 -0
- package/dist/ui/renderer.d.ts.map +1 -0
- package/dist/ui/renderer.js +69 -0
- package/dist/ui/renderer.js.map +1 -0
- package/package.json +73 -0
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import ora from 'ora';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import { run, runStream } from '../core/executor.js';
|
|
4
|
+
import { theme } from '../ui/renderer.js';
|
|
5
|
+
// ─── npm 搜索 ─────────────────────────────────────────────────
|
|
6
|
+
export async function pkgSearch(query) {
|
|
7
|
+
console.log(theme.info(`搜索 npm 包: ${chalk.bold(query)}\n`));
|
|
8
|
+
const spinner = ora({ text: '搜索中...', spinner: 'dots' }).start();
|
|
9
|
+
try {
|
|
10
|
+
const url = `https://registry.npmjs.org/-/v1/search?text=${encodeURIComponent(query)}&size=10`;
|
|
11
|
+
const res = await fetch(url);
|
|
12
|
+
const data = (await res.json());
|
|
13
|
+
spinner.stop();
|
|
14
|
+
console.log(theme.bold(`找到 ${data.objects.length} 个相关包:\n`));
|
|
15
|
+
data.objects.forEach((obj, i) => {
|
|
16
|
+
const pkg = obj.package;
|
|
17
|
+
const score = (obj.score.final * 100).toFixed(0);
|
|
18
|
+
console.log(`${chalk.cyan(`[${i + 1}]`)} ${chalk.bold(pkg.name)} ${chalk.dim(`v${pkg.version}`)} ${chalk.dim(`(匹配度 ${score}%)`)}`);
|
|
19
|
+
if (pkg.description)
|
|
20
|
+
console.log(` ${pkg.description}`);
|
|
21
|
+
console.log(` ${chalk.dim(pkg.links.npm)}`);
|
|
22
|
+
if (pkg.keywords?.length)
|
|
23
|
+
console.log(` ${chalk.dim(pkg.keywords.slice(0, 5).join(', '))}`);
|
|
24
|
+
console.log();
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
catch (err) {
|
|
28
|
+
spinner.fail(`搜索失败: ${err.message}`);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
// ─── npm 包信息 ───────────────────────────────────────────────
|
|
32
|
+
export async function pkgInfo(pkgName) {
|
|
33
|
+
const spinner = ora({ text: `获取 ${pkgName} 信息...`, spinner: 'dots' }).start();
|
|
34
|
+
try {
|
|
35
|
+
const res = await fetch(`https://registry.npmjs.org/${pkgName}/latest`);
|
|
36
|
+
if (!res.ok)
|
|
37
|
+
throw new Error(`包不存在: ${pkgName}`);
|
|
38
|
+
const data = (await res.json());
|
|
39
|
+
spinner.stop();
|
|
40
|
+
console.log(`\n${theme.bold(`📦 ${data.name}`)} ${chalk.dim(`v${data.version}`)}`);
|
|
41
|
+
if (data.description)
|
|
42
|
+
console.log(` ${data.description}\n`);
|
|
43
|
+
const author = typeof data.author === 'string' ? data.author : data.author?.name;
|
|
44
|
+
if (author)
|
|
45
|
+
console.log(`${theme.dim('作者:')} ${author}`);
|
|
46
|
+
if (data.license)
|
|
47
|
+
console.log(`${theme.dim('协议:')} ${data.license}`);
|
|
48
|
+
if (data.homepage)
|
|
49
|
+
console.log(`${theme.dim('主页:')} ${data.homepage}`);
|
|
50
|
+
if (data.keywords?.length)
|
|
51
|
+
console.log(`${theme.dim('关键词:')} ${data.keywords.slice(0, 8).join(', ')}`);
|
|
52
|
+
const deps = Object.keys(data.dependencies ?? {});
|
|
53
|
+
if (deps.length)
|
|
54
|
+
console.log(`${theme.dim('依赖:')} ${deps.slice(0, 10).join(', ')}${deps.length > 10 ? `... (+${deps.length - 10})` : ''}`);
|
|
55
|
+
console.log(`\n${theme.dim('安装:')} npm install ${data.name}`);
|
|
56
|
+
}
|
|
57
|
+
catch (err) {
|
|
58
|
+
spinner.fail(err.message);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
// ─── 安装包 ───────────────────────────────────────────────────
|
|
62
|
+
export async function pkgInstall(pkgName, options = {}) {
|
|
63
|
+
const { global: isGlobal = false, dev = false, manager = 'npm' } = options;
|
|
64
|
+
if (manager === 'brew') {
|
|
65
|
+
await brewInstall(pkgName);
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
if (manager === 'pip') {
|
|
69
|
+
await pipInstall(pkgName, isGlobal);
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
// npm
|
|
73
|
+
const flags = [isGlobal ? '-g' : '', dev ? '--save-dev' : ''].filter(Boolean);
|
|
74
|
+
const args = ['install', ...flags, pkgName];
|
|
75
|
+
const cmd = `npm ${args.join(' ')}`;
|
|
76
|
+
console.log(theme.info(`安装: ${chalk.bold(pkgName)}`));
|
|
77
|
+
console.log(theme.dim(`执行: ${cmd}\n`));
|
|
78
|
+
const spinner = ora({ text: '安装中...', spinner: 'dots', color: 'green' }).start();
|
|
79
|
+
const code = await runStream('npm', args, (d) => { spinner.stop(); process.stdout.write(chalk.dim(d)); }, (d) => { spinner.stop(); process.stdout.write(chalk.yellow(d)); });
|
|
80
|
+
spinner.stop();
|
|
81
|
+
if (code === 0) {
|
|
82
|
+
console.log('\n' + theme.success(`✔ ${pkgName} 安装成功`));
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
console.log('\n' + theme.error(`安装失败 (exit ${code})`));
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
// ─── 卸载包 ───────────────────────────────────────────────────
|
|
89
|
+
export async function pkgUninstall(pkgName, isGlobal = false) {
|
|
90
|
+
const args = ['uninstall', isGlobal ? '-g' : '', pkgName].filter(Boolean);
|
|
91
|
+
console.log(theme.info(`卸载: ${chalk.bold(pkgName)}\n`));
|
|
92
|
+
const code = await runStream('npm', args, (d) => process.stdout.write(chalk.dim(d)), (d) => process.stdout.write(chalk.yellow(d)));
|
|
93
|
+
if (code === 0) {
|
|
94
|
+
console.log('\n' + theme.success(`✔ ${pkgName} 已卸载`));
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
console.log('\n' + theme.error(`卸载失败 (exit ${code})`));
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
// ─── 列出全局安装的包 ─────────────────────────────────────────
|
|
101
|
+
export async function pkgList(isGlobal = false) {
|
|
102
|
+
const spinner = ora({ text: '获取包列表...', spinner: 'dots' }).start();
|
|
103
|
+
try {
|
|
104
|
+
const result = await run(`npm list ${isGlobal ? '-g' : ''} --depth=0 2>/dev/null`);
|
|
105
|
+
spinner.stop();
|
|
106
|
+
console.log(theme.bold(isGlobal ? '\n全局安装的包:\n' : '\n本地安装的包:\n'));
|
|
107
|
+
console.log(chalk.dim(result));
|
|
108
|
+
}
|
|
109
|
+
catch {
|
|
110
|
+
spinner.fail('获取列表失败');
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
// ─── brew 安装 ────────────────────────────────────────────────
|
|
114
|
+
async function brewInstall(name) {
|
|
115
|
+
console.log(theme.info(`brew install ${chalk.bold(name)}\n`));
|
|
116
|
+
const code = await runStream('brew', ['install', name], (d) => process.stdout.write(chalk.dim(d)), (d) => process.stdout.write(chalk.yellow(d)));
|
|
117
|
+
if (code === 0)
|
|
118
|
+
console.log('\n' + theme.success(`✔ ${name} 安装成功`));
|
|
119
|
+
else
|
|
120
|
+
console.log('\n' + theme.error('安装失败'));
|
|
121
|
+
}
|
|
122
|
+
// ─── pip 安装 ─────────────────────────────────────────────────
|
|
123
|
+
async function pipInstall(name, user = false) {
|
|
124
|
+
const args = ['install', user ? '--user' : '', name].filter(Boolean);
|
|
125
|
+
console.log(theme.info(`pip install ${chalk.bold(name)}\n`));
|
|
126
|
+
const code = await runStream('pip3', args, (d) => process.stdout.write(chalk.dim(d)), (d) => process.stdout.write(chalk.yellow(d)));
|
|
127
|
+
if (code === 0)
|
|
128
|
+
console.log('\n' + theme.success(`✔ ${name} 安装成功`));
|
|
129
|
+
else
|
|
130
|
+
console.log('\n' + theme.error('安装失败'));
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=pkg.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pkg.js","sourceRoot":"","sources":["../../src/commands/pkg.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { type ModelProvider } from '../core/config.js';
|
|
2
|
+
export interface RunOptions {
|
|
3
|
+
model?: ModelProvider;
|
|
4
|
+
verbose?: boolean;
|
|
5
|
+
noAuto?: boolean;
|
|
6
|
+
}
|
|
7
|
+
export declare function runCommand(input: string, options?: RunOptions): Promise<void>;
|
|
8
|
+
export declare function runInteractive(options?: RunOptions): Promise<void>;
|
|
9
|
+
//# sourceMappingURL=run.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/commands/run.ts"],"names":[],"mappings":"AAGA,OAAO,EAA2B,KAAK,aAAa,EAAE,MAAM,mBAAmB,CAAC;AA2BhF,MAAM,WAAW,UAAU;IACzB,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AA8GD,wBAAsB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,UAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAevF;AAGD,wBAAsB,cAAc,CAAC,OAAO,GAAE,UAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CA+D5E"}
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
import readline from 'readline';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import { detectIntent, selectBestModel, printRouteDecision } from '../core/router.js';
|
|
4
|
+
import { config, PROVIDER_LABELS } from '../core/config.js';
|
|
5
|
+
import { theme } from '../ui/renderer.js';
|
|
6
|
+
// ─── 懒加载各命令,避免循环依赖 ──────────────────────────────
|
|
7
|
+
async function getCommands() {
|
|
8
|
+
const [{ askCommand }, { codeCommand }, { fileCommand }, { cmdCommand }, { agentCommand }, { pkgInstall },] = await Promise.all([
|
|
9
|
+
import('./ask.js'),
|
|
10
|
+
import('./code.js'),
|
|
11
|
+
import('./file.js'),
|
|
12
|
+
import('./cmd.js'),
|
|
13
|
+
import('./agent.js'),
|
|
14
|
+
import('./pkg.js'),
|
|
15
|
+
]);
|
|
16
|
+
// search 单独处理(直接输出)
|
|
17
|
+
const { webSearch } = await import('../core/search.js');
|
|
18
|
+
return { askCommand, codeCommand, fileCommand, cmdCommand, agentCommand, pkgInstall, webSearch };
|
|
19
|
+
}
|
|
20
|
+
// ─── 分发到对应命令 ───────────────────────────────────────────
|
|
21
|
+
async function dispatch(input, options) {
|
|
22
|
+
const cmds = await getCommands();
|
|
23
|
+
// 意图识别
|
|
24
|
+
const intentResult = detectIntent(input);
|
|
25
|
+
const { intent, extractedArgs } = intentResult;
|
|
26
|
+
// 模型选择
|
|
27
|
+
const selectedModel = options.model
|
|
28
|
+
?? (options.noAuto ? config.get('defaultProvider') : selectBestModel(intent));
|
|
29
|
+
// 显示路由决策
|
|
30
|
+
if (options.verbose !== false) {
|
|
31
|
+
printRouteDecision(input, intentResult, selectedModel);
|
|
32
|
+
}
|
|
33
|
+
// ── 路由分发 ──────────────────────────────────────────────
|
|
34
|
+
switch (intent) {
|
|
35
|
+
case 'search': {
|
|
36
|
+
const query = extractedArgs.query || input;
|
|
37
|
+
const ora = (await import('ora')).default;
|
|
38
|
+
const spinner = ora({ text: '搜索中...', spinner: 'dots' }).start();
|
|
39
|
+
try {
|
|
40
|
+
const resp = await cmds.webSearch(query);
|
|
41
|
+
spinner.stop();
|
|
42
|
+
console.log();
|
|
43
|
+
resp.results.forEach((r, i) => {
|
|
44
|
+
console.log(`${chalk.cyan(`[${i + 1}]`)} ${chalk.bold(r.title)}`);
|
|
45
|
+
if (r.url)
|
|
46
|
+
console.log(` ${chalk.dim(r.url)}`);
|
|
47
|
+
console.log(` ${r.snippet}\n`);
|
|
48
|
+
});
|
|
49
|
+
// 搜索完直接让 AI 综合分析
|
|
50
|
+
if (resp.results.length > 0) {
|
|
51
|
+
const { formatSearchResults } = await import('../core/search.js');
|
|
52
|
+
const { Session } = await import('../core/session.js');
|
|
53
|
+
const { chat } = await import('../core/stream.js');
|
|
54
|
+
const modelConfig = config.getProvider(selectedModel);
|
|
55
|
+
const session = new Session();
|
|
56
|
+
session.addUser(`根据以下搜索结果,用中文综合回答用户问题:"${query}"\n\n${formatSearchResults(resp)}`);
|
|
57
|
+
process.stdout.write(`\n${chalk.green.bold(`🤖 ${PROVIDER_LABELS[selectedModel]}`)}: `);
|
|
58
|
+
const { content } = await chat(modelConfig, session.getMessages(), {
|
|
59
|
+
stream: config.get('stream'),
|
|
60
|
+
onChunk: (c) => process.stdout.write(c),
|
|
61
|
+
});
|
|
62
|
+
console.log('\n');
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
catch (err) {
|
|
66
|
+
spinner.fail(`搜索失败: ${err.message}`);
|
|
67
|
+
}
|
|
68
|
+
break;
|
|
69
|
+
}
|
|
70
|
+
case 'code_gen':
|
|
71
|
+
await cmds.codeCommand('generate', input, { model: selectedModel });
|
|
72
|
+
break;
|
|
73
|
+
case 'code_explain':
|
|
74
|
+
await cmds.codeCommand('explain', extractedArgs.filePath ?? input, { model: selectedModel });
|
|
75
|
+
break;
|
|
76
|
+
case 'code_review':
|
|
77
|
+
await cmds.codeCommand('review', extractedArgs.filePath ?? input, { model: selectedModel });
|
|
78
|
+
break;
|
|
79
|
+
case 'file': {
|
|
80
|
+
const filePath = extractedArgs.filePath;
|
|
81
|
+
if (!filePath) {
|
|
82
|
+
// 降级到 ask
|
|
83
|
+
await cmds.askCommand(input, { model: selectedModel });
|
|
84
|
+
break;
|
|
85
|
+
}
|
|
86
|
+
// 将输入中文件路径之外的部分作为问题
|
|
87
|
+
const question = input.replace(filePath, '').trim() || '请分析这个文件';
|
|
88
|
+
await cmds.fileCommand(filePath, question, { model: selectedModel });
|
|
89
|
+
break;
|
|
90
|
+
}
|
|
91
|
+
case 'shell':
|
|
92
|
+
await cmds.cmdCommand(input, { model: selectedModel });
|
|
93
|
+
break;
|
|
94
|
+
case 'pkg_install': {
|
|
95
|
+
const pkgName = extractedArgs.packageName;
|
|
96
|
+
if (!pkgName) {
|
|
97
|
+
await cmds.askCommand(input, { model: selectedModel });
|
|
98
|
+
break;
|
|
99
|
+
}
|
|
100
|
+
const isGlobal = /全局|-g|global/i.test(input);
|
|
101
|
+
const isDev = /开发|dev|-D/i.test(input);
|
|
102
|
+
await cmds.pkgInstall(pkgName, { global: isGlobal, dev: isDev });
|
|
103
|
+
break;
|
|
104
|
+
}
|
|
105
|
+
case 'agent':
|
|
106
|
+
await cmds.agentCommand(input, { model: selectedModel });
|
|
107
|
+
break;
|
|
108
|
+
default: // chat
|
|
109
|
+
await cmds.askCommand(input, { model: selectedModel });
|
|
110
|
+
break;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
// ─── 单次运行 ─────────────────────────────────────────────────
|
|
114
|
+
export async function runCommand(input, options = {}) {
|
|
115
|
+
const modelConfig = config.getProvider(options.model ?? selectBestModel(detectIntent(input).intent));
|
|
116
|
+
if (!modelConfig) {
|
|
117
|
+
const anyConfigured = Object.values(config.get('providers')).some((p) => p?.apiKey);
|
|
118
|
+
if (!anyConfigured) {
|
|
119
|
+
console.log(theme.error('尚未配置任何模型的 API Key'));
|
|
120
|
+
console.log(theme.info('请先运行: xxcli model set-key deepseek sk-xxxx'));
|
|
121
|
+
process.exit(1);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
await dispatch(input, options);
|
|
125
|
+
}
|
|
126
|
+
// ─── 交互式模式(无参数时进入)───────────────────────────────
|
|
127
|
+
export async function runInteractive(options = {}) {
|
|
128
|
+
console.log('\n' + theme.divider());
|
|
129
|
+
console.log(theme.info('🚀 智能模式 - 直接输入你的需求,自动识别意图和选择模型'));
|
|
130
|
+
console.log(theme.dim('示例: 搜索 DeepSeek 最新消息 | 帮我写一个防抖函数 | 安装 axios'));
|
|
131
|
+
console.log(theme.dim('/route 显示上次路由决策 | /exit 退出 | /models 查看模型状态'));
|
|
132
|
+
console.log(theme.divider() + '\n');
|
|
133
|
+
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
|
|
134
|
+
rl.on('close', () => {
|
|
135
|
+
console.log('\n' + theme.dim('👋 再见!'));
|
|
136
|
+
process.exit(0);
|
|
137
|
+
});
|
|
138
|
+
let lastIntentResult = null;
|
|
139
|
+
let lastModel = null;
|
|
140
|
+
const prompt = () => {
|
|
141
|
+
rl.question(chalk.cyan.bold('▶ '), async (input) => {
|
|
142
|
+
const trimmed = input.trim();
|
|
143
|
+
if (!trimmed) {
|
|
144
|
+
prompt();
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
if (trimmed === '/exit') {
|
|
148
|
+
rl.close();
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
if (trimmed === '/route') {
|
|
152
|
+
if (lastIntentResult && lastModel) {
|
|
153
|
+
printRouteDecision('', lastIntentResult, lastModel);
|
|
154
|
+
}
|
|
155
|
+
else {
|
|
156
|
+
console.log(theme.dim('暂无路由记录'));
|
|
157
|
+
}
|
|
158
|
+
prompt();
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
161
|
+
if (trimmed === '/models') {
|
|
162
|
+
const providers = config.get('providers');
|
|
163
|
+
const defaultP = config.get('defaultProvider');
|
|
164
|
+
console.log('\n 模型配置状态:');
|
|
165
|
+
['deepseek', 'qwen', 'glm', 'doubao', 'moonshot'].forEach((p) => {
|
|
166
|
+
const hasKey = !!providers[p]?.apiKey;
|
|
167
|
+
const isDefault = p === defaultP;
|
|
168
|
+
console.log(` ${hasKey ? chalk.green('●') : chalk.dim('○')} ` +
|
|
169
|
+
`${chalk.bold((PROVIDER_LABELS[p]).padEnd(20))}` +
|
|
170
|
+
`${isDefault ? chalk.dim(' [默认]') : ''}`);
|
|
171
|
+
});
|
|
172
|
+
console.log();
|
|
173
|
+
prompt();
|
|
174
|
+
return;
|
|
175
|
+
}
|
|
176
|
+
// 记录意图和模型
|
|
177
|
+
lastIntentResult = detectIntent(trimmed);
|
|
178
|
+
lastModel = options.model ?? selectBestModel(lastIntentResult.intent);
|
|
179
|
+
await dispatch(trimmed, { ...options, verbose: true });
|
|
180
|
+
prompt();
|
|
181
|
+
});
|
|
182
|
+
};
|
|
183
|
+
prompt();
|
|
184
|
+
}
|
|
185
|
+
//# sourceMappingURL=run.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/commands/run.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { Message } from './session.js';
|
|
2
|
+
export type TaskStatus = 'active' | 'paused' | 'completed' | 'failed';
|
|
3
|
+
export interface AgentTask {
|
|
4
|
+
id: string;
|
|
5
|
+
title: string;
|
|
6
|
+
status: TaskStatus;
|
|
7
|
+
step: number;
|
|
8
|
+
maxSteps: number;
|
|
9
|
+
model: string;
|
|
10
|
+
messages: Message[];
|
|
11
|
+
createdAt: string;
|
|
12
|
+
updatedAt: string;
|
|
13
|
+
errorCount: number;
|
|
14
|
+
}
|
|
15
|
+
export declare function createTask(userInput: string, model: string, maxSteps: number): AgentTask;
|
|
16
|
+
export declare function saveTask(task: AgentTask): void;
|
|
17
|
+
export declare function loadAllTasks(): AgentTask[];
|
|
18
|
+
export declare function loadTask(id: string): AgentTask | null;
|
|
19
|
+
export declare function deleteTask(id: string): boolean;
|
|
20
|
+
//# sourceMappingURL=agentTask.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agentTask.d.ts","sourceRoot":"","sources":["../../src/core/agentTask.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAG5C,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,QAAQ,GAAG,WAAW,GAAG,QAAQ,CAAC;AAEtE,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,UAAU,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB;AAWD,wBAAgB,UAAU,CACxB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,GACf,SAAS,CAcX;AAGD,wBAAgB,QAAQ,CAAC,IAAI,EAAE,SAAS,GAAG,IAAI,CAS9C;AAGD,wBAAgB,YAAY,IAAI,SAAS,EAAE,CAY1C;AAGD,wBAAgB,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAOrD;AAGD,wBAAgB,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAK9C"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import fs from 'fs';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import os from 'os';
|
|
4
|
+
// ─── 存储目录 ─────────────────────────────────────────────────
|
|
5
|
+
const TASKS_DIR = path.join(os.homedir(), '.config', 'ai-cli', 'tasks');
|
|
6
|
+
const MAX_TASK_FILES = 30;
|
|
7
|
+
function ensureDir() {
|
|
8
|
+
if (!fs.existsSync(TASKS_DIR))
|
|
9
|
+
fs.mkdirSync(TASKS_DIR, { recursive: true });
|
|
10
|
+
}
|
|
11
|
+
// ─── 创建新任务 ───────────────────────────────────────────────
|
|
12
|
+
export function createTask(userInput, model, maxSteps) {
|
|
13
|
+
const now = new Date().toISOString();
|
|
14
|
+
return {
|
|
15
|
+
id: Date.now().toString(),
|
|
16
|
+
title: userInput.slice(0, 40).replace(/\n/g, ' ') + (userInput.length > 40 ? '…' : ''),
|
|
17
|
+
status: 'active',
|
|
18
|
+
step: 0,
|
|
19
|
+
maxSteps,
|
|
20
|
+
model,
|
|
21
|
+
messages: [],
|
|
22
|
+
createdAt: now,
|
|
23
|
+
updatedAt: now,
|
|
24
|
+
errorCount: 0,
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
// ─── 保存任务 ─────────────────────────────────────────────────
|
|
28
|
+
export function saveTask(task) {
|
|
29
|
+
ensureDir();
|
|
30
|
+
task.updatedAt = new Date().toISOString();
|
|
31
|
+
fs.writeFileSync(path.join(TASKS_DIR, `${task.id}.json`), JSON.stringify(task, null, 2), 'utf-8');
|
|
32
|
+
pruneOldTasks();
|
|
33
|
+
}
|
|
34
|
+
// ─── 加载所有任务(时间倒序)──────────────────────────────────
|
|
35
|
+
export function loadAllTasks() {
|
|
36
|
+
ensureDir();
|
|
37
|
+
return fs.readdirSync(TASKS_DIR)
|
|
38
|
+
.filter((f) => f.endsWith('.json'))
|
|
39
|
+
.sort()
|
|
40
|
+
.reverse()
|
|
41
|
+
.map((f) => {
|
|
42
|
+
try {
|
|
43
|
+
return JSON.parse(fs.readFileSync(path.join(TASKS_DIR, f), 'utf-8'));
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
48
|
+
})
|
|
49
|
+
.filter(Boolean);
|
|
50
|
+
}
|
|
51
|
+
// ─── 按 ID 加载单条任务 ────────────────────────────────────────
|
|
52
|
+
export function loadTask(id) {
|
|
53
|
+
ensureDir();
|
|
54
|
+
const p = path.join(TASKS_DIR, `${id}.json`);
|
|
55
|
+
if (!fs.existsSync(p))
|
|
56
|
+
return null;
|
|
57
|
+
try {
|
|
58
|
+
return JSON.parse(fs.readFileSync(p, 'utf-8'));
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
return null;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
// ─── 删除任务 ─────────────────────────────────────────────────
|
|
65
|
+
export function deleteTask(id) {
|
|
66
|
+
const p = path.join(TASKS_DIR, `${id}.json`);
|
|
67
|
+
if (!fs.existsSync(p))
|
|
68
|
+
return false;
|
|
69
|
+
fs.unlinkSync(p);
|
|
70
|
+
return true;
|
|
71
|
+
}
|
|
72
|
+
// ─── 清理超出上限的旧任务 ─────────────────────────────────────
|
|
73
|
+
function pruneOldTasks() {
|
|
74
|
+
const files = fs.readdirSync(TASKS_DIR).filter((f) => f.endsWith('.json')).sort();
|
|
75
|
+
if (files.length > MAX_TASK_FILES) {
|
|
76
|
+
files.slice(0, files.length - MAX_TASK_FILES).forEach((f) => {
|
|
77
|
+
fs.unlinkSync(path.join(TASKS_DIR, f));
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=agentTask.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agentTask.js","sourceRoot":"","sources":["../../src/core/agentTask.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
export type ModelProvider = 'deepseek' | 'qwen' | 'glm' | 'doubao' | 'moonshot' | 'minimax' | 'hunyuan' | 'ernie';
|
|
2
|
+
export interface ModelConfig {
|
|
3
|
+
provider: ModelProvider;
|
|
4
|
+
model: string;
|
|
5
|
+
apiKey: string;
|
|
6
|
+
baseURL?: string;
|
|
7
|
+
maxTokens?: number;
|
|
8
|
+
temperature?: number;
|
|
9
|
+
}
|
|
10
|
+
export type SearchProvider = 'serper' | 'tavily' | 'duckduckgo';
|
|
11
|
+
export interface SearchConfig {
|
|
12
|
+
provider: SearchProvider;
|
|
13
|
+
apiKey?: string;
|
|
14
|
+
maxResults: number;
|
|
15
|
+
}
|
|
16
|
+
export interface AppConfig {
|
|
17
|
+
defaultProvider: ModelProvider;
|
|
18
|
+
providers: Partial<Record<ModelProvider, ModelConfig>>;
|
|
19
|
+
theme: 'dark' | 'light';
|
|
20
|
+
stream: boolean;
|
|
21
|
+
historySize: number;
|
|
22
|
+
search: SearchConfig;
|
|
23
|
+
agentAutoConfirm: boolean;
|
|
24
|
+
}
|
|
25
|
+
export declare const MODEL_DEFAULTS: Record<ModelProvider, Omit<ModelConfig, 'apiKey'>>;
|
|
26
|
+
export declare const PROVIDER_LABELS: Record<ModelProvider, string>;
|
|
27
|
+
export declare const PROVIDER_ENV_VARS: Record<ModelProvider, string>;
|
|
28
|
+
/** 从环境变量读取指定 provider 的 API Key,不存在则返回 undefined */
|
|
29
|
+
export declare function getEnvApiKey(provider: ModelProvider): string | undefined;
|
|
30
|
+
export declare const config: {
|
|
31
|
+
get<K extends keyof AppConfig>(key: K): AppConfig[K];
|
|
32
|
+
set<K extends keyof AppConfig>(key: K, value: AppConfig[K]): void;
|
|
33
|
+
getAll(): AppConfig;
|
|
34
|
+
getProvider(provider?: ModelProvider): ModelConfig | null;
|
|
35
|
+
setProvider(provider: ModelProvider, apiKey: string, model?: string, baseURL?: string): void;
|
|
36
|
+
setDefault(provider: ModelProvider): void;
|
|
37
|
+
setSearch(provider: SearchProvider, apiKey?: string): void;
|
|
38
|
+
clear(): void;
|
|
39
|
+
readonly path: string;
|
|
40
|
+
};
|
|
41
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,aAAa,GACrB,UAAU,GACV,MAAM,GACN,KAAK,GACL,QAAQ,GACR,UAAU,GACV,SAAS,GACT,SAAS,GACT,OAAO,CAAC;AAEZ,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,aAAa,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,QAAQ,GAAG,YAAY,CAAC;AAEhE,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,cAAc,CAAC;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,SAAS;IACxB,eAAe,EAAE,aAAa,CAAC;IAC/B,SAAS,EAAE,OAAO,CAAC,MAAM,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC,CAAC;IACvD,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;IACxB,MAAM,EAAE,OAAO,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,YAAY,CAAC;IACrB,gBAAgB,EAAE,OAAO,CAAC;CAC3B;AAGD,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,aAAa,EAAE,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,CAyD7E,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,aAAa,EAAE,MAAM,CASzD,CAAC;AAKF,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,aAAa,EAAE,MAAM,CAS3D,CAAC;AAEF,oDAAoD;AACpD,wBAAgB,YAAY,CAAC,QAAQ,EAAE,aAAa,GAAG,MAAM,GAAG,SAAS,CAExE;AAoBD,eAAO,MAAM,MAAM;QACb,CAAC,SAAS,MAAM,SAAS,OAAO,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC;QAIhD,CAAC,SAAS,MAAM,SAAS,OAAO,CAAC,SAAS,SAAS,CAAC,CAAC,CAAC,GAAG,IAAI;cAIvD,SAAS;2BAII,aAAa,GAAG,WAAW,GAAG,IAAI;0BAUnC,aAAa,UAAU,MAAM,UAAU,MAAM,YAAY,MAAM,GAAG,IAAI;yBAavE,aAAa,GAAG,IAAI;wBAIrB,cAAc,WAAW,MAAM,GAAG,IAAI;aAQjD,IAAI;mBAID,MAAM;CAGnB,CAAC"}
|