thatgfsj-code 0.2.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.
Files changed (179) hide show
  1. package/.patches/0001-fix-repl-replace-readline-with-inquirer-input-for-ke.patch +279 -0
  2. package/.patches/0002-fix-repl-stream-AI-output-directly-to-stdout-so-term.patch +564 -0
  3. package/.patches/0003-fix-session-break-the-hallucination-loop-in-assistan.patch +194 -0
  4. package/.patches/0004-chore-release-bump-version-to-0.2.1.patch +24 -0
  5. package/LICENSE +21 -0
  6. package/README.md +100 -0
  7. package/ROADMAP.md +107 -0
  8. package/dist/agent/core.d.ts +56 -0
  9. package/dist/agent/core.d.ts.map +1 -0
  10. package/dist/agent/core.js +142 -0
  11. package/dist/agent/core.js.map +1 -0
  12. package/dist/agent/index.d.ts +8 -0
  13. package/dist/agent/index.d.ts.map +1 -0
  14. package/dist/agent/index.js +8 -0
  15. package/dist/agent/index.js.map +1 -0
  16. package/dist/agent/intent.d.ts +36 -0
  17. package/dist/agent/intent.d.ts.map +1 -0
  18. package/dist/agent/intent.js +146 -0
  19. package/dist/agent/intent.js.map +1 -0
  20. package/dist/agent/streaming.d.ts +50 -0
  21. package/dist/agent/streaming.d.ts.map +1 -0
  22. package/dist/agent/streaming.js +110 -0
  23. package/dist/agent/streaming.js.map +1 -0
  24. package/dist/core/ai-engine.d.ts +59 -0
  25. package/dist/core/ai-engine.d.ts.map +1 -0
  26. package/dist/core/ai-engine.js +378 -0
  27. package/dist/core/ai-engine.js.map +1 -0
  28. package/dist/core/cli.d.ts +21 -0
  29. package/dist/core/cli.d.ts.map +1 -0
  30. package/dist/core/cli.js +143 -0
  31. package/dist/core/cli.js.map +1 -0
  32. package/dist/core/config.d.ts +38 -0
  33. package/dist/core/config.d.ts.map +1 -0
  34. package/dist/core/config.js +129 -0
  35. package/dist/core/config.js.map +1 -0
  36. package/dist/core/context-compactor.d.ts +54 -0
  37. package/dist/core/context-compactor.d.ts.map +1 -0
  38. package/dist/core/context-compactor.js +197 -0
  39. package/dist/core/context-compactor.js.map +1 -0
  40. package/dist/core/hooks.d.ts +75 -0
  41. package/dist/core/hooks.d.ts.map +1 -0
  42. package/dist/core/hooks.js +146 -0
  43. package/dist/core/hooks.js.map +1 -0
  44. package/dist/core/permissions.d.ts +52 -0
  45. package/dist/core/permissions.d.ts.map +1 -0
  46. package/dist/core/permissions.js +237 -0
  47. package/dist/core/permissions.js.map +1 -0
  48. package/dist/core/session.d.ts +54 -0
  49. package/dist/core/session.d.ts.map +1 -0
  50. package/dist/core/session.js +147 -0
  51. package/dist/core/session.js.map +1 -0
  52. package/dist/core/skills.d.ts +60 -0
  53. package/dist/core/skills.d.ts.map +1 -0
  54. package/dist/core/skills.js +175 -0
  55. package/dist/core/skills.js.map +1 -0
  56. package/dist/core/state.d.ts +60 -0
  57. package/dist/core/state.d.ts.map +1 -0
  58. package/dist/core/state.js +106 -0
  59. package/dist/core/state.js.map +1 -0
  60. package/dist/core/subagent.d.ts +68 -0
  61. package/dist/core/subagent.d.ts.map +1 -0
  62. package/dist/core/subagent.js +142 -0
  63. package/dist/core/subagent.js.map +1 -0
  64. package/dist/core/system-prompt.d.ts +40 -0
  65. package/dist/core/system-prompt.d.ts.map +1 -0
  66. package/dist/core/system-prompt.js +138 -0
  67. package/dist/core/system-prompt.js.map +1 -0
  68. package/dist/core/tool-registry.d.ts +53 -0
  69. package/dist/core/tool-registry.d.ts.map +1 -0
  70. package/dist/core/tool-registry.js +138 -0
  71. package/dist/core/tool-registry.js.map +1 -0
  72. package/dist/core/types.d.ts +206 -0
  73. package/dist/core/types.d.ts.map +1 -0
  74. package/dist/core/types.js +127 -0
  75. package/dist/core/types.js.map +1 -0
  76. package/dist/index.d.ts +7 -0
  77. package/dist/index.d.ts.map +1 -0
  78. package/dist/index.js +481 -0
  79. package/dist/index.js.map +1 -0
  80. package/dist/mcp/client.d.ts +83 -0
  81. package/dist/mcp/client.d.ts.map +1 -0
  82. package/dist/mcp/client.js +267 -0
  83. package/dist/mcp/client.js.map +1 -0
  84. package/dist/repl/index.d.ts +8 -0
  85. package/dist/repl/index.d.ts.map +1 -0
  86. package/dist/repl/index.js +8 -0
  87. package/dist/repl/index.js.map +1 -0
  88. package/dist/repl/input.d.ts +61 -0
  89. package/dist/repl/input.d.ts.map +1 -0
  90. package/dist/repl/input.js +127 -0
  91. package/dist/repl/input.js.map +1 -0
  92. package/dist/repl/loop.d.ts +53 -0
  93. package/dist/repl/loop.d.ts.map +1 -0
  94. package/dist/repl/loop.js +241 -0
  95. package/dist/repl/loop.js.map +1 -0
  96. package/dist/repl/output.d.ts +105 -0
  97. package/dist/repl/output.d.ts.map +1 -0
  98. package/dist/repl/output.js +197 -0
  99. package/dist/repl/output.js.map +1 -0
  100. package/dist/repl/welcome.d.ts +68 -0
  101. package/dist/repl/welcome.d.ts.map +1 -0
  102. package/dist/repl/welcome.js +249 -0
  103. package/dist/repl/welcome.js.map +1 -0
  104. package/dist/tools/file.d.ts +46 -0
  105. package/dist/tools/file.d.ts.map +1 -0
  106. package/dist/tools/file.js +100 -0
  107. package/dist/tools/file.js.map +1 -0
  108. package/dist/tools/git.d.ts +52 -0
  109. package/dist/tools/git.d.ts.map +1 -0
  110. package/dist/tools/git.js +112 -0
  111. package/dist/tools/git.js.map +1 -0
  112. package/dist/tools/index.d.ts +22 -0
  113. package/dist/tools/index.d.ts.map +1 -0
  114. package/dist/tools/index.js +43 -0
  115. package/dist/tools/index.js.map +1 -0
  116. package/dist/tools/search.d.ts +36 -0
  117. package/dist/tools/search.d.ts.map +1 -0
  118. package/dist/tools/search.js +223 -0
  119. package/dist/tools/search.js.map +1 -0
  120. package/dist/tools/shell.d.ts +57 -0
  121. package/dist/tools/shell.d.ts.map +1 -0
  122. package/dist/tools/shell.js +153 -0
  123. package/dist/tools/shell.js.map +1 -0
  124. package/dist/utils/diff-preview.d.ts +42 -0
  125. package/dist/utils/diff-preview.d.ts.map +1 -0
  126. package/dist/utils/diff-preview.js +174 -0
  127. package/dist/utils/diff-preview.js.map +1 -0
  128. package/dist/utils/index.d.ts +8 -0
  129. package/dist/utils/index.d.ts.map +1 -0
  130. package/dist/utils/index.js +8 -0
  131. package/dist/utils/index.js.map +1 -0
  132. package/dist/utils/memory.d.ts +81 -0
  133. package/dist/utils/memory.d.ts.map +1 -0
  134. package/dist/utils/memory.js +186 -0
  135. package/dist/utils/memory.js.map +1 -0
  136. package/dist/utils/project-context.d.ts +62 -0
  137. package/dist/utils/project-context.d.ts.map +1 -0
  138. package/dist/utils/project-context.js +197 -0
  139. package/dist/utils/project-context.js.map +1 -0
  140. package/docs/API_KEY_GUIDE.md +236 -0
  141. package/docs/FAQ.md +182 -0
  142. package/install.bat +63 -0
  143. package/install.ps1 +238 -0
  144. package/install.sh +113 -0
  145. package/package.json +36 -0
  146. package/src/agent/core.ts +179 -0
  147. package/src/agent/index.ts +8 -0
  148. package/src/agent/intent.ts +181 -0
  149. package/src/agent/streaming.ts +132 -0
  150. package/src/core/ai-engine.ts +437 -0
  151. package/src/core/cli.ts +171 -0
  152. package/src/core/config.ts +147 -0
  153. package/src/core/context-compactor.ts +245 -0
  154. package/src/core/hooks.ts +196 -0
  155. package/src/core/permissions.ts +308 -0
  156. package/src/core/session.ts +165 -0
  157. package/src/core/skills.ts +208 -0
  158. package/src/core/state.ts +120 -0
  159. package/src/core/subagent.ts +195 -0
  160. package/src/core/system-prompt.ts +163 -0
  161. package/src/core/tool-registry.ts +157 -0
  162. package/src/core/types.ts +280 -0
  163. package/src/index.ts +544 -0
  164. package/src/mcp/client.ts +330 -0
  165. package/src/repl/index.ts +8 -0
  166. package/src/repl/input.ts +139 -0
  167. package/src/repl/loop.ts +280 -0
  168. package/src/repl/output.ts +222 -0
  169. package/src/repl/welcome.ts +296 -0
  170. package/src/tools/file.ts +117 -0
  171. package/src/tools/git.ts +132 -0
  172. package/src/tools/index.ts +48 -0
  173. package/src/tools/search.ts +263 -0
  174. package/src/tools/shell.ts +181 -0
  175. package/src/utils/diff-preview.ts +202 -0
  176. package/src/utils/index.ts +8 -0
  177. package/src/utils/memory.ts +223 -0
  178. package/src/utils/project-context.ts +207 -0
  179. package/tsconfig.json +19 -0
@@ -0,0 +1,378 @@
1
+ /**
2
+ * AI Engine - Core AI interaction module
3
+ * Supports multiple providers: MiniMax, SiliconFlow, OpenAI, Anthropic
4
+ *
5
+ * Implements S01: Agent Loop pattern with async generator for streaming
6
+ * Core pattern: while(true) { response → execute tools → append results → repeat }
7
+ */
8
+ import chalk from 'chalk';
9
+ export class AIEngine {
10
+ config;
11
+ tools = new Map();
12
+ constructor(config) {
13
+ this.config = config;
14
+ }
15
+ /**
16
+ * Register tools for function calling
17
+ */
18
+ registerTool(tool) {
19
+ this.tools.set(tool.name, tool);
20
+ }
21
+ /**
22
+ * Unregister a tool
23
+ */
24
+ unregisterTool(name) {
25
+ this.tools.delete(name);
26
+ }
27
+ /**
28
+ * Get registered tools for API (S02: uses ToolRegistry if available)
29
+ */
30
+ getToolsForAPI() {
31
+ // If registry is injected, use its getToolsForAPI
32
+ if (this.registry) {
33
+ return this.registry.getToolsForAPI();
34
+ }
35
+ // Fallback: build from tools map
36
+ return Array.from(this.tools.values()).map(tool => ({
37
+ type: 'function',
38
+ function: {
39
+ name: tool.name,
40
+ description: tool.description,
41
+ parameters: {
42
+ type: 'object',
43
+ properties: tool.parameters.reduce((acc, p) => {
44
+ acc[p.name] = { type: p.type, description: p.description };
45
+ return acc;
46
+ }, {}),
47
+ required: tool.parameters.filter(p => p.required).map(p => p.name)
48
+ }
49
+ }
50
+ }));
51
+ }
52
+ // S02: Inject registry for enhanced tool management
53
+ setRegistry(registry) {
54
+ this.registry = registry;
55
+ }
56
+ registry;
57
+ // S08: Hook manager
58
+ setHooks(hooks) {
59
+ this.hooks = hooks;
60
+ }
61
+ hooks = null;
62
+ // ==================== S01: Async Generator Agent Loop ====================
63
+ async *chatStream(messages, maxIterations = 10) {
64
+ let currentMessages = [...messages];
65
+ let iterations = 0;
66
+ while (iterations < maxIterations) {
67
+ iterations++;
68
+ // S08 Hook: beforeAgentLoop
69
+ if (this.hooks) {
70
+ await this.hooks.emit('beforeAgentLoop', { messages: currentMessages, iteration: iterations });
71
+ }
72
+ let fullResponse = '';
73
+ for await (const chunk of this.streamRequest(currentMessages)) {
74
+ fullResponse += chunk;
75
+ yield chunk;
76
+ }
77
+ const response = this.parseResponse(fullResponse);
78
+ if (response.tool_calls && response.tool_calls.length > 0) {
79
+ currentMessages.push({
80
+ role: 'assistant',
81
+ content: response.content,
82
+ tool_calls: response.tool_calls
83
+ });
84
+ // Execute each tool
85
+ for (const toolCall of response.tool_calls) {
86
+ // S08 Hook: beforeToolCall
87
+ if (this.hooks) {
88
+ await this.hooks.emit('beforeToolCall', {
89
+ toolName: toolCall.function.name,
90
+ toolParams: JSON.parse(toolCall.function.arguments || '{}'),
91
+ toolCallId: toolCall.id
92
+ });
93
+ }
94
+ const result = await this.executeToolCall(toolCall);
95
+ // S08 Hook: afterToolCall
96
+ if (this.hooks) {
97
+ await this.hooks.emit('afterToolCall', {
98
+ toolName: toolCall.function.name,
99
+ toolParams: JSON.parse(toolCall.function.arguments || '{}'),
100
+ toolResult: result,
101
+ toolCallId: toolCall.id
102
+ });
103
+ }
104
+ const toolResultMsg = {
105
+ role: 'tool',
106
+ content: result.output || result.error || '',
107
+ tool_call_id: toolCall.id,
108
+ name: toolCall.function.name
109
+ };
110
+ currentMessages.push(toolResultMsg);
111
+ yield `\n${chalk.gray(`[tool: ${toolCall.function.name}]`)}`;
112
+ }
113
+ continue;
114
+ }
115
+ // No tool calls — exit loop
116
+ if (response.content) {
117
+ currentMessages.push({
118
+ role: 'assistant',
119
+ content: response.content
120
+ });
121
+ }
122
+ // S08 Hook: afterAgentLoop
123
+ if (this.hooks) {
124
+ await this.hooks.emit('afterAgentLoop', { messages: currentMessages, iteration: iterations });
125
+ }
126
+ return response;
127
+ }
128
+ // Max iterations reached
129
+ return {
130
+ content: '[Agent loop exceeded maximum iterations]',
131
+ role: 'assistant'
132
+ };
133
+ }
134
+ /**
135
+ * S01 Core: Stream request — yields chunks as they arrive
136
+ * Uses async generator for backpressure control and lazy evaluation
137
+ */
138
+ async *streamRequest(messages) {
139
+ const apiKey = this.config.apiKey || this.getApiKey();
140
+ if (!apiKey) {
141
+ // Mock streaming for demo
142
+ const mock = this.getMockResponse(messages);
143
+ for (const char of mock) {
144
+ await new Promise(r => setTimeout(r, 10));
145
+ yield char;
146
+ }
147
+ return;
148
+ }
149
+ const isAnthropicFormat = this.config.provider === 'anthropic' || this.config.provider === 'minimax';
150
+ const isGeminiFormat = this.config.provider === 'gemini';
151
+ let url;
152
+ let headers = {};
153
+ let body;
154
+ if (isGeminiFormat) {
155
+ url = `${this.config.baseUrl}/models/${this.config.model}:generateContent`;
156
+ headers = { 'Content-Type': 'application/json' };
157
+ body = this.buildGeminiRequest(messages);
158
+ }
159
+ else if (isAnthropicFormat) {
160
+ url = `${this.config.baseUrl}/messages-stream`;
161
+ headers = {
162
+ 'Content-Type': 'application/json',
163
+ 'x-api-key': apiKey,
164
+ 'anthropic-version': '2023-06-01',
165
+ 'anthropic-dangerous-direct-browser-access': 'true'
166
+ };
167
+ body = this.buildAnthropicRequest(messages, true);
168
+ }
169
+ else {
170
+ url = `${this.config.baseUrl}/chat/completions`;
171
+ headers = {
172
+ 'Content-Type': 'application/json',
173
+ 'Authorization': `Bearer ${apiKey}`
174
+ };
175
+ body = this.buildOpenAIRequest(messages, true);
176
+ }
177
+ const response = await fetch(url, {
178
+ method: 'POST',
179
+ headers,
180
+ body: JSON.stringify(body)
181
+ });
182
+ if (!response.ok || !response.body) {
183
+ yield `\n${chalk.red(`[API Error: ${response.status}]`)}`;
184
+ return;
185
+ }
186
+ const decoder = new TextDecoder();
187
+ const reader = response.body.getReader();
188
+ try {
189
+ while (true) {
190
+ const { done, value } = await reader.read();
191
+ if (done)
192
+ break;
193
+ const chunk = decoder.decode(value, { stream: true });
194
+ const text = this.extractChunkText(chunk, isAnthropicFormat, isGeminiFormat);
195
+ if (text) {
196
+ yield text;
197
+ }
198
+ }
199
+ }
200
+ finally {
201
+ reader.releaseLock();
202
+ }
203
+ }
204
+ /**
205
+ * Extract text from streaming chunk based on provider format
206
+ */
207
+ extractChunkText(chunk, isAnthropic, isGemini) {
208
+ if (isAnthropic) {
209
+ // Anthropic streaming format: data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"..."}}
210
+ const match = chunk.match(/"type"\s*:\s*"text_delta"\s*,\s*"text"\s*:\s*"([^"]*)"/);
211
+ return match ? match[1] : '';
212
+ }
213
+ else if (isGemini) {
214
+ // Gemini format
215
+ const match = chunk.match(/"text"\s*:\s*"([^"]*)"/);
216
+ return match ? match[1] : '';
217
+ }
218
+ else {
219
+ // OpenAI SSE format: data: {"choices":[{"delta":{"content":"..."}}]}
220
+ const lines = chunk.split('\n');
221
+ for (const line of lines) {
222
+ if (line.startsWith('data: ') && line !== 'data: [DONE]') {
223
+ try {
224
+ const data = JSON.parse(line.slice(6));
225
+ const content = data.choices?.[0]?.delta?.content;
226
+ if (content)
227
+ return content;
228
+ }
229
+ catch {
230
+ // Skip invalid JSON
231
+ }
232
+ }
233
+ }
234
+ return '';
235
+ }
236
+ }
237
+ /**
238
+ * Parse full response text into structured AIResponse
239
+ */
240
+ parseResponse(fullText) {
241
+ // For now return content as-is; tool call parsing happens via content patterns
242
+ return {
243
+ content: fullText,
244
+ role: 'assistant',
245
+ tool_calls: this.extractToolCalls(fullText)
246
+ };
247
+ }
248
+ /**
249
+ * Extract tool calls from response content
250
+ */
251
+ extractToolCalls(content) {
252
+ // Simple pattern: look for tool_call blocks in response
253
+ // In real implementation this would be parsed from structured response
254
+ // For streaming, we check if content indicates a tool call
255
+ if (!content.includes('tool_use'))
256
+ return undefined;
257
+ return undefined; // Placeholder — actual implementation depends on provider
258
+ }
259
+ // ==================== Legacy chat() — delegates to chatStream ====================
260
+ /**
261
+ * Original non-streaming chat — now implemented via chatStream
262
+ */
263
+ async chat(messages, maxIterations = 5) {
264
+ let fullContent = '';
265
+ for await (const chunk of this.chatStream(messages, maxIterations)) {
266
+ fullContent += chunk;
267
+ }
268
+ return {
269
+ content: fullContent,
270
+ role: 'assistant'
271
+ };
272
+ }
273
+ // ==================== Tool Execution ====================
274
+ async executeToolCall(toolCall) {
275
+ const { name, arguments: args } = toolCall.function;
276
+ const tool = this.tools.get(name);
277
+ if (!tool) {
278
+ return { error: `Tool "${name}" not found` };
279
+ }
280
+ try {
281
+ const params = JSON.parse(args);
282
+ const result = await tool.execute(params, {
283
+ confirmAction: async (msg) => {
284
+ console.log(chalk.yellow(`\n⚠️ Tool wants to execute: ${msg}`));
285
+ return false; // Default deny in CLI mode
286
+ }
287
+ });
288
+ return {
289
+ output: result.success ? (result.output || JSON.stringify(result.data)) : undefined,
290
+ error: result.error
291
+ };
292
+ }
293
+ catch (error) {
294
+ return { error: `Tool execution failed: ${error.message}` };
295
+ }
296
+ }
297
+ // ==================== Request Builders ====================
298
+ buildOpenAIRequest(messages, stream) {
299
+ const tools = this.getToolsForAPI();
300
+ return {
301
+ model: this.config.model || 'Qwen/Qwen2.5-7B-Instruct',
302
+ messages: messages.map(m => ({
303
+ role: m.role,
304
+ content: m.content,
305
+ name: m.name,
306
+ tool_call_id: m.tool_call_id,
307
+ tool_calls: m.tool_calls
308
+ })),
309
+ temperature: this.config.temperature || 0.7,
310
+ max_tokens: this.config.maxTokens || 4096,
311
+ stream,
312
+ ...(tools.length > 0 && { tools })
313
+ };
314
+ }
315
+ buildAnthropicRequest(messages, stream) {
316
+ const anthropicMessages = messages
317
+ .filter(m => m.role !== 'system')
318
+ .map(m => ({
319
+ role: m.role === 'assistant' ? 'assistant' : 'user',
320
+ content: m.content
321
+ }));
322
+ return {
323
+ model: this.config.model || 'claude-3-haiku-20240307',
324
+ messages: anthropicMessages,
325
+ max_tokens: this.config.maxTokens || 4096,
326
+ temperature: this.config.temperature || 0.7,
327
+ stream
328
+ };
329
+ }
330
+ buildGeminiRequest(messages) {
331
+ const contents = messages
332
+ .filter(m => m.role !== 'system')
333
+ .map(m => ({
334
+ role: m.role === 'assistant' ? 'model' : 'user',
335
+ parts: [{ text: m.content }]
336
+ }));
337
+ return {
338
+ contents,
339
+ generationConfig: {
340
+ temperature: this.config.temperature || 0.7,
341
+ maxOutputTokens: this.config.maxTokens || 4096
342
+ }
343
+ };
344
+ }
345
+ getApiKey() {
346
+ const provider = this.config.provider || 'siliconflow';
347
+ const envKeys = {
348
+ siliconflow: ['SILICONFLOW_API_KEY', 'OPENAI_API_KEY'],
349
+ minimax: ['MINIMAX_API_KEY', 'OPENAI_API_KEY'],
350
+ openai: ['OPENAI_API_KEY'],
351
+ anthropic: ['ANTHROPIC_API_KEY'],
352
+ ollama: [],
353
+ gemini: ['GEMINI_API_KEY'],
354
+ kimi: ['KIMI_API_KEY', 'MOONSHOT_API_KEY'],
355
+ deepseek: ['DEEPSEEK_API_KEY']
356
+ };
357
+ for (const key of envKeys[provider] || []) {
358
+ if (process.env[key])
359
+ return process.env[key];
360
+ }
361
+ return '';
362
+ }
363
+ getMockResponse(messages) {
364
+ const lastMessage = messages[messages.length - 1]?.content || '';
365
+ let response = 'Hello! I am Thatgfsj Code.\n\n';
366
+ if (lastMessage.toLowerCase().includes('hello') || lastMessage.toLowerCase().includes('hi')) {
367
+ response = 'Hi there! How can I help you today?';
368
+ }
369
+ else if (lastMessage.toLowerCase().includes('who are you')) {
370
+ response = 'I am Thatgfsj Code, an AI assistant built with Node.js.';
371
+ }
372
+ else {
373
+ response = `I understand you said: "${lastMessage.slice(0, 50)}..."\n\nThis is a streaming demo. Enable an API key for full AI capabilities.`;
374
+ }
375
+ return response;
376
+ }
377
+ }
378
+ //# sourceMappingURL=ai-engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-engine.js","sourceRoot":"","sources":["../../src/core/ai-engine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * S12: CLI & Architecture
3
+ *
4
+ * Main entry point, CLI argument parsing, and module architecture overview.
5
+ */
6
+ export interface CLIOptions {
7
+ model?: string;
8
+ provider?: string;
9
+ prompt?: string;
10
+ noStream?: boolean;
11
+ verbose?: boolean;
12
+ hooks?: boolean;
13
+ permissionMode?: 'accept' | 'deny' | 'ask';
14
+ }
15
+ export declare function parseArgs(args: string[]): CLIOptions;
16
+ /**
17
+ * S12: Print architecture overview
18
+ */
19
+ export declare function printArchitecture(): void;
20
+ export declare function main(argv: string[]): Promise<void>;
21
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/core/cli.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAgBH,MAAM,WAAW,UAAU;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,cAAc,CAAC,EAAE,QAAQ,GAAG,MAAM,GAAG,KAAK,CAAC;CAC5C;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,UAAU,CAwCpD;AA4BD;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,IAAI,CAyBxC;AAID,wBAAsB,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAwCxD"}
@@ -0,0 +1,143 @@
1
+ /**
2
+ * S12: CLI & Architecture
3
+ *
4
+ * Main entry point, CLI argument parsing, and module architecture overview.
5
+ */
6
+ import { AIEngine } from './ai-engine.js';
7
+ import { ConfigManager } from './config.js';
8
+ import { REPLLoop } from '../repl/loop.js';
9
+ import { ShellTool, FileTool, GitTool } from '../tools/index.js';
10
+ import { auditLogHook, getHookManager } from './hooks.js';
11
+ import { SystemPromptBuilder } from './system-prompt.js';
12
+ export function parseArgs(args) {
13
+ const options = {};
14
+ for (let i = 0; i < args.length; i++) {
15
+ const arg = args[i];
16
+ switch (arg) {
17
+ case '--model':
18
+ case '-m':
19
+ options.model = args[++i];
20
+ break;
21
+ case '--provider':
22
+ case '-p':
23
+ options.provider = args[++i];
24
+ break;
25
+ case '--prompt':
26
+ case '-c':
27
+ options.prompt = args[++i];
28
+ break;
29
+ case '--no-stream':
30
+ options.noStream = true;
31
+ break;
32
+ case '--verbose':
33
+ case '-v':
34
+ options.verbose = true;
35
+ break;
36
+ case '--hooks':
37
+ options.hooks = true;
38
+ break;
39
+ case '--permission':
40
+ options.permissionMode = args[++i] || 'ask';
41
+ break;
42
+ case '--help':
43
+ case '-h':
44
+ printHelp();
45
+ process.exit(0);
46
+ }
47
+ }
48
+ return options;
49
+ }
50
+ function printHelp() {
51
+ console.log(`
52
+ Thatgfsj Code - AI Coding Assistant
53
+
54
+ Usage: thatgfsj [options]
55
+
56
+ Options:
57
+ -m, --model <model> Set AI model
58
+ -p, --provider <provider> Set provider (siliconflow, minimax, openai, etc.)
59
+ -c, --prompt <text> Run single prompt and exit
60
+ --no-stream Disable streaming output
61
+ --hooks Enable built-in hooks (audit log, etc.)
62
+ --permission <mode> Set permission mode (accept, deny, ask)
63
+ -v, --verbose Verbose output
64
+ -h, --help Show this help
65
+
66
+ Examples:
67
+ thatgfsj Start REPL
68
+ thatgfsj -c "Hello" Run single prompt
69
+ thatgfsj --provider minimax --model MiniMax-M2.5 Use specific provider
70
+ thatgfsj --permission accept Accept all tool calls
71
+ `);
72
+ }
73
+ // ==================== Architecture ====================
74
+ /**
75
+ * S12: Print architecture overview
76
+ */
77
+ export function printArchitecture() {
78
+ console.log(`
79
+ Thatgfsj Code Architecture
80
+ ============================
81
+
82
+ Core:
83
+ AIEngine - Async generator agent loop (S01), multi-provider
84
+ ToolRegistry - Tool registration and execution (S02)
85
+ PermissionChecker - 6-stage permission pipeline (S03)
86
+ SystemPromptBuilder - Dynamic prompt construction (S04)
87
+ ContextCompactor - 3-tier context compression (S05)
88
+ SubagentManager - Parallel subagent execution (S06)
89
+ HookManager - Event-driven hooks (S08)
90
+ SkillsLoader - Skills discovery and catalog (S10)
91
+ StateManager - Ephemeral/Persistent/Session state (S11)
92
+
93
+ Tools:
94
+ ShellTool - Shell command execution
95
+ FileTool - File read/write/list/delete
96
+ GitTool - Git operations
97
+
98
+ Entry:
99
+ REPLLoop - Interactive REPL
100
+ CLI - Command-line mode
101
+ `);
102
+ }
103
+ // ==================== Main ====================
104
+ export async function main(argv) {
105
+ const options = parseArgs(argv.slice(2));
106
+ // Single prompt mode
107
+ if (options.prompt) {
108
+ const config = await ConfigManager.load();
109
+ if (options.provider)
110
+ config.provider = options.provider;
111
+ if (options.model)
112
+ config.model = options.model;
113
+ const ai = new AIEngine(config);
114
+ const tools = [new ShellTool(), new FileTool(), new GitTool()];
115
+ for (const tool of tools)
116
+ ai.registerTool(tool);
117
+ if (options.hooks) {
118
+ const hooks = getHookManager();
119
+ hooks.register('afterToolCall', auditLogHook);
120
+ ai.setHooks(hooks);
121
+ }
122
+ const promptBuilder = new SystemPromptBuilder({ tools, permissionMode: options.permissionMode });
123
+ const messages = [
124
+ { role: 'system', content: promptBuilder.build() },
125
+ { role: 'user', content: options.prompt }
126
+ ];
127
+ if (options.noStream) {
128
+ const response = await ai.chat(messages);
129
+ console.log(response.content);
130
+ }
131
+ else {
132
+ for await (const chunk of ai.chatStream(messages)) {
133
+ process.stdout.write(chunk);
134
+ }
135
+ console.log();
136
+ }
137
+ return;
138
+ }
139
+ // REPL mode
140
+ const repl = new REPLLoop();
141
+ await repl.start();
142
+ }
143
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/core/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Config Manager - Handles configuration loading and saving
3
+ * Supports multiple AI providers: MiniMax, SiliconFlow, OpenAI, Anthropic
4
+ */
5
+ import { Config, AIConfig } from './types.js';
6
+ export declare class ConfigManager {
7
+ private configPath;
8
+ constructor();
9
+ /**
10
+ * Load configuration with environment variable support
11
+ */
12
+ static load(): Promise<Config>;
13
+ /**
14
+ * Load config from file and merge with environment variables
15
+ */
16
+ private loadConfig;
17
+ /**
18
+ * Resolve provider and API key from config or environment
19
+ */
20
+ private resolveProvider;
21
+ /**
22
+ * Get AIConfig for AIEngine
23
+ */
24
+ static getAIConfig(): Promise<AIConfig>;
25
+ /**
26
+ * Save configuration
27
+ */
28
+ save(config: Partial<Config>): Promise<void>;
29
+ /**
30
+ * Get config path
31
+ */
32
+ getPath(): string;
33
+ /**
34
+ * List available providers
35
+ */
36
+ static listProviders(): string;
37
+ }
38
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,EAAE,MAAM,EAAa,QAAQ,EAAE,MAAM,YAAY,CAAC;AAWzD,qBAAa,aAAa;IACxB,OAAO,CAAC,UAAU,CAAS;;IAQ3B;;OAEG;WACU,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC;IAKpC;;OAEG;IACH,OAAO,CAAC,UAAU;IAmBlB;;OAEG;IACH,OAAO,CAAC,eAAe;IAwCvB;;OAEG;WACU,WAAW,IAAI,OAAO,CAAC,QAAQ,CAAC;IAY7C;;OAEG;IACG,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAYlD;;OAEG;IACH,OAAO,IAAI,MAAM;IAIjB;;OAEG;IACH,MAAM,CAAC,aAAa,IAAI,MAAM;CAK/B"}