thatgfsj-code 0.3.0 → 0.3.1
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/CHANGELOG.md +229 -0
- package/DEVELOPMENT.md +286 -0
- package/README.md +144 -79
- package/dist/agent/core.d.ts +56 -0
- package/dist/agent/core.d.ts.map +1 -0
- package/dist/agent/core.js +142 -0
- package/dist/agent/core.js.map +1 -0
- package/dist/agent/index.d.ts +8 -0
- package/dist/agent/index.d.ts.map +1 -0
- package/dist/agent/index.js +8 -0
- package/dist/agent/index.js.map +1 -0
- package/dist/agent/intent.d.ts +36 -0
- package/dist/agent/intent.d.ts.map +1 -0
- package/dist/agent/intent.js +146 -0
- package/dist/agent/intent.js.map +1 -0
- package/dist/agent/streaming.d.ts +50 -0
- package/dist/agent/streaming.d.ts.map +1 -0
- package/dist/agent/streaming.js +110 -0
- package/dist/agent/streaming.js.map +1 -0
- package/dist/core/ai-engine.d.ts +76 -0
- package/dist/core/ai-engine.d.ts.map +1 -0
- package/dist/core/ai-engine.js +394 -0
- package/dist/core/ai-engine.js.map +1 -0
- package/dist/core/cli.d.ts +21 -0
- package/dist/core/cli.d.ts.map +1 -0
- package/dist/core/cli.js +143 -0
- package/dist/core/cli.js.map +1 -0
- package/dist/core/config.d.ts +55 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +162 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/context-compactor.d.ts +54 -0
- package/dist/core/context-compactor.d.ts.map +1 -0
- package/dist/core/context-compactor.js +197 -0
- package/dist/core/context-compactor.js.map +1 -0
- package/dist/core/hooks.d.ts +75 -0
- package/dist/core/hooks.d.ts.map +1 -0
- package/dist/core/hooks.js +146 -0
- package/dist/core/hooks.js.map +1 -0
- package/dist/core/permissions.d.ts +52 -0
- package/dist/core/permissions.d.ts.map +1 -0
- package/dist/core/permissions.js +237 -0
- package/dist/core/permissions.js.map +1 -0
- package/dist/core/session.d.ts +54 -0
- package/dist/core/session.d.ts.map +1 -0
- package/dist/core/session.js +147 -0
- package/dist/core/session.js.map +1 -0
- package/dist/core/skills.d.ts +60 -0
- package/dist/core/skills.d.ts.map +1 -0
- package/dist/core/skills.js +175 -0
- package/dist/core/skills.js.map +1 -0
- package/dist/core/state.d.ts +60 -0
- package/dist/core/state.d.ts.map +1 -0
- package/dist/core/state.js +106 -0
- package/dist/core/state.js.map +1 -0
- package/dist/core/subagent.d.ts +68 -0
- package/dist/core/subagent.d.ts.map +1 -0
- package/dist/core/subagent.js +142 -0
- package/dist/core/subagent.js.map +1 -0
- package/dist/core/system-prompt.d.ts +40 -0
- package/dist/core/system-prompt.d.ts.map +1 -0
- package/dist/core/system-prompt.js +138 -0
- package/dist/core/system-prompt.js.map +1 -0
- package/dist/core/tool-registry.d.ts +53 -0
- package/dist/core/tool-registry.d.ts.map +1 -0
- package/dist/core/tool-registry.js +138 -0
- package/dist/core/tool-registry.js.map +1 -0
- package/dist/core/types.d.ts +206 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +127 -0
- package/dist/core/types.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/{cmd/index.d.ts.map → index.d.ts.map} +1 -1
- package/dist/index.js +472 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/client.d.ts +1 -1
- package/dist/mcp/client.d.ts.map +1 -1
- package/dist/repl/index.d.ts +8 -0
- package/dist/repl/index.d.ts.map +1 -0
- package/dist/repl/index.js +8 -0
- package/dist/repl/index.js.map +1 -0
- package/dist/repl/input.d.ts +69 -0
- package/dist/repl/input.d.ts.map +1 -0
- package/dist/repl/input.js +139 -0
- package/dist/repl/input.js.map +1 -0
- package/dist/repl/loop.d.ts +184 -0
- package/dist/repl/loop.d.ts.map +1 -0
- package/dist/repl/loop.js +932 -0
- package/dist/repl/loop.js.map +1 -0
- package/dist/repl/output.d.ts +105 -0
- package/dist/repl/output.d.ts.map +1 -0
- package/dist/repl/output.js +199 -0
- package/dist/repl/output.js.map +1 -0
- package/dist/repl/welcome.d.ts +68 -0
- package/dist/repl/welcome.d.ts.map +1 -0
- package/dist/repl/welcome.js +254 -0
- package/dist/repl/welcome.js.map +1 -0
- package/dist/tools/file.d.ts +1 -1
- package/dist/tools/file.d.ts.map +1 -1
- package/dist/tools/git.d.ts +1 -1
- package/dist/tools/git.d.ts.map +1 -1
- package/dist/tools/index.d.ts +15 -35
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +31 -80
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/search.d.ts +1 -1
- package/dist/tools/search.d.ts.map +1 -1
- package/dist/tools/shell.d.ts +11 -4
- package/dist/tools/shell.d.ts.map +1 -1
- package/dist/tools/shell.js +78 -42
- package/dist/tools/shell.js.map +1 -1
- package/dist/utils/diff-preview.d.ts +42 -0
- package/dist/utils/diff-preview.d.ts.map +1 -0
- package/dist/utils/diff-preview.js +174 -0
- package/dist/utils/diff-preview.js.map +1 -0
- package/dist/utils/index.d.ts +8 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +8 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/memory.d.ts +81 -0
- package/dist/utils/memory.d.ts.map +1 -0
- package/dist/utils/memory.js +186 -0
- package/dist/utils/memory.js.map +1 -0
- package/dist/utils/project-context.d.ts +62 -0
- package/dist/utils/project-context.d.ts.map +1 -0
- package/dist/utils/project-context.js +197 -0
- package/dist/utils/project-context.js.map +1 -0
- package/docs/API_KEY_GUIDE.md +6 -0
- package/docs/FAQ.md +25 -3
- package/package.json +41 -9
- package/ROADMAP.md +0 -61
- package/dist/app/agent.d.ts +0 -31
- package/dist/app/agent.d.ts.map +0 -1
- package/dist/app/agent.js +0 -106
- package/dist/app/agent.js.map +0 -1
- package/dist/app/index.d.ts +0 -39
- package/dist/app/index.d.ts.map +0 -1
- package/dist/app/index.js +0 -80
- package/dist/app/index.js.map +0 -1
- package/dist/cmd/index.d.ts +0 -12
- package/dist/cmd/index.js +0 -85
- package/dist/cmd/index.js.map +0 -1
- package/dist/config/index.d.ts +0 -39
- package/dist/config/index.d.ts.map +0 -1
- package/dist/config/index.js +0 -110
- package/dist/config/index.js.map +0 -1
- package/dist/config/providers.d.ts +0 -23
- package/dist/config/providers.d.ts.map +0 -1
- package/dist/config/providers.js +0 -152
- package/dist/config/providers.js.map +0 -1
- package/dist/config/types.d.ts +0 -33
- package/dist/config/types.d.ts.map +0 -1
- package/dist/config/types.js +0 -5
- package/dist/config/types.js.map +0 -1
- package/dist/hooks/index.d.ts +0 -31
- package/dist/hooks/index.d.ts.map +0 -1
- package/dist/hooks/index.js +0 -71
- package/dist/hooks/index.js.map +0 -1
- package/dist/llm/anthropic.d.ts +0 -17
- package/dist/llm/anthropic.d.ts.map +0 -1
- package/dist/llm/anthropic.js +0 -126
- package/dist/llm/anthropic.js.map +0 -1
- package/dist/llm/gemini.d.ts +0 -16
- package/dist/llm/gemini.d.ts.map +0 -1
- package/dist/llm/gemini.js +0 -107
- package/dist/llm/gemini.js.map +0 -1
- package/dist/llm/index.d.ts +0 -48
- package/dist/llm/index.d.ts.map +0 -1
- package/dist/llm/index.js +0 -174
- package/dist/llm/index.js.map +0 -1
- package/dist/llm/openai.d.ts +0 -17
- package/dist/llm/openai.d.ts.map +0 -1
- package/dist/llm/openai.js +0 -113
- package/dist/llm/openai.js.map +0 -1
- package/dist/llm/provider.d.ts +0 -33
- package/dist/llm/provider.d.ts.map +0 -1
- package/dist/llm/provider.js +0 -6
- package/dist/llm/provider.js.map +0 -1
- package/dist/prompts/index.d.ts +0 -27
- package/dist/prompts/index.d.ts.map +0 -1
- package/dist/prompts/index.js +0 -102
- package/dist/prompts/index.js.map +0 -1
- package/dist/session/compactor.d.ts +0 -48
- package/dist/session/compactor.d.ts.map +0 -1
- package/dist/session/compactor.js +0 -77
- package/dist/session/compactor.js.map +0 -1
- package/dist/session/index.d.ts +0 -48
- package/dist/session/index.d.ts.map +0 -1
- package/dist/session/index.js +0 -69
- package/dist/session/index.js.map +0 -1
- package/dist/session/message.d.ts +0 -26
- package/dist/session/message.d.ts.map +0 -1
- package/dist/session/message.js +0 -34
- package/dist/session/message.js.map +0 -1
- package/dist/tools/types.d.ts +0 -68
- package/dist/tools/types.d.ts.map +0 -1
- package/dist/tools/types.js +0 -57
- package/dist/tools/types.js.map +0 -1
- package/dist/tui/index.d.ts +0 -8
- package/dist/tui/index.d.ts.map +0 -1
- package/dist/tui/index.js +0 -8
- package/dist/tui/index.js.map +0 -1
- package/dist/tui/input.d.ts +0 -14
- package/dist/tui/input.d.ts.map +0 -1
- package/dist/tui/input.js +0 -50
- package/dist/tui/input.js.map +0 -1
- package/dist/tui/output.d.ts +0 -20
- package/dist/tui/output.d.ts.map +0 -1
- package/dist/tui/output.js +0 -70
- package/dist/tui/output.js.map +0 -1
- package/dist/tui/repl.d.ts +0 -25
- package/dist/tui/repl.d.ts.map +0 -1
- package/dist/tui/repl.js +0 -114
- package/dist/tui/repl.js.map +0 -1
- package/dist/tui/welcome.d.ts +0 -15
- package/dist/tui/welcome.d.ts.map +0 -1
- package/dist/tui/welcome.js +0 -86
- package/dist/tui/welcome.js.map +0 -1
- package/dist/types.d.ts +0 -38
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js +0 -6
- package/dist/types.js.map +0 -1
- package/dist/utils/diff.d.ts +0 -22
- package/dist/utils/diff.d.ts.map +0 -1
- package/dist/utils/diff.js +0 -60
- package/dist/utils/diff.js.map +0 -1
- package/dist/utils/project.d.ts +0 -32
- package/dist/utils/project.d.ts.map +0 -1
- package/dist/utils/project.js +0 -89
- package/dist/utils/project.js.map +0 -1
- package/src/app/agent.ts +0 -140
- package/src/app/index.ts +0 -101
- package/src/cmd/index.ts +0 -96
- package/src/config/index.ts +0 -130
- package/src/config/providers.ts +0 -160
- package/src/config/types.ts +0 -46
- package/src/hooks/index.ts +0 -111
- package/src/llm/anthropic.ts +0 -146
- package/src/llm/gemini.ts +0 -127
- package/src/llm/index.ts +0 -209
- package/src/llm/openai.ts +0 -132
- package/src/llm/provider.ts +0 -38
- package/src/mcp/client.ts +0 -330
- package/src/prompts/index.ts +0 -123
- package/src/session/compactor.ts +0 -103
- package/src/session/index.ts +0 -81
- package/src/session/message.ts +0 -42
- package/src/tools/file.ts +0 -117
- package/src/tools/git.ts +0 -132
- package/src/tools/index.ts +0 -108
- package/src/tools/search.ts +0 -263
- package/src/tools/shell.ts +0 -136
- package/src/tools/types.ts +0 -122
- package/src/tui/index.ts +0 -8
- package/src/tui/input.ts +0 -56
- package/src/tui/output.ts +0 -83
- package/src/tui/repl.ts +0 -131
- package/src/tui/welcome.ts +0 -101
- package/src/types.ts +0 -42
- package/src/utils/diff.ts +0 -71
- package/src/utils/project.ts +0 -99
- package/tsconfig.json +0 -19
package/dist/tui/repl.js
DELETED
|
@@ -1,114 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* REPL - Main interactive loop
|
|
3
|
-
* Migrated from old src/repl/loop.ts + src/index.ts interactive mode
|
|
4
|
-
*/
|
|
5
|
-
import chalk from 'chalk';
|
|
6
|
-
import { REPLInput } from './input.js';
|
|
7
|
-
import { REPLOutput } from './output.js';
|
|
8
|
-
import { ProjectContext } from '../utils/project.js';
|
|
9
|
-
export class REPL {
|
|
10
|
-
input;
|
|
11
|
-
output;
|
|
12
|
-
app;
|
|
13
|
-
running = false;
|
|
14
|
-
constructor(app) {
|
|
15
|
-
this.input = new REPLInput();
|
|
16
|
-
this.output = new REPLOutput();
|
|
17
|
-
this.app = app;
|
|
18
|
-
}
|
|
19
|
-
/**
|
|
20
|
-
* Start the REPL
|
|
21
|
-
*/
|
|
22
|
-
async start() {
|
|
23
|
-
this.running = true;
|
|
24
|
-
// Show banner
|
|
25
|
-
this.output.clear();
|
|
26
|
-
this.output.printBanner();
|
|
27
|
-
this.output.printInfo('Type "help" for available commands\n');
|
|
28
|
-
this.output.printDivider();
|
|
29
|
-
// Show project context
|
|
30
|
-
console.log(chalk.gray(ProjectContext.getSummary()));
|
|
31
|
-
this.output.printDivider();
|
|
32
|
-
console.log();
|
|
33
|
-
// Main loop
|
|
34
|
-
while (this.running) {
|
|
35
|
-
try {
|
|
36
|
-
const userInput = await this.input.prompt();
|
|
37
|
-
if (!userInput.trim())
|
|
38
|
-
continue;
|
|
39
|
-
// Handle commands
|
|
40
|
-
const handled = await this.handleCommand(userInput.trim());
|
|
41
|
-
if (handled)
|
|
42
|
-
continue;
|
|
43
|
-
// Process with AI
|
|
44
|
-
await this.processInput(userInput.trim());
|
|
45
|
-
}
|
|
46
|
-
catch (error) {
|
|
47
|
-
if (error.message === 'SIGINT')
|
|
48
|
-
continue;
|
|
49
|
-
this.output.printError(error.message);
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
/**
|
|
54
|
-
* Handle built-in commands
|
|
55
|
-
*/
|
|
56
|
-
async handleCommand(input) {
|
|
57
|
-
const cmd = input.toLowerCase();
|
|
58
|
-
switch (cmd) {
|
|
59
|
-
case 'exit':
|
|
60
|
-
case 'quit':
|
|
61
|
-
this.output.printInfo('\n👋 Goodbye!');
|
|
62
|
-
this.running = false;
|
|
63
|
-
this.input.close();
|
|
64
|
-
return true;
|
|
65
|
-
case 'clear':
|
|
66
|
-
this.output.clear();
|
|
67
|
-
this.output.printBanner();
|
|
68
|
-
return true;
|
|
69
|
-
case 'help':
|
|
70
|
-
this.output.printHelp();
|
|
71
|
-
return true;
|
|
72
|
-
case 'tools':
|
|
73
|
-
this.output.printHeader('🔧 Available Tools');
|
|
74
|
-
for (const tool of this.app.tools.list()) {
|
|
75
|
-
this.output.printInfo(` ${tool.name} - ${tool.description}`);
|
|
76
|
-
}
|
|
77
|
-
console.log();
|
|
78
|
-
return true;
|
|
79
|
-
case 'model':
|
|
80
|
-
this.output.printHeader('🤖 Current Model');
|
|
81
|
-
const cfg = this.app.config.get();
|
|
82
|
-
this.output.printInfo(` Provider: ${cfg.provider}`);
|
|
83
|
-
this.output.printInfo(` Model: ${cfg.model}`);
|
|
84
|
-
this.output.printInfo(` Base URL: ${cfg.baseUrl || 'default'}`);
|
|
85
|
-
console.log();
|
|
86
|
-
return true;
|
|
87
|
-
default:
|
|
88
|
-
return false;
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
/**
|
|
92
|
-
* Process user input with AI
|
|
93
|
-
*/
|
|
94
|
-
async processInput(input) {
|
|
95
|
-
this.app.session.addMessage('user', input);
|
|
96
|
-
this.output.startSpinner('Thinking...');
|
|
97
|
-
let fullResponse = '';
|
|
98
|
-
try {
|
|
99
|
-
const stream = this.app.getAgent().run(this.app.session.getMessages());
|
|
100
|
-
for await (const chunk of stream) {
|
|
101
|
-
this.output.stopSpinner();
|
|
102
|
-
process.stdout.write(chunk);
|
|
103
|
-
fullResponse += chunk;
|
|
104
|
-
}
|
|
105
|
-
console.log(); // newline
|
|
106
|
-
this.app.session.addMessage('assistant', fullResponse);
|
|
107
|
-
this.app.session.truncate();
|
|
108
|
-
}
|
|
109
|
-
catch (error) {
|
|
110
|
-
this.output.stopSpinnerFail(chalk.red(`Error: ${error.message}`));
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
//# sourceMappingURL=repl.js.map
|
package/dist/tui/repl.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"repl.js","sourceRoot":"","sources":["../../src/tui/repl.ts"],"names":[],"mappings":"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"}
|
package/dist/tui/welcome.d.ts
DELETED
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Welcome / Setup Wizard
|
|
3
|
-
* Migrated and simplified from old src/repl/welcome.ts
|
|
4
|
-
*/
|
|
5
|
-
export declare class WelcomeScreen {
|
|
6
|
-
/**
|
|
7
|
-
* Show welcome if no API key is configured
|
|
8
|
-
*/
|
|
9
|
-
static show(hasApiKey: boolean): void;
|
|
10
|
-
/**
|
|
11
|
-
* Interactive setup wizard
|
|
12
|
-
*/
|
|
13
|
-
static interactiveSetup(): Promise<void>;
|
|
14
|
-
}
|
|
15
|
-
//# sourceMappingURL=welcome.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"welcome.d.ts","sourceRoot":"","sources":["../../src/tui/welcome.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAUH,qBAAa,aAAa;IACxB;;OAEG;IACH,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,GAAG,IAAI;IAarC;;OAEG;WACU,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC;CAmE/C"}
|
package/dist/tui/welcome.js
DELETED
|
@@ -1,86 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Welcome / Setup Wizard
|
|
3
|
-
* Migrated and simplified from old src/repl/welcome.ts
|
|
4
|
-
*/
|
|
5
|
-
import chalk from 'chalk';
|
|
6
|
-
import readline from 'readline';
|
|
7
|
-
import { existsSync, mkdirSync, writeFileSync } from 'fs';
|
|
8
|
-
import { join } from 'path';
|
|
9
|
-
import { homedir } from 'os';
|
|
10
|
-
import { PROVIDERS, getModelsForProvider, listProviders } from '../config/providers.js';
|
|
11
|
-
export class WelcomeScreen {
|
|
12
|
-
/**
|
|
13
|
-
* Show welcome if no API key is configured
|
|
14
|
-
*/
|
|
15
|
-
static show(hasApiKey) {
|
|
16
|
-
if (hasApiKey)
|
|
17
|
-
return;
|
|
18
|
-
const w = 62;
|
|
19
|
-
console.log(chalk.cyan('+') + chalk.white.bold(' Thatgfsj Code ') + chalk.cyan('-'.repeat(w - 16)) + '+');
|
|
20
|
-
console.log(chalk.cyan('|') + chalk.yellow(' 快速开始指南').padEnd(w) + chalk.cyan('|'));
|
|
21
|
-
console.log(chalk.cyan('|') + ' '.repeat(w) + chalk.cyan('|'));
|
|
22
|
-
console.log(chalk.cyan('|') + chalk.gray(' 运行 gfcode init 配置你的 API Key').padEnd(w) + chalk.cyan('|'));
|
|
23
|
-
console.log(chalk.cyan('|') + chalk.gray(' 或设置环境变量: OPENAI_API_KEY, SILICONFLOW_API_KEY 等').padEnd(w) + chalk.cyan('|'));
|
|
24
|
-
console.log(chalk.cyan('+') + '-'.repeat(w) + '+');
|
|
25
|
-
console.log();
|
|
26
|
-
}
|
|
27
|
-
/**
|
|
28
|
-
* Interactive setup wizard
|
|
29
|
-
*/
|
|
30
|
-
static async interactiveSetup() {
|
|
31
|
-
console.clear();
|
|
32
|
-
console.log(chalk.cyan('\n 🤖 Thatgfsj Code 配置向导\n'));
|
|
33
|
-
const rl = readline.createInterface({
|
|
34
|
-
input: process.stdin,
|
|
35
|
-
output: process.stdout,
|
|
36
|
-
});
|
|
37
|
-
const question = (prompt) => new Promise(resolve => rl.question(prompt, answer => resolve(answer.trim())));
|
|
38
|
-
try {
|
|
39
|
-
// Step 1: Choose provider
|
|
40
|
-
console.log(chalk.white(' 步骤 1/3: 选择 AI 提供商\n'));
|
|
41
|
-
const providers = listProviders();
|
|
42
|
-
providers.forEach((p, i) => {
|
|
43
|
-
console.log(chalk.green(` ${i + 1}. ${p.name}`));
|
|
44
|
-
});
|
|
45
|
-
console.log();
|
|
46
|
-
const choice = await question(chalk.green(' 请选择 (1-' + providers.length + '): '));
|
|
47
|
-
const selected = providers[parseInt(choice) - 1] || providers[0];
|
|
48
|
-
const providerName = selected.key;
|
|
49
|
-
// Step 2: Enter API Key
|
|
50
|
-
console.log(chalk.white('\n 步骤 2/3: 输入 API Key\n'));
|
|
51
|
-
console.log(chalk.gray(` 获取地址: ${PROVIDERS[providerName].baseUrl.replace('/v1', '').replace('/v1beta', '')}`));
|
|
52
|
-
const apiKey = await question(chalk.green(' 请输入 API Key: '));
|
|
53
|
-
// Step 3: Choose model
|
|
54
|
-
console.log(chalk.white('\n 步骤 3/3: 选择模型\n'));
|
|
55
|
-
const models = getModelsForProvider(providerName);
|
|
56
|
-
models.forEach((m, i) => {
|
|
57
|
-
console.log(chalk.green(` ${i + 1}. ${m.name}`) + chalk.gray(` - ${m.desc}`));
|
|
58
|
-
});
|
|
59
|
-
console.log();
|
|
60
|
-
const modelChoice = await question(chalk.green(' 请选择模型 (1-' + models.length + '): '));
|
|
61
|
-
const selectedModel = models[parseInt(modelChoice) - 1] || models[0];
|
|
62
|
-
// Save config
|
|
63
|
-
const configDir = join(homedir(), '.thatgfsj');
|
|
64
|
-
const configPath = join(configDir, 'config.json');
|
|
65
|
-
if (!existsSync(configDir)) {
|
|
66
|
-
mkdirSync(configDir, { recursive: true });
|
|
67
|
-
}
|
|
68
|
-
writeFileSync(configPath, JSON.stringify({
|
|
69
|
-
provider: providerName,
|
|
70
|
-
model: selectedModel.id,
|
|
71
|
-
apiKey,
|
|
72
|
-
temperature: 0.7,
|
|
73
|
-
maxTokens: 4096,
|
|
74
|
-
}, null, 2));
|
|
75
|
-
console.log(chalk.green('\n ✅ 配置已保存!'));
|
|
76
|
-
console.log(chalk.gray(` 提供商: ${providerName}`));
|
|
77
|
-
console.log(chalk.gray(` 模型: ${selectedModel.name}`));
|
|
78
|
-
console.log(chalk.gray(` 配置文件: ${configPath}`));
|
|
79
|
-
console.log(chalk.cyan('\n 运行 gfcode 开始使用\n'));
|
|
80
|
-
}
|
|
81
|
-
finally {
|
|
82
|
-
rl.close();
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
//# sourceMappingURL=welcome.js.map
|
package/dist/tui/welcome.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"welcome.js","sourceRoot":"","sources":["../../src/tui/welcome.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
DELETED
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Global shared types for Thatgfsj Code
|
|
3
|
-
* Only the most fundamental types used across modules
|
|
4
|
-
*/
|
|
5
|
-
export type Role = 'system' | 'user' | 'assistant' | 'tool';
|
|
6
|
-
export interface ChatMessage {
|
|
7
|
-
role: Role;
|
|
8
|
-
content: string;
|
|
9
|
-
name?: string;
|
|
10
|
-
tool_calls?: ToolCall[];
|
|
11
|
-
tool_call_id?: string;
|
|
12
|
-
reasoning_content?: string;
|
|
13
|
-
}
|
|
14
|
-
export interface ToolCall {
|
|
15
|
-
id: string;
|
|
16
|
-
type: 'function';
|
|
17
|
-
function: {
|
|
18
|
-
name: string;
|
|
19
|
-
arguments: string;
|
|
20
|
-
};
|
|
21
|
-
}
|
|
22
|
-
export interface ChatResponse {
|
|
23
|
-
content: string;
|
|
24
|
-
role: 'assistant';
|
|
25
|
-
usage?: {
|
|
26
|
-
prompt_tokens: number;
|
|
27
|
-
completion_tokens: number;
|
|
28
|
-
total_tokens: number;
|
|
29
|
-
};
|
|
30
|
-
tool_calls?: ToolCall[];
|
|
31
|
-
reasoning_content?: string;
|
|
32
|
-
}
|
|
33
|
-
export interface ChatOptions {
|
|
34
|
-
temperature?: number;
|
|
35
|
-
maxTokens?: number;
|
|
36
|
-
stream?: boolean;
|
|
37
|
-
}
|
|
38
|
-
//# sourceMappingURL=types.d.ts.map
|
package/dist/types.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,MAAM,IAAI,GAAG,QAAQ,GAAG,MAAM,GAAG,WAAW,GAAG,MAAM,CAAC;AAE5D,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,IAAI,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,QAAQ,EAAE,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,UAAU,CAAC;IACjB,QAAQ,EAAE;QACR,IAAI,EAAE,MAAM,CAAC;QACb,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;CACH;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,WAAW,CAAC;IAClB,KAAK,CAAC,EAAE;QACN,aAAa,EAAE,MAAM,CAAC;QACtB,iBAAiB,EAAE,MAAM,CAAC;QAC1B,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC;IACF,UAAU,CAAC,EAAE,QAAQ,EAAE,CAAC;IACxB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,WAAW;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB"}
|
package/dist/types.js
DELETED
package/dist/types.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
|
package/dist/utils/diff.d.ts
DELETED
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Diff Preview - Show file changes in a readable format
|
|
3
|
-
* Migrated from old src/utils/diff-preview.ts
|
|
4
|
-
*/
|
|
5
|
-
export interface DiffResult {
|
|
6
|
-
original: string;
|
|
7
|
-
modified: string;
|
|
8
|
-
diff: string;
|
|
9
|
-
added: number;
|
|
10
|
-
removed: number;
|
|
11
|
-
}
|
|
12
|
-
export declare class DiffPreview {
|
|
13
|
-
/**
|
|
14
|
-
* Generate a simple line-by-line diff
|
|
15
|
-
*/
|
|
16
|
-
static diff(original: string, modified: string): DiffResult;
|
|
17
|
-
/**
|
|
18
|
-
* Format diff for display
|
|
19
|
-
*/
|
|
20
|
-
static format(result: DiffResult): string;
|
|
21
|
-
}
|
|
22
|
-
//# sourceMappingURL=diff.d.ts.map
|
package/dist/utils/diff.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../../src/utils/diff.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,WAAW;IACtB;;OAEG;IACH,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,UAAU;IAqC3D;;OAEG;IACH,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM;CAa1C"}
|
package/dist/utils/diff.js
DELETED
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Diff Preview - Show file changes in a readable format
|
|
3
|
-
* Migrated from old src/utils/diff-preview.ts
|
|
4
|
-
*/
|
|
5
|
-
export class DiffPreview {
|
|
6
|
-
/**
|
|
7
|
-
* Generate a simple line-by-line diff
|
|
8
|
-
*/
|
|
9
|
-
static diff(original, modified) {
|
|
10
|
-
const originalLines = original.split('\n');
|
|
11
|
-
const modifiedLines = modified.split('\n');
|
|
12
|
-
const diffLines = [];
|
|
13
|
-
let added = 0;
|
|
14
|
-
let removed = 0;
|
|
15
|
-
// Simple diff: show removed (-) and added (+) lines
|
|
16
|
-
const maxLen = Math.max(originalLines.length, modifiedLines.length);
|
|
17
|
-
for (let i = 0; i < maxLen; i++) {
|
|
18
|
-
const orig = originalLines[i];
|
|
19
|
-
const mod = modifiedLines[i];
|
|
20
|
-
if (orig === mod) {
|
|
21
|
-
diffLines.push(` ${orig}`);
|
|
22
|
-
}
|
|
23
|
-
else {
|
|
24
|
-
if (orig !== undefined) {
|
|
25
|
-
diffLines.push(`- ${orig}`);
|
|
26
|
-
removed++;
|
|
27
|
-
}
|
|
28
|
-
if (mod !== undefined) {
|
|
29
|
-
diffLines.push(`+ ${mod}`);
|
|
30
|
-
added++;
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
return {
|
|
35
|
-
original,
|
|
36
|
-
modified,
|
|
37
|
-
diff: diffLines.join('\n'),
|
|
38
|
-
added,
|
|
39
|
-
removed,
|
|
40
|
-
};
|
|
41
|
-
}
|
|
42
|
-
/**
|
|
43
|
-
* Format diff for display
|
|
44
|
-
*/
|
|
45
|
-
static format(result) {
|
|
46
|
-
const lines = result.diff.split('\n').map(line => {
|
|
47
|
-
if (line.startsWith('+'))
|
|
48
|
-
return `\x1b[32m${line}\x1b[0m`;
|
|
49
|
-
if (line.startsWith('-'))
|
|
50
|
-
return `\x1b[31m${line}\x1b[0m`;
|
|
51
|
-
return line;
|
|
52
|
-
});
|
|
53
|
-
return [
|
|
54
|
-
`\x1b[36m--- Changes: -${result.removed} / +${result.added} ---\x1b[0m`,
|
|
55
|
-
...lines,
|
|
56
|
-
`\x1b[36m--- End ---\x1b[0m`,
|
|
57
|
-
].join('\n');
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
//# sourceMappingURL=diff.js.map
|
package/dist/utils/diff.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"diff.js","sourceRoot":"","sources":["../../src/utils/diff.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAUH,MAAM,OAAO,WAAW;IACtB;;OAEG;IACH,MAAM,CAAC,IAAI,CAAC,QAAgB,EAAE,QAAgB;QAC5C,MAAM,aAAa,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC3C,MAAM,aAAa,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC3C,MAAM,SAAS,GAAa,EAAE,CAAC;QAC/B,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,IAAI,OAAO,GAAG,CAAC,CAAC;QAEhB,oDAAoD;QACpD,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;QAEpE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAChC,MAAM,IAAI,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;YAC9B,MAAM,GAAG,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;YAE7B,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;gBACjB,SAAS,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;YAC9B,CAAC;iBAAM,CAAC;gBACN,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;oBACvB,SAAS,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;oBAC5B,OAAO,EAAE,CAAC;gBACZ,CAAC;gBACD,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;oBACtB,SAAS,CAAC,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC;oBAC3B,KAAK,EAAE,CAAC;gBACV,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO;YACL,QAAQ;YACR,QAAQ;YACR,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC;YAC1B,KAAK;YACL,OAAO;SACR,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,MAAM,CAAC,MAAkB;QAC9B,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;YAC/C,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;gBAAE,OAAO,WAAW,IAAI,SAAS,CAAC;YAC1D,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;gBAAE,OAAO,WAAW,IAAI,SAAS,CAAC;YAC1D,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;QAEH,OAAO;YACL,yBAAyB,MAAM,CAAC,OAAO,OAAO,MAAM,CAAC,KAAK,aAAa;YACvE,GAAG,KAAK;YACR,4BAA4B;SAC7B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACf,CAAC;CACF"}
|
package/dist/utils/project.d.ts
DELETED
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Project Context - Detect project type and gather info
|
|
3
|
-
* Migrated from old src/utils/project-context.ts + getProjectContext() from index.ts
|
|
4
|
-
*/
|
|
5
|
-
export interface ProjectInfo {
|
|
6
|
-
type: string;
|
|
7
|
-
name: string;
|
|
8
|
-
path: string;
|
|
9
|
-
fileCount: number;
|
|
10
|
-
dependencies: number;
|
|
11
|
-
}
|
|
12
|
-
export interface PackageJson {
|
|
13
|
-
name?: string;
|
|
14
|
-
version?: string;
|
|
15
|
-
dependencies?: Record<string, string>;
|
|
16
|
-
devDependencies?: Record<string, string>;
|
|
17
|
-
}
|
|
18
|
-
export declare class ProjectContext {
|
|
19
|
-
/**
|
|
20
|
-
* Get project context string for display
|
|
21
|
-
*/
|
|
22
|
-
static getSummary(cwd?: string): string;
|
|
23
|
-
/**
|
|
24
|
-
* Count code files in directory (skipping node_modules, .git, etc.)
|
|
25
|
-
*/
|
|
26
|
-
static countCodeFiles(dir: string, maxDepth?: number): number;
|
|
27
|
-
/**
|
|
28
|
-
* Detect project type from files
|
|
29
|
-
*/
|
|
30
|
-
static detectType(cwd?: string): string;
|
|
31
|
-
}
|
|
32
|
-
//# sourceMappingURL=project.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../../src/utils/project.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC1C;AAED,qBAAa,cAAc;IACzB;;OAEG;IACH,MAAM,CAAC,UAAU,CAAC,GAAG,GAAE,MAAsB,GAAG,MAAM;IA0BtD;;OAEG;IACH,MAAM,CAAC,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,SAAI,GAAG,MAAM;IA+BxD;;OAEG;IACH,MAAM,CAAC,UAAU,CAAC,GAAG,GAAE,MAAsB,GAAG,MAAM;CAQvD"}
|
package/dist/utils/project.js
DELETED
|
@@ -1,89 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Project Context - Detect project type and gather info
|
|
3
|
-
* Migrated from old src/utils/project-context.ts + getProjectContext() from index.ts
|
|
4
|
-
*/
|
|
5
|
-
import { existsSync, readdirSync, statSync, readFileSync } from 'fs';
|
|
6
|
-
import { join } from 'path';
|
|
7
|
-
export class ProjectContext {
|
|
8
|
-
/**
|
|
9
|
-
* Get project context string for display
|
|
10
|
-
*/
|
|
11
|
-
static getSummary(cwd = process.cwd()) {
|
|
12
|
-
const info = [];
|
|
13
|
-
try {
|
|
14
|
-
const pkgPath = join(cwd, 'package.json');
|
|
15
|
-
if (existsSync(pkgPath)) {
|
|
16
|
-
const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));
|
|
17
|
-
info.push(`📦 Project: ${cwd}`);
|
|
18
|
-
info.push(` Name: ${pkg.name || 'unknown'}`);
|
|
19
|
-
const depCount = Object.keys(pkg.dependencies || {}).length;
|
|
20
|
-
if (depCount > 0)
|
|
21
|
-
info.push(` Deps: ${depCount} packages`);
|
|
22
|
-
}
|
|
23
|
-
else {
|
|
24
|
-
info.push(`📁 Working dir: ${cwd}`);
|
|
25
|
-
}
|
|
26
|
-
const fileCount = ProjectContext.countCodeFiles(cwd);
|
|
27
|
-
if (fileCount > 0) {
|
|
28
|
-
info.push(` Files: ${fileCount} code files`);
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
catch {
|
|
32
|
-
info.push(`📁 Working dir: ${cwd}`);
|
|
33
|
-
}
|
|
34
|
-
return info.join('\n');
|
|
35
|
-
}
|
|
36
|
-
/**
|
|
37
|
-
* Count code files in directory (skipping node_modules, .git, etc.)
|
|
38
|
-
*/
|
|
39
|
-
static countCodeFiles(dir, maxDepth = 3) {
|
|
40
|
-
let count = 0;
|
|
41
|
-
const codeExts = /\.(ts|js|py|go|rs|java|cpp|c|h|tsx|jsx|vue|svelte)$/;
|
|
42
|
-
const walk = (d, depth) => {
|
|
43
|
-
if (depth > maxDepth)
|
|
44
|
-
return;
|
|
45
|
-
try {
|
|
46
|
-
const items = readdirSync(d);
|
|
47
|
-
for (const item of items) {
|
|
48
|
-
if (['node_modules', '.git', 'dist', 'build', '__pycache__'].includes(item))
|
|
49
|
-
continue;
|
|
50
|
-
const fullPath = join(d, item);
|
|
51
|
-
try {
|
|
52
|
-
const stat = statSync(fullPath);
|
|
53
|
-
if (stat.isDirectory()) {
|
|
54
|
-
walk(fullPath, depth + 1);
|
|
55
|
-
}
|
|
56
|
-
else if (codeExts.test(item)) {
|
|
57
|
-
count++;
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
catch {
|
|
61
|
-
// Skip inaccessible files
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
catch {
|
|
66
|
-
// Skip inaccessible directories
|
|
67
|
-
}
|
|
68
|
-
};
|
|
69
|
-
walk(dir, 0);
|
|
70
|
-
return count;
|
|
71
|
-
}
|
|
72
|
-
/**
|
|
73
|
-
* Detect project type from files
|
|
74
|
-
*/
|
|
75
|
-
static detectType(cwd = process.cwd()) {
|
|
76
|
-
if (existsSync(join(cwd, 'package.json')))
|
|
77
|
-
return 'node';
|
|
78
|
-
if (existsSync(join(cwd, 'Cargo.toml')))
|
|
79
|
-
return 'rust';
|
|
80
|
-
if (existsSync(join(cwd, 'go.mod')))
|
|
81
|
-
return 'go';
|
|
82
|
-
if (existsSync(join(cwd, 'pyproject.toml')) || existsSync(join(cwd, 'requirements.txt')))
|
|
83
|
-
return 'python';
|
|
84
|
-
if (existsSync(join(cwd, 'build.gradle')))
|
|
85
|
-
return 'java';
|
|
86
|
-
return 'unknown';
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
//# sourceMappingURL=project.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"project.js","sourceRoot":"","sources":["../../src/utils/project.ts"],"names":[],"mappings":"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"}
|
package/src/app/agent.ts
DELETED
|
@@ -1,140 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Agent Loop - Core agent logic with streaming and tool execution
|
|
3
|
-
* Extracted from old src/core/ai-engine.ts
|
|
4
|
-
*
|
|
5
|
-
* The agent loop: while(true) { stream response → check tool calls → execute → repeat }
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
import chalk from 'chalk';
|
|
9
|
-
import type { ChatMessage, ChatResponse } from '../types.js';
|
|
10
|
-
import type { Tool } from '../tools/types.js';
|
|
11
|
-
import type { HookManager } from '../hooks/index.js';
|
|
12
|
-
import { LLMService } from '../llm/index.js';
|
|
13
|
-
import { ToolRegistry } from '../tools/index.js';
|
|
14
|
-
|
|
15
|
-
export interface AgentConfig {
|
|
16
|
-
maxIterations?: number;
|
|
17
|
-
hooks?: HookManager;
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
export class Agent {
|
|
21
|
-
private llm: LLMService;
|
|
22
|
-
private registry: ToolRegistry;
|
|
23
|
-
private hooks?: HookManager;
|
|
24
|
-
private maxIterations: number;
|
|
25
|
-
|
|
26
|
-
constructor(llm: LLMService, registry: ToolRegistry, config: AgentConfig = {}) {
|
|
27
|
-
this.llm = llm;
|
|
28
|
-
this.registry = registry;
|
|
29
|
-
this.hooks = config.hooks;
|
|
30
|
-
this.maxIterations = config.maxIterations ?? 10;
|
|
31
|
-
|
|
32
|
-
// Register tools with LLM service
|
|
33
|
-
this.llm.registerTools(registry.list());
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
/**
|
|
37
|
-
* Run agent loop with streaming output
|
|
38
|
-
* Returns the final response
|
|
39
|
-
*/
|
|
40
|
-
async *run(messages: ChatMessage[]): AsyncGenerator<string, ChatResponse> {
|
|
41
|
-
let currentMessages = [...messages];
|
|
42
|
-
let iterations = 0;
|
|
43
|
-
|
|
44
|
-
while (iterations < this.maxIterations) {
|
|
45
|
-
iterations++;
|
|
46
|
-
|
|
47
|
-
// Hook: beforeAgentLoop
|
|
48
|
-
if (this.hooks) {
|
|
49
|
-
await this.hooks.emit('beforeAgentLoop', { messages: currentMessages, iteration: iterations });
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
// Stream the response
|
|
53
|
-
let fullContent = '';
|
|
54
|
-
|
|
55
|
-
for await (const chunk of this.llm.chatStream(currentMessages, { maxIterations: 1 })) {
|
|
56
|
-
fullContent += chunk;
|
|
57
|
-
yield chunk;
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
// Get the full response to check for tool calls
|
|
61
|
-
const response: ChatResponse = {
|
|
62
|
-
content: fullContent,
|
|
63
|
-
role: 'assistant',
|
|
64
|
-
};
|
|
65
|
-
|
|
66
|
-
// Check if the response contains tool calls
|
|
67
|
-
// For now, we rely on the LLM service to handle tool calls internally
|
|
68
|
-
// If the LLM service returned tool_calls, we need to process them
|
|
69
|
-
if (response.tool_calls && response.tool_calls.length > 0) {
|
|
70
|
-
currentMessages.push({
|
|
71
|
-
role: 'assistant',
|
|
72
|
-
content: response.content,
|
|
73
|
-
tool_calls: response.tool_calls,
|
|
74
|
-
});
|
|
75
|
-
|
|
76
|
-
for (const toolCall of response.tool_calls) {
|
|
77
|
-
// Hook: beforeToolCall
|
|
78
|
-
if (this.hooks) {
|
|
79
|
-
await this.hooks.emit('beforeToolCall', {
|
|
80
|
-
toolName: toolCall.function.name,
|
|
81
|
-
toolParams: JSON.parse(toolCall.function.arguments || '{}'),
|
|
82
|
-
toolCallId: toolCall.id,
|
|
83
|
-
});
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
const result = await this.registry.execute(
|
|
87
|
-
toolCall.function.name,
|
|
88
|
-
JSON.parse(toolCall.function.arguments || '{}')
|
|
89
|
-
);
|
|
90
|
-
|
|
91
|
-
// Hook: afterToolCall
|
|
92
|
-
if (this.hooks) {
|
|
93
|
-
await this.hooks.emit('afterToolCall', {
|
|
94
|
-
toolName: toolCall.function.name,
|
|
95
|
-
toolParams: JSON.parse(toolCall.function.arguments || '{}'),
|
|
96
|
-
toolResult: result,
|
|
97
|
-
toolCallId: toolCall.id,
|
|
98
|
-
});
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
currentMessages.push({
|
|
102
|
-
role: 'tool',
|
|
103
|
-
content: result.success ? (result.output || JSON.stringify(result.data)) : (result.error || 'Tool failed'),
|
|
104
|
-
tool_call_id: toolCall.id,
|
|
105
|
-
name: toolCall.function.name,
|
|
106
|
-
});
|
|
107
|
-
|
|
108
|
-
yield `\n${chalk.gray(`[tool: ${toolCall.function.name}]`)}`;
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
continue; // Next iteration
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
// No tool calls - done
|
|
115
|
-
if (response.content) {
|
|
116
|
-
currentMessages.push({ role: 'assistant', content: response.content });
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
// Hook: afterAgentLoop
|
|
120
|
-
if (this.hooks) {
|
|
121
|
-
await this.hooks.emit('afterAgentLoop', { messages: currentMessages, iteration: iterations });
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
return response;
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
return { content: '[Agent loop exceeded maximum iterations]', role: 'assistant' };
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
/**
|
|
131
|
-
* Non-streaming chat (convenience method)
|
|
132
|
-
*/
|
|
133
|
-
async chat(messages: ChatMessage[]): Promise<ChatResponse> {
|
|
134
|
-
let fullContent = '';
|
|
135
|
-
for await (const chunk of this.run(messages)) {
|
|
136
|
-
fullContent += chunk;
|
|
137
|
-
}
|
|
138
|
-
return { content: fullContent, role: 'assistant' };
|
|
139
|
-
}
|
|
140
|
-
}
|