@yuaone/core 0.1.3 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (95) hide show
  1. package/dist/agent-loop.d.ts +152 -0
  2. package/dist/agent-loop.d.ts.map +1 -1
  3. package/dist/agent-loop.js +893 -9
  4. package/dist/agent-loop.js.map +1 -1
  5. package/dist/benchmark-runner.d.ts +141 -0
  6. package/dist/benchmark-runner.d.ts.map +1 -0
  7. package/dist/benchmark-runner.js +526 -0
  8. package/dist/benchmark-runner.js.map +1 -0
  9. package/dist/codebase-context.d.ts +49 -0
  10. package/dist/codebase-context.d.ts.map +1 -1
  11. package/dist/codebase-context.js +146 -0
  12. package/dist/codebase-context.js.map +1 -1
  13. package/dist/constants.d.ts.map +1 -1
  14. package/dist/constants.js +8 -0
  15. package/dist/constants.js.map +1 -1
  16. package/dist/context-budget.d.ts +1 -1
  17. package/dist/context-budget.d.ts.map +1 -1
  18. package/dist/context-budget.js +4 -2
  19. package/dist/context-budget.js.map +1 -1
  20. package/dist/context-compressor.d.ts +1 -1
  21. package/dist/context-compressor.d.ts.map +1 -1
  22. package/dist/context-compressor.js +5 -3
  23. package/dist/context-compressor.js.map +1 -1
  24. package/dist/context-manager.d.ts +7 -1
  25. package/dist/context-manager.d.ts.map +1 -1
  26. package/dist/context-manager.js +34 -2
  27. package/dist/context-manager.js.map +1 -1
  28. package/dist/continuation-engine.d.ts +168 -0
  29. package/dist/continuation-engine.d.ts.map +1 -0
  30. package/dist/continuation-engine.js +421 -0
  31. package/dist/continuation-engine.js.map +1 -0
  32. package/dist/cost-optimizer.d.ts +159 -0
  33. package/dist/cost-optimizer.d.ts.map +1 -0
  34. package/dist/cost-optimizer.js +406 -0
  35. package/dist/cost-optimizer.js.map +1 -0
  36. package/dist/execution-engine.d.ts.map +1 -1
  37. package/dist/execution-engine.js +9 -4
  38. package/dist/execution-engine.js.map +1 -1
  39. package/dist/execution-policy-engine.d.ts +133 -0
  40. package/dist/execution-policy-engine.d.ts.map +1 -0
  41. package/dist/execution-policy-engine.js +367 -0
  42. package/dist/execution-policy-engine.js.map +1 -0
  43. package/dist/failure-recovery.d.ts +228 -0
  44. package/dist/failure-recovery.d.ts.map +1 -0
  45. package/dist/failure-recovery.js +664 -0
  46. package/dist/failure-recovery.js.map +1 -0
  47. package/dist/hierarchical-planner.d.ts +69 -1
  48. package/dist/hierarchical-planner.d.ts.map +1 -1
  49. package/dist/hierarchical-planner.js +117 -0
  50. package/dist/hierarchical-planner.js.map +1 -1
  51. package/dist/impact-analyzer.d.ts +92 -0
  52. package/dist/impact-analyzer.d.ts.map +1 -0
  53. package/dist/impact-analyzer.js +615 -0
  54. package/dist/impact-analyzer.js.map +1 -0
  55. package/dist/index.d.ts +28 -3
  56. package/dist/index.d.ts.map +1 -1
  57. package/dist/index.js +27 -0
  58. package/dist/index.js.map +1 -1
  59. package/dist/llm-client.d.ts +1 -1
  60. package/dist/llm-client.d.ts.map +1 -1
  61. package/dist/llm-client.js +74 -7
  62. package/dist/llm-client.js.map +1 -1
  63. package/dist/memory-updater.d.ts +189 -0
  64. package/dist/memory-updater.d.ts.map +1 -0
  65. package/dist/memory-updater.js +481 -0
  66. package/dist/memory-updater.js.map +1 -0
  67. package/dist/prompt-defense.d.ts +59 -0
  68. package/dist/prompt-defense.d.ts.map +1 -0
  69. package/dist/prompt-defense.js +311 -0
  70. package/dist/prompt-defense.js.map +1 -0
  71. package/dist/reflexion.d.ts +211 -0
  72. package/dist/reflexion.d.ts.map +1 -0
  73. package/dist/reflexion.js +559 -0
  74. package/dist/reflexion.js.map +1 -0
  75. package/dist/system-prompt.d.ts +19 -3
  76. package/dist/system-prompt.d.ts.map +1 -1
  77. package/dist/system-prompt.js +203 -38
  78. package/dist/system-prompt.js.map +1 -1
  79. package/dist/task-classifier.d.ts +92 -0
  80. package/dist/task-classifier.d.ts.map +1 -0
  81. package/dist/task-classifier.js +566 -0
  82. package/dist/task-classifier.js.map +1 -0
  83. package/dist/token-budget.d.ts +131 -0
  84. package/dist/token-budget.d.ts.map +1 -0
  85. package/dist/token-budget.js +321 -0
  86. package/dist/token-budget.js.map +1 -0
  87. package/dist/types.d.ts +20 -2
  88. package/dist/types.d.ts.map +1 -1
  89. package/dist/types.js +18 -1
  90. package/dist/types.js.map +1 -1
  91. package/dist/world-state.d.ts +87 -0
  92. package/dist/world-state.d.ts.map +1 -0
  93. package/dist/world-state.js +435 -0
  94. package/dist/world-state.js.map +1 -0
  95. package/package.json +11 -21
@@ -0,0 +1,559 @@
1
+ /**
2
+ * @module reflexion
3
+ * @description Reflexion Layer — structured self-reflection after each agent run.
4
+ *
5
+ * Based on the Reflexion paper (Shinn et al., 2023):
6
+ * dynamic memory + self-reflection loop for continuous improvement.
7
+ *
8
+ * Key design decisions:
9
+ * - `reflect()` is purely heuristic (no LLM calls) — analyzes tool results, counts failures, detects patterns
10
+ * - `getGuidance()` uses keyword matching to find relevant past reflections
11
+ * - Strategy confidence decays over time (0.95 per week)
12
+ * - File-based persistence in `.yuan/memory/`
13
+ * - Max 100 reflections (FIFO), max 50 strategies
14
+ *
15
+ * @example
16
+ * ```typescript
17
+ * const engine = new ReflexionEngine({ projectPath: "/my/project" });
18
+ *
19
+ * // After a run
20
+ * const entry = engine.reflect({ goal, runId, termination, toolResults, ... });
21
+ * await engine.store.saveReflection(entry);
22
+ *
23
+ * // Before a run
24
+ * const guidance = await engine.getGuidance("fix the auth middleware");
25
+ * const prompt = engine.formatForSystemPrompt(guidance);
26
+ * ```
27
+ */
28
+ import { readFile, writeFile, mkdir, rename } from "node:fs/promises";
29
+ import { join } from "node:path";
30
+ import { randomUUID } from "node:crypto";
31
+ // ─── Constants ───
32
+ const DEFAULT_MAX_REFLECTIONS = 100;
33
+ const DEFAULT_MAX_STRATEGIES = 50;
34
+ const DEFAULT_CONFIDENCE_DECAY = 0.95;
35
+ const MS_PER_WEEK = 7 * 24 * 60 * 60 * 1000;
36
+ const REFLECTIONS_FILE = "reflections.json";
37
+ const STRATEGIES_FILE = "strategies.json";
38
+ // ─── ReflexionStore ───
39
+ /**
40
+ * File-based persistence for reflections and strategies.
41
+ *
42
+ * Storage location: `<projectPath>/.yuan/memory/`
43
+ */
44
+ export class ReflexionStore {
45
+ memoryDir;
46
+ constructor(projectPath) {
47
+ this.memoryDir = join(projectPath, ".yuan", "memory");
48
+ }
49
+ // ─── Reflection CRUD ───
50
+ /** Save a reflection entry. Appends to the list. */
51
+ async saveReflection(entry) {
52
+ const entries = await this.loadReflectionsFile();
53
+ entries.push(entry);
54
+ // FIFO: keep only last maxReflections (caller can prune, but we cap at a safe limit)
55
+ if (entries.length > DEFAULT_MAX_REFLECTIONS * 2) {
56
+ entries.splice(0, entries.length - DEFAULT_MAX_REFLECTIONS);
57
+ }
58
+ await this.writeJsonFile(REFLECTIONS_FILE, entries);
59
+ }
60
+ /** Get most recent reflections, optionally limited. */
61
+ async getReflections(limit) {
62
+ const entries = await this.loadReflectionsFile();
63
+ if (limit !== undefined && limit > 0) {
64
+ return entries.slice(-limit);
65
+ }
66
+ return entries;
67
+ }
68
+ /** Get reflections filtered by outcome. */
69
+ async getReflectionsByOutcome(outcome) {
70
+ const entries = await this.loadReflectionsFile();
71
+ return entries.filter((e) => e.outcome === outcome);
72
+ }
73
+ // ─── Strategy management ───
74
+ /** Save or update a strategy record. */
75
+ async saveStrategy(strategy) {
76
+ const strategies = await this.loadStrategiesFile();
77
+ const existingIdx = strategies.findIndex((s) => s.id === strategy.id);
78
+ if (existingIdx >= 0) {
79
+ strategies[existingIdx] = strategy;
80
+ }
81
+ else {
82
+ strategies.push(strategy);
83
+ }
84
+ // Cap at a safe limit
85
+ if (strategies.length > DEFAULT_MAX_STRATEGIES * 2) {
86
+ // Remove lowest confidence
87
+ strategies.sort((a, b) => b.confidence - a.confidence);
88
+ strategies.length = DEFAULT_MAX_STRATEGIES;
89
+ }
90
+ await this.writeJsonFile(STRATEGIES_FILE, strategies);
91
+ }
92
+ /** Find strategies relevant to a goal using keyword matching. */
93
+ async findRelevantStrategies(goal, limit) {
94
+ const strategies = await this.loadStrategiesFile();
95
+ const keywords = extractKeywords(goal);
96
+ const maxResults = limit ?? 5;
97
+ const scored = strategies.map((s) => {
98
+ let score = 0;
99
+ // Check taskPattern as regex or keywords
100
+ try {
101
+ const re = new RegExp(s.taskPattern, "i");
102
+ if (re.test(goal))
103
+ score += 10;
104
+ }
105
+ catch {
106
+ // If not valid regex, treat as keywords
107
+ const patternWords = extractKeywords(s.taskPattern);
108
+ const overlap = patternWords.filter((pw) => keywords.includes(pw)).length;
109
+ score += overlap * 3;
110
+ }
111
+ // Check examples
112
+ for (const example of s.examples) {
113
+ const exWords = extractKeywords(example);
114
+ const overlap = exWords.filter((ew) => keywords.includes(ew)).length;
115
+ score += overlap;
116
+ }
117
+ // Weight by confidence
118
+ score *= s.confidence;
119
+ return { strategy: s, score };
120
+ });
121
+ return scored
122
+ .filter((s) => s.score > 0)
123
+ .sort((a, b) => b.score - a.score)
124
+ .slice(0, maxResults)
125
+ .map((s) => s.strategy);
126
+ }
127
+ /** Update success/failure stats for a strategy. */
128
+ async updateStrategyStats(strategyId, success) {
129
+ const strategies = await this.loadStrategiesFile();
130
+ const strategy = strategies.find((s) => s.id === strategyId);
131
+ if (!strategy)
132
+ return;
133
+ if (success) {
134
+ strategy.successCount++;
135
+ }
136
+ else {
137
+ strategy.failureCount++;
138
+ }
139
+ strategy.confidence =
140
+ strategy.successCount / (strategy.successCount + strategy.failureCount);
141
+ strategy.lastUsed = Date.now();
142
+ await this.writeJsonFile(STRATEGIES_FILE, strategies);
143
+ }
144
+ // ─── Cleanup ───
145
+ /** Remove reflections older than maxAge (ms). Returns count removed. */
146
+ async pruneOldReflections(maxAge) {
147
+ const entries = await this.loadReflectionsFile();
148
+ const cutoff = Date.now() - maxAge;
149
+ const filtered = entries.filter((e) => e.timestamp > cutoff);
150
+ const removed = entries.length - filtered.length;
151
+ if (removed > 0) {
152
+ await this.writeJsonFile(REFLECTIONS_FILE, filtered);
153
+ }
154
+ return removed;
155
+ }
156
+ // ─── Private I/O ───
157
+ async ensureDir() {
158
+ await mkdir(this.memoryDir, { recursive: true });
159
+ }
160
+ async readJsonFile(filename) {
161
+ try {
162
+ const raw = await readFile(join(this.memoryDir, filename), "utf-8");
163
+ return JSON.parse(raw);
164
+ }
165
+ catch {
166
+ return null;
167
+ }
168
+ }
169
+ async writeJsonFile(filename, data) {
170
+ await this.ensureDir();
171
+ const filePath = join(this.memoryDir, filename);
172
+ const tmpPath = filePath + ".tmp";
173
+ await writeFile(tmpPath, JSON.stringify(data, null, 2), "utf-8");
174
+ await rename(tmpPath, filePath);
175
+ }
176
+ async loadReflectionsFile() {
177
+ return (await this.readJsonFile(REFLECTIONS_FILE)) ?? [];
178
+ }
179
+ async loadStrategiesFile() {
180
+ return (await this.readJsonFile(STRATEGIES_FILE)) ?? [];
181
+ }
182
+ }
183
+ /**
184
+ * ReflexionEngine — heuristic-based self-reflection after agent runs.
185
+ *
186
+ * No LLM calls. Analyzes tool results, detects failure patterns,
187
+ * extracts strategies from successful runs, and provides guidance
188
+ * for future runs.
189
+ */
190
+ export class ReflexionEngine {
191
+ store;
192
+ maxReflections;
193
+ maxStrategies;
194
+ confidenceDecayPerWeek;
195
+ constructor(config) {
196
+ this.store = new ReflexionStore(config.projectPath);
197
+ this.maxReflections = config.maxReflections ?? DEFAULT_MAX_REFLECTIONS;
198
+ this.maxStrategies = config.maxStrategies ?? DEFAULT_MAX_STRATEGIES;
199
+ this.confidenceDecayPerWeek = config.confidenceDecayPerWeek ?? DEFAULT_CONFIDENCE_DECAY;
200
+ }
201
+ /**
202
+ * After an agent run: analyze what happened and produce a ReflexionEntry.
203
+ *
204
+ * Purely heuristic — no LLM call. Analyzes:
205
+ * - Tool success/failure rates
206
+ * - Error patterns
207
+ * - Termination reason
208
+ * - Duration and resource usage
209
+ */
210
+ reflect(params) {
211
+ const { goal, runId, termination, toolResults, messages, tokensUsed, durationMs, changedFiles, } = params;
212
+ // ── Determine outcome ──
213
+ const outcome = this.determineOutcome(termination, toolResults);
214
+ const terminationReason = termination.reason;
215
+ // ── Analyze tools ──
216
+ const toolAnalysis = this.analyzeTools(toolResults);
217
+ // ── Build reflection ──
218
+ const reflection = this.buildReflection(outcome, termination, toolResults, toolAnalysis, messages);
219
+ // ── Count iterations from messages ──
220
+ const iterations = messages.filter((m) => m.role === "assistant").length;
221
+ return {
222
+ id: randomUUID(),
223
+ runId,
224
+ timestamp: Date.now(),
225
+ goal,
226
+ outcome,
227
+ terminationReason,
228
+ reflection,
229
+ toolAnalysis,
230
+ metrics: {
231
+ iterations,
232
+ tokensUsed,
233
+ durationMs,
234
+ filesChanged: changedFiles,
235
+ },
236
+ };
237
+ }
238
+ /**
239
+ * Before an agent run: retrieve relevant past reflections for context injection.
240
+ *
241
+ * Searches reflections and strategies by keyword matching against the goal.
242
+ */
243
+ async getGuidance(goal) {
244
+ const keywords = extractKeywords(goal);
245
+ // Find relevant strategies (with time-decayed confidence)
246
+ const rawStrategies = await this.store.findRelevantStrategies(goal, 5);
247
+ const relevantStrategies = rawStrategies.map((s) => this.applyConfidenceDecay(s));
248
+ // Find recent failures on similar goals
249
+ const allReflections = await this.store.getReflections();
250
+ const recentFailures = allReflections
251
+ .filter((r) => {
252
+ if (r.outcome === "success")
253
+ return false;
254
+ const rKeywords = extractKeywords(r.goal);
255
+ return keywords.some((kw) => rKeywords.includes(kw));
256
+ })
257
+ .slice(-5); // Last 5 relevant failures
258
+ // Extract avoid patterns from failures
259
+ const avoidPatterns = [];
260
+ for (const failure of recentFailures) {
261
+ for (const failed of failure.reflection.whatFailed) {
262
+ if (!avoidPatterns.includes(failed)) {
263
+ avoidPatterns.push(failed);
264
+ }
265
+ }
266
+ if (failure.reflection.rootCause) {
267
+ const rc = `Root cause: ${failure.reflection.rootCause}`;
268
+ if (!avoidPatterns.includes(rc)) {
269
+ avoidPatterns.push(rc);
270
+ }
271
+ }
272
+ }
273
+ // Suggest approach from best strategy
274
+ let suggestedApproach = null;
275
+ if (relevantStrategies.length > 0) {
276
+ const best = relevantStrategies[0];
277
+ if (best.confidence >= 0.5) {
278
+ suggestedApproach = best.strategy;
279
+ }
280
+ }
281
+ return {
282
+ relevantStrategies,
283
+ recentFailures,
284
+ avoidPatterns,
285
+ suggestedApproach,
286
+ };
287
+ }
288
+ /**
289
+ * Extract a StrategyRecord from a successful run.
290
+ *
291
+ * Only creates a strategy if the run used 3+ tool calls (nontrivial).
292
+ */
293
+ extractStrategy(entry, goal) {
294
+ // Only extract from successful or partially successful runs
295
+ if (entry.outcome === "failure")
296
+ return null;
297
+ // Require at least 3 tool calls for a meaningful strategy
298
+ if (entry.toolAnalysis.totalCalls < 3)
299
+ return null;
300
+ // Build tool sequence (unique, in order of first appearance)
301
+ const toolSequence = entry.toolAnalysis.toolsUsed;
302
+ // Build strategy description from what worked
303
+ const strategyParts = entry.reflection.whatWorked;
304
+ if (strategyParts.length === 0)
305
+ return null;
306
+ const strategy = strategyParts.join("; ");
307
+ // Extract task pattern: take significant keywords from goal
308
+ const keywords = extractKeywords(goal);
309
+ const taskPattern = keywords.slice(0, 5).join("|");
310
+ if (!taskPattern)
311
+ return null;
312
+ return {
313
+ id: randomUUID(),
314
+ taskPattern,
315
+ strategy,
316
+ toolSequence,
317
+ successCount: 1,
318
+ failureCount: 0,
319
+ confidence: 1.0,
320
+ lastUsed: Date.now(),
321
+ examples: [goal],
322
+ };
323
+ }
324
+ /**
325
+ * Format guidance for injection into a system prompt.
326
+ *
327
+ * Returns empty string if no relevant guidance found.
328
+ */
329
+ formatForSystemPrompt(guidance) {
330
+ const sections = [];
331
+ if (guidance.relevantStrategies.length === 0 &&
332
+ guidance.recentFailures.length === 0 &&
333
+ guidance.avoidPatterns.length === 0) {
334
+ return "";
335
+ }
336
+ sections.push("<reflexion-guidance>");
337
+ // Suggested approach
338
+ if (guidance.suggestedApproach) {
339
+ sections.push(`<suggested-approach>${guidance.suggestedApproach}</suggested-approach>`);
340
+ }
341
+ // Proven strategies
342
+ if (guidance.relevantStrategies.length > 0) {
343
+ sections.push("<proven-strategies>");
344
+ for (const s of guidance.relevantStrategies) {
345
+ const conf = (s.confidence * 100).toFixed(0);
346
+ sections.push(`- [${conf}% confidence] ${s.strategy} (tools: ${s.toolSequence.join(" → ")})`);
347
+ }
348
+ sections.push("</proven-strategies>");
349
+ }
350
+ // Avoid patterns
351
+ if (guidance.avoidPatterns.length > 0) {
352
+ sections.push("<avoid-patterns>");
353
+ for (const p of guidance.avoidPatterns) {
354
+ sections.push(`- ${p}`);
355
+ }
356
+ sections.push("</avoid-patterns>");
357
+ }
358
+ // Recent failures
359
+ if (guidance.recentFailures.length > 0) {
360
+ sections.push("<recent-failures>");
361
+ for (const f of guidance.recentFailures) {
362
+ const rootCause = f.reflection.rootCause
363
+ ? ` (root cause: ${f.reflection.rootCause})`
364
+ : "";
365
+ sections.push(`- Goal: "${f.goal}" → ${f.outcome}${rootCause}`);
366
+ }
367
+ sections.push("</recent-failures>");
368
+ }
369
+ sections.push("</reflexion-guidance>");
370
+ return sections.join("\n");
371
+ }
372
+ // ─── Private helpers ───
373
+ /** Determine outcome from termination reason and tool results */
374
+ determineOutcome(termination, toolResults) {
375
+ switch (termination.reason) {
376
+ case "GOAL_ACHIEVED":
377
+ return "success";
378
+ case "ERROR":
379
+ return "failure";
380
+ case "USER_CANCELLED":
381
+ // If some tools succeeded, it's partial
382
+ return toolResults.some((r) => r.success) ? "partial" : "failure";
383
+ case "MAX_ITERATIONS":
384
+ case "BUDGET_EXHAUSTED":
385
+ // If some tools succeeded and files were changed, partial
386
+ return toolResults.some((r) => r.success) ? "partial" : "failure";
387
+ case "NEEDS_APPROVAL":
388
+ return "partial";
389
+ default:
390
+ return "failure";
391
+ }
392
+ }
393
+ /** Analyze tool usage from results */
394
+ analyzeTools(toolResults) {
395
+ if (toolResults.length === 0) {
396
+ return {
397
+ toolsUsed: [],
398
+ failedTools: [],
399
+ successRate: 0,
400
+ totalCalls: 0,
401
+ avgDurationMs: 0,
402
+ };
403
+ }
404
+ // Unique tools in order of first appearance
405
+ const toolsUsed = [];
406
+ for (const r of toolResults) {
407
+ if (!toolsUsed.includes(r.name)) {
408
+ toolsUsed.push(r.name);
409
+ }
410
+ }
411
+ // Failed tools aggregation
412
+ const failMap = new Map();
413
+ for (const r of toolResults) {
414
+ if (!r.success) {
415
+ const existing = failMap.get(r.name);
416
+ if (existing) {
417
+ existing.count++;
418
+ }
419
+ else {
420
+ failMap.set(r.name, {
421
+ error: truncate(r.output, 200),
422
+ count: 1,
423
+ });
424
+ }
425
+ }
426
+ }
427
+ const failedTools = Array.from(failMap.entries()).map(([tool, info]) => ({
428
+ tool,
429
+ error: info.error,
430
+ count: info.count,
431
+ }));
432
+ const successCount = toolResults.filter((r) => r.success).length;
433
+ const successRate = successCount / toolResults.length;
434
+ const totalDuration = toolResults.reduce((sum, r) => sum + r.durationMs, 0);
435
+ const avgDurationMs = Math.round(totalDuration / toolResults.length);
436
+ return {
437
+ toolsUsed,
438
+ failedTools,
439
+ successRate,
440
+ totalCalls: toolResults.length,
441
+ avgDurationMs,
442
+ };
443
+ }
444
+ /** Build reflection heuristically from run data */
445
+ buildReflection(outcome, termination, toolResults, toolAnalysis, _messages) {
446
+ const whatWorked = [];
447
+ const whatFailed = [];
448
+ let rootCause = null;
449
+ let alternativeApproach = null;
450
+ // ── What worked ──
451
+ // Successful tools
452
+ const successfulTools = new Set();
453
+ for (const r of toolResults) {
454
+ if (r.success)
455
+ successfulTools.add(r.name);
456
+ }
457
+ if (successfulTools.size > 0) {
458
+ whatWorked.push(`Tools succeeded: ${[...successfulTools].join(", ")}`);
459
+ }
460
+ // High success rate
461
+ if (toolAnalysis.successRate >= 0.8 && toolAnalysis.totalCalls >= 3) {
462
+ whatWorked.push("High tool success rate (>=80%)");
463
+ }
464
+ // Fast execution
465
+ if (toolAnalysis.avgDurationMs < 500 && toolAnalysis.totalCalls > 0) {
466
+ whatWorked.push("Fast tool execution (<500ms avg)");
467
+ }
468
+ if (outcome === "success") {
469
+ whatWorked.push("Goal achieved successfully");
470
+ }
471
+ // ── What failed ──
472
+ // Failed tools
473
+ for (const ft of toolAnalysis.failedTools) {
474
+ whatFailed.push(`Tool "${ft.tool}" failed ${ft.count} time(s): ${ft.error}`);
475
+ }
476
+ // Low success rate
477
+ if (toolAnalysis.successRate < 0.5 && toolAnalysis.totalCalls >= 3) {
478
+ whatFailed.push("Low tool success rate (<50%)");
479
+ }
480
+ // Repeated failures on same tool
481
+ const repeatedFailures = toolAnalysis.failedTools.filter((ft) => ft.count >= 3);
482
+ if (repeatedFailures.length > 0) {
483
+ whatFailed.push(`Repeated failures: ${repeatedFailures.map((f) => f.tool).join(", ")}`);
484
+ }
485
+ // ── Root cause analysis ──
486
+ switch (termination.reason) {
487
+ case "ERROR":
488
+ rootCause = `Error: ${termination.error}`;
489
+ alternativeApproach =
490
+ "Consider breaking the task into smaller steps or using different tools";
491
+ break;
492
+ case "MAX_ITERATIONS":
493
+ rootCause = "Ran out of iterations — task may be too complex or agent got stuck in a loop";
494
+ alternativeApproach =
495
+ "Break task into smaller sub-goals; check for infinite retry loops";
496
+ break;
497
+ case "BUDGET_EXHAUSTED":
498
+ rootCause = `Token budget exhausted (${termination.tokensUsed} tokens used)`;
499
+ alternativeApproach =
500
+ "Use more focused context; avoid reading large files; use grep instead of reading entire files";
501
+ break;
502
+ case "USER_CANCELLED":
503
+ rootCause = "User cancelled the run";
504
+ break;
505
+ case "NEEDS_APPROVAL":
506
+ rootCause = "Blocked on approval — consider auto-approve for low-risk actions";
507
+ break;
508
+ }
509
+ // Additional heuristic: if many tool failures are the same error
510
+ if (toolAnalysis.failedTools.length > 0) {
511
+ const topFailure = toolAnalysis.failedTools.reduce((max, ft) => (ft.count > max.count ? ft : max), toolAnalysis.failedTools[0]);
512
+ if (topFailure.count >= 3 && !rootCause) {
513
+ rootCause = `Tool "${topFailure.tool}" repeatedly failed: ${topFailure.error}`;
514
+ alternativeApproach = `Avoid "${topFailure.tool}" or fix the underlying issue before retrying`;
515
+ }
516
+ }
517
+ return { whatWorked, whatFailed, rootCause, alternativeApproach };
518
+ }
519
+ /** Apply time-based confidence decay to a strategy */
520
+ applyConfidenceDecay(strategy) {
521
+ const now = Date.now();
522
+ const weeksSinceLastUse = (now - strategy.lastUsed) / MS_PER_WEEK;
523
+ if (weeksSinceLastUse <= 0)
524
+ return strategy;
525
+ const decayFactor = Math.pow(this.confidenceDecayPerWeek, weeksSinceLastUse);
526
+ return {
527
+ ...strategy,
528
+ confidence: strategy.confidence * decayFactor,
529
+ };
530
+ }
531
+ }
532
+ // ─── Utility Functions ───
533
+ /** Extract meaningful keywords from text, removing stop words */
534
+ function extractKeywords(text) {
535
+ const stopWords = new Set([
536
+ "the", "a", "an", "is", "are", "was", "were", "be",
537
+ "to", "of", "and", "in", "that", "have", "it",
538
+ "for", "not", "on", "with", "as", "do", "at",
539
+ "this", "but", "from", "or", "by", "will", "my",
540
+ "all", "can", "had", "her", "one", "our", "out",
541
+ "should", "would", "could", "has", "its", "into",
542
+ "then", "than", "been", "some", "when", "what",
543
+ ]);
544
+ // CJK 문자를 개별 토큰으로 추출 (한국어/일본어/중국어 지원)
545
+ const cjkMatches = text.match(/[\u3000-\u9fff\uac00-\ud7af]{2,}/g) ?? [];
546
+ const asciiWords = text
547
+ .toLowerCase()
548
+ .replace(/[^a-z0-9\s_-]/g, " ")
549
+ .split(/\s+/)
550
+ .filter((w) => w.length > 2 && !stopWords.has(w));
551
+ return [...asciiWords, ...cjkMatches];
552
+ }
553
+ /** Truncate a string to maxLen, appending "..." if truncated */
554
+ function truncate(str, maxLen) {
555
+ if (str.length <= maxLen)
556
+ return str;
557
+ return str.slice(0, maxLen - 3) + "...";
558
+ }
559
+ //# sourceMappingURL=reflexion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reflexion.js","sourceRoot":"","sources":["../src/reflexion.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,13 @@
1
1
  /**
2
2
  * @module system-prompt
3
- * @description 시스템 프롬프트 생성.
4
- * YUAN.md 내용 + 도구 목록 + 프로젝트 구조를 조합하여
5
- * 에이전트의 시스템 프롬프트를 구성한다.
3
+ * @description 시스템 프롬프트 생성 — YUAN 에이전트의 두뇌를 구성한다.
4
+ *
5
+ * Claude Code 수준의 상세한 프롬프트로 LLM에게:
6
+ * - 작업 방식 (탐색 → 계획 → 실행 → 검증)
7
+ * - 도구 사용 패턴과 전략
8
+ * - 코드 품질 기준
9
+ * - 안전 규칙
10
+ * 을 가르친다.
6
11
  */
7
12
  import type { ToolDefinition } from "./types.js";
8
13
  import type { ProjectStructure } from "./memory.js";
@@ -16,6 +21,17 @@ export interface SystemPromptOptions {
16
21
  tools: ToolDefinition[];
17
22
  /** 추가 규칙/지시 */
18
23
  additionalRules?: string[];
24
+ /** 프로젝트 경로 */
25
+ projectPath?: string;
26
+ /** OS / 환경 정보 */
27
+ environment?: EnvironmentInfo;
28
+ }
29
+ /** 환경 정보 */
30
+ export interface EnvironmentInfo {
31
+ os?: string;
32
+ shell?: string;
33
+ nodeVersion?: string;
34
+ gitBranch?: string;
19
35
  }
20
36
  /**
21
37
  * 에이전트 시스템 프롬프트를 생성.
@@ -1 +1 @@
1
- {"version":3,"file":"system-prompt.d.ts","sourceRoot":"","sources":["../src/system-prompt.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAEpD,qBAAqB;AACrB,MAAM,WAAW,mBAAmB;IAClC,oBAAoB;IACpB,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,iBAAiB;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,mBAAmB;IACnB,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,eAAe;IACf,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;CAC5B;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,mBAAmB,GAAG,MAAM,CAkCtE"}
1
+ {"version":3,"file":"system-prompt.d.ts","sourceRoot":"","sources":["../src/system-prompt.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAEpD,qBAAqB;AACrB,MAAM,WAAW,mBAAmB;IAClC,oBAAoB;IACpB,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,iBAAiB;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,mBAAmB;IACnB,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,eAAe;IACf,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,cAAc;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iBAAiB;IACjB,WAAW,CAAC,EAAE,eAAe,CAAC;CAC/B;AAED,YAAY;AACZ,MAAM,WAAW,eAAe;IAC9B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,mBAAmB,GAAG,MAAM,CAgDtE"}