@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.
Files changed (235) hide show
  1. package/LICENSE +663 -0
  2. package/README.md +15 -0
  3. package/dist/__tests__/context-manager.test.d.ts +6 -0
  4. package/dist/__tests__/context-manager.test.d.ts.map +1 -0
  5. package/dist/__tests__/context-manager.test.js +220 -0
  6. package/dist/__tests__/context-manager.test.js.map +1 -0
  7. package/dist/__tests__/governor.test.d.ts +6 -0
  8. package/dist/__tests__/governor.test.d.ts.map +1 -0
  9. package/dist/__tests__/governor.test.js +210 -0
  10. package/dist/__tests__/governor.test.js.map +1 -0
  11. package/dist/__tests__/model-router.test.d.ts +6 -0
  12. package/dist/__tests__/model-router.test.d.ts.map +1 -0
  13. package/dist/__tests__/model-router.test.js +329 -0
  14. package/dist/__tests__/model-router.test.js.map +1 -0
  15. package/dist/agent-logger.d.ts +384 -0
  16. package/dist/agent-logger.d.ts.map +1 -0
  17. package/dist/agent-logger.js +820 -0
  18. package/dist/agent-logger.js.map +1 -0
  19. package/dist/agent-loop.d.ts +163 -0
  20. package/dist/agent-loop.d.ts.map +1 -0
  21. package/dist/agent-loop.js +609 -0
  22. package/dist/agent-loop.js.map +1 -0
  23. package/dist/agent-modes.d.ts +85 -0
  24. package/dist/agent-modes.d.ts.map +1 -0
  25. package/dist/agent-modes.js +418 -0
  26. package/dist/agent-modes.js.map +1 -0
  27. package/dist/approval.d.ts +137 -0
  28. package/dist/approval.d.ts.map +1 -0
  29. package/dist/approval.js +299 -0
  30. package/dist/approval.js.map +1 -0
  31. package/dist/async-completion-queue.d.ts +56 -0
  32. package/dist/async-completion-queue.d.ts.map +1 -0
  33. package/dist/async-completion-queue.js +77 -0
  34. package/dist/async-completion-queue.js.map +1 -0
  35. package/dist/auto-fix.d.ts +174 -0
  36. package/dist/auto-fix.d.ts.map +1 -0
  37. package/dist/auto-fix.js +319 -0
  38. package/dist/auto-fix.js.map +1 -0
  39. package/dist/codebase-context.d.ts +396 -0
  40. package/dist/codebase-context.d.ts.map +1 -0
  41. package/dist/codebase-context.js +1260 -0
  42. package/dist/codebase-context.js.map +1 -0
  43. package/dist/conflict-resolver.d.ts +191 -0
  44. package/dist/conflict-resolver.d.ts.map +1 -0
  45. package/dist/conflict-resolver.js +524 -0
  46. package/dist/conflict-resolver.js.map +1 -0
  47. package/dist/constants.d.ts +52 -0
  48. package/dist/constants.d.ts.map +1 -0
  49. package/dist/constants.js +141 -0
  50. package/dist/constants.js.map +1 -0
  51. package/dist/context-budget.d.ts +435 -0
  52. package/dist/context-budget.d.ts.map +1 -0
  53. package/dist/context-budget.js +903 -0
  54. package/dist/context-budget.js.map +1 -0
  55. package/dist/context-compressor.d.ts +143 -0
  56. package/dist/context-compressor.d.ts.map +1 -0
  57. package/dist/context-compressor.js +511 -0
  58. package/dist/context-compressor.js.map +1 -0
  59. package/dist/context-manager.d.ts +112 -0
  60. package/dist/context-manager.d.ts.map +1 -0
  61. package/dist/context-manager.js +247 -0
  62. package/dist/context-manager.js.map +1 -0
  63. package/dist/continuous-reflection.d.ts +267 -0
  64. package/dist/continuous-reflection.d.ts.map +1 -0
  65. package/dist/continuous-reflection.js +338 -0
  66. package/dist/continuous-reflection.js.map +1 -0
  67. package/dist/cross-file-refactor.d.ts +352 -0
  68. package/dist/cross-file-refactor.d.ts.map +1 -0
  69. package/dist/cross-file-refactor.js +1544 -0
  70. package/dist/cross-file-refactor.js.map +1 -0
  71. package/dist/dag-orchestrator.d.ts +138 -0
  72. package/dist/dag-orchestrator.d.ts.map +1 -0
  73. package/dist/dag-orchestrator.js +379 -0
  74. package/dist/dag-orchestrator.js.map +1 -0
  75. package/dist/debate-orchestrator.d.ts +301 -0
  76. package/dist/debate-orchestrator.d.ts.map +1 -0
  77. package/dist/debate-orchestrator.js +719 -0
  78. package/dist/debate-orchestrator.js.map +1 -0
  79. package/dist/dependency-analyzer.d.ts +113 -0
  80. package/dist/dependency-analyzer.d.ts.map +1 -0
  81. package/dist/dependency-analyzer.js +444 -0
  82. package/dist/dependency-analyzer.js.map +1 -0
  83. package/dist/design-loop.d.ts +59 -0
  84. package/dist/design-loop.d.ts.map +1 -0
  85. package/dist/design-loop.js +344 -0
  86. package/dist/design-loop.js.map +1 -0
  87. package/dist/doc-intelligence.d.ts +383 -0
  88. package/dist/doc-intelligence.d.ts.map +1 -0
  89. package/dist/doc-intelligence.js +1307 -0
  90. package/dist/doc-intelligence.js.map +1 -0
  91. package/dist/dynamic-role-generator.d.ts +76 -0
  92. package/dist/dynamic-role-generator.d.ts.map +1 -0
  93. package/dist/dynamic-role-generator.js +194 -0
  94. package/dist/dynamic-role-generator.js.map +1 -0
  95. package/dist/errors.d.ts +69 -0
  96. package/dist/errors.d.ts.map +1 -0
  97. package/dist/errors.js +102 -0
  98. package/dist/errors.js.map +1 -0
  99. package/dist/event-bus.d.ts +159 -0
  100. package/dist/event-bus.d.ts.map +1 -0
  101. package/dist/event-bus.js +305 -0
  102. package/dist/event-bus.js.map +1 -0
  103. package/dist/execution-engine.d.ts +425 -0
  104. package/dist/execution-engine.d.ts.map +1 -0
  105. package/dist/execution-engine.js +1555 -0
  106. package/dist/execution-engine.js.map +1 -0
  107. package/dist/git-intelligence.d.ts +306 -0
  108. package/dist/git-intelligence.d.ts.map +1 -0
  109. package/dist/git-intelligence.js +1099 -0
  110. package/dist/git-intelligence.js.map +1 -0
  111. package/dist/governor.d.ts +77 -0
  112. package/dist/governor.d.ts.map +1 -0
  113. package/dist/governor.js +161 -0
  114. package/dist/governor.js.map +1 -0
  115. package/dist/hierarchical-planner.d.ts +313 -0
  116. package/dist/hierarchical-planner.d.ts.map +1 -0
  117. package/dist/hierarchical-planner.js +981 -0
  118. package/dist/hierarchical-planner.js.map +1 -0
  119. package/dist/index.d.ts +121 -0
  120. package/dist/index.d.ts.map +1 -0
  121. package/dist/index.js +123 -0
  122. package/dist/index.js.map +1 -0
  123. package/dist/intent-inference.d.ts +103 -0
  124. package/dist/intent-inference.d.ts.map +1 -0
  125. package/dist/intent-inference.js +605 -0
  126. package/dist/intent-inference.js.map +1 -0
  127. package/dist/interrupt-manager.d.ts +143 -0
  128. package/dist/interrupt-manager.d.ts.map +1 -0
  129. package/dist/interrupt-manager.js +196 -0
  130. package/dist/interrupt-manager.js.map +1 -0
  131. package/dist/kernel.d.ts +564 -0
  132. package/dist/kernel.d.ts.map +1 -0
  133. package/dist/kernel.js +1419 -0
  134. package/dist/kernel.js.map +1 -0
  135. package/dist/language-support.d.ts +232 -0
  136. package/dist/language-support.d.ts.map +1 -0
  137. package/dist/language-support.js +1134 -0
  138. package/dist/language-support.js.map +1 -0
  139. package/dist/llm-client.d.ts +82 -0
  140. package/dist/llm-client.d.ts.map +1 -0
  141. package/dist/llm-client.js +475 -0
  142. package/dist/llm-client.js.map +1 -0
  143. package/dist/mcp-client.d.ts +232 -0
  144. package/dist/mcp-client.d.ts.map +1 -0
  145. package/dist/mcp-client.js +718 -0
  146. package/dist/mcp-client.js.map +1 -0
  147. package/dist/memory-manager.d.ts +200 -0
  148. package/dist/memory-manager.d.ts.map +1 -0
  149. package/dist/memory-manager.js +568 -0
  150. package/dist/memory-manager.js.map +1 -0
  151. package/dist/memory.d.ts +87 -0
  152. package/dist/memory.d.ts.map +1 -0
  153. package/dist/memory.js +341 -0
  154. package/dist/memory.js.map +1 -0
  155. package/dist/model-router.d.ts +245 -0
  156. package/dist/model-router.d.ts.map +1 -0
  157. package/dist/model-router.js +632 -0
  158. package/dist/model-router.js.map +1 -0
  159. package/dist/parallel-executor.d.ts +125 -0
  160. package/dist/parallel-executor.d.ts.map +1 -0
  161. package/dist/parallel-executor.js +201 -0
  162. package/dist/parallel-executor.js.map +1 -0
  163. package/dist/perf-optimizer.d.ts +212 -0
  164. package/dist/perf-optimizer.d.ts.map +1 -0
  165. package/dist/perf-optimizer.js +721 -0
  166. package/dist/perf-optimizer.js.map +1 -0
  167. package/dist/persona.d.ts +305 -0
  168. package/dist/persona.d.ts.map +1 -0
  169. package/dist/persona.js +887 -0
  170. package/dist/persona.js.map +1 -0
  171. package/dist/planner.d.ts +70 -0
  172. package/dist/planner.d.ts.map +1 -0
  173. package/dist/planner.js +264 -0
  174. package/dist/planner.js.map +1 -0
  175. package/dist/qa-pipeline.d.ts +365 -0
  176. package/dist/qa-pipeline.d.ts.map +1 -0
  177. package/dist/qa-pipeline.js +1352 -0
  178. package/dist/qa-pipeline.js.map +1 -0
  179. package/dist/reasoning-adapter.d.ts +116 -0
  180. package/dist/reasoning-adapter.d.ts.map +1 -0
  181. package/dist/reasoning-adapter.js +187 -0
  182. package/dist/reasoning-adapter.js.map +1 -0
  183. package/dist/role-registry.d.ts +55 -0
  184. package/dist/role-registry.d.ts.map +1 -0
  185. package/dist/role-registry.js +192 -0
  186. package/dist/role-registry.js.map +1 -0
  187. package/dist/sandbox-tiers.d.ts +327 -0
  188. package/dist/sandbox-tiers.d.ts.map +1 -0
  189. package/dist/sandbox-tiers.js +928 -0
  190. package/dist/sandbox-tiers.js.map +1 -0
  191. package/dist/security-scanner.d.ts +222 -0
  192. package/dist/security-scanner.d.ts.map +1 -0
  193. package/dist/security-scanner.js +1129 -0
  194. package/dist/security-scanner.js.map +1 -0
  195. package/dist/security.d.ts +93 -0
  196. package/dist/security.d.ts.map +1 -0
  197. package/dist/security.js +393 -0
  198. package/dist/security.js.map +1 -0
  199. package/dist/self-reflection.d.ts +397 -0
  200. package/dist/self-reflection.d.ts.map +1 -0
  201. package/dist/self-reflection.js +908 -0
  202. package/dist/self-reflection.js.map +1 -0
  203. package/dist/session-persistence.d.ts +191 -0
  204. package/dist/session-persistence.d.ts.map +1 -0
  205. package/dist/session-persistence.js +395 -0
  206. package/dist/session-persistence.js.map +1 -0
  207. package/dist/speculative-executor.d.ts +210 -0
  208. package/dist/speculative-executor.d.ts.map +1 -0
  209. package/dist/speculative-executor.js +618 -0
  210. package/dist/speculative-executor.js.map +1 -0
  211. package/dist/state-machine.d.ts +289 -0
  212. package/dist/state-machine.d.ts.map +1 -0
  213. package/dist/state-machine.js +695 -0
  214. package/dist/state-machine.js.map +1 -0
  215. package/dist/sub-agent.d.ts +177 -0
  216. package/dist/sub-agent.d.ts.map +1 -0
  217. package/dist/sub-agent.js +303 -0
  218. package/dist/sub-agent.js.map +1 -0
  219. package/dist/system-prompt.d.ts +26 -0
  220. package/dist/system-prompt.d.ts.map +1 -0
  221. package/dist/system-prompt.js +84 -0
  222. package/dist/system-prompt.js.map +1 -0
  223. package/dist/test-intelligence.d.ts +439 -0
  224. package/dist/test-intelligence.d.ts.map +1 -0
  225. package/dist/test-intelligence.js +1165 -0
  226. package/dist/test-intelligence.js.map +1 -0
  227. package/dist/types.d.ts +632 -0
  228. package/dist/types.d.ts.map +1 -0
  229. package/dist/types.js +6 -0
  230. package/dist/types.js.map +1 -0
  231. package/dist/vector-index.d.ts +314 -0
  232. package/dist/vector-index.d.ts.map +1 -0
  233. package/dist/vector-index.js +618 -0
  234. package/dist/vector-index.js.map +1 -0
  235. package/package.json +41 -0
@@ -0,0 +1,618 @@
1
+ /**
2
+ * @module speculative-executor
3
+ * @description Speculative Execution — 2~3개의 서로 다른 접근법을 병렬로 시도하여
4
+ * 최적의 결과를 선택하는 모듈.
5
+ *
6
+ * conservative(안전/최소 변경), aggressive(대담한 리팩토링),
7
+ * creative(새로운 패러다임) 전략을 동시에 실행하고, 빌드·테스트·품질 점수로 승자를 결정한다.
8
+ */
9
+ import { EventEmitter } from "node:events";
10
+ import { execSync } from "node:child_process";
11
+ import { BYOKClient } from "./llm-client.js";
12
+ // ─── Constants ───
13
+ const DEFAULT_CONFIG = {
14
+ maxApproaches: 3,
15
+ approachTimeout: 120_000,
16
+ minQualityThreshold: 60,
17
+ };
18
+ const APPROACH_GENERATION_PROMPT = `You are a senior software architect. Given a coding task, generate distinct approaches to solve it.
19
+
20
+ Each approach MUST be a different strategy:
21
+ - "conservative": Minimal changes, safe, follows existing patterns closely. Prefer small targeted edits.
22
+ - "aggressive": Bold refactor, may change interfaces/APIs, restructure modules. Aims for ideal architecture.
23
+ - "creative": Novel solution using a different paradigm/pattern than currently exists. Think outside the box.
24
+
25
+ Rules:
26
+ - Generate between 2 and {maxApproaches} approaches.
27
+ - Each approach must have a unique strategy type.
28
+ - The systemPromptDelta should give specific instructions to a coding agent about HOW to implement this approach.
29
+ - Keep descriptions concise but specific.
30
+
31
+ Return ONLY a JSON array (no markdown fences, no extra text):
32
+ [
33
+ {
34
+ "strategy": "conservative" | "aggressive" | "creative",
35
+ "description": "What this approach does",
36
+ "systemPromptDelta": "Additional system prompt instructions for this approach"
37
+ }
38
+ ]`;
39
+ const QUALITY_ASSESSMENT_PROMPT = `Rate the quality of these code changes on a scale of 0-10.
40
+
41
+ Consider:
42
+ - Code readability and clarity
43
+ - Error handling
44
+ - Following best practices
45
+ - Minimal unnecessary complexity
46
+
47
+ Changes:
48
+ {changes}
49
+
50
+ Return ONLY a JSON object: { "score": <0-10>, "reason": "brief reason" }`;
51
+ // ─── SpeculativeExecutor ───
52
+ /**
53
+ * Speculative Execution 엔진.
54
+ *
55
+ * 2~3개의 서로 다른 접근법을 병렬로 시도하고,
56
+ * 빌드/테스트/품질 점수를 기반으로 최적의 결과를 선택한다.
57
+ *
58
+ * @example
59
+ * ```ts
60
+ * const executor = new SpeculativeExecutor({
61
+ * maxApproaches: 3,
62
+ * approachTimeout: 120_000,
63
+ * minQualityThreshold: 60,
64
+ * byokConfig: { provider: "anthropic", apiKey: "sk-..." },
65
+ * projectPath: "/path/to/project",
66
+ * });
67
+ *
68
+ * executor.on("speculative:complete", ({ result }) => {
69
+ * console.log("Winner:", result.winner?.approach.strategy);
70
+ * });
71
+ *
72
+ * const result = await executor.execute("Add error handling to all API routes", toolExecutor);
73
+ * ```
74
+ */
75
+ export class SpeculativeExecutor extends EventEmitter {
76
+ config;
77
+ llmClient;
78
+ constructor(config) {
79
+ super();
80
+ this.config = { ...DEFAULT_CONFIG, ...config };
81
+ this.llmClient = new BYOKClient(config.byokConfig);
82
+ }
83
+ /**
84
+ * 리소스 정리. 내부 LLM 클라이언트를 해제하고 이벤트 리스너를 제거한다.
85
+ */
86
+ destroy() {
87
+ this.llmClient.destroy();
88
+ this.removeAllListeners();
89
+ }
90
+ /**
91
+ * LLM을 사용하여 2~3개의 접근법을 생성한다.
92
+ * @param goal 달성할 목표
93
+ * @param codebaseContext 프로젝트 컨텍스트 (파일 구조, 기존 패턴 등)
94
+ * @returns 생성된 접근법 목록
95
+ */
96
+ async generateApproaches(goal, codebaseContext) {
97
+ const prompt = APPROACH_GENERATION_PROMPT.replace("{maxApproaches}", String(this.config.maxApproaches));
98
+ const response = await this.llmClient.chat([
99
+ { role: "system", content: prompt },
100
+ {
101
+ role: "user",
102
+ content: `Task: ${goal}\n\nProject context:\n${codebaseContext}`,
103
+ },
104
+ ]);
105
+ const content = response.content ?? "[]";
106
+ let rawApproaches;
107
+ try {
108
+ // Strip markdown code fences if present
109
+ const cleaned = content.replace(/^```(?:json)?\s*\n?/m, "").replace(/\n?```\s*$/m, "").trim();
110
+ rawApproaches = JSON.parse(cleaned);
111
+ }
112
+ catch {
113
+ // Fallback: generate default approaches if LLM response is malformed
114
+ rawApproaches = this.getDefaultApproaches(goal);
115
+ }
116
+ // Validate and cap at maxApproaches
117
+ const approaches = rawApproaches
118
+ .filter((a) => a.strategy &&
119
+ a.description &&
120
+ a.systemPromptDelta &&
121
+ ["conservative", "aggressive", "creative"].includes(a.strategy))
122
+ .slice(0, this.config.maxApproaches)
123
+ .map((a, idx) => ({
124
+ id: `approach-${a.strategy}-${idx}`,
125
+ strategy: a.strategy,
126
+ description: a.description,
127
+ systemPromptDelta: a.systemPromptDelta,
128
+ }));
129
+ // Ensure at least 2 approaches
130
+ if (approaches.length < 2) {
131
+ return this.getDefaultApproaches(goal).map((a, idx) => ({
132
+ id: `approach-${a.strategy}-${idx}`,
133
+ ...a,
134
+ }));
135
+ }
136
+ return approaches;
137
+ }
138
+ /**
139
+ * 단일 접근법을 실행한다.
140
+ * ToolExecutor를 사용하여 도구 호출을 수행하고, 변경 사항을 추적한다.
141
+ * @param approach 실행할 접근법
142
+ * @param goal 달성할 목표
143
+ * @param toolExecutor 도구 실행기
144
+ * @returns 접근법 실행 결과
145
+ */
146
+ async executeApproach(approach, goal, toolExecutor) {
147
+ const startTime = Date.now();
148
+ const changes = new Map();
149
+ let tokensUsed = 0;
150
+ let buildPassed = false;
151
+ let testPassed = false;
152
+ try {
153
+ // Build enhanced system prompt with approach delta
154
+ const systemPrompt = [
155
+ `You are an expert coding agent. Your goal: ${goal}`,
156
+ "",
157
+ `Strategy: ${approach.strategy}`,
158
+ approach.systemPromptDelta,
159
+ "",
160
+ "Use the available tools to implement the changes. Track all file modifications.",
161
+ `Project path: ${this.config.projectPath}`,
162
+ ].join("\n");
163
+ // Run agent loop for this approach using the LLM + tool executor
164
+ const messages = [
165
+ { role: "system", content: systemPrompt },
166
+ { role: "user", content: `Implement this task: ${goal}\n\nApproach: ${approach.description}` },
167
+ ];
168
+ const MAX_ITERATIONS = 15;
169
+ let iteration = 0;
170
+ while (iteration < MAX_ITERATIONS) {
171
+ iteration++;
172
+ const response = await this.llmClient.chat(messages, toolExecutor.definitions);
173
+ tokensUsed += (response.usage.input + response.usage.output);
174
+ // If no tool calls, the agent is done
175
+ if (response.toolCalls.length === 0) {
176
+ if (response.content) {
177
+ messages.push({ role: "assistant", content: response.content });
178
+ }
179
+ break;
180
+ }
181
+ // Process tool calls
182
+ messages.push({
183
+ role: "assistant",
184
+ content: response.content,
185
+ tool_calls: response.toolCalls,
186
+ });
187
+ for (const toolCall of response.toolCalls) {
188
+ const result = await toolExecutor.execute(toolCall);
189
+ messages.push({
190
+ role: "tool",
191
+ content: result.output,
192
+ tool_call_id: toolCall.id,
193
+ });
194
+ // Track file changes from write/edit tools
195
+ this.trackFileChanges(toolCall, result.output, changes);
196
+ }
197
+ }
198
+ // Verify build
199
+ buildPassed = await this.verifyBuild(toolExecutor);
200
+ // Verify tests
201
+ testPassed = await this.verifyTests(toolExecutor);
202
+ // Calculate quality score
203
+ const qualityScore = await this.calculateQualityScore(changes, buildPassed, testPassed, tokensUsed);
204
+ const durationMs = Date.now() - startTime;
205
+ return {
206
+ approach,
207
+ success: buildPassed,
208
+ changes,
209
+ buildPassed,
210
+ testPassed,
211
+ qualityScore,
212
+ tokensUsed,
213
+ durationMs,
214
+ };
215
+ }
216
+ catch (err) {
217
+ const durationMs = Date.now() - startTime;
218
+ const errorMessage = err instanceof Error ? err.message : String(err);
219
+ return {
220
+ approach,
221
+ success: false,
222
+ changes,
223
+ buildPassed,
224
+ testPassed,
225
+ qualityScore: 0,
226
+ tokensUsed,
227
+ durationMs,
228
+ error: errorMessage,
229
+ };
230
+ }
231
+ }
232
+ /**
233
+ * 모든 접근법 결과를 평가하여 최적의 결과를 선택한다.
234
+ *
235
+ * 평가 기준 (가중치 순서):
236
+ * 1. buildPassed (+40점)
237
+ * 2. testPassed (+30점)
238
+ * 3. 변경 파일 수가 적을수록 (+10점)
239
+ * 4. 토큰 사용량이 적을수록 (+10점)
240
+ * 5. LLM 품질 평가 (+10점)
241
+ *
242
+ * @param results 모든 접근법 결과
243
+ * @returns 최적 결과 (모두 기준 미달이면 null)
244
+ */
245
+ evaluateResults(results) {
246
+ const validResults = results.filter((r) => r.success && r.qualityScore >= this.config.minQualityThreshold);
247
+ if (validResults.length === 0) {
248
+ // Fallback: pick any result that at least built
249
+ const builtResults = results.filter((r) => r.buildPassed);
250
+ if (builtResults.length === 0)
251
+ return null;
252
+ return builtResults.sort((a, b) => b.qualityScore - a.qualityScore)[0];
253
+ }
254
+ // Sort by composite score (higher is better)
255
+ validResults.sort((a, b) => {
256
+ const scoreA = this.compositeScore(a, results);
257
+ const scoreB = this.compositeScore(b, results);
258
+ return scoreB - scoreA;
259
+ });
260
+ return validResults[0];
261
+ }
262
+ /**
263
+ * 메인 실행 메서드. 접근법 생성 → 병렬 실행 → 평가 → 최적 결과 반환.
264
+ * @param goal 달성할 목표
265
+ * @param toolExecutor 도구 실행기
266
+ * @param codebaseContext 프로젝트 컨텍스트 (선택)
267
+ * @returns Speculative Execution 결과
268
+ */
269
+ async execute(goal, toolExecutor, codebaseContext) {
270
+ const context = codebaseContext ?? "";
271
+ // 1. Generate approaches
272
+ const approaches = await this.generateApproaches(goal, context);
273
+ this.emit("speculative:start", { goal, approachCount: approaches.length });
274
+ // 2. Execute approaches SEQUENTIALLY with git-based isolation.
275
+ // Each approach runs on a clean working tree; changes are stashed
276
+ // after execution so subsequent approaches start from the same baseline.
277
+ const allSettled = [];
278
+ for (const approach of approaches) {
279
+ this.emit("speculative:approach:start", { approach });
280
+ // Snapshot: stash any uncommitted changes so each approach starts clean
281
+ const stashLabel = `yuan-speculative-${approach.id}-${Date.now()}`;
282
+ try {
283
+ execSync("git stash push -u -q -m " + JSON.stringify(stashLabel), {
284
+ cwd: this.config.projectPath,
285
+ encoding: "utf-8",
286
+ timeout: 10_000,
287
+ });
288
+ }
289
+ catch {
290
+ // Not a git repo or nothing to stash — continue
291
+ }
292
+ try {
293
+ const result = await this.withTimeout(this.executeApproach(approach, goal, toolExecutor), this.config.approachTimeout, approach);
294
+ // Capture file changes from the working tree into the result
295
+ this.emit("speculative:approach:complete", { result });
296
+ // Restore baseline: discard approach's filesystem changes, keep result in memory
297
+ try {
298
+ execSync("git checkout -- . && git clean -fd -q", {
299
+ cwd: this.config.projectPath,
300
+ encoding: "utf-8",
301
+ timeout: 10_000,
302
+ });
303
+ }
304
+ catch {
305
+ // best-effort cleanup
306
+ }
307
+ allSettled.push({ status: "fulfilled", value: result });
308
+ }
309
+ catch (err) {
310
+ // Restore baseline on failure too
311
+ try {
312
+ execSync("git checkout -- . && git clean -fd -q", {
313
+ cwd: this.config.projectPath,
314
+ encoding: "utf-8",
315
+ timeout: 10_000,
316
+ });
317
+ }
318
+ catch {
319
+ // best-effort cleanup
320
+ }
321
+ allSettled.push({
322
+ status: "rejected",
323
+ reason: err instanceof Error ? err : new Error(String(err)),
324
+ });
325
+ }
326
+ }
327
+ const settledResults = allSettled;
328
+ const allResults = settledResults.map((settled, idx) => {
329
+ if (settled.status === "fulfilled") {
330
+ return settled.value;
331
+ }
332
+ // Rejected — create a failed result
333
+ return {
334
+ approach: approaches[idx],
335
+ success: false,
336
+ changes: new Map(),
337
+ buildPassed: false,
338
+ testPassed: false,
339
+ qualityScore: 0,
340
+ tokensUsed: 0,
341
+ durationMs: 0,
342
+ error: settled.reason instanceof Error ? settled.reason.message : String(settled.reason),
343
+ };
344
+ });
345
+ // 3. Evaluate and pick winner
346
+ const winner = this.evaluateResults(allResults);
347
+ this.emit("speculative:evaluation", { allResults, winner });
348
+ // 4. Extract learnings from failed approaches
349
+ const learnings = this.extractLearnings(allResults, winner);
350
+ // 5. Build final result
351
+ const totalTokensUsed = allResults.reduce((sum, r) => sum + r.tokensUsed, 0);
352
+ const selectionReason = winner
353
+ ? this.buildSelectionReason(winner, allResults)
354
+ : "No approach met the minimum quality threshold.";
355
+ const result = {
356
+ winner,
357
+ allResults,
358
+ selectionReason,
359
+ totalTokensUsed,
360
+ learnings,
361
+ };
362
+ this.emit("speculative:complete", { result });
363
+ return result;
364
+ }
365
+ // ─── Private Helpers ───
366
+ /**
367
+ * 도구 호출에서 파일 변경을 추적한다.
368
+ */
369
+ trackFileChanges(toolCall, _output, changes) {
370
+ const args = typeof toolCall.arguments === "string"
371
+ ? this.safeParseJSON(toolCall.arguments)
372
+ : toolCall.arguments;
373
+ if (!args)
374
+ return;
375
+ const name = toolCall.name;
376
+ const record = args;
377
+ const filePath = typeof record["file_path"] === "string" ? record["file_path"] : undefined;
378
+ const content = typeof record["content"] === "string" ? record["content"] : undefined;
379
+ if (name === "file_write" && filePath && content) {
380
+ changes.set(filePath, content);
381
+ }
382
+ else if (name === "file_edit" && filePath) {
383
+ // For edits, we mark the file as changed but can't track full content
384
+ const existing = changes.get(filePath) ?? "[edited]";
385
+ changes.set(filePath, existing);
386
+ }
387
+ }
388
+ /**
389
+ * 빌드 검증 — shell_exec로 tsc --noEmit 실행.
390
+ */
391
+ async verifyBuild(toolExecutor) {
392
+ try {
393
+ const buildCall = {
394
+ id: `verify-build-${Date.now()}`,
395
+ name: "shell_exec",
396
+ arguments: {
397
+ command: "npx tsc --noEmit",
398
+ cwd: this.config.projectPath,
399
+ },
400
+ };
401
+ const result = await toolExecutor.execute(buildCall);
402
+ return result.success;
403
+ }
404
+ catch {
405
+ return false;
406
+ }
407
+ }
408
+ /**
409
+ * 테스트 검증 — shell_exec로 테스트 실행.
410
+ */
411
+ async verifyTests(toolExecutor) {
412
+ try {
413
+ const testCall = {
414
+ id: `verify-test-${Date.now()}`,
415
+ name: "shell_exec",
416
+ arguments: {
417
+ command: "npm test --if-present 2>/dev/null || true",
418
+ cwd: this.config.projectPath,
419
+ },
420
+ };
421
+ const result = await toolExecutor.execute(testCall);
422
+ return result.success;
423
+ }
424
+ catch {
425
+ return false;
426
+ }
427
+ }
428
+ /**
429
+ * 품질 점수 계산 (0–100).
430
+ *
431
+ * - buildPassed: +40
432
+ * - testPassed: +30
433
+ * - 변경 파일 수 적을수록: +10
434
+ * - 토큰 효율: +10
435
+ * - LLM 품질 평가: +10
436
+ */
437
+ async calculateQualityScore(changes, buildPassed, testPassed, tokensUsed) {
438
+ let score = 0;
439
+ // Build: +40
440
+ if (buildPassed)
441
+ score += 40;
442
+ // Tests: +30
443
+ if (testPassed)
444
+ score += 30;
445
+ // Fewer files changed: +10 (10 for 1 file, 5 for 5+, linear scale)
446
+ const fileCount = changes.size;
447
+ score += Math.max(0, Math.round(10 * (1 - Math.min(fileCount, 10) / 10)));
448
+ // Token efficiency: +10 (fewer tokens = higher score)
449
+ // Baseline: 50k tokens = 0, 0 tokens = 10
450
+ const tokenScore = Math.max(0, Math.round(10 * (1 - Math.min(tokensUsed, 50_000) / 50_000)));
451
+ score += tokenScore;
452
+ // LLM quality assessment: +10
453
+ score += await this.llmQualityAssessment(changes);
454
+ return Math.min(100, score);
455
+ }
456
+ /**
457
+ * LLM에 코드 변경 품질 평가 요청 (0–10점 → 0–10 범위).
458
+ */
459
+ async llmQualityAssessment(changes) {
460
+ if (changes.size === 0)
461
+ return 0;
462
+ try {
463
+ // Summarize changes for evaluation (cap at 4000 chars to save tokens)
464
+ const changeSummary = Array.from(changes.entries())
465
+ .map(([path, content]) => {
466
+ const truncated = content.length > 500 ? content.slice(0, 500) + "..." : content;
467
+ return `--- ${path} ---\n${truncated}`;
468
+ })
469
+ .join("\n\n")
470
+ .slice(0, 4000);
471
+ const prompt = QUALITY_ASSESSMENT_PROMPT.replace("{changes}", changeSummary);
472
+ const response = await this.llmClient.chat([
473
+ { role: "user", content: prompt },
474
+ ]);
475
+ const content = response.content ?? "{}";
476
+ const cleaned = content.replace(/^```(?:json)?\s*\n?/m, "").replace(/\n?```\s*$/m, "").trim();
477
+ const parsed = JSON.parse(cleaned);
478
+ const rawScore = typeof parsed.score === "number" ? parsed.score : 5;
479
+ return Math.min(10, Math.max(0, Math.round(rawScore)));
480
+ }
481
+ catch {
482
+ // Default score if LLM assessment fails
483
+ return 5;
484
+ }
485
+ }
486
+ /**
487
+ * 복합 점수 계산 (평가 정렬용).
488
+ */
489
+ compositeScore(result, allResults) {
490
+ let score = result.qualityScore;
491
+ // Bonus for build passing
492
+ if (result.buildPassed)
493
+ score += 40;
494
+ // Bonus for tests passing
495
+ if (result.testPassed)
496
+ score += 30;
497
+ // Token efficiency bonus (relative to other approaches)
498
+ const maxTokens = Math.max(...allResults.map((r) => r.tokensUsed), 1);
499
+ const tokenEfficiency = 1 - result.tokensUsed / maxTokens;
500
+ score += tokenEfficiency * 10;
501
+ // Fewer changes bonus
502
+ const maxChanges = Math.max(...allResults.map((r) => r.changes.size), 1);
503
+ const changeEfficiency = 1 - result.changes.size / maxChanges;
504
+ score += changeEfficiency * 10;
505
+ return score;
506
+ }
507
+ /**
508
+ * 실패한 접근법에서 학습 포인트를 추출한다.
509
+ */
510
+ extractLearnings(allResults, winner) {
511
+ const learnings = [];
512
+ for (const result of allResults) {
513
+ if (result === winner)
514
+ continue;
515
+ if (result.error) {
516
+ learnings.push(`[${result.approach.strategy}] Failed: ${result.error}`);
517
+ }
518
+ else if (!result.buildPassed) {
519
+ learnings.push(`[${result.approach.strategy}] Build failed — approach "${result.approach.description}" may have structural issues.`);
520
+ }
521
+ else if (!result.testPassed) {
522
+ learnings.push(`[${result.approach.strategy}] Tests failed — regression detected.`);
523
+ }
524
+ else if (result.qualityScore < this.config.minQualityThreshold) {
525
+ learnings.push(`[${result.approach.strategy}] Quality score ${result.qualityScore} below threshold ${this.config.minQualityThreshold}.`);
526
+ }
527
+ }
528
+ return learnings;
529
+ }
530
+ /**
531
+ * 승자 선택 이유를 생성한다.
532
+ */
533
+ buildSelectionReason(winner, allResults) {
534
+ const parts = [
535
+ `Selected "${winner.approach.strategy}" approach.`,
536
+ ];
537
+ if (winner.buildPassed)
538
+ parts.push("Build passed.");
539
+ if (winner.testPassed)
540
+ parts.push("Tests passed.");
541
+ parts.push(`Quality score: ${winner.qualityScore}/100.`);
542
+ parts.push(`Files changed: ${winner.changes.size}.`);
543
+ parts.push(`Tokens used: ${winner.tokensUsed}.`);
544
+ const otherCount = allResults.filter((r) => r !== winner).length;
545
+ parts.push(`Evaluated against ${otherCount} other approach(es).`);
546
+ return parts.join(" ");
547
+ }
548
+ /**
549
+ * Promise에 타임아웃을 적용한다.
550
+ */
551
+ async withTimeout(promise, timeoutMs, approach) {
552
+ return new Promise((resolve) => {
553
+ const timer = setTimeout(() => {
554
+ resolve({
555
+ approach,
556
+ success: false,
557
+ changes: new Map(),
558
+ buildPassed: false,
559
+ testPassed: false,
560
+ qualityScore: 0,
561
+ tokensUsed: 0,
562
+ durationMs: timeoutMs,
563
+ error: `Approach timed out after ${timeoutMs}ms`,
564
+ });
565
+ }, timeoutMs);
566
+ promise
567
+ .then((result) => {
568
+ clearTimeout(timer);
569
+ resolve(result);
570
+ })
571
+ .catch((err) => {
572
+ clearTimeout(timer);
573
+ resolve({
574
+ approach,
575
+ success: false,
576
+ changes: new Map(),
577
+ buildPassed: false,
578
+ testPassed: false,
579
+ qualityScore: 0,
580
+ tokensUsed: 0,
581
+ durationMs: 0,
582
+ error: err instanceof Error ? err.message : String(err),
583
+ });
584
+ });
585
+ });
586
+ }
587
+ /**
588
+ * LLM이 유효한 접근법을 생성하지 못했을 때 사용하는 기본 접근법.
589
+ */
590
+ getDefaultApproaches(goal) {
591
+ return [
592
+ {
593
+ strategy: "conservative",
594
+ description: `Make minimal, safe changes to achieve: ${goal}`,
595
+ systemPromptDelta: "Make the smallest possible changes. Follow existing code patterns exactly. " +
596
+ "Do not refactor or reorganize. Keep the same interfaces and APIs.",
597
+ },
598
+ {
599
+ strategy: "aggressive",
600
+ description: `Refactor and restructure to best achieve: ${goal}`,
601
+ systemPromptDelta: "Feel free to refactor, rename, and restructure code for the ideal solution. " +
602
+ "Improve interfaces and APIs if it leads to better code. Be thorough.",
603
+ },
604
+ ];
605
+ }
606
+ /**
607
+ * 안전한 JSON 파싱 (실패 시 null 반환).
608
+ */
609
+ safeParseJSON(str) {
610
+ try {
611
+ return JSON.parse(str);
612
+ }
613
+ catch {
614
+ return null;
615
+ }
616
+ }
617
+ }
618
+ //# sourceMappingURL=speculative-executor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"speculative-executor.js","sourceRoot":"","sources":["../src/speculative-executor.ts"],"names":[],"mappings":"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"}