activo 0.4.2 → 0.4.4
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/dist/cli/index.js +0 -0
- package/dist/core/agent.d.ts.map +1 -1
- package/dist/core/agent.js +426 -48
- package/dist/core/agent.js.map +1 -1
- package/dist/core/config.js +1 -1
- package/dist/core/llm/ollama.d.ts +1 -1
- package/dist/core/llm/ollama.d.ts.map +1 -1
- package/dist/core/llm/ollama.js +57 -2
- package/dist/core/llm/ollama.js.map +1 -1
- package/dist/core/tools/analyzeAll.d.ts.map +1 -1
- package/dist/core/tools/analyzeAll.js +16 -28
- package/dist/core/tools/analyzeAll.js.map +1 -1
- package/dist/core/tools/index.d.ts +1 -0
- package/dist/core/tools/index.d.ts.map +1 -1
- package/dist/core/tools/index.js +74 -0
- package/dist/core/tools/index.js.map +1 -1
- package/dist/core/tools/javaAst.d.ts.map +1 -1
- package/dist/core/tools/javaAst.js +191 -0
- package/dist/core/tools/javaAst.js.map +1 -1
- package/package.json +2 -2
- package/src/core/agent.ts +481 -48
- package/src/core/config.ts +1 -1
- package/src/core/llm/ollama.ts +70 -3
- package/src/core/tools/analyzeAll.ts +17 -29
- package/src/core/tools/index.ts +79 -0
- package/src/core/tools/javaAst.ts +218 -0
- package/src/core/tools/javaQuality.integration.test.ts +537 -0
package/dist/cli/index.js
CHANGED
|
File without changes
|
package/dist/core/agent.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../src/core/agent.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../src/core/agent.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC5D,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAmD,UAAU,EAAQ,MAAM,kBAAkB,CAAC;AAErG,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,UAAU,GAAG,SAAS,GAAG,UAAU,GAAG,aAAa,GAAG,MAAM,GAAG,OAAO,CAAC;IAC7E,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,OAAO,GAAG,UAAU,GAAG,OAAO,CAAC;IACxC,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,KAAK,CAAC;QACf,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC9B,MAAM,EAAE,UAAU,CAAC;KACpB,CAAC,CAAC;CACJ;AAgaD,wBAAsB,cAAc,CAClC,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,WAAW,EAAE,EACtB,MAAM,EAAE,YAAY,EACpB,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,EACrC,cAAc,CAAC,EAAE,MAAM,GACtB,OAAO,CAAC,WAAW,CAAC,CAqGtB;AAED,wBAAuB,oBAAoB,CACzC,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,WAAW,EAAE,EACtB,MAAM,EAAE,YAAY,EACpB,MAAM,EAAE,MAAM,EACd,WAAW,CAAC,EAAE,WAAW,EACzB,cAAc,CAAC,EAAE,MAAM,GACtB,cAAc,CAAC,UAAU,CAAC,CA2J5B"}
|
package/dist/core/agent.js
CHANGED
|
@@ -1,52 +1,12 @@
|
|
|
1
|
-
import
|
|
1
|
+
import * as fs from "fs";
|
|
2
|
+
import { selectTools, executeTool } from "./tools/index.js";
|
|
2
3
|
const BASE_SYSTEM_PROMPT = `You are ACTIVO, a code quality analyzer. You MUST call tools to perform tasks.
|
|
3
4
|
|
|
4
|
-
##
|
|
5
|
+
## RULES
|
|
5
6
|
1. Call tool IMMEDIATELY when user requests an action
|
|
6
|
-
2. NEVER
|
|
7
|
-
3.
|
|
8
|
-
4.
|
|
9
|
-
|
|
10
|
-
## TOOLS BY CATEGORY
|
|
11
|
-
|
|
12
|
-
### Document Conversion & RAG
|
|
13
|
-
- import_hwp_standards(hwpPath, outputDir): Convert HWP to markdown
|
|
14
|
-
- import_pdf_standards(pdfPath, outputDir): Convert PDF to markdown
|
|
15
|
-
- index_standards(directory?): Index standards for RAG search (run after import)
|
|
16
|
-
- search_standards(query, topK?): Search standards by semantic query
|
|
17
|
-
- check_quality_rag(filepath, topK?): Check code using RAG to find relevant standards
|
|
18
|
-
|
|
19
|
-
### Code Analysis (Recommended: use analyze_all)
|
|
20
|
-
- analyze_all(path, include?): Analyze all code (Java/JS/TS/Python)
|
|
21
|
-
- java_analyze(path): Java code analysis
|
|
22
|
-
- java_complexity(path): Java complexity metrics
|
|
23
|
-
- spring_check(path): Spring pattern check
|
|
24
|
-
- ast_analyze(path): JS/TS AST analysis
|
|
25
|
-
- react_check(path): React pattern check
|
|
26
|
-
- vue_check(path): Vue pattern check
|
|
27
|
-
- python_check(path): Python code analysis
|
|
28
|
-
|
|
29
|
-
### SQL/DB Analysis
|
|
30
|
-
- sql_check(path): SQL query analysis
|
|
31
|
-
- mybatis_check(path): MyBatis mapper analysis
|
|
32
|
-
|
|
33
|
-
### Web Analysis
|
|
34
|
-
- css_check(path): CSS analysis
|
|
35
|
-
- html_check(path): HTML analysis
|
|
36
|
-
- dependency_check(path): package.json dependency analysis
|
|
37
|
-
- openapi_check(path): OpenAPI spec analysis
|
|
38
|
-
|
|
39
|
-
### File Operations
|
|
40
|
-
- read_file(path): Read file content
|
|
41
|
-
- write_file(path, content): Write file
|
|
42
|
-
- list_directory(path): List directory contents
|
|
43
|
-
- grep_search(pattern, path): Search pattern in files
|
|
44
|
-
- glob_search(pattern): Search files by pattern
|
|
45
|
-
|
|
46
|
-
## EXAMPLE
|
|
47
|
-
User: "Analyze src folder"
|
|
48
|
-
→ Call analyze_all(path="src") immediately
|
|
49
|
-
→ After result: Summarize findings`;
|
|
7
|
+
2. NEVER fabricate results - only report actual tool output
|
|
8
|
+
3. After tool returns, summarize in user's language (Korean if user speaks Korean)
|
|
9
|
+
4. Use analyze_all for broad code analysis`;
|
|
50
10
|
// Build system prompt with optional context
|
|
51
11
|
function buildSystemPrompt(contextSummary) {
|
|
52
12
|
if (!contextSummary) {
|
|
@@ -61,8 +21,376 @@ ${contextSummary}
|
|
|
61
21
|
---
|
|
62
22
|
위 내용은 이전 세션에서의 대화 요약입니다. 필요시 참고하세요.`;
|
|
63
23
|
}
|
|
24
|
+
// Intent patterns: keyword groups → tool + args builder
|
|
25
|
+
const INTENT_PATTERNS = [
|
|
26
|
+
// Single file analysis (must come before directory patterns)
|
|
27
|
+
{
|
|
28
|
+
keywords: ["분석", "analyze", "검사", "check"],
|
|
29
|
+
tool: "_single_file", // special marker - resolved at match time
|
|
30
|
+
buildArgs: (path) => ({ filepath: path }),
|
|
31
|
+
},
|
|
32
|
+
// analyze_all with Java filter
|
|
33
|
+
{
|
|
34
|
+
keywords: ["자바", "java"],
|
|
35
|
+
tool: "analyze_all",
|
|
36
|
+
buildArgs: (path) => ({ path, include: ["java"] }),
|
|
37
|
+
},
|
|
38
|
+
// Spring patterns
|
|
39
|
+
{
|
|
40
|
+
keywords: ["spring", "스프링"],
|
|
41
|
+
tool: "analyze_all",
|
|
42
|
+
buildArgs: (path) => ({ path, include: ["java"] }),
|
|
43
|
+
},
|
|
44
|
+
// Dependency analysis
|
|
45
|
+
{
|
|
46
|
+
keywords: ["의존성", "dependency", "dependencies", "취약점"],
|
|
47
|
+
tool: "dependency_check",
|
|
48
|
+
buildArgs: (path) => ({ path }),
|
|
49
|
+
},
|
|
50
|
+
// Complexity
|
|
51
|
+
{
|
|
52
|
+
keywords: ["복잡도", "complexity"],
|
|
53
|
+
tool: "analyze_all",
|
|
54
|
+
buildArgs: (path) => ({ path }),
|
|
55
|
+
},
|
|
56
|
+
// Python
|
|
57
|
+
{
|
|
58
|
+
keywords: ["python", "파이썬", ".py"],
|
|
59
|
+
tool: "analyze_all",
|
|
60
|
+
buildArgs: (path) => ({ path, include: ["py"] }),
|
|
61
|
+
},
|
|
62
|
+
// Frontend
|
|
63
|
+
{
|
|
64
|
+
keywords: ["react", "리액트", "vue", "뷰", "프론트엔드", "frontend"],
|
|
65
|
+
tool: "analyze_all",
|
|
66
|
+
buildArgs: (path) => ({ path, include: ["js", "ts", "jsx", "tsx", "vue"] }),
|
|
67
|
+
},
|
|
68
|
+
// CSS
|
|
69
|
+
{
|
|
70
|
+
keywords: ["css", "scss", "less", "스타일"],
|
|
71
|
+
tool: "analyze_all",
|
|
72
|
+
buildArgs: (path) => ({ path, include: ["css"] }),
|
|
73
|
+
},
|
|
74
|
+
// HTML
|
|
75
|
+
{
|
|
76
|
+
keywords: ["html", "jsp", "접근성", "a11y", "seo"],
|
|
77
|
+
tool: "analyze_all",
|
|
78
|
+
buildArgs: (path) => ({ path, include: ["html"] }),
|
|
79
|
+
},
|
|
80
|
+
// SQL / MyBatis
|
|
81
|
+
{
|
|
82
|
+
keywords: ["sql", "mybatis", "마이바티스", "쿼리"],
|
|
83
|
+
tool: "analyze_all",
|
|
84
|
+
buildArgs: (path) => ({ path, include: ["java", "xml"] }),
|
|
85
|
+
},
|
|
86
|
+
// Broad analysis (catch-all, must be last)
|
|
87
|
+
{
|
|
88
|
+
keywords: ["전체분석", "전체 분석", "분석해", "코드품질", "코드 품질", "analyze", "분석", "검사", "check"],
|
|
89
|
+
tool: "analyze_all",
|
|
90
|
+
buildArgs: (path) => ({ path }),
|
|
91
|
+
},
|
|
92
|
+
];
|
|
93
|
+
// File extension → single-file tool mapping
|
|
94
|
+
const FILE_TOOL_MAP = {
|
|
95
|
+
".java": "java_analyze",
|
|
96
|
+
".js": "ast_analyze",
|
|
97
|
+
".ts": "ast_analyze",
|
|
98
|
+
".jsx": "react_check",
|
|
99
|
+
".tsx": "react_check",
|
|
100
|
+
".vue": "vue_check",
|
|
101
|
+
".py": "python_check",
|
|
102
|
+
".css": "css_check",
|
|
103
|
+
".scss": "css_check",
|
|
104
|
+
".less": "css_check",
|
|
105
|
+
".html": "html_check",
|
|
106
|
+
".htm": "html_check",
|
|
107
|
+
".jsp": "html_check",
|
|
108
|
+
};
|
|
109
|
+
/**
|
|
110
|
+
* Extract filesystem paths from user message.
|
|
111
|
+
* Handles quoted paths (with spaces), simple paths, and greedy path expansion.
|
|
112
|
+
*/
|
|
113
|
+
function extractPaths(message) {
|
|
114
|
+
const paths = [];
|
|
115
|
+
// 1. Quoted paths: '...' or "..."
|
|
116
|
+
const quotedMatches = message.match(/['"]([/\\][^'"]+)['"]/g);
|
|
117
|
+
if (quotedMatches) {
|
|
118
|
+
for (const m of quotedMatches) {
|
|
119
|
+
paths.push(m.slice(1, -1)); // strip quotes
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
// 2. Simple paths (no spaces) - Unix & Windows
|
|
123
|
+
const unixMatches = message.match(/(?:^|\s)(\/[^\s,;:'"]+)/g);
|
|
124
|
+
if (unixMatches) {
|
|
125
|
+
for (const m of unixMatches) {
|
|
126
|
+
paths.push(m.trim());
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
const winMatches = message.match(/(?:^|\s)([A-Z]:\\[^\s,;:'"]+)/gi);
|
|
130
|
+
if (winMatches) {
|
|
131
|
+
for (const m of winMatches) {
|
|
132
|
+
paths.push(m.trim());
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
// 3. Greedy path expansion: if simple match doesn't exist,
|
|
136
|
+
// try extending with subsequent words until path is valid
|
|
137
|
+
if (paths.length === 0 || !paths.some((p) => { try {
|
|
138
|
+
return fs.existsSync(p);
|
|
139
|
+
}
|
|
140
|
+
catch {
|
|
141
|
+
return false;
|
|
142
|
+
} })) {
|
|
143
|
+
const words = message.split(/\s+/);
|
|
144
|
+
for (let i = 0; i < words.length; i++) {
|
|
145
|
+
if (words[i].startsWith("/") || /^[A-Z]:\\/i.test(words[i])) {
|
|
146
|
+
// Found a path start, try extending
|
|
147
|
+
let candidate = words[i];
|
|
148
|
+
let bestPath = "";
|
|
149
|
+
// Check initial segment
|
|
150
|
+
try {
|
|
151
|
+
if (fs.existsSync(candidate))
|
|
152
|
+
bestPath = candidate;
|
|
153
|
+
}
|
|
154
|
+
catch { /* */ }
|
|
155
|
+
// Extend with subsequent words
|
|
156
|
+
for (let j = i + 1; j < words.length; j++) {
|
|
157
|
+
const extended = candidate + " " + words[j];
|
|
158
|
+
try {
|
|
159
|
+
if (fs.existsSync(extended)) {
|
|
160
|
+
bestPath = extended;
|
|
161
|
+
candidate = extended;
|
|
162
|
+
}
|
|
163
|
+
else {
|
|
164
|
+
// No more valid extensions - stop
|
|
165
|
+
break;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
catch {
|
|
169
|
+
break;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
if (bestPath) {
|
|
173
|
+
paths.push(bestPath);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
// Filter to actually existing paths, deduplicate
|
|
179
|
+
const seen = new Set();
|
|
180
|
+
return paths.filter((p) => {
|
|
181
|
+
if (seen.has(p))
|
|
182
|
+
return false;
|
|
183
|
+
seen.add(p);
|
|
184
|
+
try {
|
|
185
|
+
return fs.existsSync(p);
|
|
186
|
+
}
|
|
187
|
+
catch {
|
|
188
|
+
return false;
|
|
189
|
+
}
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Determine if a path is a single file (not a directory).
|
|
194
|
+
*/
|
|
195
|
+
function isSingleFile(p) {
|
|
196
|
+
try {
|
|
197
|
+
return fs.statSync(p).isFile();
|
|
198
|
+
}
|
|
199
|
+
catch {
|
|
200
|
+
return false;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Resolve the correct tool for a single file based on extension.
|
|
205
|
+
*/
|
|
206
|
+
function resolveFileAnalysisTool(filepath) {
|
|
207
|
+
const ext = filepath.substring(filepath.lastIndexOf(".")).toLowerCase();
|
|
208
|
+
const toolName = FILE_TOOL_MAP[ext];
|
|
209
|
+
if (!toolName)
|
|
210
|
+
return null;
|
|
211
|
+
// Some tools use 'filepath', others use 'path'
|
|
212
|
+
const argKey = ["python_check", "css_check", "html_check"].includes(toolName) ? "path" : "filepath";
|
|
213
|
+
return { tool: toolName, args: { [argKey]: filepath } };
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Detect user intent from the message and automatically execute the appropriate tool.
|
|
217
|
+
* Returns IntentResult with handled=true if a tool was executed, false otherwise.
|
|
218
|
+
*/
|
|
219
|
+
async function detectAndExecuteIntent(userMessage, onEvent) {
|
|
220
|
+
const msg = userMessage.toLowerCase();
|
|
221
|
+
const paths = extractPaths(userMessage);
|
|
222
|
+
// No path found → can't auto-route
|
|
223
|
+
if (paths.length === 0) {
|
|
224
|
+
return { handled: false };
|
|
225
|
+
}
|
|
226
|
+
const targetPath = paths[0];
|
|
227
|
+
// Check if path is a single file
|
|
228
|
+
if (isSingleFile(targetPath)) {
|
|
229
|
+
const fileInfo = resolveFileAnalysisTool(targetPath);
|
|
230
|
+
if (fileInfo) {
|
|
231
|
+
return await executeIntentTool(fileInfo.tool, fileInfo.args, onEvent);
|
|
232
|
+
}
|
|
233
|
+
// Unknown file type → fall back to LLM
|
|
234
|
+
return { handled: false };
|
|
235
|
+
}
|
|
236
|
+
// Path is a directory → match intent patterns
|
|
237
|
+
for (const pattern of INTENT_PATTERNS) {
|
|
238
|
+
// Skip the single-file marker for directories
|
|
239
|
+
if (pattern.tool === "_single_file")
|
|
240
|
+
continue;
|
|
241
|
+
if (pattern.keywords.some((kw) => msg.includes(kw))) {
|
|
242
|
+
const args = pattern.buildArgs(targetPath, userMessage);
|
|
243
|
+
return await executeIntentTool(pattern.tool, args, onEvent);
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
// Has a directory path but no matching keyword → default to analyze_all
|
|
247
|
+
// (user likely wants some kind of analysis if they provided a path)
|
|
248
|
+
const hasAnalysisHint = /분석|검사|확인|체크|check|analyze|review|scan|report/i.test(msg);
|
|
249
|
+
if (hasAnalysisHint) {
|
|
250
|
+
return await executeIntentTool("analyze_all", { path: targetPath }, onEvent);
|
|
251
|
+
}
|
|
252
|
+
return { handled: false };
|
|
253
|
+
}
|
|
254
|
+
/**
|
|
255
|
+
* Execute a tool by name and return an IntentResult with the summary prompt.
|
|
256
|
+
*/
|
|
257
|
+
async function executeIntentTool(toolName, toolArgs, onEvent) {
|
|
258
|
+
const toolCall = {
|
|
259
|
+
id: `intent_${Date.now()}_${Math.random().toString(36).slice(2)}`,
|
|
260
|
+
name: toolName,
|
|
261
|
+
arguments: toolArgs,
|
|
262
|
+
};
|
|
263
|
+
// Emit tool_use start event
|
|
264
|
+
onEvent?.({
|
|
265
|
+
type: "tool_use",
|
|
266
|
+
tool: toolName,
|
|
267
|
+
status: "start",
|
|
268
|
+
args: toolArgs,
|
|
269
|
+
});
|
|
270
|
+
const result = await executeTool(toolCall);
|
|
271
|
+
// Emit tool_result event
|
|
272
|
+
onEvent?.({
|
|
273
|
+
type: "tool_result",
|
|
274
|
+
tool: toolName,
|
|
275
|
+
status: result.success ? "complete" : "error",
|
|
276
|
+
result,
|
|
277
|
+
});
|
|
278
|
+
if (!result.success) {
|
|
279
|
+
return {
|
|
280
|
+
handled: true,
|
|
281
|
+
toolName,
|
|
282
|
+
toolArgs,
|
|
283
|
+
toolResult: result,
|
|
284
|
+
summaryPrompt: `도구 "${toolName}" 실행 중 오류가 발생했습니다: ${result.error}\n사용자에게 오류 내용을 설명해주세요.`,
|
|
285
|
+
};
|
|
286
|
+
}
|
|
287
|
+
// Compress result to fit in context window
|
|
288
|
+
const compressed = compressAnalysisResult(result.content);
|
|
289
|
+
return {
|
|
290
|
+
handled: true,
|
|
291
|
+
toolName,
|
|
292
|
+
toolArgs,
|
|
293
|
+
toolResult: result,
|
|
294
|
+
summaryPrompt: `아래는 "${toolName}" 도구의 실행 결과입니다. 사용자에게 한국어로 핵심 내용을 요약해주세요.\n\n${compressed}`,
|
|
295
|
+
};
|
|
296
|
+
}
|
|
297
|
+
/**
|
|
298
|
+
* Compress analysis result JSON to fit within LLM context window.
|
|
299
|
+
* Extracts only key metrics, removing verbose raw data.
|
|
300
|
+
*/
|
|
301
|
+
function compressAnalysisResult(resultContent, maxChars = 2000) {
|
|
302
|
+
try {
|
|
303
|
+
const parsed = JSON.parse(resultContent);
|
|
304
|
+
// analyze_all result
|
|
305
|
+
if (parsed.path && parsed.fileStats) {
|
|
306
|
+
const compact = {
|
|
307
|
+
path: parsed.path,
|
|
308
|
+
totalFiles: parsed.totalFiles,
|
|
309
|
+
fileStats: parsed.fileStats,
|
|
310
|
+
analysesRun: parsed.analysesRun,
|
|
311
|
+
successful: parsed.successful,
|
|
312
|
+
failed: parsed.failed,
|
|
313
|
+
};
|
|
314
|
+
// Extract issue summaries (compact)
|
|
315
|
+
if (parsed.issuesSummary?.length > 0) {
|
|
316
|
+
compact.issues = parsed.issuesSummary.map((is) => ({
|
|
317
|
+
tool: is.tool,
|
|
318
|
+
issues: is.issues.slice(0, 5),
|
|
319
|
+
}));
|
|
320
|
+
}
|
|
321
|
+
// Extract per-tool summaries (key metrics only)
|
|
322
|
+
if (parsed.details?.length > 0) {
|
|
323
|
+
compact.analyses = parsed.details.map((d) => {
|
|
324
|
+
const s = d.summary;
|
|
325
|
+
const brief = { tool: d.tool };
|
|
326
|
+
// Extract numeric/small fields only
|
|
327
|
+
for (const [k, v] of Object.entries(s)) {
|
|
328
|
+
if (typeof v === "number" || typeof v === "boolean") {
|
|
329
|
+
brief[k] = v;
|
|
330
|
+
}
|
|
331
|
+
else if (typeof v === "string" && v.length < 100) {
|
|
332
|
+
brief[k] = v;
|
|
333
|
+
}
|
|
334
|
+
// Skip arrays/objects (raw data) to save space
|
|
335
|
+
}
|
|
336
|
+
// Include issues from samples (java_analyze etc.)
|
|
337
|
+
if (Array.isArray(s.samples)) {
|
|
338
|
+
const allIssues = [];
|
|
339
|
+
for (const sample of s.samples) {
|
|
340
|
+
if (Array.isArray(sample.result?.issues)) {
|
|
341
|
+
allIssues.push(...sample.result.issues.slice(0, 3));
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
if (allIssues.length > 0) {
|
|
345
|
+
brief.issues = allIssues.slice(0, 10);
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
return brief;
|
|
349
|
+
});
|
|
350
|
+
}
|
|
351
|
+
if (parsed.errors?.length > 0) {
|
|
352
|
+
compact.errors = parsed.errors;
|
|
353
|
+
}
|
|
354
|
+
const result = JSON.stringify(compact, null, 1);
|
|
355
|
+
return result.length > maxChars ? result.slice(0, maxChars) + "..." : result;
|
|
356
|
+
}
|
|
357
|
+
// java_analyze or other single-file results
|
|
358
|
+
if (parsed.file || parsed.filepath || parsed.classes || parsed.functions) {
|
|
359
|
+
const result = JSON.stringify(parsed, null, 1);
|
|
360
|
+
return result.length > maxChars ? result.slice(0, maxChars) + "..." : result;
|
|
361
|
+
}
|
|
362
|
+
// Generic: just truncate
|
|
363
|
+
const result = JSON.stringify(parsed, null, 1);
|
|
364
|
+
return result.length > maxChars ? result.slice(0, maxChars) + "..." : result;
|
|
365
|
+
}
|
|
366
|
+
catch {
|
|
367
|
+
// Not valid JSON, return truncated raw text
|
|
368
|
+
return resultContent.length > maxChars ? resultContent.slice(0, maxChars) + "..." : resultContent;
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
// ─── Main processing functions ───
|
|
64
372
|
export async function processMessage(userMessage, history, client, config, onEvent, contextSummary) {
|
|
65
|
-
|
|
373
|
+
// Try intent router first
|
|
374
|
+
const intent = await detectAndExecuteIntent(userMessage, onEvent);
|
|
375
|
+
if (intent.handled && intent.summaryPrompt) {
|
|
376
|
+
// Tool already executed → ask LLM to summarize only (no tools = VRAM savings)
|
|
377
|
+
onEvent?.({ type: "thinking" });
|
|
378
|
+
const summaryMessages = [
|
|
379
|
+
{ role: "system", content: BASE_SYSTEM_PROMPT },
|
|
380
|
+
{ role: "user", content: intent.summaryPrompt },
|
|
381
|
+
];
|
|
382
|
+
const response = await client.chat(summaryMessages); // No tools!
|
|
383
|
+
onEvent?.({ type: "content", content: response.content });
|
|
384
|
+
onEvent?.({ type: "done" });
|
|
385
|
+
return {
|
|
386
|
+
content: response.content,
|
|
387
|
+
toolCalls: intent.toolResult
|
|
388
|
+
? [{ tool: intent.toolName, args: intent.toolArgs, result: intent.toolResult }]
|
|
389
|
+
: [],
|
|
390
|
+
};
|
|
391
|
+
}
|
|
392
|
+
// Fallback: existing LLM-driven tool selection
|
|
393
|
+
const tools = selectTools(userMessage);
|
|
66
394
|
const systemPrompt = buildSystemPrompt(contextSummary);
|
|
67
395
|
const messages = [
|
|
68
396
|
{ role: "system", content: systemPrompt },
|
|
@@ -123,7 +451,57 @@ export async function processMessage(userMessage, history, client, config, onEve
|
|
|
123
451
|
};
|
|
124
452
|
}
|
|
125
453
|
export async function* streamProcessMessage(userMessage, history, client, config, abortSignal, contextSummary) {
|
|
126
|
-
|
|
454
|
+
// Try intent router first
|
|
455
|
+
const intent = await detectAndExecuteIntent(userMessage, (event) => {
|
|
456
|
+
// Events are yielded by the caller, we collect them via callback
|
|
457
|
+
// But generators can't yield from callbacks, so we handle this differently
|
|
458
|
+
});
|
|
459
|
+
if (intent.handled) {
|
|
460
|
+
// Emit the tool events that happened during intent detection
|
|
461
|
+
if (intent.toolName) {
|
|
462
|
+
yield {
|
|
463
|
+
type: "tool_use",
|
|
464
|
+
tool: intent.toolName,
|
|
465
|
+
status: "start",
|
|
466
|
+
args: intent.toolArgs,
|
|
467
|
+
};
|
|
468
|
+
yield {
|
|
469
|
+
type: "tool_result",
|
|
470
|
+
tool: intent.toolName,
|
|
471
|
+
status: intent.toolResult?.success ? "complete" : "error",
|
|
472
|
+
result: intent.toolResult,
|
|
473
|
+
};
|
|
474
|
+
}
|
|
475
|
+
if (intent.summaryPrompt) {
|
|
476
|
+
if (abortSignal?.aborted) {
|
|
477
|
+
yield { type: "error", error: "Operation cancelled" };
|
|
478
|
+
return;
|
|
479
|
+
}
|
|
480
|
+
yield { type: "thinking" };
|
|
481
|
+
// Stream the LLM summary (no tools = streaming mode in ollama client)
|
|
482
|
+
const summaryMessages = [
|
|
483
|
+
{ role: "system", content: BASE_SYSTEM_PROMPT },
|
|
484
|
+
{ role: "user", content: intent.summaryPrompt },
|
|
485
|
+
];
|
|
486
|
+
for await (const event of client.streamChat(summaryMessages, undefined, abortSignal)) {
|
|
487
|
+
if (abortSignal?.aborted) {
|
|
488
|
+
yield { type: "error", error: "Operation cancelled" };
|
|
489
|
+
return;
|
|
490
|
+
}
|
|
491
|
+
if (event.type === "content" && event.content) {
|
|
492
|
+
yield { type: "content", content: event.content };
|
|
493
|
+
}
|
|
494
|
+
else if (event.type === "error") {
|
|
495
|
+
yield { type: "error", error: event.error };
|
|
496
|
+
return;
|
|
497
|
+
}
|
|
498
|
+
}
|
|
499
|
+
}
|
|
500
|
+
yield { type: "done" };
|
|
501
|
+
return;
|
|
502
|
+
}
|
|
503
|
+
// Fallback: existing LLM-driven tool selection
|
|
504
|
+
const tools = selectTools(userMessage);
|
|
127
505
|
const systemPrompt = buildSystemPrompt(contextSummary);
|
|
128
506
|
const messages = [
|
|
129
507
|
{ role: "system", content: systemPrompt },
|
package/dist/core/agent.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent.js","sourceRoot":"","sources":["../../src/core/agent.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"agent.js","sourceRoot":"","sources":["../../src/core/agent.ts"],"names":[],"mappings":"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"}
|
package/dist/core/config.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ollama.d.ts","sourceRoot":"","sources":["../../../src/core/llm/ollama.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"ollama.d.ts","sourceRoot":"","sources":["../../../src/core/llm/ollama.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAExD,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,WAAW,GAAG,MAAM,CAAC;IAC/C,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,QAAQ,EAAE,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,SAAS,GAAG,WAAW,GAAG,MAAM,GAAG,OAAO,CAAC;IACjD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AA4ED,qBAAa,YAAY;IACvB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,SAAS,CAAS;gBAEd,MAAM,EAAE,YAAY;IAO1B,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAS/B,UAAU,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAO/B,IAAI,CACR,QAAQ,EAAE,WAAW,EAAE,EACvB,KAAK,CAAC,EAAE,IAAI,EAAE,GACb,OAAO,CAAC,WAAW,CAAC;IA4ChB,UAAU,CACf,QAAQ,EAAE,WAAW,EAAE,EACvB,KAAK,CAAC,EAAE,IAAI,EAAE,EACd,WAAW,CAAC,EAAE,WAAW,GACxB,cAAc,CAAC,WAAW,CAAC;IA2G9B,OAAO,CAAC,eAAe;IAkBvB,OAAO,CAAC,aAAa;IAiBrB,QAAQ,IAAI,MAAM;IAIlB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAKvB,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAoBtD,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;CAQvE"}
|
package/dist/core/llm/ollama.js
CHANGED
|
@@ -1,3 +1,52 @@
|
|
|
1
|
+
// Estimate token count for a string (rough: ~3 chars per token for mixed Korean/English)
|
|
2
|
+
function estimateTokens(text) {
|
|
3
|
+
if (!text)
|
|
4
|
+
return 0;
|
|
5
|
+
return Math.ceil(text.length / 3);
|
|
6
|
+
}
|
|
7
|
+
// Estimate tokens for tool definitions sent to Ollama
|
|
8
|
+
function estimateToolTokens(tools) {
|
|
9
|
+
let total = 0;
|
|
10
|
+
for (const tool of tools) {
|
|
11
|
+
// name + description + JSON schema overhead
|
|
12
|
+
total += estimateTokens(tool.name) + estimateTokens(tool.description) + 20;
|
|
13
|
+
if (tool.parameters?.properties) {
|
|
14
|
+
for (const [key, prop] of Object.entries(tool.parameters.properties)) {
|
|
15
|
+
total += estimateTokens(key) + estimateTokens(prop.description || "") + 10;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
return total;
|
|
20
|
+
}
|
|
21
|
+
// Prune messages to fit within context window
|
|
22
|
+
function pruneMessages(messages, maxContextTokens, toolTokens) {
|
|
23
|
+
if (messages.length <= 2)
|
|
24
|
+
return messages;
|
|
25
|
+
const responseReserve = 1000; // reserve tokens for model response
|
|
26
|
+
const safetyBuffer = 200;
|
|
27
|
+
const budget = maxContextTokens - toolTokens - responseReserve - safetyBuffer;
|
|
28
|
+
// Always preserve: first message (system) and last message (user)
|
|
29
|
+
const systemMsg = messages[0];
|
|
30
|
+
const lastMsg = messages[messages.length - 1];
|
|
31
|
+
const history = messages.slice(1, -1);
|
|
32
|
+
let usedTokens = estimateTokens(systemMsg.content) + estimateTokens(lastMsg.content);
|
|
33
|
+
// If even system + last message exceeds budget, truncate system prompt
|
|
34
|
+
if (usedTokens > budget) {
|
|
35
|
+
const maxSystemChars = Math.max(200, (budget - estimateTokens(lastMsg.content)) * 3);
|
|
36
|
+
systemMsg.content = systemMsg.content.slice(0, maxSystemChars);
|
|
37
|
+
return [systemMsg, lastMsg];
|
|
38
|
+
}
|
|
39
|
+
// Add messages from newest to oldest
|
|
40
|
+
const kept = [];
|
|
41
|
+
for (let i = history.length - 1; i >= 0; i--) {
|
|
42
|
+
const msgTokens = estimateTokens(history[i].content) + 4; // 4 tokens overhead per message
|
|
43
|
+
if (usedTokens + msgTokens > budget)
|
|
44
|
+
break;
|
|
45
|
+
kept.unshift(history[i]);
|
|
46
|
+
usedTokens += msgTokens;
|
|
47
|
+
}
|
|
48
|
+
return [systemMsg, ...kept, lastMsg];
|
|
49
|
+
}
|
|
1
50
|
export class OllamaClient {
|
|
2
51
|
baseUrl;
|
|
3
52
|
model;
|
|
@@ -26,7 +75,10 @@ export class OllamaClient {
|
|
|
26
75
|
return data.models.map((m) => m.name);
|
|
27
76
|
}
|
|
28
77
|
async chat(messages, tools) {
|
|
29
|
-
|
|
78
|
+
let ollamaMessages = this.convertMessages(messages);
|
|
79
|
+
// Prune messages to fit within context window
|
|
80
|
+
const toolTokens = tools?.length ? estimateToolTokens(tools) : 0;
|
|
81
|
+
ollamaMessages = pruneMessages(ollamaMessages, this.contextLength, toolTokens);
|
|
30
82
|
const body = {
|
|
31
83
|
model: this.model,
|
|
32
84
|
messages: ollamaMessages,
|
|
@@ -60,7 +112,10 @@ export class OllamaClient {
|
|
|
60
112
|
return this.parseResponse(data);
|
|
61
113
|
}
|
|
62
114
|
async *streamChat(messages, tools, abortSignal) {
|
|
63
|
-
|
|
115
|
+
let ollamaMessages = this.convertMessages(messages);
|
|
116
|
+
// Prune messages to fit within context window
|
|
117
|
+
const toolTokens = tools?.length ? estimateToolTokens(tools) : 0;
|
|
118
|
+
ollamaMessages = pruneMessages(ollamaMessages, this.contextLength, toolTokens);
|
|
64
119
|
// Use non-streaming mode when tools are provided to avoid hallucination
|
|
65
120
|
// (LLM often outputs fake results before tool calls in streaming mode)
|
|
66
121
|
const useStreaming = !tools?.length;
|