@yuaone/core 0.1.2 → 0.2.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.
Files changed (63) hide show
  1. package/dist/agent-loop.d.ts +112 -0
  2. package/dist/agent-loop.d.ts.map +1 -1
  3. package/dist/agent-loop.js +715 -9
  4. package/dist/agent-loop.js.map +1 -1
  5. package/dist/constants.d.ts.map +1 -1
  6. package/dist/constants.js +16 -0
  7. package/dist/constants.js.map +1 -1
  8. package/dist/context-budget.d.ts +1 -1
  9. package/dist/context-budget.d.ts.map +1 -1
  10. package/dist/context-budget.js +4 -2
  11. package/dist/context-budget.js.map +1 -1
  12. package/dist/context-compressor.d.ts +1 -1
  13. package/dist/context-compressor.d.ts.map +1 -1
  14. package/dist/context-compressor.js +5 -3
  15. package/dist/context-compressor.js.map +1 -1
  16. package/dist/context-manager.d.ts +7 -1
  17. package/dist/context-manager.d.ts.map +1 -1
  18. package/dist/context-manager.js +34 -2
  19. package/dist/context-manager.js.map +1 -1
  20. package/dist/continuation-engine.d.ts +168 -0
  21. package/dist/continuation-engine.d.ts.map +1 -0
  22. package/dist/continuation-engine.js +421 -0
  23. package/dist/continuation-engine.js.map +1 -0
  24. package/dist/execution-engine.d.ts.map +1 -1
  25. package/dist/execution-engine.js +9 -4
  26. package/dist/execution-engine.js.map +1 -1
  27. package/dist/index.d.ts +14 -1
  28. package/dist/index.d.ts.map +1 -1
  29. package/dist/index.js +14 -0
  30. package/dist/index.js.map +1 -1
  31. package/dist/llm-client.d.ts +1 -1
  32. package/dist/llm-client.d.ts.map +1 -1
  33. package/dist/llm-client.js +74 -7
  34. package/dist/llm-client.js.map +1 -1
  35. package/dist/memory-updater.d.ts +189 -0
  36. package/dist/memory-updater.d.ts.map +1 -0
  37. package/dist/memory-updater.js +481 -0
  38. package/dist/memory-updater.js.map +1 -0
  39. package/dist/prompt-defense.d.ts +59 -0
  40. package/dist/prompt-defense.d.ts.map +1 -0
  41. package/dist/prompt-defense.js +311 -0
  42. package/dist/prompt-defense.js.map +1 -0
  43. package/dist/reflexion.d.ts +211 -0
  44. package/dist/reflexion.d.ts.map +1 -0
  45. package/dist/reflexion.js +559 -0
  46. package/dist/reflexion.js.map +1 -0
  47. package/dist/system-prompt.d.ts +19 -3
  48. package/dist/system-prompt.d.ts.map +1 -1
  49. package/dist/system-prompt.js +203 -38
  50. package/dist/system-prompt.js.map +1 -1
  51. package/dist/task-classifier.d.ts +92 -0
  52. package/dist/task-classifier.d.ts.map +1 -0
  53. package/dist/task-classifier.js +566 -0
  54. package/dist/task-classifier.js.map +1 -0
  55. package/dist/token-budget.d.ts +131 -0
  56. package/dist/token-budget.d.ts.map +1 -0
  57. package/dist/token-budget.js +321 -0
  58. package/dist/token-budget.js.map +1 -0
  59. package/dist/types.d.ts +20 -2
  60. package/dist/types.d.ts.map +1 -1
  61. package/dist/types.js +18 -1
  62. package/dist/types.js.map +1 -1
  63. package/package.json +1 -1
@@ -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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"}