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,267 @@
|
|
|
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 { spawn } from 'child_process';
|
|
9
|
+
// ==================== MCP Client ====================
|
|
10
|
+
export class MCPClient {
|
|
11
|
+
process = null;
|
|
12
|
+
tools = new Map();
|
|
13
|
+
requestId = 0;
|
|
14
|
+
pendingRequests = new Map();
|
|
15
|
+
name;
|
|
16
|
+
connected = false;
|
|
17
|
+
constructor(name) {
|
|
18
|
+
this.name = name;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* S07: Connect to an MCP server
|
|
22
|
+
* @param command Command to run (e.g., 'npx', 'node')
|
|
23
|
+
* @param args Arguments (e.g., ['-y', '@modelcontextprotocol/server-filesystem', '/path/to/dir'])
|
|
24
|
+
*/
|
|
25
|
+
async connect(command, args) {
|
|
26
|
+
return new Promise((resolve, reject) => {
|
|
27
|
+
this.process = spawn(command, args, {
|
|
28
|
+
stdio: ['pipe', 'pipe', 'pipe']
|
|
29
|
+
});
|
|
30
|
+
let buffer = '';
|
|
31
|
+
this.process.stdout?.on('data', (data) => {
|
|
32
|
+
buffer += data.toString();
|
|
33
|
+
const lines = buffer.split('\n');
|
|
34
|
+
buffer = lines.pop() || '';
|
|
35
|
+
for (const line of lines) {
|
|
36
|
+
if (line.trim()) {
|
|
37
|
+
this.handleMessage(line);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
this.process.stderr?.on('data', (data) => {
|
|
42
|
+
console.error(`[MCP ${this.name}] stderr:`, data.toString().trim());
|
|
43
|
+
});
|
|
44
|
+
this.process.on('error', (err) => {
|
|
45
|
+
reject(err);
|
|
46
|
+
});
|
|
47
|
+
this.process.on('close', (code) => {
|
|
48
|
+
this.connected = false;
|
|
49
|
+
console.log(`[MCP ${this.name}] exited with code ${code}`);
|
|
50
|
+
});
|
|
51
|
+
// Initialize MCP connection
|
|
52
|
+
this.sendRequest('initialize', {
|
|
53
|
+
protocolVersion: '2024-11-05',
|
|
54
|
+
capabilities: { tools: {} },
|
|
55
|
+
clientInfo: { name: 'thatgfsj-code', version: '1.0.0' }
|
|
56
|
+
}).then(() => {
|
|
57
|
+
this.connected = true;
|
|
58
|
+
// Send initialized notification
|
|
59
|
+
this.sendNotification('initialized', {});
|
|
60
|
+
// List available tools
|
|
61
|
+
return this.listTools();
|
|
62
|
+
}).then(() => {
|
|
63
|
+
resolve();
|
|
64
|
+
}).catch(reject);
|
|
65
|
+
// Timeout
|
|
66
|
+
setTimeout(() => reject(new Error('MCP connection timeout')), 30000);
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* S07: Handle incoming JSON-RPC message
|
|
71
|
+
*/
|
|
72
|
+
handleMessage(raw) {
|
|
73
|
+
try {
|
|
74
|
+
const msg = JSON.parse(raw);
|
|
75
|
+
// Handle response
|
|
76
|
+
const pending = this.pendingRequests.get(msg.id);
|
|
77
|
+
if (pending) {
|
|
78
|
+
this.pendingRequests.delete(msg.id);
|
|
79
|
+
if (msg.error) {
|
|
80
|
+
pending.reject(new Error(msg.error.message));
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
pending.resolve(msg.result);
|
|
84
|
+
}
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
// Not JSON, ignore
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* S07: Send a JSON-RPC request
|
|
94
|
+
*/
|
|
95
|
+
sendRequest(method, params) {
|
|
96
|
+
return new Promise((resolve, reject) => {
|
|
97
|
+
if (!this.process?.connected) {
|
|
98
|
+
reject(new Error('MCP process not connected'));
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
const id = ++this.requestId;
|
|
102
|
+
this.pendingRequests.set(id, { resolve, reject });
|
|
103
|
+
const request = {
|
|
104
|
+
jsonrpc: '2.0',
|
|
105
|
+
id,
|
|
106
|
+
method,
|
|
107
|
+
params
|
|
108
|
+
};
|
|
109
|
+
this.process.stdin?.write(JSON.stringify(request) + '\n');
|
|
110
|
+
// Timeout
|
|
111
|
+
setTimeout(() => {
|
|
112
|
+
if (this.pendingRequests.has(id)) {
|
|
113
|
+
this.pendingRequests.delete(id);
|
|
114
|
+
reject(new Error('MCP request timeout: ' + method));
|
|
115
|
+
}
|
|
116
|
+
}, 30000);
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* S07: Send a notification (no response expected)
|
|
121
|
+
*/
|
|
122
|
+
sendNotification(method, params) {
|
|
123
|
+
if (!this.process?.connected)
|
|
124
|
+
return;
|
|
125
|
+
const notification = {
|
|
126
|
+
jsonrpc: '2.0',
|
|
127
|
+
method,
|
|
128
|
+
params
|
|
129
|
+
};
|
|
130
|
+
this.process.stdin?.write(JSON.stringify(notification) + '\n');
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* S07: Call an MCP tool
|
|
134
|
+
*/
|
|
135
|
+
async callTool(name, arguments_) {
|
|
136
|
+
try {
|
|
137
|
+
const result = await this.sendRequest('tools/call', {
|
|
138
|
+
name,
|
|
139
|
+
arguments: arguments_
|
|
140
|
+
});
|
|
141
|
+
return {
|
|
142
|
+
success: true,
|
|
143
|
+
output: typeof result === 'string' ? result : JSON.stringify(result)
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
catch (error) {
|
|
147
|
+
return {
|
|
148
|
+
success: false,
|
|
149
|
+
error: error.message
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* S07: List tools from MCP server
|
|
155
|
+
*/
|
|
156
|
+
async listTools() {
|
|
157
|
+
try {
|
|
158
|
+
const result = await this.sendRequest('tools/list', {});
|
|
159
|
+
const tools = result.tools || [];
|
|
160
|
+
this.tools.clear();
|
|
161
|
+
for (const tool of tools) {
|
|
162
|
+
this.tools.set(tool.name, tool);
|
|
163
|
+
}
|
|
164
|
+
console.log(`[MCP ${this.name}] Loaded ${tools.length} tools:`, [...this.tools.keys()].join(', '));
|
|
165
|
+
}
|
|
166
|
+
catch (error) {
|
|
167
|
+
console.error(`[MCP ${this.name}] Failed to list tools:`, error.message);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* S07: Get registered tools as agent Tool[]
|
|
172
|
+
*/
|
|
173
|
+
getTools() {
|
|
174
|
+
return [...this.tools.values()].map(mcpTool => ({
|
|
175
|
+
name: this.name + ':' + mcpTool.name,
|
|
176
|
+
description: mcpTool.description,
|
|
177
|
+
parameters: Object.entries(mcpTool.inputSchema.properties || {}).map(([name, schema]) => ({
|
|
178
|
+
name,
|
|
179
|
+
type: schema.type || 'string',
|
|
180
|
+
description: schema.description || '',
|
|
181
|
+
required: (mcpTool.inputSchema.required || []).includes(name)
|
|
182
|
+
})),
|
|
183
|
+
execute: async (params) => {
|
|
184
|
+
return this.callTool(mcpTool.name, params);
|
|
185
|
+
}
|
|
186
|
+
}));
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* S07: Get tool names
|
|
190
|
+
*/
|
|
191
|
+
getToolNames() {
|
|
192
|
+
return [...this.tools.keys()];
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* S07: Check if connected
|
|
196
|
+
*/
|
|
197
|
+
isConnected() {
|
|
198
|
+
return this.connected;
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* S07: Disconnect from MCP server
|
|
202
|
+
*/
|
|
203
|
+
disconnect() {
|
|
204
|
+
if (this.process) {
|
|
205
|
+
this.process.kill();
|
|
206
|
+
this.process = null;
|
|
207
|
+
}
|
|
208
|
+
this.connected = false;
|
|
209
|
+
this.tools.clear();
|
|
210
|
+
this.pendingRequests.clear();
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
// ==================== MCP Server Manager ====================
|
|
214
|
+
export class MCPServerManager {
|
|
215
|
+
clients = new Map();
|
|
216
|
+
/**
|
|
217
|
+
* S07: Add and connect an MCP server
|
|
218
|
+
*/
|
|
219
|
+
async addServer(name, command, args) {
|
|
220
|
+
const client = new MCPClient(name);
|
|
221
|
+
await client.connect(command, args);
|
|
222
|
+
this.clients.set(name, client);
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* S07: Get all tools from all servers
|
|
226
|
+
*/
|
|
227
|
+
getAllTools() {
|
|
228
|
+
const allTools = [];
|
|
229
|
+
for (const client of this.clients.values()) {
|
|
230
|
+
allTools.push(...client.getTools());
|
|
231
|
+
}
|
|
232
|
+
return allTools;
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* S07: Get tool names from all servers
|
|
236
|
+
*/
|
|
237
|
+
getAllToolNames() {
|
|
238
|
+
const names = [];
|
|
239
|
+
for (const [serverName, client] of this.clients) {
|
|
240
|
+
for (const toolName of client.getToolNames()) {
|
|
241
|
+
names.push(serverName + ':' + toolName);
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
return names;
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* S07: Disconnect a server
|
|
248
|
+
*/
|
|
249
|
+
removeServer(name) {
|
|
250
|
+
const client = this.clients.get(name);
|
|
251
|
+
if (client) {
|
|
252
|
+
client.disconnect();
|
|
253
|
+
this.clients.delete(name);
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* S07: Get server status
|
|
258
|
+
*/
|
|
259
|
+
getStatus() {
|
|
260
|
+
const status = {};
|
|
261
|
+
for (const [name, client] of this.clients) {
|
|
262
|
+
status[name] = client.isConnected();
|
|
263
|
+
}
|
|
264
|
+
return status;
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/mcp/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* System Prompt Builder - Dynamic prompt construction
|
|
3
|
+
* Migrated from old src/core/system-prompt.ts
|
|
4
|
+
*/
|
|
5
|
+
import type { Tool } from '../tools/types.js';
|
|
6
|
+
export interface SystemPromptConfig {
|
|
7
|
+
cwd?: string;
|
|
8
|
+
tools?: Tool[];
|
|
9
|
+
includeProjectMd?: boolean;
|
|
10
|
+
permissionMode?: 'accept' | 'deny' | 'ask';
|
|
11
|
+
date?: Date;
|
|
12
|
+
}
|
|
13
|
+
export declare class SystemPromptBuilder {
|
|
14
|
+
private config;
|
|
15
|
+
constructor(config?: SystemPromptConfig);
|
|
16
|
+
build(): string;
|
|
17
|
+
private buildIdentity;
|
|
18
|
+
private buildToolInstructions;
|
|
19
|
+
private buildEnvironment;
|
|
20
|
+
private buildPermissionMode;
|
|
21
|
+
private buildProjectInstructions;
|
|
22
|
+
private buildDateInfo;
|
|
23
|
+
setTools(tools: Tool[]): this;
|
|
24
|
+
setCwd(cwd: string): this;
|
|
25
|
+
setPermissionMode(mode: 'accept' | 'deny' | 'ask'): this;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/prompts/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAE9C,MAAM,WAAW,kBAAkB;IACjC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC;IACf,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,cAAc,CAAC,EAAE,QAAQ,GAAG,MAAM,GAAG,KAAK,CAAC;IAC3C,IAAI,CAAC,EAAE,IAAI,CAAC;CACb;AAED,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,MAAM,CAA+B;gBAEjC,MAAM,GAAE,kBAAuB;IAU3C,KAAK,IAAI,MAAM;IAYf,OAAO,CAAC,aAAa;IAsBrB,OAAO,CAAC,qBAAqB;IAgB7B,OAAO,CAAC,gBAAgB;IAIxB,OAAO,CAAC,mBAAmB;IAU3B,OAAO,CAAC,wBAAwB;IAmBhC,OAAO,CAAC,aAAa;IAMrB,QAAQ,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,IAAI;IAC7B,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IACzB,iBAAiB,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,KAAK,GAAG,IAAI;CACzD"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* System Prompt Builder - Dynamic prompt construction
|
|
3
|
+
* Migrated from old src/core/system-prompt.ts
|
|
4
|
+
*/
|
|
5
|
+
import { readFileSync, existsSync } from 'fs';
|
|
6
|
+
import { join } from 'path';
|
|
7
|
+
export class SystemPromptBuilder {
|
|
8
|
+
config;
|
|
9
|
+
constructor(config = {}) {
|
|
10
|
+
this.config = {
|
|
11
|
+
cwd: config.cwd ?? process.cwd(),
|
|
12
|
+
tools: config.tools ?? [],
|
|
13
|
+
includeProjectMd: config.includeProjectMd ?? true,
|
|
14
|
+
permissionMode: config.permissionMode ?? 'ask',
|
|
15
|
+
date: config.date ?? new Date(),
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
build() {
|
|
19
|
+
const fragments = [
|
|
20
|
+
this.buildIdentity(),
|
|
21
|
+
this.buildToolInstructions(),
|
|
22
|
+
this.buildEnvironment(),
|
|
23
|
+
this.buildPermissionMode(),
|
|
24
|
+
this.buildProjectInstructions(),
|
|
25
|
+
this.buildDateInfo(),
|
|
26
|
+
];
|
|
27
|
+
return fragments.filter(Boolean).join('\n\n');
|
|
28
|
+
}
|
|
29
|
+
buildIdentity() {
|
|
30
|
+
return [
|
|
31
|
+
'You are Thatgfsj Code, an interactive coding agent running in the user\'s terminal.',
|
|
32
|
+
'',
|
|
33
|
+
'You have access to tools (file operations, shell commands, git, search) that let you',
|
|
34
|
+
'read, write, and modify files and run commands to help with coding tasks.',
|
|
35
|
+
'',
|
|
36
|
+
'When working on a task:',
|
|
37
|
+
'1. First understand what files are involved',
|
|
38
|
+
'2. Read necessary files to understand the codebase',
|
|
39
|
+
'3. Make changes using appropriate tools',
|
|
40
|
+
'4. Verify the changes work',
|
|
41
|
+
'',
|
|
42
|
+
'Be concise but thorough. Show your reasoning.',
|
|
43
|
+
'',
|
|
44
|
+
'When using tools:',
|
|
45
|
+
'- Prefer small, targeted operations over large batch changes',
|
|
46
|
+
'- Confirm destructive operations (rm, git push --force, etc.)',
|
|
47
|
+
'- Explain what you are going to do before doing it',
|
|
48
|
+
].join('\n');
|
|
49
|
+
}
|
|
50
|
+
buildToolInstructions() {
|
|
51
|
+
const tools = this.config.tools;
|
|
52
|
+
if (tools.length === 0) {
|
|
53
|
+
return '## Tools\n\nNo tools are currently registered.';
|
|
54
|
+
}
|
|
55
|
+
const toolDescs = tools.map(t => {
|
|
56
|
+
const params = t.parameters
|
|
57
|
+
.map(p => ` - ${p.name} (${p.type}${p.required ? ', required' : ''}): ${p.description}`)
|
|
58
|
+
.join('\n');
|
|
59
|
+
return `### ${t.name}\n${t.description}\n\nParameters:\n${params}`;
|
|
60
|
+
}).join('\n\n');
|
|
61
|
+
return `## Tools\n\nYou have access to the following tools:\n\n${toolDescs}\n\nTo use a tool, respond with a tool call. Each tool call must include the tool name and parameters as a JSON object.`;
|
|
62
|
+
}
|
|
63
|
+
buildEnvironment() {
|
|
64
|
+
return `## Environment\n\nWorking directory: ${this.config.cwd}`;
|
|
65
|
+
}
|
|
66
|
+
buildPermissionMode() {
|
|
67
|
+
const mode = this.config.permissionMode;
|
|
68
|
+
const explanations = {
|
|
69
|
+
accept: 'All tool calls are automatically allowed without confirmation.',
|
|
70
|
+
deny: 'All tool calls are blocked. You may only read and discuss.',
|
|
71
|
+
ask: 'Dangerous or destructive commands require user confirmation before execution.',
|
|
72
|
+
};
|
|
73
|
+
return `## Permission Mode\n\nCurrent mode: ${mode}\n\n${explanations[mode] || ''}`;
|
|
74
|
+
}
|
|
75
|
+
buildProjectInstructions() {
|
|
76
|
+
if (!this.config.includeProjectMd)
|
|
77
|
+
return '';
|
|
78
|
+
const cwd = this.config.cwd;
|
|
79
|
+
const paths = [join(cwd, 'CLAUDE.md'), join(cwd, '.claude.md'), join(cwd, 'AGENTS.md')];
|
|
80
|
+
for (const path of paths) {
|
|
81
|
+
if (existsSync(path)) {
|
|
82
|
+
try {
|
|
83
|
+
const content = readFileSync(path, 'utf-8');
|
|
84
|
+
return `## Project Instructions (from ${path.split(/[/\\]/).pop()})\n\n${content}`;
|
|
85
|
+
}
|
|
86
|
+
catch {
|
|
87
|
+
// Ignore
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
return '';
|
|
92
|
+
}
|
|
93
|
+
buildDateInfo() {
|
|
94
|
+
const now = this.config.date;
|
|
95
|
+
const iso = now.toISOString().replace('T', ' ').split('.')[0];
|
|
96
|
+
return `## Current Time\n\n${iso}`;
|
|
97
|
+
}
|
|
98
|
+
setTools(tools) { this.config.tools = tools; return this; }
|
|
99
|
+
setCwd(cwd) { this.config.cwd = cwd; return this; }
|
|
100
|
+
setPermissionMode(mode) { this.config.permissionMode = mode; return this; }
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/prompts/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Context Compactor - Progressive compression for conversation history
|
|
3
|
+
* Migrated from old src/core/context-compactor.ts
|
|
4
|
+
*
|
|
5
|
+
* Strategy:
|
|
6
|
+
* 1. Within limit: no compression
|
|
7
|
+
* 2. Beyond limit: keep system + recent N turns + summarize middle
|
|
8
|
+
*/
|
|
9
|
+
import type { ChatMessage } from '../types.js';
|
|
10
|
+
export interface CompactorConfig {
|
|
11
|
+
/** Max messages before compression kicks in */
|
|
12
|
+
maxMessages?: number;
|
|
13
|
+
/** How many recent turns to always preserve */
|
|
14
|
+
preserveRecent?: number;
|
|
15
|
+
}
|
|
16
|
+
export interface CompressionResult {
|
|
17
|
+
originalCount: number;
|
|
18
|
+
compactedCount: number;
|
|
19
|
+
removedCount: number;
|
|
20
|
+
}
|
|
21
|
+
export declare class ContextCompactor {
|
|
22
|
+
private maxMessages;
|
|
23
|
+
private preserveRecent;
|
|
24
|
+
constructor(config?: CompactorConfig);
|
|
25
|
+
/**
|
|
26
|
+
* Compact messages if needed
|
|
27
|
+
*/
|
|
28
|
+
compact(messages: ChatMessage[]): {
|
|
29
|
+
compacted: ChatMessage[];
|
|
30
|
+
result: CompressionResult;
|
|
31
|
+
};
|
|
32
|
+
/**
|
|
33
|
+
* Auto-compact if messages exceed limit
|
|
34
|
+
*/
|
|
35
|
+
autoCompact(messages: ChatMessage[]): {
|
|
36
|
+
compacted: ChatMessage[];
|
|
37
|
+
result: CompressionResult;
|
|
38
|
+
};
|
|
39
|
+
/**
|
|
40
|
+
* Estimate token count (rough: ~4 chars per token)
|
|
41
|
+
*/
|
|
42
|
+
estimateTokens(messages: ChatMessage[]): number;
|
|
43
|
+
/**
|
|
44
|
+
* Extract topic summary from messages
|
|
45
|
+
*/
|
|
46
|
+
private extractTopics;
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=compactor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compactor.d.ts","sourceRoot":"","sources":["../../src/session/compactor.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C,MAAM,WAAW,eAAe;IAC9B,+CAA+C;IAC/C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,+CAA+C;IAC/C,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,iBAAiB;IAChC,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,cAAc,CAAS;gBAEnB,MAAM,GAAE,eAAoB;IAKxC;;OAEG;IACH,OAAO,CAAC,QAAQ,EAAE,WAAW,EAAE,GAAG;QAAE,SAAS,EAAE,WAAW,EAAE,CAAC;QAAC,MAAM,EAAE,iBAAiB,CAAA;KAAE;IA0CzF;;OAEG;IACH,WAAW,CAAC,QAAQ,EAAE,WAAW,EAAE,GAAG;QAAE,SAAS,EAAE,WAAW,EAAE,CAAC;QAAC,MAAM,EAAE,iBAAiB,CAAA;KAAE;IAI7F;;OAEG;IACH,cAAc,CAAC,QAAQ,EAAE,WAAW,EAAE,GAAG,MAAM;IAI/C;;OAEG;IACH,OAAO,CAAC,aAAa;CAOtB"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Context Compactor - Progressive compression for conversation history
|
|
3
|
+
* Migrated from old src/core/context-compactor.ts
|
|
4
|
+
*
|
|
5
|
+
* Strategy:
|
|
6
|
+
* 1. Within limit: no compression
|
|
7
|
+
* 2. Beyond limit: keep system + recent N turns + summarize middle
|
|
8
|
+
*/
|
|
9
|
+
export class ContextCompactor {
|
|
10
|
+
maxMessages;
|
|
11
|
+
preserveRecent;
|
|
12
|
+
constructor(config = {}) {
|
|
13
|
+
this.maxMessages = config.maxMessages ?? 50;
|
|
14
|
+
this.preserveRecent = config.preserveRecent ?? 10;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Compact messages if needed
|
|
18
|
+
*/
|
|
19
|
+
compact(messages) {
|
|
20
|
+
if (messages.length <= this.maxMessages) {
|
|
21
|
+
return {
|
|
22
|
+
compacted: messages,
|
|
23
|
+
result: { originalCount: messages.length, compactedCount: messages.length, removedCount: 0 },
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
const systemMsg = messages.find(m => m.role === 'system');
|
|
27
|
+
const others = messages.filter(m => m.role !== 'system');
|
|
28
|
+
if (others.length <= this.preserveRecent) {
|
|
29
|
+
return {
|
|
30
|
+
compacted: messages,
|
|
31
|
+
result: { originalCount: messages.length, compactedCount: messages.length, removedCount: 0 },
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
// Keep recent N turns
|
|
35
|
+
const recent = others.slice(-this.preserveRecent);
|
|
36
|
+
// Summarize the middle portion
|
|
37
|
+
const middle = others.slice(0, -this.preserveRecent);
|
|
38
|
+
const summary = {
|
|
39
|
+
role: 'system',
|
|
40
|
+
content: `[Earlier conversation summary: ${middle.length} messages covering ${this.extractTopics(middle)}]`,
|
|
41
|
+
};
|
|
42
|
+
const compacted = systemMsg
|
|
43
|
+
? [systemMsg, summary, ...recent]
|
|
44
|
+
: [summary, ...recent];
|
|
45
|
+
return {
|
|
46
|
+
compacted,
|
|
47
|
+
result: {
|
|
48
|
+
originalCount: messages.length,
|
|
49
|
+
compactedCount: compacted.length,
|
|
50
|
+
removedCount: messages.length - compacted.length,
|
|
51
|
+
},
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Auto-compact if messages exceed limit
|
|
56
|
+
*/
|
|
57
|
+
autoCompact(messages) {
|
|
58
|
+
return this.compact(messages);
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Estimate token count (rough: ~4 chars per token)
|
|
62
|
+
*/
|
|
63
|
+
estimateTokens(messages) {
|
|
64
|
+
return messages.reduce((sum, m) => sum + Math.ceil(m.content.length / 4) + 10, 0);
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Extract topic summary from messages
|
|
68
|
+
*/
|
|
69
|
+
extractTopics(msgs) {
|
|
70
|
+
const topics = msgs
|
|
71
|
+
.filter(m => m.role === 'user')
|
|
72
|
+
.map(m => m.content.slice(0, 30))
|
|
73
|
+
.slice(0, 3);
|
|
74
|
+
return topics.join(', ') || 'various topics';
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=compactor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compactor.js","sourceRoot":"","sources":["../../src/session/compactor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session Manager - Manages conversation history
|
|
3
|
+
* Migrated from old src/core/session.ts
|
|
4
|
+
*/
|
|
5
|
+
import type { ChatMessage } from '../types.js';
|
|
6
|
+
export declare class SessionManager {
|
|
7
|
+
private messages;
|
|
8
|
+
private sessionId;
|
|
9
|
+
private createdAt;
|
|
10
|
+
private compactor;
|
|
11
|
+
constructor(maxMessages?: number);
|
|
12
|
+
/**
|
|
13
|
+
* Add a message to the session
|
|
14
|
+
*/
|
|
15
|
+
addMessage(role: ChatMessage['role'], content: string, extras?: Partial<ChatMessage>): void;
|
|
16
|
+
/**
|
|
17
|
+
* Get all messages (copy)
|
|
18
|
+
*/
|
|
19
|
+
getMessages(): ChatMessage[];
|
|
20
|
+
/**
|
|
21
|
+
* Get message count
|
|
22
|
+
*/
|
|
23
|
+
getMessageCount(): number;
|
|
24
|
+
/**
|
|
25
|
+
* Clear session history
|
|
26
|
+
*/
|
|
27
|
+
clear(): void;
|
|
28
|
+
/**
|
|
29
|
+
* Truncate messages to fit context window
|
|
30
|
+
*/
|
|
31
|
+
truncate(maxMessages?: number): void;
|
|
32
|
+
/**
|
|
33
|
+
* Get session ID
|
|
34
|
+
*/
|
|
35
|
+
getId(): string;
|
|
36
|
+
/**
|
|
37
|
+
* Get session info
|
|
38
|
+
*/
|
|
39
|
+
getInfo(): {
|
|
40
|
+
id: string;
|
|
41
|
+
messageCount: number;
|
|
42
|
+
createdAt: Date;
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
export { ContextCompactor } from './compactor.js';
|
|
46
|
+
export type { CompactorConfig, CompressionResult } from './compactor.js';
|
|
47
|
+
export * from './message.js';
|
|
48
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/session/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAG/C,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAqB;IACrC,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,SAAS,CAAO;IACxB,OAAO,CAAC,SAAS,CAAmB;gBAExB,WAAW,SAAK;IAM5B;;OAEG;IACH,UAAU,CAAC,IAAI,EAAE,WAAW,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,GAAG,IAAI;IAI3F;;OAEG;IACH,WAAW,IAAI,WAAW,EAAE;IAI5B;;OAEG;IACH,eAAe,IAAI,MAAM;IAIzB;;OAEG;IACH,KAAK,IAAI,IAAI;IAIb;;OAEG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI;IAQpC;;OAEG;IACH,KAAK,IAAI,MAAM;IAIf;;OAEG;IACH,OAAO,IAAI;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,IAAI,CAAA;KAAE;CAOjE;AAED,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,YAAY,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACzE,cAAc,cAAc,CAAC"}
|