@yuaone/core 0.1.3 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agent-loop.d.ts +152 -0
- package/dist/agent-loop.d.ts.map +1 -1
- package/dist/agent-loop.js +893 -9
- package/dist/agent-loop.js.map +1 -1
- package/dist/benchmark-runner.d.ts +141 -0
- package/dist/benchmark-runner.d.ts.map +1 -0
- package/dist/benchmark-runner.js +526 -0
- package/dist/benchmark-runner.js.map +1 -0
- package/dist/codebase-context.d.ts +49 -0
- package/dist/codebase-context.d.ts.map +1 -1
- package/dist/codebase-context.js +146 -0
- package/dist/codebase-context.js.map +1 -1
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +8 -0
- package/dist/constants.js.map +1 -1
- package/dist/context-budget.d.ts +1 -1
- package/dist/context-budget.d.ts.map +1 -1
- package/dist/context-budget.js +4 -2
- package/dist/context-budget.js.map +1 -1
- package/dist/context-compressor.d.ts +1 -1
- package/dist/context-compressor.d.ts.map +1 -1
- package/dist/context-compressor.js +5 -3
- package/dist/context-compressor.js.map +1 -1
- package/dist/context-manager.d.ts +7 -1
- package/dist/context-manager.d.ts.map +1 -1
- package/dist/context-manager.js +34 -2
- package/dist/context-manager.js.map +1 -1
- package/dist/continuation-engine.d.ts +168 -0
- package/dist/continuation-engine.d.ts.map +1 -0
- package/dist/continuation-engine.js +421 -0
- package/dist/continuation-engine.js.map +1 -0
- package/dist/cost-optimizer.d.ts +159 -0
- package/dist/cost-optimizer.d.ts.map +1 -0
- package/dist/cost-optimizer.js +406 -0
- package/dist/cost-optimizer.js.map +1 -0
- package/dist/execution-engine.d.ts.map +1 -1
- package/dist/execution-engine.js +9 -4
- package/dist/execution-engine.js.map +1 -1
- package/dist/execution-policy-engine.d.ts +133 -0
- package/dist/execution-policy-engine.d.ts.map +1 -0
- package/dist/execution-policy-engine.js +367 -0
- package/dist/execution-policy-engine.js.map +1 -0
- package/dist/failure-recovery.d.ts +228 -0
- package/dist/failure-recovery.d.ts.map +1 -0
- package/dist/failure-recovery.js +664 -0
- package/dist/failure-recovery.js.map +1 -0
- package/dist/hierarchical-planner.d.ts +69 -1
- package/dist/hierarchical-planner.d.ts.map +1 -1
- package/dist/hierarchical-planner.js +117 -0
- package/dist/hierarchical-planner.js.map +1 -1
- package/dist/impact-analyzer.d.ts +92 -0
- package/dist/impact-analyzer.d.ts.map +1 -0
- package/dist/impact-analyzer.js +615 -0
- package/dist/impact-analyzer.js.map +1 -0
- package/dist/index.d.ts +28 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +27 -0
- package/dist/index.js.map +1 -1
- package/dist/llm-client.d.ts +1 -1
- package/dist/llm-client.d.ts.map +1 -1
- package/dist/llm-client.js +74 -7
- package/dist/llm-client.js.map +1 -1
- package/dist/memory-updater.d.ts +189 -0
- package/dist/memory-updater.d.ts.map +1 -0
- package/dist/memory-updater.js +481 -0
- package/dist/memory-updater.js.map +1 -0
- package/dist/prompt-defense.d.ts +59 -0
- package/dist/prompt-defense.d.ts.map +1 -0
- package/dist/prompt-defense.js +311 -0
- package/dist/prompt-defense.js.map +1 -0
- package/dist/reflexion.d.ts +211 -0
- package/dist/reflexion.d.ts.map +1 -0
- package/dist/reflexion.js +559 -0
- package/dist/reflexion.js.map +1 -0
- package/dist/system-prompt.d.ts +19 -3
- package/dist/system-prompt.d.ts.map +1 -1
- package/dist/system-prompt.js +203 -38
- package/dist/system-prompt.js.map +1 -1
- package/dist/task-classifier.d.ts +92 -0
- package/dist/task-classifier.d.ts.map +1 -0
- package/dist/task-classifier.js +566 -0
- package/dist/task-classifier.js.map +1 -0
- package/dist/token-budget.d.ts +131 -0
- package/dist/token-budget.d.ts.map +1 -0
- package/dist/token-budget.js +321 -0
- package/dist/token-budget.js.map +1 -0
- package/dist/types.d.ts +20 -2
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +18 -1
- package/dist/types.js.map +1 -1
- package/dist/world-state.d.ts +87 -0
- package/dist/world-state.d.ts.map +1 -0
- package/dist/world-state.js +435 -0
- package/dist/world-state.js.map +1 -0
- package/package.json +11 -21
|
@@ -0,0 +1,566 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module task-classifier
|
|
3
|
+
* @description 사용자 입력을 태스크 유형으로 분류하고, 최적 도구 시퀀스를 매핑한다.
|
|
4
|
+
* 하드코딩된 도구 순서를 지능적 분류로 대체.
|
|
5
|
+
*/
|
|
6
|
+
// ─── Task Type Enum ───
|
|
7
|
+
/** 태스크 유형 */
|
|
8
|
+
export var TaskType;
|
|
9
|
+
(function (TaskType) {
|
|
10
|
+
TaskType["DEBUG"] = "debug";
|
|
11
|
+
TaskType["FEATURE"] = "feature";
|
|
12
|
+
TaskType["REFACTOR"] = "refactor";
|
|
13
|
+
TaskType["TEST"] = "test";
|
|
14
|
+
TaskType["EXPLAIN"] = "explain";
|
|
15
|
+
TaskType["SEARCH"] = "search";
|
|
16
|
+
TaskType["CONFIG"] = "config";
|
|
17
|
+
TaskType["DEPLOY"] = "deploy";
|
|
18
|
+
})(TaskType || (TaskType = {}));
|
|
19
|
+
const KEYWORD_RULES = [
|
|
20
|
+
{
|
|
21
|
+
type: TaskType.DEBUG,
|
|
22
|
+
keywords: [
|
|
23
|
+
"버그", "에러", "fix", "broken", "crash", "안됨", "오류",
|
|
24
|
+
"error", "bug", "issue", "fail", "failing", "wrong", "incorrect",
|
|
25
|
+
"doesn't work", "안돼", "동작안", "문제", "exception", "traceback",
|
|
26
|
+
"stack trace", "segfault", "panic",
|
|
27
|
+
],
|
|
28
|
+
weight: 1.0,
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
type: TaskType.FEATURE,
|
|
32
|
+
keywords: [
|
|
33
|
+
"추가", "만들", "add", "create", "implement", "새로",
|
|
34
|
+
"new", "build", "feature", "구현", "만들어", "생성",
|
|
35
|
+
"develop", "introduce", "write", "작성",
|
|
36
|
+
],
|
|
37
|
+
weight: 1.0,
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
type: TaskType.REFACTOR,
|
|
41
|
+
keywords: [
|
|
42
|
+
"리팩", "refactor", "clean", "정리", "개선",
|
|
43
|
+
"restructure", "reorganize", "simplify", "optimize", "improve",
|
|
44
|
+
"cleanup", "rename", "extract", "move", "split", "merge",
|
|
45
|
+
"중복", "duplicate", "DRY",
|
|
46
|
+
],
|
|
47
|
+
weight: 1.0,
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
type: TaskType.TEST,
|
|
51
|
+
keywords: [
|
|
52
|
+
"테스트", "test", "검증", "커버리지",
|
|
53
|
+
"coverage", "spec", "unit test", "integration test", "e2e",
|
|
54
|
+
"assert", "expect", "mock", "stub", "fixture",
|
|
55
|
+
],
|
|
56
|
+
weight: 1.0,
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
type: TaskType.EXPLAIN,
|
|
60
|
+
keywords: [
|
|
61
|
+
"설명", "explain", "뭐야", "어떻게", "왜", "분석",
|
|
62
|
+
"what is", "how does", "why", "describe", "understand",
|
|
63
|
+
"analyze", "overview", "summary", "읽어", "알려",
|
|
64
|
+
],
|
|
65
|
+
weight: 0.9,
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
type: TaskType.SEARCH,
|
|
69
|
+
keywords: [
|
|
70
|
+
"찾아", "search", "find", "어디", "grep",
|
|
71
|
+
"locate", "where", "which file", "look for", "검색",
|
|
72
|
+
"파일 찾", "코드 찾",
|
|
73
|
+
],
|
|
74
|
+
weight: 0.9,
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
type: TaskType.CONFIG,
|
|
78
|
+
keywords: [
|
|
79
|
+
"설정", "config", "환경", "env", ".json", ".yaml",
|
|
80
|
+
"configure", "configuration", "setting", "setup",
|
|
81
|
+
".toml", ".ini", "tsconfig", "eslint", "prettier",
|
|
82
|
+
"package.json", "환경변수",
|
|
83
|
+
],
|
|
84
|
+
weight: 0.9,
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
type: TaskType.DEPLOY,
|
|
88
|
+
keywords: [
|
|
89
|
+
"배포", "deploy", "build", "release",
|
|
90
|
+
"publish", "ship", "CI", "CD", "pipeline",
|
|
91
|
+
"docker", "production", "staging", "pm2",
|
|
92
|
+
],
|
|
93
|
+
weight: 0.9,
|
|
94
|
+
},
|
|
95
|
+
];
|
|
96
|
+
// ─── Tool Sequence Mappings ───
|
|
97
|
+
const TOOL_SEQUENCES = {
|
|
98
|
+
[TaskType.DEBUG]: ["grep", "file_read", "shell_exec", "file_edit", "test_run"],
|
|
99
|
+
[TaskType.FEATURE]: ["glob", "file_read", "file_write", "file_edit", "test_run", "git_ops"],
|
|
100
|
+
[TaskType.REFACTOR]: ["grep", "file_read", "code_search", "file_edit", "test_run"],
|
|
101
|
+
[TaskType.TEST]: ["file_read", "file_write", "test_run", "file_edit", "test_run"],
|
|
102
|
+
[TaskType.EXPLAIN]: ["grep", "file_read", "code_search"],
|
|
103
|
+
[TaskType.SEARCH]: ["grep", "glob", "file_read", "code_search"],
|
|
104
|
+
[TaskType.CONFIG]: ["file_read", "file_edit", "shell_exec"],
|
|
105
|
+
[TaskType.DEPLOY]: ["git_ops", "shell_exec", "test_run"],
|
|
106
|
+
};
|
|
107
|
+
const COMPLEXITY_SIGNALS = [
|
|
108
|
+
// Complexity increasers
|
|
109
|
+
{ pattern: /multiple files|여러 파일|across.*files/i, delta: 2 },
|
|
110
|
+
{ pattern: /refactor.*entire|전체.*리팩|whole.*codebase/i, delta: 3 },
|
|
111
|
+
{ pattern: /migration|마이그레이션/i, delta: 2 },
|
|
112
|
+
{ pattern: /database|DB|스키마/i, delta: 1 },
|
|
113
|
+
{ pattern: /security|보안|auth/i, delta: 1 },
|
|
114
|
+
{ pattern: /performance|성능|optimize/i, delta: 1 },
|
|
115
|
+
{ pattern: /parallel|병렬|concurrent/i, delta: 2 },
|
|
116
|
+
{ pattern: /API|endpoint|라우터/i, delta: 1 },
|
|
117
|
+
// Complexity reducers
|
|
118
|
+
{ pattern: /simple|간단|just|only|하나만/i, delta: -1 },
|
|
119
|
+
{ pattern: /typo|오타|rename|이름/i, delta: -2 },
|
|
120
|
+
{ pattern: /comment|주석/i, delta: -2 },
|
|
121
|
+
{ pattern: /log|로그|print/i, delta: -1 },
|
|
122
|
+
];
|
|
123
|
+
const DEBUG_CONTEXT_HINTS = [
|
|
124
|
+
{ pattern: /test.*fail|테스트.*실패/i, hint: "Check recent test output and __tests__/ directory" },
|
|
125
|
+
{ pattern: /stack\s*trace|traceback/i, hint: "Look for error logs in stdout/stderr" },
|
|
126
|
+
{ pattern: /import.*error|모듈.*못/i, hint: "Check package.json dependencies and tsconfig paths" },
|
|
127
|
+
{ pattern: /type.*error|타입.*에러/i, hint: "Run tsc --noEmit to get full type error list" },
|
|
128
|
+
{ pattern: /runtime|런타임/i, hint: "Check process logs and error handlers" },
|
|
129
|
+
];
|
|
130
|
+
const FEATURE_CONTEXT_HINTS = [
|
|
131
|
+
{ pattern: /component|컴포넌트/i, hint: "Scan existing components/ for similar patterns" },
|
|
132
|
+
{ pattern: /API|endpoint|라우트/i, hint: "Check routes/ directory for existing API patterns" },
|
|
133
|
+
{ pattern: /hook|훅/i, hint: "Check hooks/ or use*.ts for existing hook patterns" },
|
|
134
|
+
{ pattern: /store|스토어|상태/i, hint: "Check stores/ for existing state management patterns" },
|
|
135
|
+
{ pattern: /type|타입|interface/i, hint: "Check types.ts or shared types for existing definitions" },
|
|
136
|
+
];
|
|
137
|
+
const REFACTOR_CONTEXT_HINTS = [
|
|
138
|
+
{ pattern: /import|의존/i, hint: "Trace import graph to identify affected files" },
|
|
139
|
+
{ pattern: /duplicate|중복|DRY/i, hint: "Search for duplicated code patterns across files" },
|
|
140
|
+
{ pattern: /extract|추출/i, hint: "Identify the extraction boundary and consumers" },
|
|
141
|
+
];
|
|
142
|
+
// ─── File Pattern Extraction ───
|
|
143
|
+
/**
|
|
144
|
+
* 메시지에서 파일 경로나 파일 패턴을 추출한다.
|
|
145
|
+
*/
|
|
146
|
+
function extractFilePatterns(message) {
|
|
147
|
+
const patterns = [];
|
|
148
|
+
// Match explicit file paths (e.g., src/foo/bar.ts, ./package.json)
|
|
149
|
+
const filePathRegex = /(?:^|\s)(\.?\/?[\w./-]+\.(?:ts|tsx|js|jsx|json|yaml|yml|toml|css|scss|md|env))/gi;
|
|
150
|
+
let match;
|
|
151
|
+
while ((match = filePathRegex.exec(message)) !== null) {
|
|
152
|
+
patterns.push(match[1].trim());
|
|
153
|
+
}
|
|
154
|
+
// Match glob patterns (e.g., **/*.ts, src/**/*.tsx)
|
|
155
|
+
const globRegex = /(?:^|\s)([\w./*-]+\*[\w./*-]*)/g;
|
|
156
|
+
while ((match = globRegex.exec(message)) !== null) {
|
|
157
|
+
patterns.push(match[1].trim());
|
|
158
|
+
}
|
|
159
|
+
return patterns;
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* 메시지에서 검색에 유용한 grep/glob 패턴을 추출한다.
|
|
163
|
+
*/
|
|
164
|
+
function extractSearchPatterns(message, type) {
|
|
165
|
+
const patterns = [];
|
|
166
|
+
// Extract quoted strings as potential search terms
|
|
167
|
+
const quotedRegex = /["'`]([^"'`]+)["'`]/g;
|
|
168
|
+
let match;
|
|
169
|
+
while ((match = quotedRegex.exec(message)) !== null) {
|
|
170
|
+
patterns.push(match[1]);
|
|
171
|
+
}
|
|
172
|
+
// Extract function/class/variable names (camelCase, PascalCase, snake_case)
|
|
173
|
+
const identifierRegex = /\b([A-Z][a-zA-Z0-9]+|[a-z][a-zA-Z0-9]*(?:_[a-zA-Z0-9]+)+)\b/g;
|
|
174
|
+
while ((match = identifierRegex.exec(message)) !== null) {
|
|
175
|
+
const ident = match[1];
|
|
176
|
+
// Filter out common English words that match camelCase pattern
|
|
177
|
+
if (ident.length > 3 && !COMMON_WORDS.has(ident.toLowerCase())) {
|
|
178
|
+
patterns.push(ident);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
// For debug tasks, extract error message fragments
|
|
182
|
+
if (type === TaskType.DEBUG) {
|
|
183
|
+
const errorRegex = /(?:error|Error|ERROR)[:\s]+(.+?)(?:\.|$)/gm;
|
|
184
|
+
while ((match = errorRegex.exec(message)) !== null) {
|
|
185
|
+
patterns.push(match[1].trim());
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
return [...new Set(patterns)];
|
|
189
|
+
}
|
|
190
|
+
const COMMON_WORDS = new Set([
|
|
191
|
+
"this", "that", "with", "from", "have", "been", "were", "they",
|
|
192
|
+
"some", "what", "when", "where", "which", "there", "their",
|
|
193
|
+
"about", "would", "could", "should", "after", "before",
|
|
194
|
+
"other", "these", "those", "than", "then", "also", "just",
|
|
195
|
+
"into", "over", "such", "only", "very", "make", "like",
|
|
196
|
+
]);
|
|
197
|
+
// ─── LLM Classification Prompt ───
|
|
198
|
+
const LLM_CLASSIFICATION_PROMPT = `You are a task classifier for a coding agent. Classify the user's message into exactly one task type.
|
|
199
|
+
|
|
200
|
+
Task types:
|
|
201
|
+
- debug: Fix bugs, errors, crashes, failing tests
|
|
202
|
+
- feature: Add new functionality, create new files/components
|
|
203
|
+
- refactor: Restructure, clean up, optimize existing code
|
|
204
|
+
- test: Write, fix, or improve tests
|
|
205
|
+
- explain: Explain code, analyze architecture, answer questions
|
|
206
|
+
- search: Find files, code patterns, or specific implementations
|
|
207
|
+
- config: Modify configuration files, environment settings
|
|
208
|
+
- deploy: Build, release, deploy, CI/CD operations
|
|
209
|
+
|
|
210
|
+
Respond with ONLY a JSON object (no markdown, no explanation):
|
|
211
|
+
{
|
|
212
|
+
"type": "<task_type>",
|
|
213
|
+
"confidence": <0.0-1.0>,
|
|
214
|
+
"estimatedComplexity": "<trivial|simple|moderate|complex>",
|
|
215
|
+
"contextHints": ["<hint1>", "<hint2>"],
|
|
216
|
+
"searchPatterns": ["<pattern1>", "<pattern2>"]
|
|
217
|
+
}`;
|
|
218
|
+
// ─── TaskClassifier Class ───
|
|
219
|
+
/**
|
|
220
|
+
* 사용자 입력을 태스크 유형으로 분류하고 최적 도구 시퀀스를 매핑하는 분류기.
|
|
221
|
+
*
|
|
222
|
+
* 두 가지 모드:
|
|
223
|
+
* 1. `classify()` — 키워드 기반 휴리스틱 (LLM 호출 없이 빠름)
|
|
224
|
+
* 2. `classifyWithLLM()` — LLM 강화 분류 (모호한 경우)
|
|
225
|
+
*/
|
|
226
|
+
export class TaskClassifier {
|
|
227
|
+
/**
|
|
228
|
+
* 휴리스틱 기반 태스크 분류 (LLM 호출 없음, 빠름).
|
|
229
|
+
*
|
|
230
|
+
* @param message - 사용자 입력 메시지
|
|
231
|
+
* @param projectContext - 프로젝트 컨텍스트 (선택, 예: 파일 구조 요약)
|
|
232
|
+
* @returns 태스크 분류 결과
|
|
233
|
+
*/
|
|
234
|
+
classify(message, projectContext) {
|
|
235
|
+
const normalizedMessage = message.toLowerCase();
|
|
236
|
+
const scores = new Map();
|
|
237
|
+
// Initialize scores
|
|
238
|
+
for (const taskType of Object.values(TaskType)) {
|
|
239
|
+
scores.set(taskType, 0);
|
|
240
|
+
}
|
|
241
|
+
// Score each task type based on keyword matches
|
|
242
|
+
for (const rule of KEYWORD_RULES) {
|
|
243
|
+
let matchCount = 0;
|
|
244
|
+
for (const keyword of rule.keywords) {
|
|
245
|
+
if (normalizedMessage.includes(keyword.toLowerCase())) {
|
|
246
|
+
matchCount++;
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
if (matchCount > 0) {
|
|
250
|
+
const currentScore = scores.get(rule.type) ?? 0;
|
|
251
|
+
// Diminishing returns for multiple matches on same type
|
|
252
|
+
scores.set(rule.type, currentScore + rule.weight * (1 + Math.log(matchCount)));
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
// Apply project context boost if available
|
|
256
|
+
if (projectContext) {
|
|
257
|
+
this.applyContextBoost(scores, normalizedMessage, projectContext);
|
|
258
|
+
}
|
|
259
|
+
// Find the best match
|
|
260
|
+
let bestType = TaskType.FEATURE; // default fallback
|
|
261
|
+
let bestScore = 0;
|
|
262
|
+
let secondBestScore = 0;
|
|
263
|
+
for (const [type, score] of scores) {
|
|
264
|
+
if (score > bestScore) {
|
|
265
|
+
secondBestScore = bestScore;
|
|
266
|
+
bestScore = score;
|
|
267
|
+
bestType = type;
|
|
268
|
+
}
|
|
269
|
+
else if (score > secondBestScore) {
|
|
270
|
+
secondBestScore = score;
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
// Calculate confidence
|
|
274
|
+
const confidence = this.calculateConfidence(bestScore, secondBestScore);
|
|
275
|
+
// Estimate complexity
|
|
276
|
+
const estimatedComplexity = this.estimateComplexity(message);
|
|
277
|
+
// Generate context hints
|
|
278
|
+
const contextHints = this.generateContextHints(bestType, message);
|
|
279
|
+
// Extract file patterns from message
|
|
280
|
+
const filePatterns = extractFilePatterns(message);
|
|
281
|
+
if (filePatterns.length > 0) {
|
|
282
|
+
contextHints.push(...filePatterns.map((p) => `Referenced file: ${p}`));
|
|
283
|
+
}
|
|
284
|
+
// Extract search patterns
|
|
285
|
+
const searchPatterns = extractSearchPatterns(message, bestType);
|
|
286
|
+
// Get tool sequence
|
|
287
|
+
const toolSequence = this.getToolSequence(bestType);
|
|
288
|
+
return {
|
|
289
|
+
type: bestType,
|
|
290
|
+
confidence,
|
|
291
|
+
toolSequence,
|
|
292
|
+
contextHints,
|
|
293
|
+
estimatedComplexity,
|
|
294
|
+
...(searchPatterns.length > 0 ? { searchPatterns } : {}),
|
|
295
|
+
};
|
|
296
|
+
}
|
|
297
|
+
/**
|
|
298
|
+
* LLM 강화 태스크 분류 (모호한 경우 사용).
|
|
299
|
+
*
|
|
300
|
+
* @param message - 사용자 입력 메시지
|
|
301
|
+
* @param llmClient - BYOK LLM 클라이언트
|
|
302
|
+
* @returns 태스크 분류 결과
|
|
303
|
+
*/
|
|
304
|
+
async classifyWithLLM(message, llmClient) {
|
|
305
|
+
// First, get heuristic classification as fallback
|
|
306
|
+
const heuristic = this.classify(message);
|
|
307
|
+
// If heuristic is confident enough, skip LLM call
|
|
308
|
+
if (heuristic.confidence >= 0.8) {
|
|
309
|
+
return heuristic;
|
|
310
|
+
}
|
|
311
|
+
try {
|
|
312
|
+
const response = await llmClient.chat([
|
|
313
|
+
{ role: "system", content: LLM_CLASSIFICATION_PROMPT },
|
|
314
|
+
{ role: "user", content: message },
|
|
315
|
+
]);
|
|
316
|
+
if (!response.content) {
|
|
317
|
+
return heuristic;
|
|
318
|
+
}
|
|
319
|
+
const parsed = this.parseLLMClassification(response.content);
|
|
320
|
+
if (!parsed) {
|
|
321
|
+
return heuristic;
|
|
322
|
+
}
|
|
323
|
+
// Merge LLM result with heuristic hints
|
|
324
|
+
const toolSequence = this.getToolSequence(parsed.type);
|
|
325
|
+
const mergedHints = [
|
|
326
|
+
...new Set([...parsed.contextHints, ...heuristic.contextHints]),
|
|
327
|
+
];
|
|
328
|
+
const mergedPatterns = [
|
|
329
|
+
...new Set([
|
|
330
|
+
...(parsed.searchPatterns ?? []),
|
|
331
|
+
...(heuristic.searchPatterns ?? []),
|
|
332
|
+
]),
|
|
333
|
+
];
|
|
334
|
+
return {
|
|
335
|
+
type: parsed.type,
|
|
336
|
+
confidence: parsed.confidence,
|
|
337
|
+
toolSequence,
|
|
338
|
+
contextHints: mergedHints,
|
|
339
|
+
estimatedComplexity: parsed.estimatedComplexity,
|
|
340
|
+
...(mergedPatterns.length > 0 ? { searchPatterns: mergedPatterns } : {}),
|
|
341
|
+
};
|
|
342
|
+
}
|
|
343
|
+
catch {
|
|
344
|
+
// LLM call failed — fall back to heuristic
|
|
345
|
+
return heuristic;
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
/**
|
|
349
|
+
* 태스크 유형에 대한 최적 도구 실행 순서를 반환한다.
|
|
350
|
+
*
|
|
351
|
+
* @param type - 태스크 유형
|
|
352
|
+
* @returns 도구 이름 배열 (실행 순서)
|
|
353
|
+
*/
|
|
354
|
+
getToolSequence(type) {
|
|
355
|
+
return [...TOOL_SEQUENCES[type]];
|
|
356
|
+
}
|
|
357
|
+
/**
|
|
358
|
+
* 분류 결과를 시스템 프롬프트 주입용 문자열로 포맷한다.
|
|
359
|
+
*
|
|
360
|
+
* @param classification - 태스크 분류 결과
|
|
361
|
+
* @returns 시스템 프롬프트에 삽입할 문자열
|
|
362
|
+
*/
|
|
363
|
+
formatForSystemPrompt(classification) {
|
|
364
|
+
const lines = [
|
|
365
|
+
`<task-classification>`,
|
|
366
|
+
`Task Type: ${classification.type}`,
|
|
367
|
+
`Confidence: ${(classification.confidence * 100).toFixed(0)}%`,
|
|
368
|
+
`Complexity: ${classification.estimatedComplexity}`,
|
|
369
|
+
``,
|
|
370
|
+
`Recommended Tool Order:`,
|
|
371
|
+
...classification.toolSequence.map((tool, i) => ` ${i + 1}. ${tool}`),
|
|
372
|
+
];
|
|
373
|
+
if (classification.contextHints.length > 0) {
|
|
374
|
+
lines.push(``, `Context Hints:`);
|
|
375
|
+
for (const hint of classification.contextHints) {
|
|
376
|
+
lines.push(` - ${hint}`);
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
if (classification.searchPatterns && classification.searchPatterns.length > 0) {
|
|
380
|
+
lines.push(``, `Search Patterns:`);
|
|
381
|
+
for (const pattern of classification.searchPatterns) {
|
|
382
|
+
lines.push(` - ${pattern}`);
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
lines.push(`</task-classification>`);
|
|
386
|
+
return lines.join("\n");
|
|
387
|
+
}
|
|
388
|
+
// ─── Private Helpers ───
|
|
389
|
+
/**
|
|
390
|
+
* 프로젝트 컨텍스트를 기반으로 점수를 보정한다.
|
|
391
|
+
*/
|
|
392
|
+
applyContextBoost(scores, message, projectContext) {
|
|
393
|
+
const ctx = projectContext.toLowerCase();
|
|
394
|
+
// If project context mentions tests and message mentions related files
|
|
395
|
+
if (ctx.includes("test") || ctx.includes("spec")) {
|
|
396
|
+
if (message.includes("test") || message.includes("테스트")) {
|
|
397
|
+
const current = scores.get(TaskType.TEST) ?? 0;
|
|
398
|
+
scores.set(TaskType.TEST, current + 0.3);
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
// If project context mentions CI/CD
|
|
402
|
+
if (ctx.includes("ci") || ctx.includes("pipeline") || ctx.includes("deploy")) {
|
|
403
|
+
if (message.includes("deploy") || message.includes("배포") || message.includes("build")) {
|
|
404
|
+
const current = scores.get(TaskType.DEPLOY) ?? 0;
|
|
405
|
+
scores.set(TaskType.DEPLOY, current + 0.3);
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
// If project context mentions config files
|
|
409
|
+
if (ctx.includes("config") || ctx.includes(".env") || ctx.includes("tsconfig")) {
|
|
410
|
+
if (message.includes("설정") || message.includes("config") || message.includes("env")) {
|
|
411
|
+
const current = scores.get(TaskType.CONFIG) ?? 0;
|
|
412
|
+
scores.set(TaskType.CONFIG, current + 0.3);
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
/**
|
|
417
|
+
* 1위와 2위 점수 차이를 기반으로 신뢰도를 계산한다.
|
|
418
|
+
*/
|
|
419
|
+
calculateConfidence(bestScore, secondBestScore) {
|
|
420
|
+
if (bestScore === 0) {
|
|
421
|
+
// No matches at all — very low confidence, default to feature
|
|
422
|
+
return 0.2;
|
|
423
|
+
}
|
|
424
|
+
// Gap-based confidence
|
|
425
|
+
const gap = bestScore - secondBestScore;
|
|
426
|
+
const ratio = gap / bestScore;
|
|
427
|
+
// Map ratio to confidence range [0.4, 1.0]
|
|
428
|
+
const confidence = 0.4 + ratio * 0.6;
|
|
429
|
+
return Math.min(1.0, Math.max(0.0, confidence));
|
|
430
|
+
}
|
|
431
|
+
/**
|
|
432
|
+
* 메시지 복잡도 시그널을 기반으로 복잡도를 추정한다.
|
|
433
|
+
*/
|
|
434
|
+
estimateComplexity(message) {
|
|
435
|
+
let score = 0;
|
|
436
|
+
// Base score from message length
|
|
437
|
+
if (message.length > 500)
|
|
438
|
+
score += 2;
|
|
439
|
+
else if (message.length > 200)
|
|
440
|
+
score += 1;
|
|
441
|
+
// Apply complexity signals
|
|
442
|
+
for (const signal of COMPLEXITY_SIGNALS) {
|
|
443
|
+
if (signal.pattern.test(message)) {
|
|
444
|
+
score += signal.delta;
|
|
445
|
+
}
|
|
446
|
+
}
|
|
447
|
+
// Count file references (more files = more complex)
|
|
448
|
+
const filePatterns = extractFilePatterns(message);
|
|
449
|
+
score += Math.min(filePatterns.length, 3);
|
|
450
|
+
if (score <= -1)
|
|
451
|
+
return "trivial";
|
|
452
|
+
if (score <= 1)
|
|
453
|
+
return "simple";
|
|
454
|
+
if (score <= 4)
|
|
455
|
+
return "moderate";
|
|
456
|
+
return "complex";
|
|
457
|
+
}
|
|
458
|
+
/**
|
|
459
|
+
* 태스크 유형 및 메시지 내용을 기반으로 컨텍스트 힌트를 생성한다.
|
|
460
|
+
*/
|
|
461
|
+
generateContextHints(type, message) {
|
|
462
|
+
const hints = [];
|
|
463
|
+
let rules;
|
|
464
|
+
switch (type) {
|
|
465
|
+
case TaskType.DEBUG:
|
|
466
|
+
rules = DEBUG_CONTEXT_HINTS;
|
|
467
|
+
break;
|
|
468
|
+
case TaskType.FEATURE:
|
|
469
|
+
rules = FEATURE_CONTEXT_HINTS;
|
|
470
|
+
break;
|
|
471
|
+
case TaskType.REFACTOR:
|
|
472
|
+
rules = REFACTOR_CONTEXT_HINTS;
|
|
473
|
+
break;
|
|
474
|
+
default:
|
|
475
|
+
rules = [];
|
|
476
|
+
break;
|
|
477
|
+
}
|
|
478
|
+
for (const rule of rules) {
|
|
479
|
+
if (rule.pattern.test(message)) {
|
|
480
|
+
hints.push(rule.hint);
|
|
481
|
+
}
|
|
482
|
+
}
|
|
483
|
+
// Generic hints based on task type
|
|
484
|
+
switch (type) {
|
|
485
|
+
case TaskType.DEBUG:
|
|
486
|
+
if (hints.length === 0) {
|
|
487
|
+
hints.push("Search for error patterns in recent logs");
|
|
488
|
+
hints.push("Check git diff for recent changes that may have introduced the bug");
|
|
489
|
+
}
|
|
490
|
+
break;
|
|
491
|
+
case TaskType.FEATURE:
|
|
492
|
+
if (hints.length === 0) {
|
|
493
|
+
hints.push("Scan existing code for similar implementations to follow patterns");
|
|
494
|
+
}
|
|
495
|
+
break;
|
|
496
|
+
case TaskType.TEST:
|
|
497
|
+
hints.push("Check existing test files for testing patterns and utilities");
|
|
498
|
+
break;
|
|
499
|
+
case TaskType.CONFIG:
|
|
500
|
+
hints.push("Read current config before making changes");
|
|
501
|
+
break;
|
|
502
|
+
case TaskType.DEPLOY:
|
|
503
|
+
hints.push("Verify build passes before deployment");
|
|
504
|
+
hints.push("Check git status for uncommitted changes");
|
|
505
|
+
break;
|
|
506
|
+
case TaskType.SEARCH:
|
|
507
|
+
hints.push("Use glob for file discovery, grep for content search");
|
|
508
|
+
break;
|
|
509
|
+
case TaskType.EXPLAIN:
|
|
510
|
+
hints.push("Read the target files and trace their dependencies");
|
|
511
|
+
break;
|
|
512
|
+
case TaskType.REFACTOR:
|
|
513
|
+
if (hints.length === 0) {
|
|
514
|
+
hints.push("Map the dependency graph of affected files before refactoring");
|
|
515
|
+
}
|
|
516
|
+
break;
|
|
517
|
+
}
|
|
518
|
+
return hints;
|
|
519
|
+
}
|
|
520
|
+
/**
|
|
521
|
+
* LLM 응답 JSON을 파싱하여 분류 결과로 변환한다.
|
|
522
|
+
*/
|
|
523
|
+
parseLLMClassification(raw) {
|
|
524
|
+
try {
|
|
525
|
+
// Strip potential markdown code fences
|
|
526
|
+
let cleaned = raw.trim();
|
|
527
|
+
if (cleaned.startsWith("```")) {
|
|
528
|
+
cleaned = cleaned.replace(/^```(?:json)?\n?/, "").replace(/\n?```$/, "");
|
|
529
|
+
}
|
|
530
|
+
const parsed = JSON.parse(cleaned);
|
|
531
|
+
// Validate type
|
|
532
|
+
const typeStr = parsed.type;
|
|
533
|
+
if (!typeStr || !Object.values(TaskType).includes(typeStr)) {
|
|
534
|
+
return null;
|
|
535
|
+
}
|
|
536
|
+
// Validate confidence
|
|
537
|
+
const confidence = typeof parsed.confidence === "number"
|
|
538
|
+
? Math.min(1.0, Math.max(0.0, parsed.confidence))
|
|
539
|
+
: 0.5;
|
|
540
|
+
// Validate complexity
|
|
541
|
+
const validComplexities = ["trivial", "simple", "moderate", "complex"];
|
|
542
|
+
const complexity = validComplexities.includes(parsed.estimatedComplexity)
|
|
543
|
+
? parsed.estimatedComplexity
|
|
544
|
+
: "moderate";
|
|
545
|
+
// Extract hints
|
|
546
|
+
const contextHints = Array.isArray(parsed.contextHints)
|
|
547
|
+
? parsed.contextHints.filter((h) => typeof h === "string")
|
|
548
|
+
: [];
|
|
549
|
+
// Extract search patterns
|
|
550
|
+
const searchPatterns = Array.isArray(parsed.searchPatterns)
|
|
551
|
+
? parsed.searchPatterns.filter((p) => typeof p === "string")
|
|
552
|
+
: undefined;
|
|
553
|
+
return {
|
|
554
|
+
type: typeStr,
|
|
555
|
+
confidence,
|
|
556
|
+
estimatedComplexity: complexity,
|
|
557
|
+
contextHints,
|
|
558
|
+
searchPatterns,
|
|
559
|
+
};
|
|
560
|
+
}
|
|
561
|
+
catch {
|
|
562
|
+
return null;
|
|
563
|
+
}
|
|
564
|
+
}
|
|
565
|
+
}
|
|
566
|
+
//# sourceMappingURL=task-classifier.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-classifier.js","sourceRoot":"","sources":["../src/task-classifier.ts"],"names":[],"mappings":"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"}
|