@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,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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"}
|