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.
Files changed (103) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +328 -0
  3. package/dist/commands/agent.d.ts +12 -0
  4. package/dist/commands/agent.d.ts.map +1 -0
  5. package/dist/commands/agent.js +311 -0
  6. package/dist/commands/agent.js.map +1 -0
  7. package/dist/commands/ask.d.ts +7 -0
  8. package/dist/commands/ask.d.ts.map +1 -0
  9. package/dist/commands/ask.js +52 -0
  10. package/dist/commands/ask.js.map +1 -0
  11. package/dist/commands/chat.d.ts +9 -0
  12. package/dist/commands/chat.d.ts.map +1 -0
  13. package/dist/commands/chat.js +129 -0
  14. package/dist/commands/chat.js.map +1 -0
  15. package/dist/commands/cmd.d.ts +6 -0
  16. package/dist/commands/cmd.d.ts.map +1 -0
  17. package/dist/commands/cmd.js +52 -0
  18. package/dist/commands/cmd.js.map +1 -0
  19. package/dist/commands/code.d.ts +8 -0
  20. package/dist/commands/code.d.ts.map +1 -0
  21. package/dist/commands/code.js +75 -0
  22. package/dist/commands/code.js.map +1 -0
  23. package/dist/commands/file.d.ts +7 -0
  24. package/dist/commands/file.d.ts.map +1 -0
  25. package/dist/commands/file.js +66 -0
  26. package/dist/commands/file.js.map +1 -0
  27. package/dist/commands/history.d.ts +5 -0
  28. package/dist/commands/history.d.ts.map +1 -0
  29. package/dist/commands/history.js +159 -0
  30. package/dist/commands/history.js.map +1 -0
  31. package/dist/commands/init.d.ts +2 -0
  32. package/dist/commands/init.d.ts.map +1 -0
  33. package/dist/commands/init.js +144 -0
  34. package/dist/commands/init.js.map +1 -0
  35. package/dist/commands/install.d.ts +24 -0
  36. package/dist/commands/install.d.ts.map +1 -0
  37. package/dist/commands/install.js +328 -0
  38. package/dist/commands/install.js.map +1 -0
  39. package/dist/commands/model.d.ts +6 -0
  40. package/dist/commands/model.d.ts.map +1 -0
  41. package/dist/commands/model.js +128 -0
  42. package/dist/commands/model.js.map +1 -0
  43. package/dist/commands/pkg.d.ts +12 -0
  44. package/dist/commands/pkg.d.ts.map +1 -0
  45. package/dist/commands/pkg.js +132 -0
  46. package/dist/commands/pkg.js.map +1 -0
  47. package/dist/commands/run.d.ts +9 -0
  48. package/dist/commands/run.d.ts.map +1 -0
  49. package/dist/commands/run.js +185 -0
  50. package/dist/commands/run.js.map +1 -0
  51. package/dist/core/agentTask.d.ts +20 -0
  52. package/dist/core/agentTask.d.ts.map +1 -0
  53. package/dist/core/agentTask.js +81 -0
  54. package/dist/core/agentTask.js.map +1 -0
  55. package/dist/core/config.d.ts +41 -0
  56. package/dist/core/config.d.ts.map +1 -0
  57. package/dist/core/config.js +153 -0
  58. package/dist/core/config.js.map +1 -0
  59. package/dist/core/executor.d.ts +20 -0
  60. package/dist/core/executor.d.ts.map +1 -0
  61. package/dist/core/executor.js +68 -0
  62. package/dist/core/executor.js.map +1 -0
  63. package/dist/core/files.d.ts +24 -0
  64. package/dist/core/files.d.ts.map +1 -0
  65. package/dist/core/files.js +95 -0
  66. package/dist/core/files.js.map +1 -0
  67. package/dist/core/github.d.ts +32 -0
  68. package/dist/core/github.d.ts.map +1 -0
  69. package/dist/core/github.js +82 -0
  70. package/dist/core/github.js.map +1 -0
  71. package/dist/core/prompt.d.ts +9 -0
  72. package/dist/core/prompt.d.ts.map +1 -0
  73. package/dist/core/prompt.js +44 -0
  74. package/dist/core/prompt.js.map +1 -0
  75. package/dist/core/router.d.ts +16 -0
  76. package/dist/core/router.d.ts.map +1 -0
  77. package/dist/core/router.js +182 -0
  78. package/dist/core/router.js.map +1 -0
  79. package/dist/core/search.d.ts +14 -0
  80. package/dist/core/search.d.ts.map +1 -0
  81. package/dist/core/search.js +179 -0
  82. package/dist/core/search.js.map +1 -0
  83. package/dist/core/session.d.ts +38 -0
  84. package/dist/core/session.d.ts.map +1 -0
  85. package/dist/core/session.js +172 -0
  86. package/dist/core/session.js.map +1 -0
  87. package/dist/core/stream.d.ts +15 -0
  88. package/dist/core/stream.d.ts.map +1 -0
  89. package/dist/core/stream.js +102 -0
  90. package/dist/core/stream.js.map +1 -0
  91. package/dist/core/tools.d.ts +343 -0
  92. package/dist/core/tools.d.ts.map +1 -0
  93. package/dist/core/tools.js +293 -0
  94. package/dist/core/tools.js.map +1 -0
  95. package/dist/index.d.ts +3 -0
  96. package/dist/index.d.ts.map +1 -0
  97. package/dist/index.js +372 -0
  98. package/dist/index.js.map +1 -0
  99. package/dist/ui/renderer.d.ts +17 -0
  100. package/dist/ui/renderer.d.ts.map +1 -0
  101. package/dist/ui/renderer.js +69 -0
  102. package/dist/ui/renderer.js.map +1 -0
  103. 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"}