thatgfsj-code 0.3.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 +136 -0
- package/ROADMAP.md +61 -0
- package/dist/app/agent.d.ts +31 -0
- package/dist/app/agent.d.ts.map +1 -0
- package/dist/app/agent.js +106 -0
- package/dist/app/agent.js.map +1 -0
- package/dist/app/index.d.ts +39 -0
- package/dist/app/index.d.ts.map +1 -0
- package/dist/app/index.js +80 -0
- package/dist/app/index.js.map +1 -0
- package/dist/cmd/index.d.ts +12 -0
- package/dist/cmd/index.d.ts.map +1 -0
- package/dist/cmd/index.js +85 -0
- package/dist/cmd/index.js.map +1 -0
- package/dist/config/index.d.ts +39 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +110 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/providers.d.ts +23 -0
- package/dist/config/providers.d.ts.map +1 -0
- package/dist/config/providers.js +152 -0
- package/dist/config/providers.js.map +1 -0
- package/dist/config/types.d.ts +33 -0
- package/dist/config/types.d.ts.map +1 -0
- package/dist/config/types.js +5 -0
- package/dist/config/types.js.map +1 -0
- package/dist/hooks/index.d.ts +31 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/index.js +71 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/llm/anthropic.d.ts +17 -0
- package/dist/llm/anthropic.d.ts.map +1 -0
- package/dist/llm/anthropic.js +126 -0
- package/dist/llm/anthropic.js.map +1 -0
- package/dist/llm/gemini.d.ts +16 -0
- package/dist/llm/gemini.d.ts.map +1 -0
- package/dist/llm/gemini.js +107 -0
- package/dist/llm/gemini.js.map +1 -0
- package/dist/llm/index.d.ts +48 -0
- package/dist/llm/index.d.ts.map +1 -0
- package/dist/llm/index.js +174 -0
- package/dist/llm/index.js.map +1 -0
- package/dist/llm/openai.d.ts +17 -0
- package/dist/llm/openai.d.ts.map +1 -0
- package/dist/llm/openai.js +113 -0
- package/dist/llm/openai.js.map +1 -0
- package/dist/llm/provider.d.ts +33 -0
- package/dist/llm/provider.d.ts.map +1 -0
- package/dist/llm/provider.js +6 -0
- package/dist/llm/provider.js.map +1 -0
- package/dist/mcp/client.d.ts +83 -0
- package/dist/mcp/client.d.ts.map +1 -0
- package/dist/mcp/client.js +267 -0
- package/dist/mcp/client.js.map +1 -0
- package/dist/prompts/index.d.ts +27 -0
- package/dist/prompts/index.d.ts.map +1 -0
- package/dist/prompts/index.js +102 -0
- package/dist/prompts/index.js.map +1 -0
- package/dist/session/compactor.d.ts +48 -0
- package/dist/session/compactor.d.ts.map +1 -0
- package/dist/session/compactor.js +77 -0
- package/dist/session/compactor.js.map +1 -0
- package/dist/session/index.d.ts +48 -0
- package/dist/session/index.d.ts.map +1 -0
- package/dist/session/index.js +69 -0
- package/dist/session/index.js.map +1 -0
- package/dist/session/message.d.ts +26 -0
- package/dist/session/message.d.ts.map +1 -0
- package/dist/session/message.js +34 -0
- package/dist/session/message.js.map +1 -0
- package/dist/tools/file.d.ts +46 -0
- package/dist/tools/file.d.ts.map +1 -0
- package/dist/tools/file.js +100 -0
- package/dist/tools/file.js.map +1 -0
- package/dist/tools/git.d.ts +52 -0
- package/dist/tools/git.d.ts.map +1 -0
- package/dist/tools/git.js +112 -0
- package/dist/tools/git.js.map +1 -0
- package/dist/tools/index.d.ts +42 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +92 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/search.d.ts +36 -0
- package/dist/tools/search.d.ts.map +1 -0
- package/dist/tools/search.js +223 -0
- package/dist/tools/search.js.map +1 -0
- package/dist/tools/shell.d.ts +50 -0
- package/dist/tools/shell.d.ts.map +1 -0
- package/dist/tools/shell.js +117 -0
- package/dist/tools/shell.js.map +1 -0
- package/dist/tools/types.d.ts +68 -0
- package/dist/tools/types.d.ts.map +1 -0
- package/dist/tools/types.js +57 -0
- package/dist/tools/types.js.map +1 -0
- package/dist/tui/index.d.ts +8 -0
- package/dist/tui/index.d.ts.map +1 -0
- package/dist/tui/index.js +8 -0
- package/dist/tui/index.js.map +1 -0
- package/dist/tui/input.d.ts +14 -0
- package/dist/tui/input.d.ts.map +1 -0
- package/dist/tui/input.js +50 -0
- package/dist/tui/input.js.map +1 -0
- package/dist/tui/output.d.ts +20 -0
- package/dist/tui/output.d.ts.map +1 -0
- package/dist/tui/output.js +70 -0
- package/dist/tui/output.js.map +1 -0
- package/dist/tui/repl.d.ts +25 -0
- package/dist/tui/repl.d.ts.map +1 -0
- package/dist/tui/repl.js +114 -0
- package/dist/tui/repl.js.map +1 -0
- package/dist/tui/welcome.d.ts +15 -0
- package/dist/tui/welcome.d.ts.map +1 -0
- package/dist/tui/welcome.js +86 -0
- package/dist/tui/welcome.js.map +1 -0
- package/dist/types.d.ts +38 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +6 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/diff.d.ts +22 -0
- package/dist/utils/diff.d.ts.map +1 -0
- package/dist/utils/diff.js +60 -0
- package/dist/utils/diff.js.map +1 -0
- package/dist/utils/project.d.ts +32 -0
- package/dist/utils/project.d.ts.map +1 -0
- package/dist/utils/project.js +89 -0
- package/dist/utils/project.js.map +1 -0
- package/docs/API_KEY_GUIDE.md +236 -0
- package/docs/FAQ.md +182 -0
- package/install.bat +63 -0
- package/install.ps1 +238 -0
- package/install.sh +113 -0
- package/package.json +36 -0
- package/src/app/agent.ts +140 -0
- package/src/app/index.ts +101 -0
- package/src/cmd/index.ts +96 -0
- package/src/config/index.ts +130 -0
- package/src/config/providers.ts +160 -0
- package/src/config/types.ts +46 -0
- package/src/hooks/index.ts +111 -0
- package/src/llm/anthropic.ts +146 -0
- package/src/llm/gemini.ts +127 -0
- package/src/llm/index.ts +209 -0
- package/src/llm/openai.ts +132 -0
- package/src/llm/provider.ts +38 -0
- package/src/mcp/client.ts +330 -0
- package/src/prompts/index.ts +123 -0
- package/src/session/compactor.ts +103 -0
- package/src/session/index.ts +81 -0
- package/src/session/message.ts +42 -0
- package/src/tools/file.ts +117 -0
- package/src/tools/git.ts +132 -0
- package/src/tools/index.ts +108 -0
- package/src/tools/search.ts +263 -0
- package/src/tools/shell.ts +136 -0
- package/src/tools/types.ts +122 -0
- package/src/tui/index.ts +8 -0
- package/src/tui/input.ts +56 -0
- package/src/tui/output.ts +83 -0
- package/src/tui/repl.ts +131 -0
- package/src/tui/welcome.ts +101 -0
- package/src/types.ts +42 -0
- package/src/utils/diff.ts +71 -0
- package/src/utils/project.ts +99 -0
- package/tsconfig.json +19 -0
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Google Gemini Provider
|
|
3
|
+
*/
|
|
4
|
+
export class GeminiProvider {
|
|
5
|
+
name = 'gemini';
|
|
6
|
+
config;
|
|
7
|
+
constructor(config) {
|
|
8
|
+
this.config = config;
|
|
9
|
+
}
|
|
10
|
+
buildTools(tools) {
|
|
11
|
+
return tools.map(tool => ({
|
|
12
|
+
name: tool.name,
|
|
13
|
+
description: tool.description,
|
|
14
|
+
parameters: tool.inputSchema || {
|
|
15
|
+
type: 'object',
|
|
16
|
+
properties: Object.fromEntries(tool.parameters.map(p => [p.name, { type: p.type, description: p.description }])),
|
|
17
|
+
required: tool.parameters.filter(p => p.required).map(p => p.name),
|
|
18
|
+
},
|
|
19
|
+
}));
|
|
20
|
+
}
|
|
21
|
+
async chat(messages, options) {
|
|
22
|
+
const body = this.buildRequest(messages, options);
|
|
23
|
+
const url = `${this.config.baseUrl}/models/${this.config.model}:generateContent?key=${this.config.apiKey}`;
|
|
24
|
+
const response = await fetch(url, {
|
|
25
|
+
method: 'POST',
|
|
26
|
+
headers: { 'Content-Type': 'application/json' },
|
|
27
|
+
body: JSON.stringify(body),
|
|
28
|
+
});
|
|
29
|
+
if (!response.ok) {
|
|
30
|
+
const text = await response.text().catch(() => '');
|
|
31
|
+
throw new Error(`Gemini API error ${response.status}: ${text}`);
|
|
32
|
+
}
|
|
33
|
+
const data = await response.json();
|
|
34
|
+
const candidate = data.candidates?.[0];
|
|
35
|
+
const text = candidate?.content?.parts?.map((p) => p.text).join('') || '';
|
|
36
|
+
return {
|
|
37
|
+
content: text,
|
|
38
|
+
role: 'assistant',
|
|
39
|
+
usage: data.usageMetadata ? {
|
|
40
|
+
prompt_tokens: data.usageMetadata.promptTokenCount || 0,
|
|
41
|
+
completion_tokens: data.usageMetadata.candidatesTokenCount || 0,
|
|
42
|
+
total_tokens: data.usageMetadata.totalTokenCount || 0,
|
|
43
|
+
} : undefined,
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
async *chatStream(messages, options) {
|
|
47
|
+
const body = this.buildRequest(messages, options);
|
|
48
|
+
const url = `${this.config.baseUrl}/models/${this.config.model}:streamGenerateContent?key=${this.config.apiKey}`;
|
|
49
|
+
const response = await fetch(url, {
|
|
50
|
+
method: 'POST',
|
|
51
|
+
headers: { 'Content-Type': 'application/json' },
|
|
52
|
+
body: JSON.stringify(body),
|
|
53
|
+
});
|
|
54
|
+
if (!response.ok || !response.body) {
|
|
55
|
+
const text = await response.text().catch(() => '');
|
|
56
|
+
throw new Error(`Gemini API error ${response.status}: ${text}`);
|
|
57
|
+
}
|
|
58
|
+
const reader = response.body.getReader();
|
|
59
|
+
const decoder = new TextDecoder();
|
|
60
|
+
let fullContent = '';
|
|
61
|
+
let buffer = '';
|
|
62
|
+
try {
|
|
63
|
+
while (true) {
|
|
64
|
+
const { done, value } = await reader.read();
|
|
65
|
+
if (done)
|
|
66
|
+
break;
|
|
67
|
+
buffer += decoder.decode(value, { stream: true });
|
|
68
|
+
// Gemini streams JSON array chunks
|
|
69
|
+
const jsonMatch = buffer.match(/\{"candidates":\[.*?\]\}/);
|
|
70
|
+
if (jsonMatch) {
|
|
71
|
+
try {
|
|
72
|
+
const data = JSON.parse(jsonMatch[0]);
|
|
73
|
+
const text = data.candidates?.[0]?.content?.parts?.map((p) => p.text).join('') || '';
|
|
74
|
+
if (text) {
|
|
75
|
+
fullContent += text;
|
|
76
|
+
yield text;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
// Skip invalid JSON
|
|
81
|
+
}
|
|
82
|
+
buffer = buffer.slice(jsonMatch.index + jsonMatch[0].length);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
finally {
|
|
87
|
+
reader.releaseLock();
|
|
88
|
+
}
|
|
89
|
+
return { content: fullContent, role: 'assistant' };
|
|
90
|
+
}
|
|
91
|
+
buildRequest(messages, options) {
|
|
92
|
+
const contents = messages
|
|
93
|
+
.filter(m => m.role !== 'system')
|
|
94
|
+
.map(m => ({
|
|
95
|
+
role: m.role === 'assistant' ? 'model' : 'user',
|
|
96
|
+
parts: [{ text: m.content }],
|
|
97
|
+
}));
|
|
98
|
+
return {
|
|
99
|
+
contents,
|
|
100
|
+
generationConfig: {
|
|
101
|
+
temperature: options?.temperature ?? this.config.temperature,
|
|
102
|
+
maxOutputTokens: options?.maxTokens ?? this.config.maxTokens,
|
|
103
|
+
},
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
//# sourceMappingURL=gemini.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gemini.js","sourceRoot":"","sources":["../../src/llm/gemini.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LLM Service - Factory for creating providers
|
|
3
|
+
* Replaces the monolithic AIEngine with a clean provider abstraction
|
|
4
|
+
*/
|
|
5
|
+
import type { ChatMessage, ChatResponse, ChatOptions } from '../types.js';
|
|
6
|
+
import type { Tool } from '../tools/types.js';
|
|
7
|
+
import type { LLMProvider } from './provider.js';
|
|
8
|
+
import type { AIConfig } from '../config/types.js';
|
|
9
|
+
export declare class LLMService {
|
|
10
|
+
private provider;
|
|
11
|
+
private tools;
|
|
12
|
+
constructor(provider: LLMProvider);
|
|
13
|
+
/**
|
|
14
|
+
* Create LLMService from AIConfig
|
|
15
|
+
*/
|
|
16
|
+
static fromConfig(config: AIConfig): LLMService;
|
|
17
|
+
/**
|
|
18
|
+
* Register tools for function calling
|
|
19
|
+
*/
|
|
20
|
+
registerTools(tools: Tool[]): void;
|
|
21
|
+
/**
|
|
22
|
+
* Get provider name
|
|
23
|
+
*/
|
|
24
|
+
getProviderName(): string;
|
|
25
|
+
/**
|
|
26
|
+
* Non-streaming chat
|
|
27
|
+
*/
|
|
28
|
+
chat(messages: ChatMessage[], options?: ChatOptions): Promise<ChatResponse>;
|
|
29
|
+
/**
|
|
30
|
+
* Streaming chat with agent loop (tool call support)
|
|
31
|
+
*/
|
|
32
|
+
chatStream(messages: ChatMessage[], options?: ChatOptions & {
|
|
33
|
+
maxIterations?: number;
|
|
34
|
+
}): AsyncGenerator<string, ChatResponse>;
|
|
35
|
+
/**
|
|
36
|
+
* Check if API key is available
|
|
37
|
+
*/
|
|
38
|
+
private hasApiKey;
|
|
39
|
+
/**
|
|
40
|
+
* Mock response when no API key is set
|
|
41
|
+
*/
|
|
42
|
+
private getMockResponse;
|
|
43
|
+
}
|
|
44
|
+
export type { LLMProvider, ProviderConfig } from './provider.js';
|
|
45
|
+
export { OpenAIProvider } from './openai.js';
|
|
46
|
+
export { AnthropicProvider } from './anthropic.js';
|
|
47
|
+
export { GeminiProvider } from './gemini.js';
|
|
48
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/llm/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,WAAW,EAAY,MAAM,aAAa,CAAC;AACpF,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,KAAK,EAAE,QAAQ,EAAgB,MAAM,oBAAoB,CAAC;AAMjE,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAc;IAC9B,OAAO,CAAC,KAAK,CAAgC;gBAEjC,QAAQ,EAAE,WAAW;IAIjC;;OAEG;IACH,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,QAAQ,GAAG,UAAU;IA6B/C;;OAEG;IACH,aAAa,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,IAAI;IAMlC;;OAEG;IACH,eAAe,IAAI,MAAM;IAIzB;;OAEG;IACG,IAAI,CAAC,QAAQ,EAAE,WAAW,EAAE,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;IAOjF;;OAEG;IACI,UAAU,CACf,QAAQ,EAAE,WAAW,EAAE,EACvB,OAAO,CAAC,EAAE,WAAW,GAAG;QAAE,aAAa,CAAC,EAAE,MAAM,CAAA;KAAE,GACjD,cAAc,CAAC,MAAM,EAAE,YAAY,CAAC;IA2FvC;;OAEG;IACH,OAAO,CAAC,SAAS;IAIjB;;OAEG;IACH,OAAO,CAAC,eAAe;CAcxB;AAGD,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AACjE,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LLM Service - Factory for creating providers
|
|
3
|
+
* Replaces the monolithic AIEngine with a clean provider abstraction
|
|
4
|
+
*/
|
|
5
|
+
import chalk from 'chalk';
|
|
6
|
+
import { PROVIDERS } from '../config/providers.js';
|
|
7
|
+
import { OpenAIProvider } from './openai.js';
|
|
8
|
+
import { AnthropicProvider } from './anthropic.js';
|
|
9
|
+
import { GeminiProvider } from './gemini.js';
|
|
10
|
+
export class LLMService {
|
|
11
|
+
provider;
|
|
12
|
+
tools = new Map();
|
|
13
|
+
constructor(provider) {
|
|
14
|
+
this.provider = provider;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Create LLMService from AIConfig
|
|
18
|
+
*/
|
|
19
|
+
static fromConfig(config) {
|
|
20
|
+
const providerName = config.provider || 'siliconflow';
|
|
21
|
+
const providerConfig = PROVIDERS[providerName];
|
|
22
|
+
const providerCfg = {
|
|
23
|
+
apiKey: config.apiKey || '',
|
|
24
|
+
model: config.model || providerConfig.defaultModel,
|
|
25
|
+
baseUrl: config.baseUrl || providerConfig.baseUrl,
|
|
26
|
+
temperature: config.temperature ?? 0.7,
|
|
27
|
+
maxTokens: config.maxTokens ?? 4096,
|
|
28
|
+
};
|
|
29
|
+
const format = providerConfig.format;
|
|
30
|
+
let provider;
|
|
31
|
+
switch (format) {
|
|
32
|
+
case 'anthropic':
|
|
33
|
+
provider = new AnthropicProvider(providerCfg);
|
|
34
|
+
break;
|
|
35
|
+
case 'gemini':
|
|
36
|
+
provider = new GeminiProvider(providerCfg);
|
|
37
|
+
break;
|
|
38
|
+
default:
|
|
39
|
+
provider = new OpenAIProvider(providerCfg);
|
|
40
|
+
}
|
|
41
|
+
return new LLMService(provider);
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Register tools for function calling
|
|
45
|
+
*/
|
|
46
|
+
registerTools(tools) {
|
|
47
|
+
for (const tool of tools) {
|
|
48
|
+
this.tools.set(tool.name, tool);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Get provider name
|
|
53
|
+
*/
|
|
54
|
+
getProviderName() {
|
|
55
|
+
return this.provider.name;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Non-streaming chat
|
|
59
|
+
*/
|
|
60
|
+
async chat(messages, options) {
|
|
61
|
+
if (!this.hasApiKey()) {
|
|
62
|
+
return this.getMockResponse(messages);
|
|
63
|
+
}
|
|
64
|
+
return this.provider.chat(messages, options);
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Streaming chat with agent loop (tool call support)
|
|
68
|
+
*/
|
|
69
|
+
async *chatStream(messages, options) {
|
|
70
|
+
if (!this.hasApiKey()) {
|
|
71
|
+
const mock = this.getMockResponse(messages);
|
|
72
|
+
for (const char of mock.content) {
|
|
73
|
+
await new Promise(r => setTimeout(r, 10));
|
|
74
|
+
yield char;
|
|
75
|
+
}
|
|
76
|
+
return mock;
|
|
77
|
+
}
|
|
78
|
+
const maxIterations = options?.maxIterations ?? 10;
|
|
79
|
+
let currentMessages = [...messages];
|
|
80
|
+
let iterations = 0;
|
|
81
|
+
while (iterations < maxIterations) {
|
|
82
|
+
iterations++;
|
|
83
|
+
// Get tools in provider format
|
|
84
|
+
const toolsArray = [...this.tools.values()];
|
|
85
|
+
const providerTools = toolsArray.length > 0 ? this.provider.buildTools(toolsArray) : [];
|
|
86
|
+
// Stream the response
|
|
87
|
+
let fullContent = '';
|
|
88
|
+
const streamOptions = { ...options };
|
|
89
|
+
// Add tools to the request if available
|
|
90
|
+
if (providerTools.length > 0) {
|
|
91
|
+
// We need to pass tools differently depending on provider
|
|
92
|
+
// For now, inject into messages context
|
|
93
|
+
}
|
|
94
|
+
for await (const chunk of this.provider.chatStream(currentMessages, streamOptions)) {
|
|
95
|
+
fullContent += chunk;
|
|
96
|
+
yield chunk;
|
|
97
|
+
}
|
|
98
|
+
// Check for tool calls in the response
|
|
99
|
+
const response = await this.provider.chat(currentMessages, { ...streamOptions, stream: false });
|
|
100
|
+
const toolCalls = response.tool_calls;
|
|
101
|
+
if (toolCalls && toolCalls.length > 0) {
|
|
102
|
+
// Append assistant message with tool calls
|
|
103
|
+
currentMessages.push({
|
|
104
|
+
role: 'assistant',
|
|
105
|
+
content: fullContent,
|
|
106
|
+
tool_calls: toolCalls,
|
|
107
|
+
});
|
|
108
|
+
// Execute each tool
|
|
109
|
+
for (const toolCall of toolCalls) {
|
|
110
|
+
const tool = this.tools.get(toolCall.function.name);
|
|
111
|
+
if (!tool) {
|
|
112
|
+
currentMessages.push({
|
|
113
|
+
role: 'tool',
|
|
114
|
+
content: `Tool "${toolCall.function.name}" not found`,
|
|
115
|
+
tool_call_id: toolCall.id,
|
|
116
|
+
name: toolCall.function.name,
|
|
117
|
+
});
|
|
118
|
+
continue;
|
|
119
|
+
}
|
|
120
|
+
try {
|
|
121
|
+
const params = JSON.parse(toolCall.function.arguments || '{}');
|
|
122
|
+
const result = await tool.execute(params);
|
|
123
|
+
currentMessages.push({
|
|
124
|
+
role: 'tool',
|
|
125
|
+
content: result.success ? (result.output || JSON.stringify(result.data)) : (result.error || 'Tool failed'),
|
|
126
|
+
tool_call_id: toolCall.id,
|
|
127
|
+
name: toolCall.function.name,
|
|
128
|
+
});
|
|
129
|
+
yield `\n${chalk.gray(`[tool: ${toolCall.function.name}]`)}`;
|
|
130
|
+
}
|
|
131
|
+
catch (error) {
|
|
132
|
+
currentMessages.push({
|
|
133
|
+
role: 'tool',
|
|
134
|
+
content: `Tool execution error: ${error.message}`,
|
|
135
|
+
tool_call_id: toolCall.id,
|
|
136
|
+
name: toolCall.function.name,
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
continue; // Loop back for next iteration
|
|
141
|
+
}
|
|
142
|
+
// No tool calls - we're done
|
|
143
|
+
return response;
|
|
144
|
+
}
|
|
145
|
+
return { content: '[Agent loop exceeded maximum iterations]', role: 'assistant' };
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Check if API key is available
|
|
149
|
+
*/
|
|
150
|
+
hasApiKey() {
|
|
151
|
+
return !!this.provider.config?.apiKey;
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Mock response when no API key is set
|
|
155
|
+
*/
|
|
156
|
+
getMockResponse(messages) {
|
|
157
|
+
const last = messages[messages.length - 1]?.content || '';
|
|
158
|
+
let content;
|
|
159
|
+
if (/^(hi|hello|hey)/i.test(last)) {
|
|
160
|
+
content = 'Hi there! How can I help you today?';
|
|
161
|
+
}
|
|
162
|
+
else if (last.toLowerCase().includes('who are you')) {
|
|
163
|
+
content = 'I am Thatgfsj Code, an AI coding assistant.';
|
|
164
|
+
}
|
|
165
|
+
else {
|
|
166
|
+
content = `I understand you said: "${last.slice(0, 50)}..."\n\nThis is a demo response. Configure an API key for full AI capabilities.\nRun: gfcode init`;
|
|
167
|
+
}
|
|
168
|
+
return { content, role: 'assistant' };
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
export { OpenAIProvider } from './openai.js';
|
|
172
|
+
export { AnthropicProvider } from './anthropic.js';
|
|
173
|
+
export { GeminiProvider } from './gemini.js';
|
|
174
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/llm/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenAI-compatible Provider
|
|
3
|
+
* Works with: OpenAI, SiliconFlow, MiniMax (OpenAI mode), DeepSeek, Kimi, ERNIE, Ollama
|
|
4
|
+
*/
|
|
5
|
+
import type { ChatMessage, ChatResponse, ChatOptions } from '../types.js';
|
|
6
|
+
import type { Tool } from '../tools/types.js';
|
|
7
|
+
import type { LLMProvider, ProviderConfig } from './provider.js';
|
|
8
|
+
export declare class OpenAIProvider implements LLMProvider {
|
|
9
|
+
readonly name = "openai";
|
|
10
|
+
private config;
|
|
11
|
+
constructor(config: ProviderConfig);
|
|
12
|
+
buildTools(tools: Tool[]): any[];
|
|
13
|
+
chat(messages: ChatMessage[], options?: ChatOptions): Promise<ChatResponse>;
|
|
14
|
+
chatStream(messages: ChatMessage[], options?: ChatOptions): AsyncGenerator<string, ChatResponse>;
|
|
15
|
+
private buildRequest;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=openai.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../src/llm/openai.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1E,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAEjE,qBAAa,cAAe,YAAW,WAAW;IAChD,QAAQ,CAAC,IAAI,YAAY;IACzB,OAAO,CAAC,MAAM,CAAiB;gBAEnB,MAAM,EAAE,cAAc;IAIlC,UAAU,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,GAAG,EAAE;IAiB1B,IAAI,CAAC,QAAQ,EAAE,WAAW,EAAE,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;IA4B1E,UAAU,CAAC,QAAQ,EAAE,WAAW,EAAE,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,cAAc,CAAC,MAAM,EAAE,YAAY,CAAC;IAsDvG,OAAO,CAAC,YAAY;CAerB"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenAI-compatible Provider
|
|
3
|
+
* Works with: OpenAI, SiliconFlow, MiniMax (OpenAI mode), DeepSeek, Kimi, ERNIE, Ollama
|
|
4
|
+
*/
|
|
5
|
+
export class OpenAIProvider {
|
|
6
|
+
name = 'openai';
|
|
7
|
+
config;
|
|
8
|
+
constructor(config) {
|
|
9
|
+
this.config = config;
|
|
10
|
+
}
|
|
11
|
+
buildTools(tools) {
|
|
12
|
+
return tools.map(tool => ({
|
|
13
|
+
type: 'function',
|
|
14
|
+
function: {
|
|
15
|
+
name: tool.name,
|
|
16
|
+
description: tool.description,
|
|
17
|
+
parameters: tool.inputSchema || {
|
|
18
|
+
type: 'object',
|
|
19
|
+
properties: Object.fromEntries(tool.parameters.map(p => [p.name, { type: p.type, description: p.description }])),
|
|
20
|
+
required: tool.parameters.filter(p => p.required).map(p => p.name),
|
|
21
|
+
},
|
|
22
|
+
},
|
|
23
|
+
}));
|
|
24
|
+
}
|
|
25
|
+
async chat(messages, options) {
|
|
26
|
+
const body = this.buildRequest(messages, false, options);
|
|
27
|
+
const response = await fetch(`${this.config.baseUrl}/chat/completions`, {
|
|
28
|
+
method: 'POST',
|
|
29
|
+
headers: {
|
|
30
|
+
'Content-Type': 'application/json',
|
|
31
|
+
'Authorization': `Bearer ${this.config.apiKey}`,
|
|
32
|
+
},
|
|
33
|
+
body: JSON.stringify(body),
|
|
34
|
+
});
|
|
35
|
+
if (!response.ok) {
|
|
36
|
+
const text = await response.text().catch(() => '');
|
|
37
|
+
throw new Error(`OpenAI API error ${response.status}: ${text}`);
|
|
38
|
+
}
|
|
39
|
+
const data = await response.json();
|
|
40
|
+
const choice = data.choices?.[0];
|
|
41
|
+
return {
|
|
42
|
+
content: choice?.message?.content || '',
|
|
43
|
+
role: 'assistant',
|
|
44
|
+
usage: data.usage,
|
|
45
|
+
tool_calls: choice?.message?.tool_calls,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
async *chatStream(messages, options) {
|
|
49
|
+
const body = this.buildRequest(messages, true, options);
|
|
50
|
+
const response = await fetch(`${this.config.baseUrl}/chat/completions`, {
|
|
51
|
+
method: 'POST',
|
|
52
|
+
headers: {
|
|
53
|
+
'Content-Type': 'application/json',
|
|
54
|
+
'Authorization': `Bearer ${this.config.apiKey}`,
|
|
55
|
+
},
|
|
56
|
+
body: JSON.stringify(body),
|
|
57
|
+
});
|
|
58
|
+
if (!response.ok || !response.body) {
|
|
59
|
+
const text = await response.text().catch(() => '');
|
|
60
|
+
throw new Error(`OpenAI API error ${response.status}: ${text}`);
|
|
61
|
+
}
|
|
62
|
+
const reader = response.body.getReader();
|
|
63
|
+
const decoder = new TextDecoder();
|
|
64
|
+
let fullContent = '';
|
|
65
|
+
let buffer = '';
|
|
66
|
+
try {
|
|
67
|
+
while (true) {
|
|
68
|
+
const { done, value } = await reader.read();
|
|
69
|
+
if (done)
|
|
70
|
+
break;
|
|
71
|
+
buffer += decoder.decode(value, { stream: true });
|
|
72
|
+
const lines = buffer.split('\n');
|
|
73
|
+
buffer = lines.pop() || '';
|
|
74
|
+
for (const line of lines) {
|
|
75
|
+
const trimmed = line.trim();
|
|
76
|
+
if (!trimmed || !trimmed.startsWith('data: ') || trimmed === 'data: [DONE]')
|
|
77
|
+
continue;
|
|
78
|
+
try {
|
|
79
|
+
const data = JSON.parse(trimmed.slice(6));
|
|
80
|
+
const content = data.choices?.[0]?.delta?.content;
|
|
81
|
+
if (content) {
|
|
82
|
+
fullContent += content;
|
|
83
|
+
yield content;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
catch {
|
|
87
|
+
// Skip invalid JSON lines
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
finally {
|
|
93
|
+
reader.releaseLock();
|
|
94
|
+
}
|
|
95
|
+
return { content: fullContent, role: 'assistant' };
|
|
96
|
+
}
|
|
97
|
+
buildRequest(messages, stream, options) {
|
|
98
|
+
return {
|
|
99
|
+
model: this.config.model,
|
|
100
|
+
messages: messages.map(m => ({
|
|
101
|
+
role: m.role,
|
|
102
|
+
content: m.content,
|
|
103
|
+
...(m.name && { name: m.name }),
|
|
104
|
+
...(m.tool_call_id && { tool_call_id: m.tool_call_id }),
|
|
105
|
+
...(m.tool_calls && { tool_calls: m.tool_calls }),
|
|
106
|
+
})),
|
|
107
|
+
temperature: options?.temperature ?? this.config.temperature,
|
|
108
|
+
max_tokens: options?.maxTokens ?? this.config.maxTokens,
|
|
109
|
+
stream,
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=openai.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai.js","sourceRoot":"","sources":["../../src/llm/openai.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Abstract LLM Provider interface
|
|
3
|
+
* All providers implement this interface
|
|
4
|
+
*/
|
|
5
|
+
import type { ChatMessage, ChatResponse, ChatOptions } from '../types.js';
|
|
6
|
+
import type { Tool } from '../tools/types.js';
|
|
7
|
+
export interface LLMProvider {
|
|
8
|
+
/** Provider name for logging */
|
|
9
|
+
readonly name: string;
|
|
10
|
+
/**
|
|
11
|
+
* Non-streaming chat completion
|
|
12
|
+
*/
|
|
13
|
+
chat(messages: ChatMessage[], options?: ChatOptions): Promise<ChatResponse>;
|
|
14
|
+
/**
|
|
15
|
+
* Streaming chat completion - yields text chunks
|
|
16
|
+
*/
|
|
17
|
+
chatStream(messages: ChatMessage[], options?: ChatOptions): AsyncGenerator<string, ChatResponse>;
|
|
18
|
+
/**
|
|
19
|
+
* Convert Tool[] to provider-specific format
|
|
20
|
+
*/
|
|
21
|
+
buildTools(tools: Tool[]): any[];
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Provider configuration passed to each provider
|
|
25
|
+
*/
|
|
26
|
+
export interface ProviderConfig {
|
|
27
|
+
apiKey: string;
|
|
28
|
+
model: string;
|
|
29
|
+
baseUrl: string;
|
|
30
|
+
temperature: number;
|
|
31
|
+
maxTokens: number;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../src/llm/provider.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1E,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAE9C,MAAM,WAAW,WAAW;IAC1B,gCAAgC;IAChC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB;;OAEG;IACH,IAAI,CAAC,QAAQ,EAAE,WAAW,EAAE,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IAE5E;;OAEG;IACH,UAAU,CAAC,QAAQ,EAAE,WAAW,EAAE,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,cAAc,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IAEjG;;OAEG;IACH,UAAU,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,GAAG,EAAE,CAAC;CAClC;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACnB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider.js","sourceRoot":"","sources":["../../src/llm/provider.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* S07: MCP Client (Model Context Protocol)
|
|
3
|
+
* Connect to MCP servers and expose their tools as agent tools
|
|
4
|
+
*
|
|
5
|
+
* MCP turns the agent from a closed system into an open platform.
|
|
6
|
+
* Any server can expose tools via the MCP JSON-RPC 2.0 protocol.
|
|
7
|
+
*/
|
|
8
|
+
import type { Tool, ToolResult } from '../tools/types.js';
|
|
9
|
+
export declare class MCPClient {
|
|
10
|
+
private process;
|
|
11
|
+
private tools;
|
|
12
|
+
private requestId;
|
|
13
|
+
private pendingRequests;
|
|
14
|
+
private name;
|
|
15
|
+
private connected;
|
|
16
|
+
constructor(name: string);
|
|
17
|
+
/**
|
|
18
|
+
* S07: Connect to an MCP server
|
|
19
|
+
* @param command Command to run (e.g., 'npx', 'node')
|
|
20
|
+
* @param args Arguments (e.g., ['-y', '@modelcontextprotocol/server-filesystem', '/path/to/dir'])
|
|
21
|
+
*/
|
|
22
|
+
connect(command: string, args: string[]): Promise<void>;
|
|
23
|
+
/**
|
|
24
|
+
* S07: Handle incoming JSON-RPC message
|
|
25
|
+
*/
|
|
26
|
+
private handleMessage;
|
|
27
|
+
/**
|
|
28
|
+
* S07: Send a JSON-RPC request
|
|
29
|
+
*/
|
|
30
|
+
private sendRequest;
|
|
31
|
+
/**
|
|
32
|
+
* S07: Send a notification (no response expected)
|
|
33
|
+
*/
|
|
34
|
+
private sendNotification;
|
|
35
|
+
/**
|
|
36
|
+
* S07: Call an MCP tool
|
|
37
|
+
*/
|
|
38
|
+
callTool(name: string, arguments_: Record<string, any>): Promise<ToolResult>;
|
|
39
|
+
/**
|
|
40
|
+
* S07: List tools from MCP server
|
|
41
|
+
*/
|
|
42
|
+
private listTools;
|
|
43
|
+
/**
|
|
44
|
+
* S07: Get registered tools as agent Tool[]
|
|
45
|
+
*/
|
|
46
|
+
getTools(): Tool[];
|
|
47
|
+
/**
|
|
48
|
+
* S07: Get tool names
|
|
49
|
+
*/
|
|
50
|
+
getToolNames(): string[];
|
|
51
|
+
/**
|
|
52
|
+
* S07: Check if connected
|
|
53
|
+
*/
|
|
54
|
+
isConnected(): boolean;
|
|
55
|
+
/**
|
|
56
|
+
* S07: Disconnect from MCP server
|
|
57
|
+
*/
|
|
58
|
+
disconnect(): void;
|
|
59
|
+
}
|
|
60
|
+
export declare class MCPServerManager {
|
|
61
|
+
private clients;
|
|
62
|
+
/**
|
|
63
|
+
* S07: Add and connect an MCP server
|
|
64
|
+
*/
|
|
65
|
+
addServer(name: string, command: string, args: string[]): Promise<void>;
|
|
66
|
+
/**
|
|
67
|
+
* S07: Get all tools from all servers
|
|
68
|
+
*/
|
|
69
|
+
getAllTools(): Tool[];
|
|
70
|
+
/**
|
|
71
|
+
* S07: Get tool names from all servers
|
|
72
|
+
*/
|
|
73
|
+
getAllToolNames(): string[];
|
|
74
|
+
/**
|
|
75
|
+
* S07: Disconnect a server
|
|
76
|
+
*/
|
|
77
|
+
removeServer(name: string): void;
|
|
78
|
+
/**
|
|
79
|
+
* S07: Get server status
|
|
80
|
+
*/
|
|
81
|
+
getStatus(): Record<string, boolean>;
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/mcp/client.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AA8B1D,qBAAa,SAAS;IACpB,OAAO,CAAC,OAAO,CAA6B;IAC5C,OAAO,CAAC,KAAK,CAAmC;IAChD,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,eAAe,CAGR;IACf,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,SAAS,CAAS;gBAEd,IAAI,EAAE,MAAM;IAIxB;;;;OAIG;IACG,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAqD7D;;OAEG;IACH,OAAO,CAAC,aAAa;IAoBrB;;OAEG;IACH,OAAO,CAAC,WAAW;IA6BnB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAYxB;;OAEG;IACG,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC;IAmBlF;;OAEG;YACW,SAAS;IAgBvB;;OAEG;IACH,QAAQ,IAAI,IAAI,EAAE;IAgBlB;;OAEG;IACH,YAAY,IAAI,MAAM,EAAE;IAIxB;;OAEG;IACH,WAAW,IAAI,OAAO;IAItB;;OAEG;IACH,UAAU,IAAI,IAAI;CASnB;AAID,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,OAAO,CAAqC;IAEpD;;OAEG;IACG,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAM7E;;OAEG;IACH,WAAW,IAAI,IAAI,EAAE;IAQrB;;OAEG;IACH,eAAe,IAAI,MAAM,EAAE;IAU3B;;OAEG;IACH,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAQhC;;OAEG;IACH,SAAS,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAOrC"}
|