@yuaone/core 0.1.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/LICENSE +663 -0
- package/README.md +15 -0
- package/dist/__tests__/context-manager.test.d.ts +6 -0
- package/dist/__tests__/context-manager.test.d.ts.map +1 -0
- package/dist/__tests__/context-manager.test.js +220 -0
- package/dist/__tests__/context-manager.test.js.map +1 -0
- package/dist/__tests__/governor.test.d.ts +6 -0
- package/dist/__tests__/governor.test.d.ts.map +1 -0
- package/dist/__tests__/governor.test.js +210 -0
- package/dist/__tests__/governor.test.js.map +1 -0
- package/dist/__tests__/model-router.test.d.ts +6 -0
- package/dist/__tests__/model-router.test.d.ts.map +1 -0
- package/dist/__tests__/model-router.test.js +329 -0
- package/dist/__tests__/model-router.test.js.map +1 -0
- package/dist/agent-logger.d.ts +384 -0
- package/dist/agent-logger.d.ts.map +1 -0
- package/dist/agent-logger.js +820 -0
- package/dist/agent-logger.js.map +1 -0
- package/dist/agent-loop.d.ts +163 -0
- package/dist/agent-loop.d.ts.map +1 -0
- package/dist/agent-loop.js +609 -0
- package/dist/agent-loop.js.map +1 -0
- package/dist/agent-modes.d.ts +85 -0
- package/dist/agent-modes.d.ts.map +1 -0
- package/dist/agent-modes.js +418 -0
- package/dist/agent-modes.js.map +1 -0
- package/dist/approval.d.ts +137 -0
- package/dist/approval.d.ts.map +1 -0
- package/dist/approval.js +299 -0
- package/dist/approval.js.map +1 -0
- package/dist/async-completion-queue.d.ts +56 -0
- package/dist/async-completion-queue.d.ts.map +1 -0
- package/dist/async-completion-queue.js +77 -0
- package/dist/async-completion-queue.js.map +1 -0
- package/dist/auto-fix.d.ts +174 -0
- package/dist/auto-fix.d.ts.map +1 -0
- package/dist/auto-fix.js +319 -0
- package/dist/auto-fix.js.map +1 -0
- package/dist/codebase-context.d.ts +396 -0
- package/dist/codebase-context.d.ts.map +1 -0
- package/dist/codebase-context.js +1260 -0
- package/dist/codebase-context.js.map +1 -0
- package/dist/conflict-resolver.d.ts +191 -0
- package/dist/conflict-resolver.d.ts.map +1 -0
- package/dist/conflict-resolver.js +524 -0
- package/dist/conflict-resolver.js.map +1 -0
- package/dist/constants.d.ts +52 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +141 -0
- package/dist/constants.js.map +1 -0
- package/dist/context-budget.d.ts +435 -0
- package/dist/context-budget.d.ts.map +1 -0
- package/dist/context-budget.js +903 -0
- package/dist/context-budget.js.map +1 -0
- package/dist/context-compressor.d.ts +143 -0
- package/dist/context-compressor.d.ts.map +1 -0
- package/dist/context-compressor.js +511 -0
- package/dist/context-compressor.js.map +1 -0
- package/dist/context-manager.d.ts +112 -0
- package/dist/context-manager.d.ts.map +1 -0
- package/dist/context-manager.js +247 -0
- package/dist/context-manager.js.map +1 -0
- package/dist/continuous-reflection.d.ts +267 -0
- package/dist/continuous-reflection.d.ts.map +1 -0
- package/dist/continuous-reflection.js +338 -0
- package/dist/continuous-reflection.js.map +1 -0
- package/dist/cross-file-refactor.d.ts +352 -0
- package/dist/cross-file-refactor.d.ts.map +1 -0
- package/dist/cross-file-refactor.js +1544 -0
- package/dist/cross-file-refactor.js.map +1 -0
- package/dist/dag-orchestrator.d.ts +138 -0
- package/dist/dag-orchestrator.d.ts.map +1 -0
- package/dist/dag-orchestrator.js +379 -0
- package/dist/dag-orchestrator.js.map +1 -0
- package/dist/debate-orchestrator.d.ts +301 -0
- package/dist/debate-orchestrator.d.ts.map +1 -0
- package/dist/debate-orchestrator.js +719 -0
- package/dist/debate-orchestrator.js.map +1 -0
- package/dist/dependency-analyzer.d.ts +113 -0
- package/dist/dependency-analyzer.d.ts.map +1 -0
- package/dist/dependency-analyzer.js +444 -0
- package/dist/dependency-analyzer.js.map +1 -0
- package/dist/design-loop.d.ts +59 -0
- package/dist/design-loop.d.ts.map +1 -0
- package/dist/design-loop.js +344 -0
- package/dist/design-loop.js.map +1 -0
- package/dist/doc-intelligence.d.ts +383 -0
- package/dist/doc-intelligence.d.ts.map +1 -0
- package/dist/doc-intelligence.js +1307 -0
- package/dist/doc-intelligence.js.map +1 -0
- package/dist/dynamic-role-generator.d.ts +76 -0
- package/dist/dynamic-role-generator.d.ts.map +1 -0
- package/dist/dynamic-role-generator.js +194 -0
- package/dist/dynamic-role-generator.js.map +1 -0
- package/dist/errors.d.ts +69 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +102 -0
- package/dist/errors.js.map +1 -0
- package/dist/event-bus.d.ts +159 -0
- package/dist/event-bus.d.ts.map +1 -0
- package/dist/event-bus.js +305 -0
- package/dist/event-bus.js.map +1 -0
- package/dist/execution-engine.d.ts +425 -0
- package/dist/execution-engine.d.ts.map +1 -0
- package/dist/execution-engine.js +1555 -0
- package/dist/execution-engine.js.map +1 -0
- package/dist/git-intelligence.d.ts +306 -0
- package/dist/git-intelligence.d.ts.map +1 -0
- package/dist/git-intelligence.js +1099 -0
- package/dist/git-intelligence.js.map +1 -0
- package/dist/governor.d.ts +77 -0
- package/dist/governor.d.ts.map +1 -0
- package/dist/governor.js +161 -0
- package/dist/governor.js.map +1 -0
- package/dist/hierarchical-planner.d.ts +313 -0
- package/dist/hierarchical-planner.d.ts.map +1 -0
- package/dist/hierarchical-planner.js +981 -0
- package/dist/hierarchical-planner.js.map +1 -0
- package/dist/index.d.ts +121 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +123 -0
- package/dist/index.js.map +1 -0
- package/dist/intent-inference.d.ts +103 -0
- package/dist/intent-inference.d.ts.map +1 -0
- package/dist/intent-inference.js +605 -0
- package/dist/intent-inference.js.map +1 -0
- package/dist/interrupt-manager.d.ts +143 -0
- package/dist/interrupt-manager.d.ts.map +1 -0
- package/dist/interrupt-manager.js +196 -0
- package/dist/interrupt-manager.js.map +1 -0
- package/dist/kernel.d.ts +564 -0
- package/dist/kernel.d.ts.map +1 -0
- package/dist/kernel.js +1419 -0
- package/dist/kernel.js.map +1 -0
- package/dist/language-support.d.ts +232 -0
- package/dist/language-support.d.ts.map +1 -0
- package/dist/language-support.js +1134 -0
- package/dist/language-support.js.map +1 -0
- package/dist/llm-client.d.ts +82 -0
- package/dist/llm-client.d.ts.map +1 -0
- package/dist/llm-client.js +475 -0
- package/dist/llm-client.js.map +1 -0
- package/dist/mcp-client.d.ts +232 -0
- package/dist/mcp-client.d.ts.map +1 -0
- package/dist/mcp-client.js +718 -0
- package/dist/mcp-client.js.map +1 -0
- package/dist/memory-manager.d.ts +200 -0
- package/dist/memory-manager.d.ts.map +1 -0
- package/dist/memory-manager.js +568 -0
- package/dist/memory-manager.js.map +1 -0
- package/dist/memory.d.ts +87 -0
- package/dist/memory.d.ts.map +1 -0
- package/dist/memory.js +341 -0
- package/dist/memory.js.map +1 -0
- package/dist/model-router.d.ts +245 -0
- package/dist/model-router.d.ts.map +1 -0
- package/dist/model-router.js +632 -0
- package/dist/model-router.js.map +1 -0
- package/dist/parallel-executor.d.ts +125 -0
- package/dist/parallel-executor.d.ts.map +1 -0
- package/dist/parallel-executor.js +201 -0
- package/dist/parallel-executor.js.map +1 -0
- package/dist/perf-optimizer.d.ts +212 -0
- package/dist/perf-optimizer.d.ts.map +1 -0
- package/dist/perf-optimizer.js +721 -0
- package/dist/perf-optimizer.js.map +1 -0
- package/dist/persona.d.ts +305 -0
- package/dist/persona.d.ts.map +1 -0
- package/dist/persona.js +887 -0
- package/dist/persona.js.map +1 -0
- package/dist/planner.d.ts +70 -0
- package/dist/planner.d.ts.map +1 -0
- package/dist/planner.js +264 -0
- package/dist/planner.js.map +1 -0
- package/dist/qa-pipeline.d.ts +365 -0
- package/dist/qa-pipeline.d.ts.map +1 -0
- package/dist/qa-pipeline.js +1352 -0
- package/dist/qa-pipeline.js.map +1 -0
- package/dist/reasoning-adapter.d.ts +116 -0
- package/dist/reasoning-adapter.d.ts.map +1 -0
- package/dist/reasoning-adapter.js +187 -0
- package/dist/reasoning-adapter.js.map +1 -0
- package/dist/role-registry.d.ts +55 -0
- package/dist/role-registry.d.ts.map +1 -0
- package/dist/role-registry.js +192 -0
- package/dist/role-registry.js.map +1 -0
- package/dist/sandbox-tiers.d.ts +327 -0
- package/dist/sandbox-tiers.d.ts.map +1 -0
- package/dist/sandbox-tiers.js +928 -0
- package/dist/sandbox-tiers.js.map +1 -0
- package/dist/security-scanner.d.ts +222 -0
- package/dist/security-scanner.d.ts.map +1 -0
- package/dist/security-scanner.js +1129 -0
- package/dist/security-scanner.js.map +1 -0
- package/dist/security.d.ts +93 -0
- package/dist/security.d.ts.map +1 -0
- package/dist/security.js +393 -0
- package/dist/security.js.map +1 -0
- package/dist/self-reflection.d.ts +397 -0
- package/dist/self-reflection.d.ts.map +1 -0
- package/dist/self-reflection.js +908 -0
- package/dist/self-reflection.js.map +1 -0
- package/dist/session-persistence.d.ts +191 -0
- package/dist/session-persistence.d.ts.map +1 -0
- package/dist/session-persistence.js +395 -0
- package/dist/session-persistence.js.map +1 -0
- package/dist/speculative-executor.d.ts +210 -0
- package/dist/speculative-executor.d.ts.map +1 -0
- package/dist/speculative-executor.js +618 -0
- package/dist/speculative-executor.js.map +1 -0
- package/dist/state-machine.d.ts +289 -0
- package/dist/state-machine.d.ts.map +1 -0
- package/dist/state-machine.js +695 -0
- package/dist/state-machine.js.map +1 -0
- package/dist/sub-agent.d.ts +177 -0
- package/dist/sub-agent.d.ts.map +1 -0
- package/dist/sub-agent.js +303 -0
- package/dist/sub-agent.js.map +1 -0
- package/dist/system-prompt.d.ts +26 -0
- package/dist/system-prompt.d.ts.map +1 -0
- package/dist/system-prompt.js +84 -0
- package/dist/system-prompt.js.map +1 -0
- package/dist/test-intelligence.d.ts +439 -0
- package/dist/test-intelligence.d.ts.map +1 -0
- package/dist/test-intelligence.js +1165 -0
- package/dist/test-intelligence.js.map +1 -0
- package/dist/types.d.ts +632 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +6 -0
- package/dist/types.js.map +1 -0
- package/dist/vector-index.d.ts +314 -0
- package/dist/vector-index.d.ts.map +1 -0
- package/dist/vector-index.js +618 -0
- package/dist/vector-index.js.map +1 -0
- package/package.json +41 -0
|
@@ -0,0 +1,605 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module intent-inference
|
|
3
|
+
* @description Intent Inference Engine — 모호한 사용자 입력을 구체적 태스크 명세로 변환.
|
|
4
|
+
*
|
|
5
|
+
* 프로젝트 컨텍스트(git 상태, 디렉토리 구조, 최근 에러 등)를 분석하여
|
|
6
|
+
* 모호/간결한 입력도 실행 가능한 목표로 정제한다.
|
|
7
|
+
* 한국어 슬랭/축약어도 이해한다.
|
|
8
|
+
*/
|
|
9
|
+
import { execSync, execFileSync } from "node:child_process";
|
|
10
|
+
import { readFile, readdir } from "node:fs/promises";
|
|
11
|
+
import { join, basename } from "node:path";
|
|
12
|
+
import { BYOKClient } from "./llm-client.js";
|
|
13
|
+
const KOREAN_PATTERNS = {
|
|
14
|
+
bug_fix: { intent: "bug_fix", keywords: ["고쳐", "수정", "에러", "버그", "오류", "안됨", "안돼", "깨짐", "터짐", "뻑남"] },
|
|
15
|
+
feature: { intent: "feature", keywords: ["추가", "만들어", "넣어", "구현", "기능"] },
|
|
16
|
+
refactor: { intent: "refactor", keywords: ["리팩토링", "개선", "정리", "깔끔", "클린"] },
|
|
17
|
+
optimize: { intent: "optimize", keywords: ["느려", "빠르게", "최적화", "성능", "속도"] },
|
|
18
|
+
test: { intent: "test", keywords: ["테스트", "검증", "확인"] },
|
|
19
|
+
docs: { intent: "docs", keywords: ["문서", "주석", "설명"] },
|
|
20
|
+
};
|
|
21
|
+
const JAPANESE_PATTERNS = {
|
|
22
|
+
bug_fix: { intent: "bug_fix", keywords: ["直して", "修正", "エラー", "バグ", "壊れ", "動かない", "落ちる", "クラッシュ"] },
|
|
23
|
+
feature: { intent: "feature", keywords: ["追加", "作って", "実装", "機能", "新しい"] },
|
|
24
|
+
refactor: { intent: "refactor", keywords: ["リファクタ", "改善", "整理", "きれい", "クリーン"] },
|
|
25
|
+
optimize: { intent: "optimize", keywords: ["遅い", "速く", "最適化", "パフォーマンス", "高速"] },
|
|
26
|
+
test: { intent: "test", keywords: ["テスト", "検証", "確認"] },
|
|
27
|
+
docs: { intent: "docs", keywords: ["ドキュメント", "コメント", "説明", "文書"] },
|
|
28
|
+
};
|
|
29
|
+
const CHINESE_PATTERNS = {
|
|
30
|
+
bug_fix: { intent: "bug_fix", keywords: ["修复", "修改", "错误", "bug", "报错", "崩溃", "不行", "坏了"] },
|
|
31
|
+
feature: { intent: "feature", keywords: ["添加", "新增", "实现", "功能", "创建"] },
|
|
32
|
+
refactor: { intent: "refactor", keywords: ["重构", "改进", "整理", "优化代码", "清理"] },
|
|
33
|
+
optimize: { intent: "optimize", keywords: ["慢", "快", "优化", "性能", "速度"] },
|
|
34
|
+
test: { intent: "test", keywords: ["测试", "验证", "检查"] },
|
|
35
|
+
docs: { intent: "docs", keywords: ["文档", "注释", "说明"] },
|
|
36
|
+
};
|
|
37
|
+
const ENGLISH_PATTERNS = {
|
|
38
|
+
bug_fix: { intent: "bug_fix", keywords: ["fix", "bug", "error", "broken", "crash", "failing", "doesn't work", "not working"] },
|
|
39
|
+
feature: { intent: "feature", keywords: ["add", "create", "implement", "build", "new feature", "make"] },
|
|
40
|
+
refactor: { intent: "refactor", keywords: ["refactor", "improve", "clean up", "reorganize", "simplify"] },
|
|
41
|
+
optimize: { intent: "optimize", keywords: ["slow", "fast", "optimize", "performance", "speed up"] },
|
|
42
|
+
test: { intent: "test", keywords: ["test", "verify", "check", "coverage"] },
|
|
43
|
+
docs: { intent: "docs", keywords: ["document", "comment", "readme", "explain"] },
|
|
44
|
+
};
|
|
45
|
+
/** All language patterns merged for multi-language matching */
|
|
46
|
+
const ALL_LANG_PATTERNS = [
|
|
47
|
+
KOREAN_PATTERNS, JAPANESE_PATTERNS, CHINESE_PATTERNS, ENGLISH_PATTERNS,
|
|
48
|
+
];
|
|
49
|
+
/** 한국어 슬랭/축약어 → 의미 매핑 */
|
|
50
|
+
const KOREAN_SLANG = {
|
|
51
|
+
"ㅇㅇ": "yes/확인",
|
|
52
|
+
"ㄱㄱ": "go/진행",
|
|
53
|
+
"ㄴㄴ": "no/아니오",
|
|
54
|
+
"ㅎㅇ": "hi/인사",
|
|
55
|
+
"ㅂㅂ": "bye/종료",
|
|
56
|
+
"ㄱㅅ": "감사/thanks",
|
|
57
|
+
"ㅈㅅ": "죄송/sorry",
|
|
58
|
+
};
|
|
59
|
+
/** 다국어 지시 대명사 (모호성 증가 신호) */
|
|
60
|
+
const DEMONSTRATIVES = [
|
|
61
|
+
// Korean
|
|
62
|
+
"이거", "저거", "그거", "여기", "거기", "저기",
|
|
63
|
+
// Japanese
|
|
64
|
+
"これ", "それ", "あれ", "ここ", "そこ", "あそこ",
|
|
65
|
+
// Chinese
|
|
66
|
+
"这个", "那个", "这里", "那里",
|
|
67
|
+
// English
|
|
68
|
+
"this thing", "that thing", "this one", "that one",
|
|
69
|
+
];
|
|
70
|
+
// ─── Engine ───
|
|
71
|
+
/**
|
|
72
|
+
* Intent Inference Engine.
|
|
73
|
+
*
|
|
74
|
+
* 모호한 사용자 입력을 분석하고, 프로젝트 컨텍스트 신호를 수집하여
|
|
75
|
+
* 구체적이고 실행 가능한 태스크 명세로 변환한다.
|
|
76
|
+
*/
|
|
77
|
+
export class IntentInferenceEngine {
|
|
78
|
+
config;
|
|
79
|
+
llm;
|
|
80
|
+
constructor(config) {
|
|
81
|
+
this.config = config;
|
|
82
|
+
this.llm = new BYOKClient(config.byokConfig);
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* 리소스 정리. 내부 LLM 클라이언트를 해제한다.
|
|
86
|
+
*/
|
|
87
|
+
destroy() {
|
|
88
|
+
this.llm.destroy();
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* 사용자 입력을 분석하여 구체적 의도를 추론한다.
|
|
92
|
+
* @param userInput 사용자가 입력한 원본 텍스트
|
|
93
|
+
* @returns 추론된 의도 결과
|
|
94
|
+
*/
|
|
95
|
+
async infer(userInput) {
|
|
96
|
+
const trimmed = userInput.trim();
|
|
97
|
+
// 1. Quick heuristic classification
|
|
98
|
+
const classification = this.classifyInput(trimmed);
|
|
99
|
+
// 2. Gather context signals in parallel
|
|
100
|
+
const signals = await this.gatherSignals(trimmed);
|
|
101
|
+
// 3. Identify target files
|
|
102
|
+
const targetFiles = await this.identifyTargetFiles(trimmed, signals);
|
|
103
|
+
// 4. Refine goal via LLM (if ambiguous or low confidence)
|
|
104
|
+
const refinedGoal = await this.refineGoal(trimmed, signals, classification.category);
|
|
105
|
+
// 5. Generate suggested approach
|
|
106
|
+
const suggestedApproach = this.buildApproach(classification.category, targetFiles, signals);
|
|
107
|
+
return {
|
|
108
|
+
originalInput: trimmed,
|
|
109
|
+
isAmbiguous: classification.isAmbiguous,
|
|
110
|
+
category: classification.category,
|
|
111
|
+
confidence: classification.confidence,
|
|
112
|
+
refinedGoal,
|
|
113
|
+
targetFiles,
|
|
114
|
+
suggestedApproach,
|
|
115
|
+
signals,
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
// ─── Classification ───
|
|
119
|
+
/**
|
|
120
|
+
* 입력 텍스트를 휴리스틱으로 빠르게 분류한다.
|
|
121
|
+
* LLM 호출 없이 패턴 매칭으로 1차 분류.
|
|
122
|
+
*/
|
|
123
|
+
classifyInput(input) {
|
|
124
|
+
const isAmbiguous = this.detectAmbiguity(input);
|
|
125
|
+
// Try Korean pattern matching first
|
|
126
|
+
const koreanMatch = this.matchKoreanPatterns(input);
|
|
127
|
+
if (koreanMatch) {
|
|
128
|
+
return {
|
|
129
|
+
isAmbiguous,
|
|
130
|
+
category: koreanMatch.category,
|
|
131
|
+
confidence: isAmbiguous ? koreanMatch.confidence * 0.7 : koreanMatch.confidence,
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
// English pattern matching
|
|
135
|
+
const englishMatch = this.matchEnglishPatterns(input);
|
|
136
|
+
if (englishMatch) {
|
|
137
|
+
return {
|
|
138
|
+
isAmbiguous,
|
|
139
|
+
category: englishMatch.category,
|
|
140
|
+
confidence: isAmbiguous ? englishMatch.confidence * 0.7 : englishMatch.confidence,
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
return {
|
|
144
|
+
isAmbiguous,
|
|
145
|
+
category: "unknown",
|
|
146
|
+
confidence: 0.1,
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
/** 입력의 모호성을 판정한다. */
|
|
150
|
+
detectAmbiguity(input) {
|
|
151
|
+
// Very short input → likely ambiguous
|
|
152
|
+
if (input.length < 20)
|
|
153
|
+
return true;
|
|
154
|
+
// Only Korean slang (ㅇㅇ, ㄱㄱ) → definitely ambiguous
|
|
155
|
+
const slangOnly = input
|
|
156
|
+
.replace(/\s+/g, "")
|
|
157
|
+
.split("")
|
|
158
|
+
.every((ch) => /[ㄱ-ㅎㅏ-ㅣ]/.test(ch));
|
|
159
|
+
if (slangOnly && input.length < 10)
|
|
160
|
+
return true;
|
|
161
|
+
// Contains demonstratives without specifics
|
|
162
|
+
const hasDemo = DEMONSTRATIVES.some((d) => input.includes(d));
|
|
163
|
+
const hasFilePath = /[./\\][\w-]+\.\w+/.test(input) || /\/[\w-/]+/.test(input);
|
|
164
|
+
if (hasDemo && !hasFilePath)
|
|
165
|
+
return true;
|
|
166
|
+
// Has specific signals → NOT ambiguous
|
|
167
|
+
const hasFunctionName = /\b[a-zA-Z_]\w*\(/.test(input);
|
|
168
|
+
const hasErrorMessage = /error|Error|exception|Exception|failed|Failed|Cannot|cannot/.test(input);
|
|
169
|
+
if (hasFilePath || hasFunctionName || hasErrorMessage)
|
|
170
|
+
return false;
|
|
171
|
+
// No file paths mentioned → might be ambiguous
|
|
172
|
+
if (!hasFilePath)
|
|
173
|
+
return true;
|
|
174
|
+
return false;
|
|
175
|
+
}
|
|
176
|
+
/** 한국어 키워드 패턴 매칭 */
|
|
177
|
+
matchKoreanPatterns(input) {
|
|
178
|
+
// Match across all languages (Korean, Japanese, Chinese, English)
|
|
179
|
+
let bestMatch = null;
|
|
180
|
+
let bestCount = 0;
|
|
181
|
+
for (const langPatterns of ALL_LANG_PATTERNS) {
|
|
182
|
+
for (const [, pattern] of Object.entries(langPatterns)) {
|
|
183
|
+
const matchCount = pattern.keywords.filter((kw) => input.toLowerCase().includes(kw.toLowerCase())).length;
|
|
184
|
+
if (matchCount > bestCount) {
|
|
185
|
+
bestCount = matchCount;
|
|
186
|
+
bestMatch = {
|
|
187
|
+
category: pattern.intent,
|
|
188
|
+
confidence: Math.min(0.5 + matchCount * 0.15, 0.9),
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
return bestMatch;
|
|
194
|
+
}
|
|
195
|
+
/** 영어 키워드 패턴 매칭 */
|
|
196
|
+
matchEnglishPatterns(input) {
|
|
197
|
+
const lower = input.toLowerCase();
|
|
198
|
+
const patterns = [
|
|
199
|
+
{ category: "bug_fix", keywords: ["fix", "bug", "error", "broken", "crash", "issue", "wrong", "fail"], weight: 0.15 },
|
|
200
|
+
{ category: "feature", keywords: ["add", "create", "implement", "new", "build", "feature"], weight: 0.15 },
|
|
201
|
+
{ category: "refactor", keywords: ["refactor", "clean", "reorganize", "restructure", "simplify", "extract"], weight: 0.15 },
|
|
202
|
+
{ category: "test", keywords: ["test", "spec", "coverage", "assert", "mock", "jest", "vitest"], weight: 0.15 },
|
|
203
|
+
{ category: "docs", keywords: ["doc", "document", "readme", "comment", "jsdoc", "explain"], weight: 0.15 },
|
|
204
|
+
{ category: "optimize", keywords: ["optimize", "performance", "slow", "fast", "speed", "cache", "memory"], weight: 0.15 },
|
|
205
|
+
{ category: "upgrade", keywords: ["upgrade", "update", "migrate", "version", "dependency", "bump"], weight: 0.15 },
|
|
206
|
+
{ category: "explore", keywords: ["explain", "understand", "how", "what", "where", "find", "show", "list"], weight: 0.1 },
|
|
207
|
+
];
|
|
208
|
+
let bestMatch = null;
|
|
209
|
+
let bestScore = 0;
|
|
210
|
+
for (const pattern of patterns) {
|
|
211
|
+
const matchCount = pattern.keywords.filter((kw) => lower.includes(kw)).length;
|
|
212
|
+
const score = matchCount * pattern.weight;
|
|
213
|
+
if (score > bestScore) {
|
|
214
|
+
bestScore = score;
|
|
215
|
+
bestMatch = {
|
|
216
|
+
category: pattern.category,
|
|
217
|
+
confidence: Math.min(0.4 + score, 0.9),
|
|
218
|
+
};
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
return bestMatch;
|
|
222
|
+
}
|
|
223
|
+
// ─── Signal Gathering ───
|
|
224
|
+
/**
|
|
225
|
+
* 프로젝트 컨텍스트에서 의도 추론에 도움이 되는 신호를 수집한다.
|
|
226
|
+
* git 상태, 프로젝트 구조, 최근 에러 등을 병렬로 수집.
|
|
227
|
+
*/
|
|
228
|
+
async gatherSignals(input) {
|
|
229
|
+
const signals = [];
|
|
230
|
+
// Gather in parallel
|
|
231
|
+
const [gitSignals, structureSignals, errorSignals, koreanSignals] = await Promise.allSettled([
|
|
232
|
+
this.gatherGitSignals(),
|
|
233
|
+
this.gatherStructureSignals(),
|
|
234
|
+
this.gatherErrorSignals(),
|
|
235
|
+
Promise.resolve(this.gatherKoreanNLPSignals(input)),
|
|
236
|
+
]);
|
|
237
|
+
if (gitSignals.status === "fulfilled")
|
|
238
|
+
signals.push(...gitSignals.value);
|
|
239
|
+
if (structureSignals.status === "fulfilled")
|
|
240
|
+
signals.push(...structureSignals.value);
|
|
241
|
+
if (errorSignals.status === "fulfilled")
|
|
242
|
+
signals.push(...errorSignals.value);
|
|
243
|
+
if (koreanSignals.status === "fulfilled")
|
|
244
|
+
signals.push(...koreanSignals.value);
|
|
245
|
+
// Sort by relevance
|
|
246
|
+
signals.sort((a, b) => b.relevance - a.relevance);
|
|
247
|
+
return signals;
|
|
248
|
+
}
|
|
249
|
+
/** Git 상태에서 신호 수집 */
|
|
250
|
+
async gatherGitSignals() {
|
|
251
|
+
const signals = [];
|
|
252
|
+
const cwd = this.config.projectPath;
|
|
253
|
+
try {
|
|
254
|
+
// Uncommitted changes
|
|
255
|
+
const status = execSync("git status --porcelain", {
|
|
256
|
+
cwd,
|
|
257
|
+
encoding: "utf-8",
|
|
258
|
+
timeout: 5_000,
|
|
259
|
+
}).trim();
|
|
260
|
+
if (status) {
|
|
261
|
+
const changedFiles = status
|
|
262
|
+
.split("\n")
|
|
263
|
+
.map((line) => line.slice(3).trim())
|
|
264
|
+
.filter(Boolean);
|
|
265
|
+
signals.push({
|
|
266
|
+
source: "git_status",
|
|
267
|
+
description: `Uncommitted changes in ${changedFiles.length} file(s): ${changedFiles.slice(0, 5).join(", ")}`,
|
|
268
|
+
relevance: 0.8,
|
|
269
|
+
});
|
|
270
|
+
}
|
|
271
|
+
// Recent commits
|
|
272
|
+
const log = execSync("git log --oneline -5", {
|
|
273
|
+
cwd,
|
|
274
|
+
encoding: "utf-8",
|
|
275
|
+
timeout: 5_000,
|
|
276
|
+
}).trim();
|
|
277
|
+
if (log) {
|
|
278
|
+
signals.push({
|
|
279
|
+
source: "git_status",
|
|
280
|
+
description: `Recent commits:\n${log}`,
|
|
281
|
+
relevance: 0.5,
|
|
282
|
+
});
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
catch {
|
|
286
|
+
// Not a git repo or git unavailable — skip
|
|
287
|
+
}
|
|
288
|
+
return signals;
|
|
289
|
+
}
|
|
290
|
+
/** 프로젝트 구조에서 신호 수집 */
|
|
291
|
+
async gatherStructureSignals() {
|
|
292
|
+
const signals = [];
|
|
293
|
+
const root = this.config.projectPath;
|
|
294
|
+
try {
|
|
295
|
+
// package.json
|
|
296
|
+
const pkgPath = join(root, "package.json");
|
|
297
|
+
const pkgRaw = await readFile(pkgPath, "utf-8");
|
|
298
|
+
const pkg = JSON.parse(pkgRaw);
|
|
299
|
+
const projectType = pkg.type === "module" ? "ESM" : "CommonJS";
|
|
300
|
+
const deps = Object.keys((pkg.dependencies ?? {}));
|
|
301
|
+
const devDeps = Object.keys((pkg.devDependencies ?? {}));
|
|
302
|
+
signals.push({
|
|
303
|
+
source: "project_structure",
|
|
304
|
+
description: `Project: ${pkg.name ?? basename(root)} (${projectType}). Dependencies: ${deps.slice(0, 10).join(", ")}. DevDeps: ${devDeps.slice(0, 5).join(", ")}`,
|
|
305
|
+
relevance: 0.6,
|
|
306
|
+
});
|
|
307
|
+
}
|
|
308
|
+
catch {
|
|
309
|
+
// No package.json — try other signals
|
|
310
|
+
}
|
|
311
|
+
try {
|
|
312
|
+
// tsconfig check
|
|
313
|
+
const tsconfigPath = join(root, "tsconfig.json");
|
|
314
|
+
await readFile(tsconfigPath, "utf-8");
|
|
315
|
+
signals.push({
|
|
316
|
+
source: "project_structure",
|
|
317
|
+
description: "TypeScript project (tsconfig.json found)",
|
|
318
|
+
relevance: 0.4,
|
|
319
|
+
});
|
|
320
|
+
}
|
|
321
|
+
catch {
|
|
322
|
+
// Not TypeScript
|
|
323
|
+
}
|
|
324
|
+
try {
|
|
325
|
+
// Top-level directory listing
|
|
326
|
+
const entries = await readdir(root, { withFileTypes: true });
|
|
327
|
+
const dirs = entries
|
|
328
|
+
.filter((e) => e.isDirectory() && !e.name.startsWith(".") && e.name !== "node_modules")
|
|
329
|
+
.map((e) => e.name);
|
|
330
|
+
const files = entries
|
|
331
|
+
.filter((e) => e.isFile())
|
|
332
|
+
.map((e) => e.name)
|
|
333
|
+
.slice(0, 10);
|
|
334
|
+
signals.push({
|
|
335
|
+
source: "project_structure",
|
|
336
|
+
description: `Top-level dirs: ${dirs.join(", ")}. Files: ${files.join(", ")}`,
|
|
337
|
+
relevance: 0.3,
|
|
338
|
+
});
|
|
339
|
+
}
|
|
340
|
+
catch {
|
|
341
|
+
// Can't read directory
|
|
342
|
+
}
|
|
343
|
+
return signals;
|
|
344
|
+
}
|
|
345
|
+
/** 최근 에러/빌드 실패 신호 수집 */
|
|
346
|
+
async gatherErrorSignals() {
|
|
347
|
+
const signals = [];
|
|
348
|
+
const cwd = this.config.projectPath;
|
|
349
|
+
try {
|
|
350
|
+
// Check recent git diff for error-related changes
|
|
351
|
+
const diff = execSync("git diff HEAD --stat", {
|
|
352
|
+
cwd,
|
|
353
|
+
encoding: "utf-8",
|
|
354
|
+
timeout: 5_000,
|
|
355
|
+
}).trim();
|
|
356
|
+
if (diff) {
|
|
357
|
+
signals.push({
|
|
358
|
+
source: "recent_errors",
|
|
359
|
+
description: `Recent diff stats:\n${diff}`,
|
|
360
|
+
relevance: 0.4,
|
|
361
|
+
});
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
catch {
|
|
365
|
+
// No diff or git unavailable
|
|
366
|
+
}
|
|
367
|
+
// Check for common error log files
|
|
368
|
+
const errorLogPaths = [
|
|
369
|
+
"npm-debug.log",
|
|
370
|
+
"yarn-error.log",
|
|
371
|
+
".next/error.log",
|
|
372
|
+
];
|
|
373
|
+
for (const logPath of errorLogPaths) {
|
|
374
|
+
try {
|
|
375
|
+
const content = await readFile(join(cwd, logPath), "utf-8");
|
|
376
|
+
// Only take last 500 chars to avoid context bloat
|
|
377
|
+
const tail = content.slice(-500);
|
|
378
|
+
signals.push({
|
|
379
|
+
source: "recent_errors",
|
|
380
|
+
description: `Error log found (${logPath}): ...${tail}`,
|
|
381
|
+
relevance: 0.9,
|
|
382
|
+
});
|
|
383
|
+
}
|
|
384
|
+
catch {
|
|
385
|
+
// Log file doesn't exist — normal
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
return signals;
|
|
389
|
+
}
|
|
390
|
+
/** 한국어 NLP 신호 수집 (슬랭, 축약어, 패턴) */
|
|
391
|
+
gatherKoreanNLPSignals(input) {
|
|
392
|
+
const signals = [];
|
|
393
|
+
// Detect Korean slang
|
|
394
|
+
for (const [slang, meaning] of Object.entries(KOREAN_SLANG)) {
|
|
395
|
+
if (input.includes(slang)) {
|
|
396
|
+
signals.push({
|
|
397
|
+
source: "korean_nlp",
|
|
398
|
+
description: `Korean slang detected: "${slang}" → ${meaning}`,
|
|
399
|
+
relevance: 0.3,
|
|
400
|
+
});
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
// Detect demonstratives (context-dependent words)
|
|
404
|
+
const foundDemos = DEMONSTRATIVES.filter((d) => input.includes(d));
|
|
405
|
+
if (foundDemos.length > 0) {
|
|
406
|
+
signals.push({
|
|
407
|
+
source: "korean_nlp",
|
|
408
|
+
description: `Demonstratives found: ${foundDemos.join(", ")} — needs contextual resolution`,
|
|
409
|
+
relevance: 0.6,
|
|
410
|
+
});
|
|
411
|
+
}
|
|
412
|
+
// Detect Korean intent keywords
|
|
413
|
+
for (const [category, pattern] of Object.entries(KOREAN_PATTERNS)) {
|
|
414
|
+
const matched = pattern.keywords.filter((kw) => input.includes(kw));
|
|
415
|
+
if (matched.length > 0) {
|
|
416
|
+
signals.push({
|
|
417
|
+
source: "korean_nlp",
|
|
418
|
+
description: `Korean intent keywords (${category}): ${matched.join(", ")}`,
|
|
419
|
+
relevance: 0.7,
|
|
420
|
+
});
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
return signals;
|
|
424
|
+
}
|
|
425
|
+
// ─── Goal Refinement ───
|
|
426
|
+
/**
|
|
427
|
+
* LLM을 사용하여 모호한 입력을 구체적 태스크 명세로 변환한다.
|
|
428
|
+
*/
|
|
429
|
+
async refineGoal(input, signals, category) {
|
|
430
|
+
const signalsSummary = signals
|
|
431
|
+
.filter((s) => s.relevance >= 0.3)
|
|
432
|
+
.map((s) => `- [${s.source}] ${s.description}`)
|
|
433
|
+
.join("\n");
|
|
434
|
+
const prompt = [
|
|
435
|
+
`User said: "${input}"`,
|
|
436
|
+
"",
|
|
437
|
+
"Context signals:",
|
|
438
|
+
signalsSummary || "(no signals available)",
|
|
439
|
+
"",
|
|
440
|
+
`This appears to be a ${category} request.`,
|
|
441
|
+
"",
|
|
442
|
+
"Convert this into a specific, actionable task description.",
|
|
443
|
+
"Include: what exactly to do, which files to modify, expected outcome.",
|
|
444
|
+
"Be concrete and technical.",
|
|
445
|
+
"If the input is in Korean, respond in Korean.",
|
|
446
|
+
"Keep the response under 200 words.",
|
|
447
|
+
].join("\n");
|
|
448
|
+
try {
|
|
449
|
+
const response = await this.llm.chat([
|
|
450
|
+
{
|
|
451
|
+
role: "system",
|
|
452
|
+
content: "You are a coding task specification engine. Convert vague user requests into precise, actionable task descriptions. Be technical and specific. Output ONLY the task description, no preamble.",
|
|
453
|
+
},
|
|
454
|
+
{ role: "user", content: prompt },
|
|
455
|
+
]);
|
|
456
|
+
return response.content?.trim() ?? input;
|
|
457
|
+
}
|
|
458
|
+
catch {
|
|
459
|
+
// LLM call failed — fall back to original input with category prefix
|
|
460
|
+
return `[${category}] ${input}`;
|
|
461
|
+
}
|
|
462
|
+
}
|
|
463
|
+
// ─── Target File Identification ───
|
|
464
|
+
/**
|
|
465
|
+
* 입력 텍스트와 컨텍스트 신호에서 관련 파일을 추론한다.
|
|
466
|
+
*/
|
|
467
|
+
async identifyTargetFiles(input, signals) {
|
|
468
|
+
const files = new Set();
|
|
469
|
+
// 1. Extract explicit file paths from input
|
|
470
|
+
const filePathRegex = /(?:^|\s)((?:\.\/|\/)?[\w./-]+\.(?:ts|tsx|js|jsx|json|css|scss|md|yaml|yml|toml|py|go|rs|java|c|h|cpp))\b/g;
|
|
471
|
+
let match;
|
|
472
|
+
while ((match = filePathRegex.exec(input)) !== null) {
|
|
473
|
+
files.add(match[1]);
|
|
474
|
+
}
|
|
475
|
+
// 2. Extract files from git status signals
|
|
476
|
+
for (const signal of signals) {
|
|
477
|
+
if (signal.source === "git_status" && signal.description.includes("Uncommitted changes")) {
|
|
478
|
+
const fileList = signal.description
|
|
479
|
+
.split(": ")
|
|
480
|
+
.slice(1)
|
|
481
|
+
.join(": ")
|
|
482
|
+
.split(", ");
|
|
483
|
+
for (const f of fileList) {
|
|
484
|
+
if (f && !f.includes("..."))
|
|
485
|
+
files.add(f.trim());
|
|
486
|
+
}
|
|
487
|
+
}
|
|
488
|
+
}
|
|
489
|
+
// 3. Try to find files matching keywords in input
|
|
490
|
+
if (files.size === 0) {
|
|
491
|
+
const identifiers = input.match(/\b[a-zA-Z][\w-]*(?:\.(?:ts|tsx|js|jsx))?/g) ?? [];
|
|
492
|
+
const cwd = this.config.projectPath;
|
|
493
|
+
for (const id of identifiers.slice(0, 5)) {
|
|
494
|
+
// Only look for identifiers that look like file names
|
|
495
|
+
if (id.length < 3 || /^(the|and|for|but|not|fix|add|get|set|new|old|use|can|has|was|are|did)$/i.test(id)) {
|
|
496
|
+
continue;
|
|
497
|
+
}
|
|
498
|
+
// Sanitize: strip any characters that are not alphanumeric, dash, underscore, or dot
|
|
499
|
+
const safeId = id.replace(/[^a-zA-Z0-9._-]/g, "");
|
|
500
|
+
if (safeId.length < 3)
|
|
501
|
+
continue;
|
|
502
|
+
try {
|
|
503
|
+
const found = execFileSync("find", [
|
|
504
|
+
".", "-name", `*${safeId}*`, "-type", "f",
|
|
505
|
+
"-not", "-path", "*/node_modules/*",
|
|
506
|
+
"-not", "-path", "*/.git/*",
|
|
507
|
+
], {
|
|
508
|
+
cwd,
|
|
509
|
+
encoding: "utf-8",
|
|
510
|
+
timeout: 3_000,
|
|
511
|
+
maxBuffer: 4096,
|
|
512
|
+
}).trim();
|
|
513
|
+
// Take only first 3 results
|
|
514
|
+
const lines = found.split("\n").filter(Boolean).slice(0, 3);
|
|
515
|
+
for (const f of lines) {
|
|
516
|
+
files.add(f.replace(/^\.\//, ""));
|
|
517
|
+
}
|
|
518
|
+
}
|
|
519
|
+
catch {
|
|
520
|
+
// find failed — skip
|
|
521
|
+
}
|
|
522
|
+
}
|
|
523
|
+
}
|
|
524
|
+
return Array.from(files).slice(0, 20);
|
|
525
|
+
}
|
|
526
|
+
// ─── Approach Building ───
|
|
527
|
+
/**
|
|
528
|
+
* 카테고리와 대상 파일에 기반한 접근 방법 제안을 생성한다.
|
|
529
|
+
*/
|
|
530
|
+
buildApproach(category, targetFiles, signals) {
|
|
531
|
+
const fileList = targetFiles.length > 0
|
|
532
|
+
? `Target files: ${targetFiles.slice(0, 5).join(", ")}`
|
|
533
|
+
: "No specific files identified yet — will scan project structure";
|
|
534
|
+
const hasGitChanges = signals.some((s) => s.source === "git_status" && s.description.includes("Uncommitted"));
|
|
535
|
+
const approaches = {
|
|
536
|
+
bug_fix: [
|
|
537
|
+
"1. Reproduce the issue by examining error context",
|
|
538
|
+
"2. Identify root cause in the relevant source files",
|
|
539
|
+
"3. Apply minimal fix to resolve the issue",
|
|
540
|
+
"4. Verify fix doesn't introduce regressions",
|
|
541
|
+
fileList,
|
|
542
|
+
].join("\n"),
|
|
543
|
+
feature: [
|
|
544
|
+
"1. Understand the feature requirements",
|
|
545
|
+
"2. Identify insertion points in existing code",
|
|
546
|
+
"3. Implement the feature with proper types",
|
|
547
|
+
"4. Add necessary exports and integrations",
|
|
548
|
+
fileList,
|
|
549
|
+
].join("\n"),
|
|
550
|
+
refactor: [
|
|
551
|
+
"1. Analyze current code structure and dependencies",
|
|
552
|
+
"2. Plan refactoring steps to minimize breakage",
|
|
553
|
+
"3. Apply refactoring incrementally",
|
|
554
|
+
"4. Verify all imports and references are updated",
|
|
555
|
+
fileList,
|
|
556
|
+
].join("\n"),
|
|
557
|
+
test: [
|
|
558
|
+
"1. Identify testable units and coverage gaps",
|
|
559
|
+
"2. Write test cases covering happy path and edge cases",
|
|
560
|
+
"3. Ensure test infrastructure is set up",
|
|
561
|
+
"4. Verify all tests pass",
|
|
562
|
+
fileList,
|
|
563
|
+
].join("\n"),
|
|
564
|
+
docs: [
|
|
565
|
+
"1. Identify undocumented or poorly documented areas",
|
|
566
|
+
"2. Write clear JSDoc/inline comments",
|
|
567
|
+
"3. Update README or related docs if needed",
|
|
568
|
+
fileList,
|
|
569
|
+
].join("\n"),
|
|
570
|
+
optimize: [
|
|
571
|
+
"1. Profile and identify performance bottlenecks",
|
|
572
|
+
"2. Analyze algorithmic complexity",
|
|
573
|
+
"3. Apply targeted optimizations",
|
|
574
|
+
"4. Benchmark before and after",
|
|
575
|
+
fileList,
|
|
576
|
+
].join("\n"),
|
|
577
|
+
upgrade: [
|
|
578
|
+
"1. Check current dependency versions",
|
|
579
|
+
"2. Review changelogs for breaking changes",
|
|
580
|
+
"3. Update dependencies incrementally",
|
|
581
|
+
"4. Fix any breaking API changes",
|
|
582
|
+
"5. Verify build and tests pass",
|
|
583
|
+
fileList,
|
|
584
|
+
].join("\n"),
|
|
585
|
+
explore: [
|
|
586
|
+
"1. Scan project structure and entry points",
|
|
587
|
+
"2. Trace the relevant code flow",
|
|
588
|
+
"3. Summarize findings with code references",
|
|
589
|
+
fileList,
|
|
590
|
+
].join("\n"),
|
|
591
|
+
unknown: [
|
|
592
|
+
"1. Clarify the user's intent from context",
|
|
593
|
+
"2. Scan project for relevant patterns",
|
|
594
|
+
"3. Propose a concrete action plan",
|
|
595
|
+
fileList,
|
|
596
|
+
].join("\n"),
|
|
597
|
+
};
|
|
598
|
+
let approach = approaches[category];
|
|
599
|
+
if (hasGitChanges) {
|
|
600
|
+
approach += "\n\nNote: There are uncommitted git changes — consider reviewing them for context.";
|
|
601
|
+
}
|
|
602
|
+
return approach;
|
|
603
|
+
}
|
|
604
|
+
}
|
|
605
|
+
//# sourceMappingURL=intent-inference.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"intent-inference.js","sourceRoot":"","sources":["../src/intent-inference.ts"],"names":[],"mappings":"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"}
|