activo 0.4.1 → 0.4.3
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/README.md +99 -4
- package/dist/core/agent.d.ts.map +1 -1
- package/dist/core/agent.js +7 -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/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/package.json +1 -1
- package/src/core/agent.ts +7 -48
- package/src/core/config.ts +1 -1
- package/src/core/llm/ollama.ts +70 -3
- package/src/core/tools/index.ts +79 -0
package/README.md
CHANGED
|
@@ -4,6 +4,23 @@ AI 기반 코드 품질 분석 CLI (Ollama)
|
|
|
4
4
|
|
|
5
5
|

|
|
6
6
|
|
|
7
|
+
Ollama를 활용한 대화형 코드 분석 에이전트. Java, TypeScript, Python, SQL, CSS 등 다국어·멀티스택 프로젝트를 자동 감지하고 품질 이슈를 분석합니다.
|
|
8
|
+
|
|
9
|
+
- **Tool Calling**: LLM이 상황에 맞는 도구를 직접 호출
|
|
10
|
+
- **MCP 지원**: Model Context Protocol 연동
|
|
11
|
+
- **React Ink TUI**: 터미널용 대화형 UI
|
|
12
|
+
|
|
13
|
+
## 주요 기능
|
|
14
|
+
|
|
15
|
+
| 카테고리 | 도구 | 설명 |
|
|
16
|
+
|----------|------|------|
|
|
17
|
+
| **전체 분석** | `analyze_all` | 디렉토리 전체 자동 감지 및 분석 (권장) |
|
|
18
|
+
| **코드 분석** | Java, JS/TS, Python, React, Vue | AST, 순환 복잡도, 프레임워크 패턴 |
|
|
19
|
+
| **SQL/DB** | `sql_check`, `mybatis_check` | SQL Injection, N+1, 동적 SQL 분석 |
|
|
20
|
+
| **웹** | `css_check`, `html_check` | !important, 접근성(a11y), SEO 검사 |
|
|
21
|
+
| **의존성** | `dependency_check` | npm/Maven/Gradle 보안 취약점 검출 |
|
|
22
|
+
| **표준/RAG** | `import_hwp_standards`, `check_quality_rag` | HWP/PDF → 마크다운, RAG 기반 품질 검사 |
|
|
23
|
+
|
|
7
24
|
## 설치
|
|
8
25
|
|
|
9
26
|
```bash
|
|
@@ -14,7 +31,7 @@ npm install -g activo
|
|
|
14
31
|
|
|
15
32
|
- Node.js 18+
|
|
16
33
|
- [Ollama](https://ollama.ai) 실행 중
|
|
17
|
-
- 모델: `ollama pull mistral:latest`
|
|
34
|
+
- 모델: `ollama pull mistral:latest` (또는 `qwen2.5:7b` 등)
|
|
18
35
|
|
|
19
36
|
## 사용법
|
|
20
37
|
|
|
@@ -22,13 +39,91 @@ npm install -g activo
|
|
|
22
39
|
# 대화형 모드
|
|
23
40
|
activo
|
|
24
41
|
|
|
25
|
-
# 프롬프트와 함께 실행
|
|
26
|
-
activo "src 폴더 분석해줘"
|
|
42
|
+
# 프롬프트와 함께 실행 (권장)
|
|
43
|
+
activo "src 폴더 품질 분석해줘"
|
|
27
44
|
|
|
28
45
|
# 특정 모델 사용
|
|
29
|
-
activo --model qwen2.5:7b
|
|
46
|
+
activo --model qwen2.5:7b "Java 코드 복잡도 점검해줘"
|
|
47
|
+
|
|
48
|
+
# Headless 모드 (CI/스크립트)
|
|
49
|
+
activo --headless "analyze_all 해줘"
|
|
50
|
+
|
|
51
|
+
# 프롬프트만 출력 후 종료
|
|
52
|
+
activo --print "분석 요약해줘"
|
|
53
|
+
|
|
54
|
+
# 이전 세션 이어서
|
|
55
|
+
activo --resume
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
## 설정
|
|
59
|
+
|
|
60
|
+
설정 파일: `~/.activo/config.json` (전역), `.activo/config.json` (프로젝트별)
|
|
61
|
+
|
|
62
|
+
```json
|
|
63
|
+
{
|
|
64
|
+
"ollama": {
|
|
65
|
+
"baseUrl": "http://localhost:11434",
|
|
66
|
+
"model": "mistral:latest",
|
|
67
|
+
"contextLength": 8192,
|
|
68
|
+
"keepAlive": 1800
|
|
69
|
+
},
|
|
70
|
+
"standards": {
|
|
71
|
+
"directory": ".activo/standards"
|
|
72
|
+
},
|
|
73
|
+
"mcp": {
|
|
74
|
+
"servers": {
|
|
75
|
+
"my-server": {
|
|
76
|
+
"command": "npx",
|
|
77
|
+
"args": ["-y", "my-mcp-server"],
|
|
78
|
+
"env": {}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
30
83
|
```
|
|
31
84
|
|
|
85
|
+
| 옵션 | 설명 | 기본값 |
|
|
86
|
+
|------|------|--------|
|
|
87
|
+
| `ollama.baseUrl` | Ollama API URL | `http://localhost:11434` |
|
|
88
|
+
| `ollama.model` | 사용할 모델 | `mistral:latest` |
|
|
89
|
+
| `ollama.contextLength` | 컨텍스트 길이 | `8192` |
|
|
90
|
+
| `ollama.keepAlive` | 모델 유지 시간(초) | `1800` |
|
|
91
|
+
|
|
92
|
+
## 프로젝트 데이터
|
|
93
|
+
|
|
94
|
+
분석 시 프로젝트 루트에 `.activo/` 디렉토리가 생성됩니다.
|
|
95
|
+
|
|
96
|
+
| 경로 | 용도 |
|
|
97
|
+
|------|------|
|
|
98
|
+
| `.activo/cache/` | 파일 요약 캐시 |
|
|
99
|
+
| `.activo/embeddings/` | 코드 임베딩 인덱스 |
|
|
100
|
+
| `.activo/memory/` | 프로젝트 메모리·대화 요약 |
|
|
101
|
+
| `.activo/standards-rag/` | 표준 문서 RAG (HWP/PDF import 후) |
|
|
102
|
+
|
|
103
|
+
## MCP 연동
|
|
104
|
+
|
|
105
|
+
`~/.activo/config.json`의 `mcp.servers`에 MCP 서버를 등록하면 activo가 해당 도구를 자동으로 사용할 수 있습니다.
|
|
106
|
+
|
|
107
|
+
```json
|
|
108
|
+
{
|
|
109
|
+
"mcp": {
|
|
110
|
+
"servers": {
|
|
111
|
+
"filesystem": {
|
|
112
|
+
"command": "npx",
|
|
113
|
+
"args": ["-y", "@modelcontextprotocol/server-filesystem", "/path/to/allowed"]
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
## 기술 스택
|
|
121
|
+
|
|
122
|
+
- **Ollama** - 로컬 LLM
|
|
123
|
+
- **TypeScript Compiler API** - JS/TS AST 분석
|
|
124
|
+
- **java-ast** - Java 파싱 (ANTLR4)
|
|
125
|
+
- **React Ink** - 터미널 UI
|
|
126
|
+
|
|
32
127
|
## 라이선스
|
|
33
128
|
|
|
34
129
|
MIT
|
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":"AAAA,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC5D,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,
|
|
1
|
+
{"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../src/core/agent.ts"],"names":[],"mappings":"AAAA,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;AA0BD,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,CA2EtB;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,CAkG5B"}
|
package/dist/core/agent.js
CHANGED
|
@@ -1,52 +1,11 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { selectTools, executeTool } from "./tools/index.js";
|
|
2
2
|
const BASE_SYSTEM_PROMPT = `You are ACTIVO, a code quality analyzer. You MUST call tools to perform tasks.
|
|
3
3
|
|
|
4
|
-
##
|
|
4
|
+
## RULES
|
|
5
5
|
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`;
|
|
6
|
+
2. NEVER fabricate results - only report actual tool output
|
|
7
|
+
3. After tool returns, summarize in user's language (Korean if user speaks Korean)
|
|
8
|
+
4. Use analyze_all for broad code analysis`;
|
|
50
9
|
// Build system prompt with optional context
|
|
51
10
|
function buildSystemPrompt(contextSummary) {
|
|
52
11
|
if (!contextSummary) {
|
|
@@ -62,7 +21,7 @@ ${contextSummary}
|
|
|
62
21
|
위 내용은 이전 세션에서의 대화 요약입니다. 필요시 참고하세요.`;
|
|
63
22
|
}
|
|
64
23
|
export async function processMessage(userMessage, history, client, config, onEvent, contextSummary) {
|
|
65
|
-
const tools =
|
|
24
|
+
const tools = selectTools(userMessage);
|
|
66
25
|
const systemPrompt = buildSystemPrompt(contextSummary);
|
|
67
26
|
const messages = [
|
|
68
27
|
{ role: "system", content: systemPrompt },
|
|
@@ -123,7 +82,7 @@ export async function processMessage(userMessage, history, client, config, onEve
|
|
|
123
82
|
};
|
|
124
83
|
}
|
|
125
84
|
export async function* streamProcessMessage(userMessage, history, client, config, abortSignal, contextSummary) {
|
|
126
|
-
const tools =
|
|
85
|
+
const tools = selectTools(userMessage);
|
|
127
86
|
const systemPrompt = buildSystemPrompt(contextSummary);
|
|
128
87
|
const messages = [
|
|
129
88
|
{ 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":"AAEA,OAAO,
|
|
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;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ollama.js","sourceRoot":"","sources":["../../../src/core/llm/ollama.ts"],"names":[],"mappings":"AAgCA,MAAM,OAAO,YAAY;IACf,OAAO,CAAS;IAChB,KAAK,CAAS;IACd,aAAa,CAAS;IACtB,SAAS,CAAS;IAE1B,YAAY,MAAoB;QAC9B,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;QAC9B,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;QAC1B,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC,aAAa,CAAC;QAC1C,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;IACpC,CAAC;IAED,KAAK,CAAC,WAAW;QACf,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,WAAW,CAAC,CAAC;YACzD,OAAO,QAAQ,CAAC,EAAE,CAAC;QACrB,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,KAAK,CAAC,UAAU;QACd,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,WAAW,CAAC,CAAC;QACzD,IAAI,CAAC,QAAQ,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;QAC3D,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAwC,CAAC;QAC5E,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACxC,CAAC;IAED,KAAK,CAAC,IAAI,CACR,QAAuB,EACvB,KAAc;QAEd,
|
|
1
|
+
{"version":3,"file":"ollama.js","sourceRoot":"","sources":["../../../src/core/llm/ollama.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAkBxD,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,sBAAsB,CAAC;AACrC,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,yBAAyB,CAAC;AACxC,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,iBAAiB,CAAC;AAGhC,wBAAgB,WAAW,IAAI,IAAI,EAAE,CAEpC;AAGD,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAEtD;AAGD,wBAAsB,WAAW,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,UAAU,CAAC,CAoBzE;AAGD,wBAAgB,kBAAkB,IAAI,KAAK,CAAC;IAC1C,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;CAChC,CAAC,CAMD"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAkBxD,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,sBAAsB,CAAC;AACrC,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,yBAAyB,CAAC;AACxC,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,iBAAiB,CAAC;AAGhC,wBAAgB,WAAW,IAAI,IAAI,EAAE,CAEpC;AAGD,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAEtD;AAGD,wBAAsB,WAAW,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,UAAU,CAAC,CAoBzE;AAGD,wBAAgB,kBAAkB,IAAI,KAAK,CAAC;IAC1C,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;CAChC,CAAC,CAMD;AA8CD,wBAAgB,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,EAAE,CAiCvD"}
|
package/dist/core/tools/index.js
CHANGED
|
@@ -68,4 +68,78 @@ export function getToolDefinitions() {
|
|
|
68
68
|
parameters: t.parameters,
|
|
69
69
|
}));
|
|
70
70
|
}
|
|
71
|
+
// Tool category mapping for selective loading
|
|
72
|
+
const TOOL_CATEGORIES = {
|
|
73
|
+
core: ["analyze_all", "read_file", "list_directory", "grep_search", "glob_search"],
|
|
74
|
+
java: ["java_analyze", "java_complexity", "spring_check"],
|
|
75
|
+
frontend_js: ["ast_analyze", "get_call_graph", "find_symbol_usage", "complexity_report"],
|
|
76
|
+
react: ["react_check"],
|
|
77
|
+
vue: ["vue_check"],
|
|
78
|
+
jquery: ["jquery_check"],
|
|
79
|
+
sql: ["sql_check"],
|
|
80
|
+
mybatis: ["mybatis_check"],
|
|
81
|
+
css: ["css_check"],
|
|
82
|
+
html: ["html_check"],
|
|
83
|
+
python: ["python_check"],
|
|
84
|
+
dependency: ["dependency_check"],
|
|
85
|
+
openapi: ["openapi_check"],
|
|
86
|
+
standards: ["import_hwp_standards", "import_pdf_standards", "index_standards", "search_standards", "check_quality_rag", "list_standards", "check_code_quality"],
|
|
87
|
+
cache: ["summarize_file", "get_file_outline", "get_cached_summary", "list_cache", "clear_cache", "batch_summarize"],
|
|
88
|
+
embeddings: ["index_codebase", "semantic_search", "find_similar_code", "embeddings_status", "clear_embeddings"],
|
|
89
|
+
memory: ["init_project_memory", "add_key_file", "add_note", "add_fact", "save_conversation", "get_project_context", "search_memory", "clear_memory"],
|
|
90
|
+
file_write: ["write_file", "run_command"],
|
|
91
|
+
};
|
|
92
|
+
// Keyword-to-category mapping
|
|
93
|
+
const KEYWORD_CATEGORIES = [
|
|
94
|
+
{ keywords: ["java", "spring", ".java", "controller", "service", "repository", "entity"], categories: ["java"] },
|
|
95
|
+
{ keywords: ["react", "jsx", "tsx", "hook", "usestate", "useeffect", "component"], categories: ["react", "frontend_js"] },
|
|
96
|
+
{ keywords: ["vue", ".vue", "vuex", "composition"], categories: ["vue", "frontend_js"] },
|
|
97
|
+
{ keywords: ["jquery", "$.", "$("], categories: ["jquery", "frontend_js"] },
|
|
98
|
+
{ keywords: ["javascript", "typescript", "js", "ts", "ast", "복잡도", "complexity"], categories: ["frontend_js"] },
|
|
99
|
+
{ keywords: ["sql", "query", "쿼리", "select", "insert", "update", "delete"], categories: ["sql"] },
|
|
100
|
+
{ keywords: ["mybatis", "mapper", "xml"], categories: ["mybatis"] },
|
|
101
|
+
{ keywords: ["css", "scss", "less", "style", "스타일"], categories: ["css"] },
|
|
102
|
+
{ keywords: ["html", "jsp", "접근성", "a11y", "seo"], categories: ["html"] },
|
|
103
|
+
{ keywords: ["python", ".py", "django", "flask", "fastapi"], categories: ["python"] },
|
|
104
|
+
{ keywords: ["dependency", "의존성", "package.json", "pom.xml", "gradle", "취약점"], categories: ["dependency"] },
|
|
105
|
+
{ keywords: ["openapi", "swagger", "api 스펙", "api spec"], categories: ["openapi"] },
|
|
106
|
+
{ keywords: ["표준", "standard", "hwp", "pdf", "rag", "품질기준"], categories: ["standards"] },
|
|
107
|
+
{ keywords: ["캐시", "cache", "요약", "summarize", "outline"], categories: ["cache"] },
|
|
108
|
+
{ keywords: ["임베딩", "embedding", "벡터", "vector", "semantic", "의미검색", "인덱싱"], categories: ["embeddings"] },
|
|
109
|
+
{ keywords: ["메모리", "memory", "컨텍스트", "context", "기억", "노트"], categories: ["memory"] },
|
|
110
|
+
{ keywords: ["write", "쓰기", "실행", "run", "command", "명령"], categories: ["file_write"] },
|
|
111
|
+
];
|
|
112
|
+
// Select relevant tools based on user message (max ~15 tools)
|
|
113
|
+
export function selectTools(userMessage) {
|
|
114
|
+
const msg = userMessage.toLowerCase();
|
|
115
|
+
const allTools = getAllTools();
|
|
116
|
+
const selectedNames = new Set();
|
|
117
|
+
// Always include core tools
|
|
118
|
+
for (const name of TOOL_CATEGORIES.core) {
|
|
119
|
+
selectedNames.add(name);
|
|
120
|
+
}
|
|
121
|
+
// Match keywords to categories
|
|
122
|
+
for (const { keywords, categories } of KEYWORD_CATEGORIES) {
|
|
123
|
+
if (keywords.some((kw) => msg.includes(kw))) {
|
|
124
|
+
for (const cat of categories) {
|
|
125
|
+
const names = TOOL_CATEGORIES[cat];
|
|
126
|
+
if (names) {
|
|
127
|
+
for (const name of names) {
|
|
128
|
+
selectedNames.add(name);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
// If "분석", "analyze", "check", "전체" → add analyze_all (already in core)
|
|
135
|
+
// If very broad request or no specific match, add common analysis tools
|
|
136
|
+
if (selectedNames.size <= TOOL_CATEGORIES.core.length) {
|
|
137
|
+
// No specific category matched - add analyze_all + common ones
|
|
138
|
+
for (const name of TOOL_CATEGORIES.java)
|
|
139
|
+
selectedNames.add(name);
|
|
140
|
+
for (const name of TOOL_CATEGORIES.frontend_js)
|
|
141
|
+
selectedNames.add(name);
|
|
142
|
+
}
|
|
143
|
+
return allTools.filter((t) => selectedNames.has(t.name));
|
|
144
|
+
}
|
|
71
145
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/tools/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/tools/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/core/agent.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { OllamaClient, ChatMessage } from "./llm/ollama.js";
|
|
2
2
|
import { Config } from "./config.js";
|
|
3
|
-
import { getAllTools, executeTool, ToolCall, ToolResult, Tool } from "./tools/index.js";
|
|
3
|
+
import { getAllTools, selectTools, executeTool, ToolCall, ToolResult, Tool } from "./tools/index.js";
|
|
4
4
|
|
|
5
5
|
export interface AgentEvent {
|
|
6
6
|
type: "thinking" | "content" | "tool_use" | "tool_result" | "done" | "error";
|
|
@@ -23,52 +23,11 @@ export interface AgentResult {
|
|
|
23
23
|
|
|
24
24
|
const BASE_SYSTEM_PROMPT = `You are ACTIVO, a code quality analyzer. You MUST call tools to perform tasks.
|
|
25
25
|
|
|
26
|
-
##
|
|
26
|
+
## RULES
|
|
27
27
|
1. Call tool IMMEDIATELY when user requests an action
|
|
28
|
-
2. NEVER
|
|
29
|
-
3.
|
|
30
|
-
4.
|
|
31
|
-
|
|
32
|
-
## TOOLS BY CATEGORY
|
|
33
|
-
|
|
34
|
-
### Document Conversion & RAG
|
|
35
|
-
- import_hwp_standards(hwpPath, outputDir): Convert HWP to markdown
|
|
36
|
-
- import_pdf_standards(pdfPath, outputDir): Convert PDF to markdown
|
|
37
|
-
- index_standards(directory?): Index standards for RAG search (run after import)
|
|
38
|
-
- search_standards(query, topK?): Search standards by semantic query
|
|
39
|
-
- check_quality_rag(filepath, topK?): Check code using RAG to find relevant standards
|
|
40
|
-
|
|
41
|
-
### Code Analysis (Recommended: use analyze_all)
|
|
42
|
-
- analyze_all(path, include?): Analyze all code (Java/JS/TS/Python)
|
|
43
|
-
- java_analyze(path): Java code analysis
|
|
44
|
-
- java_complexity(path): Java complexity metrics
|
|
45
|
-
- spring_check(path): Spring pattern check
|
|
46
|
-
- ast_analyze(path): JS/TS AST analysis
|
|
47
|
-
- react_check(path): React pattern check
|
|
48
|
-
- vue_check(path): Vue pattern check
|
|
49
|
-
- python_check(path): Python code analysis
|
|
50
|
-
|
|
51
|
-
### SQL/DB Analysis
|
|
52
|
-
- sql_check(path): SQL query analysis
|
|
53
|
-
- mybatis_check(path): MyBatis mapper analysis
|
|
54
|
-
|
|
55
|
-
### Web Analysis
|
|
56
|
-
- css_check(path): CSS analysis
|
|
57
|
-
- html_check(path): HTML analysis
|
|
58
|
-
- dependency_check(path): package.json dependency analysis
|
|
59
|
-
- openapi_check(path): OpenAPI spec analysis
|
|
60
|
-
|
|
61
|
-
### File Operations
|
|
62
|
-
- read_file(path): Read file content
|
|
63
|
-
- write_file(path, content): Write file
|
|
64
|
-
- list_directory(path): List directory contents
|
|
65
|
-
- grep_search(pattern, path): Search pattern in files
|
|
66
|
-
- glob_search(pattern): Search files by pattern
|
|
67
|
-
|
|
68
|
-
## EXAMPLE
|
|
69
|
-
User: "Analyze src folder"
|
|
70
|
-
→ Call analyze_all(path="src") immediately
|
|
71
|
-
→ After result: Summarize findings`;
|
|
28
|
+
2. NEVER fabricate results - only report actual tool output
|
|
29
|
+
3. After tool returns, summarize in user's language (Korean if user speaks Korean)
|
|
30
|
+
4. Use analyze_all for broad code analysis`;
|
|
72
31
|
|
|
73
32
|
// Build system prompt with optional context
|
|
74
33
|
function buildSystemPrompt(contextSummary?: string): string {
|
|
@@ -94,7 +53,7 @@ export async function processMessage(
|
|
|
94
53
|
onEvent?: (event: AgentEvent) => void,
|
|
95
54
|
contextSummary?: string
|
|
96
55
|
): Promise<AgentResult> {
|
|
97
|
-
const tools =
|
|
56
|
+
const tools = selectTools(userMessage);
|
|
98
57
|
const systemPrompt = buildSystemPrompt(contextSummary);
|
|
99
58
|
|
|
100
59
|
const messages: ChatMessage[] = [
|
|
@@ -178,7 +137,7 @@ export async function* streamProcessMessage(
|
|
|
178
137
|
abortSignal?: AbortSignal,
|
|
179
138
|
contextSummary?: string
|
|
180
139
|
): AsyncGenerator<AgentEvent> {
|
|
181
|
-
const tools =
|
|
140
|
+
const tools = selectTools(userMessage);
|
|
182
141
|
const systemPrompt = buildSystemPrompt(contextSummary);
|
|
183
142
|
|
|
184
143
|
const messages: ChatMessage[] = [
|
package/src/core/config.ts
CHANGED
package/src/core/llm/ollama.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { OllamaConfig } from "../config.js";
|
|
2
|
-
import { Tool, ToolCall } from "../tools/types.js";
|
|
2
|
+
import type { Tool, ToolCall } from "../tools/types.js";
|
|
3
3
|
|
|
4
4
|
export interface ChatMessage {
|
|
5
5
|
role: "system" | "user" | "assistant" | "tool";
|
|
@@ -30,6 +30,65 @@ interface OllamaChatResponse {
|
|
|
30
30
|
done: boolean;
|
|
31
31
|
}
|
|
32
32
|
|
|
33
|
+
// Estimate token count for a string (rough: ~3 chars per token for mixed Korean/English)
|
|
34
|
+
function estimateTokens(text: string): number {
|
|
35
|
+
if (!text) return 0;
|
|
36
|
+
return Math.ceil(text.length / 3);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
// Estimate tokens for tool definitions sent to Ollama
|
|
40
|
+
function estimateToolTokens(tools: Tool[]): number {
|
|
41
|
+
let total = 0;
|
|
42
|
+
for (const tool of tools) {
|
|
43
|
+
// name + description + JSON schema overhead
|
|
44
|
+
total += estimateTokens(tool.name) + estimateTokens(tool.description) + 20;
|
|
45
|
+
if (tool.parameters?.properties) {
|
|
46
|
+
for (const [key, prop] of Object.entries(tool.parameters.properties)) {
|
|
47
|
+
total += estimateTokens(key) + estimateTokens((prop as { description?: string }).description || "") + 10;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return total;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// Prune messages to fit within context window
|
|
55
|
+
function pruneMessages(
|
|
56
|
+
messages: Array<{ role: string; content: string }>,
|
|
57
|
+
maxContextTokens: number,
|
|
58
|
+
toolTokens: number
|
|
59
|
+
): Array<{ role: string; content: string }> {
|
|
60
|
+
if (messages.length <= 2) return messages;
|
|
61
|
+
|
|
62
|
+
const responseReserve = 1000; // reserve tokens for model response
|
|
63
|
+
const safetyBuffer = 200;
|
|
64
|
+
const budget = maxContextTokens - toolTokens - responseReserve - safetyBuffer;
|
|
65
|
+
|
|
66
|
+
// Always preserve: first message (system) and last message (user)
|
|
67
|
+
const systemMsg = messages[0];
|
|
68
|
+
const lastMsg = messages[messages.length - 1];
|
|
69
|
+
const history = messages.slice(1, -1);
|
|
70
|
+
|
|
71
|
+
let usedTokens = estimateTokens(systemMsg.content) + estimateTokens(lastMsg.content);
|
|
72
|
+
|
|
73
|
+
// If even system + last message exceeds budget, truncate system prompt
|
|
74
|
+
if (usedTokens > budget) {
|
|
75
|
+
const maxSystemChars = Math.max(200, (budget - estimateTokens(lastMsg.content)) * 3);
|
|
76
|
+
systemMsg.content = systemMsg.content.slice(0, maxSystemChars);
|
|
77
|
+
return [systemMsg, lastMsg];
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
// Add messages from newest to oldest
|
|
81
|
+
const kept: Array<{ role: string; content: string }> = [];
|
|
82
|
+
for (let i = history.length - 1; i >= 0; i--) {
|
|
83
|
+
const msgTokens = estimateTokens(history[i].content) + 4; // 4 tokens overhead per message
|
|
84
|
+
if (usedTokens + msgTokens > budget) break;
|
|
85
|
+
kept.unshift(history[i]);
|
|
86
|
+
usedTokens += msgTokens;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
return [systemMsg, ...kept, lastMsg];
|
|
90
|
+
}
|
|
91
|
+
|
|
33
92
|
export class OllamaClient {
|
|
34
93
|
private baseUrl: string;
|
|
35
94
|
private model: string;
|
|
@@ -63,7 +122,11 @@ export class OllamaClient {
|
|
|
63
122
|
messages: ChatMessage[],
|
|
64
123
|
tools?: Tool[]
|
|
65
124
|
): Promise<ChatMessage> {
|
|
66
|
-
|
|
125
|
+
let ollamaMessages = this.convertMessages(messages);
|
|
126
|
+
|
|
127
|
+
// Prune messages to fit within context window
|
|
128
|
+
const toolTokens = tools?.length ? estimateToolTokens(tools) : 0;
|
|
129
|
+
ollamaMessages = pruneMessages(ollamaMessages, this.contextLength, toolTokens);
|
|
67
130
|
|
|
68
131
|
const body: Record<string, unknown> = {
|
|
69
132
|
model: this.model,
|
|
@@ -107,7 +170,11 @@ export class OllamaClient {
|
|
|
107
170
|
tools?: Tool[],
|
|
108
171
|
abortSignal?: AbortSignal
|
|
109
172
|
): AsyncGenerator<StreamEvent> {
|
|
110
|
-
|
|
173
|
+
let ollamaMessages = this.convertMessages(messages);
|
|
174
|
+
|
|
175
|
+
// Prune messages to fit within context window
|
|
176
|
+
const toolTokens = tools?.length ? estimateToolTokens(tools) : 0;
|
|
177
|
+
ollamaMessages = pruneMessages(ollamaMessages, this.contextLength, toolTokens);
|
|
111
178
|
|
|
112
179
|
// Use non-streaming mode when tools are provided to avoid hallucination
|
|
113
180
|
// (LLM often outputs fake results before tool calls in streaming mode)
|
package/src/core/tools/index.ts
CHANGED
|
@@ -79,3 +79,82 @@ export function getToolDefinitions(): Array<{
|
|
|
79
79
|
parameters: t.parameters,
|
|
80
80
|
}));
|
|
81
81
|
}
|
|
82
|
+
|
|
83
|
+
// Tool category mapping for selective loading
|
|
84
|
+
const TOOL_CATEGORIES: Record<string, string[]> = {
|
|
85
|
+
core: ["analyze_all", "read_file", "list_directory", "grep_search", "glob_search"],
|
|
86
|
+
java: ["java_analyze", "java_complexity", "spring_check"],
|
|
87
|
+
frontend_js: ["ast_analyze", "get_call_graph", "find_symbol_usage", "complexity_report"],
|
|
88
|
+
react: ["react_check"],
|
|
89
|
+
vue: ["vue_check"],
|
|
90
|
+
jquery: ["jquery_check"],
|
|
91
|
+
sql: ["sql_check"],
|
|
92
|
+
mybatis: ["mybatis_check"],
|
|
93
|
+
css: ["css_check"],
|
|
94
|
+
html: ["html_check"],
|
|
95
|
+
python: ["python_check"],
|
|
96
|
+
dependency: ["dependency_check"],
|
|
97
|
+
openapi: ["openapi_check"],
|
|
98
|
+
standards: ["import_hwp_standards", "import_pdf_standards", "index_standards", "search_standards", "check_quality_rag", "list_standards", "check_code_quality"],
|
|
99
|
+
cache: ["summarize_file", "get_file_outline", "get_cached_summary", "list_cache", "clear_cache", "batch_summarize"],
|
|
100
|
+
embeddings: ["index_codebase", "semantic_search", "find_similar_code", "embeddings_status", "clear_embeddings"],
|
|
101
|
+
memory: ["init_project_memory", "add_key_file", "add_note", "add_fact", "save_conversation", "get_project_context", "search_memory", "clear_memory"],
|
|
102
|
+
file_write: ["write_file", "run_command"],
|
|
103
|
+
};
|
|
104
|
+
|
|
105
|
+
// Keyword-to-category mapping
|
|
106
|
+
const KEYWORD_CATEGORIES: Array<{ keywords: string[]; categories: string[] }> = [
|
|
107
|
+
{ keywords: ["java", "spring", ".java", "controller", "service", "repository", "entity"], categories: ["java"] },
|
|
108
|
+
{ keywords: ["react", "jsx", "tsx", "hook", "usestate", "useeffect", "component"], categories: ["react", "frontend_js"] },
|
|
109
|
+
{ keywords: ["vue", ".vue", "vuex", "composition"], categories: ["vue", "frontend_js"] },
|
|
110
|
+
{ keywords: ["jquery", "$.", "$("], categories: ["jquery", "frontend_js"] },
|
|
111
|
+
{ keywords: ["javascript", "typescript", "js", "ts", "ast", "복잡도", "complexity"], categories: ["frontend_js"] },
|
|
112
|
+
{ keywords: ["sql", "query", "쿼리", "select", "insert", "update", "delete"], categories: ["sql"] },
|
|
113
|
+
{ keywords: ["mybatis", "mapper", "xml"], categories: ["mybatis"] },
|
|
114
|
+
{ keywords: ["css", "scss", "less", "style", "스타일"], categories: ["css"] },
|
|
115
|
+
{ keywords: ["html", "jsp", "접근성", "a11y", "seo"], categories: ["html"] },
|
|
116
|
+
{ keywords: ["python", ".py", "django", "flask", "fastapi"], categories: ["python"] },
|
|
117
|
+
{ keywords: ["dependency", "의존성", "package.json", "pom.xml", "gradle", "취약점"], categories: ["dependency"] },
|
|
118
|
+
{ keywords: ["openapi", "swagger", "api 스펙", "api spec"], categories: ["openapi"] },
|
|
119
|
+
{ keywords: ["표준", "standard", "hwp", "pdf", "rag", "품질기준"], categories: ["standards"] },
|
|
120
|
+
{ keywords: ["캐시", "cache", "요약", "summarize", "outline"], categories: ["cache"] },
|
|
121
|
+
{ keywords: ["임베딩", "embedding", "벡터", "vector", "semantic", "의미검색", "인덱싱"], categories: ["embeddings"] },
|
|
122
|
+
{ keywords: ["메모리", "memory", "컨텍스트", "context", "기억", "노트"], categories: ["memory"] },
|
|
123
|
+
{ keywords: ["write", "쓰기", "실행", "run", "command", "명령"], categories: ["file_write"] },
|
|
124
|
+
];
|
|
125
|
+
|
|
126
|
+
// Select relevant tools based on user message (max ~15 tools)
|
|
127
|
+
export function selectTools(userMessage: string): Tool[] {
|
|
128
|
+
const msg = userMessage.toLowerCase();
|
|
129
|
+
const allTools = getAllTools();
|
|
130
|
+
const selectedNames = new Set<string>();
|
|
131
|
+
|
|
132
|
+
// Always include core tools
|
|
133
|
+
for (const name of TOOL_CATEGORIES.core) {
|
|
134
|
+
selectedNames.add(name);
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
// Match keywords to categories
|
|
138
|
+
for (const { keywords, categories } of KEYWORD_CATEGORIES) {
|
|
139
|
+
if (keywords.some((kw) => msg.includes(kw))) {
|
|
140
|
+
for (const cat of categories) {
|
|
141
|
+
const names = TOOL_CATEGORIES[cat];
|
|
142
|
+
if (names) {
|
|
143
|
+
for (const name of names) {
|
|
144
|
+
selectedNames.add(name);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
// If "분석", "analyze", "check", "전체" → add analyze_all (already in core)
|
|
152
|
+
// If very broad request or no specific match, add common analysis tools
|
|
153
|
+
if (selectedNames.size <= TOOL_CATEGORIES.core.length) {
|
|
154
|
+
// No specific category matched - add analyze_all + common ones
|
|
155
|
+
for (const name of TOOL_CATEGORIES.java) selectedNames.add(name);
|
|
156
|
+
for (const name of TOOL_CATEGORIES.frontend_js) selectedNames.add(name);
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
return allTools.filter((t) => selectedNames.has(t.name));
|
|
160
|
+
}
|