@yuaone/core 0.9.8 → 0.9.9
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/dist/__tests__/context-manager.test.js +5 -9
- package/dist/__tests__/context-manager.test.js.map +1 -1
- package/dist/agent-coordinator.d.ts +172 -0
- package/dist/agent-coordinator.d.ts.map +1 -0
- package/dist/agent-coordinator.js +390 -0
- package/dist/agent-coordinator.js.map +1 -0
- package/dist/agent-loop.d.ts +83 -39
- package/dist/agent-loop.d.ts.map +1 -1
- package/dist/agent-loop.js +694 -471
- package/dist/agent-loop.js.map +1 -1
- package/dist/agent-reputation.d.ts +72 -0
- package/dist/agent-reputation.d.ts.map +1 -0
- package/dist/agent-reputation.js +222 -0
- package/dist/agent-reputation.js.map +1 -0
- package/dist/arch-summarizer.d.ts +48 -0
- package/dist/arch-summarizer.d.ts.map +1 -0
- package/dist/arch-summarizer.js +239 -0
- package/dist/arch-summarizer.js.map +1 -0
- package/dist/autonomous/explicit-planner.d.ts +45 -0
- package/dist/autonomous/explicit-planner.d.ts.map +1 -0
- package/dist/autonomous/explicit-planner.js +99 -0
- package/dist/autonomous/explicit-planner.js.map +1 -0
- package/dist/autonomous/incident-debugger.d.ts +78 -0
- package/dist/autonomous/incident-debugger.d.ts.map +1 -0
- package/dist/autonomous/incident-debugger.js +324 -0
- package/dist/autonomous/incident-debugger.js.map +1 -0
- package/dist/autonomous/index.d.ts +15 -0
- package/dist/autonomous/index.d.ts.map +1 -0
- package/dist/autonomous/index.js +10 -0
- package/dist/autonomous/index.js.map +1 -0
- package/dist/autonomous/patch-tournament.d.ts +82 -0
- package/dist/autonomous/patch-tournament.d.ts.map +1 -0
- package/dist/autonomous/patch-tournament.js +150 -0
- package/dist/autonomous/patch-tournament.js.map +1 -0
- package/dist/autonomous/research-agent.d.ts +66 -0
- package/dist/autonomous/research-agent.d.ts.map +1 -0
- package/dist/autonomous/research-agent.js +210 -0
- package/dist/autonomous/research-agent.js.map +1 -0
- package/dist/autonomous/task-memory.d.ts +63 -0
- package/dist/autonomous/task-memory.d.ts.map +1 -0
- package/dist/autonomous/task-memory.js +143 -0
- package/dist/autonomous/task-memory.js.map +1 -0
- package/dist/budget-governor-v2.d.ts +93 -0
- package/dist/budget-governor-v2.d.ts.map +1 -0
- package/dist/budget-governor-v2.js +345 -0
- package/dist/budget-governor-v2.js.map +1 -0
- package/dist/capability-graph.d.ts +102 -0
- package/dist/capability-graph.d.ts.map +1 -0
- package/dist/capability-graph.js +397 -0
- package/dist/capability-graph.js.map +1 -0
- package/dist/capability-self-model.d.ts +144 -0
- package/dist/capability-self-model.d.ts.map +1 -0
- package/dist/capability-self-model.js +312 -0
- package/dist/capability-self-model.js.map +1 -0
- package/dist/checkpoint-manager.d.ts +94 -0
- package/dist/checkpoint-manager.d.ts.map +1 -0
- package/dist/checkpoint-manager.js +225 -0
- package/dist/checkpoint-manager.js.map +1 -0
- package/dist/continuation-engine.js +1 -1
- package/dist/continuation-engine.js.map +1 -1
- package/dist/dag-orchestrator.d.ts +0 -3
- package/dist/dag-orchestrator.d.ts.map +1 -1
- package/dist/dag-orchestrator.js +0 -1
- package/dist/dag-orchestrator.js.map +1 -1
- package/dist/evidence-chain.d.ts +99 -0
- package/dist/evidence-chain.d.ts.map +1 -0
- package/dist/evidence-chain.js +200 -0
- package/dist/evidence-chain.js.map +1 -0
- package/dist/execution-engine.d.ts.map +1 -1
- package/dist/execution-engine.js +0 -1
- package/dist/execution-engine.js.map +1 -1
- package/dist/failure-signature-memory.d.ts +61 -0
- package/dist/failure-signature-memory.d.ts.map +1 -0
- package/dist/failure-signature-memory.js +278 -0
- package/dist/failure-signature-memory.js.map +1 -0
- package/dist/index.d.ts +52 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +48 -7
- package/dist/index.js.map +1 -1
- package/dist/language-detector.d.ts.map +1 -1
- package/dist/language-detector.js +122 -43
- package/dist/language-detector.js.map +1 -1
- package/dist/llm-client.d.ts +0 -7
- package/dist/llm-client.d.ts.map +1 -1
- package/dist/llm-client.js +15 -122
- package/dist/llm-client.js.map +1 -1
- package/dist/mcp-client.js +1 -1
- package/dist/mcp-client.js.map +1 -1
- package/dist/memory.d.ts.map +1 -1
- package/dist/memory.js +0 -15
- package/dist/memory.js.map +1 -1
- package/dist/meta-learning-collector.d.ts +64 -0
- package/dist/meta-learning-collector.d.ts.map +1 -0
- package/dist/meta-learning-collector.js +169 -0
- package/dist/meta-learning-collector.js.map +1 -0
- package/dist/meta-learning-engine.d.ts +61 -0
- package/dist/meta-learning-engine.d.ts.map +1 -0
- package/dist/meta-learning-engine.js +250 -0
- package/dist/meta-learning-engine.js.map +1 -0
- package/dist/overhead-governor.d.ts +105 -0
- package/dist/overhead-governor.d.ts.map +1 -0
- package/dist/overhead-governor.js +239 -0
- package/dist/overhead-governor.js.map +1 -0
- package/dist/playbook-library.d.ts +75 -0
- package/dist/playbook-library.d.ts.map +1 -0
- package/dist/playbook-library.js +241 -0
- package/dist/playbook-library.js.map +1 -0
- package/dist/project-executive.d.ts +97 -0
- package/dist/project-executive.d.ts.map +1 -0
- package/dist/project-executive.js +223 -0
- package/dist/project-executive.js.map +1 -0
- package/dist/reasoning-adapter.d.ts.map +1 -1
- package/dist/reasoning-adapter.js +11 -36
- package/dist/reasoning-adapter.js.map +1 -1
- package/dist/research-loop.d.ts +79 -0
- package/dist/research-loop.d.ts.map +1 -0
- package/dist/research-loop.js +363 -0
- package/dist/research-loop.js.map +1 -0
- package/dist/resolve-memory-path.d.ts +32 -0
- package/dist/resolve-memory-path.d.ts.map +1 -0
- package/dist/resolve-memory-path.js +97 -0
- package/dist/resolve-memory-path.js.map +1 -0
- package/dist/safe-bounds.d.ts +101 -0
- package/dist/safe-bounds.d.ts.map +1 -0
- package/dist/safe-bounds.js +140 -0
- package/dist/safe-bounds.js.map +1 -0
- package/dist/sandbox-tiers.d.ts +5 -0
- package/dist/sandbox-tiers.d.ts.map +1 -1
- package/dist/sandbox-tiers.js +14 -6
- package/dist/sandbox-tiers.js.map +1 -1
- package/dist/security.d.ts.map +1 -1
- package/dist/security.js +3 -0
- package/dist/security.js.map +1 -1
- package/dist/self-improvement-loop.d.ts +64 -0
- package/dist/self-improvement-loop.d.ts.map +1 -0
- package/dist/self-improvement-loop.js +156 -0
- package/dist/self-improvement-loop.js.map +1 -0
- package/dist/session-persistence.d.ts +5 -0
- package/dist/session-persistence.d.ts.map +1 -1
- package/dist/session-persistence.js +19 -3
- package/dist/session-persistence.js.map +1 -1
- package/dist/skill-loader.d.ts +16 -9
- package/dist/skill-loader.d.ts.map +1 -1
- package/dist/skill-loader.js +52 -116
- package/dist/skill-loader.js.map +1 -1
- package/dist/skill-registry.d.ts +60 -0
- package/dist/skill-registry.d.ts.map +1 -0
- package/dist/skill-registry.js +162 -0
- package/dist/skill-registry.js.map +1 -0
- package/dist/stall-detector.d.ts +56 -0
- package/dist/stall-detector.d.ts.map +1 -0
- package/dist/stall-detector.js +142 -0
- package/dist/stall-detector.js.map +1 -0
- package/dist/strategy-learner.d.ts +57 -0
- package/dist/strategy-learner.d.ts.map +1 -0
- package/dist/strategy-learner.js +160 -0
- package/dist/strategy-learner.js.map +1 -0
- package/dist/strategy-market.d.ts +73 -0
- package/dist/strategy-market.d.ts.map +1 -0
- package/dist/strategy-market.js +200 -0
- package/dist/strategy-market.js.map +1 -0
- package/dist/sub-agent.d.ts +0 -3
- package/dist/sub-agent.d.ts.map +1 -1
- package/dist/sub-agent.js +0 -10
- package/dist/sub-agent.js.map +1 -1
- package/dist/system-prompt.d.ts +0 -2
- package/dist/system-prompt.d.ts.map +1 -1
- package/dist/system-prompt.js +97 -490
- package/dist/system-prompt.js.map +1 -1
- package/dist/task-classifier.d.ts.map +1 -1
- package/dist/task-classifier.js +2 -54
- package/dist/task-classifier.js.map +1 -1
- package/dist/tool-synthesizer.d.ts +149 -0
- package/dist/tool-synthesizer.d.ts.map +1 -0
- package/dist/tool-synthesizer.js +455 -0
- package/dist/tool-synthesizer.js.map +1 -0
- package/dist/trace-pattern-extractor.d.ts +76 -0
- package/dist/trace-pattern-extractor.d.ts.map +1 -0
- package/dist/trace-pattern-extractor.js +321 -0
- package/dist/trace-pattern-extractor.js.map +1 -0
- package/dist/trace-recorder.d.ts +38 -0
- package/dist/trace-recorder.d.ts.map +1 -0
- package/dist/trace-recorder.js +94 -0
- package/dist/trace-recorder.js.map +1 -0
- package/dist/trust-economics.d.ts +50 -0
- package/dist/trust-economics.d.ts.map +1 -0
- package/dist/trust-economics.js +148 -0
- package/dist/trust-economics.js.map +1 -0
- package/dist/types.d.ts +273 -4
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/yuan-md-loader.d.ts +22 -0
- package/dist/yuan-md-loader.d.ts.map +1 -0
- package/dist/yuan-md-loader.js +75 -0
- package/dist/yuan-md-loader.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module overhead-governor
|
|
3
|
+
* @description 서브시스템 실행 정책 중앙 관리자.
|
|
4
|
+
*
|
|
5
|
+
* "Main loop is sacred. All secondary intelligence must earn the right to block."
|
|
6
|
+
*
|
|
7
|
+
* 모든 optional 서브시스템(AutoTSC, Debate, SelfReflection, QAPipeline 등)은
|
|
8
|
+
* 이 Governor의 결정 없이 blocking으로 실행될 수 없다.
|
|
9
|
+
*
|
|
10
|
+
* 모드:
|
|
11
|
+
* OFF — 실행 안 함
|
|
12
|
+
* SHADOW — 실제 실행 없이 "실행됐을 것" 로그만 남김
|
|
13
|
+
* BLOCKING — 실제 blocking 실행
|
|
14
|
+
*/
|
|
15
|
+
import { readFileSync } from "node:fs";
|
|
16
|
+
const DEFAULTS = {
|
|
17
|
+
autoTsc: "SHADOW",
|
|
18
|
+
debate: "OFF",
|
|
19
|
+
deepVerify: "OFF",
|
|
20
|
+
quickVerify: "SHADOW",
|
|
21
|
+
qaPipeline: "SHADOW", // SHADOW: runs + emits event, but does NOT block LLM loop
|
|
22
|
+
llmFixer: "OFF",
|
|
23
|
+
summarize: "SHADOW",
|
|
24
|
+
// Phase 3 defaults — OFF until explicitly enabled (high-cost operations)
|
|
25
|
+
research: "OFF",
|
|
26
|
+
tournament: "OFF",
|
|
27
|
+
debugMode: "OFF",
|
|
28
|
+
};
|
|
29
|
+
// ─── OverheadGovernor ────────────────────────────────────────────────────────
|
|
30
|
+
export class OverheadGovernor {
|
|
31
|
+
cfg;
|
|
32
|
+
/** Shadow mode 로그 콜백 (TUI로 보내거나 stdout) */
|
|
33
|
+
onShadow;
|
|
34
|
+
constructor(config, onShadow) {
|
|
35
|
+
this.cfg = { ...DEFAULTS, ...config };
|
|
36
|
+
this.onShadow = onShadow;
|
|
37
|
+
}
|
|
38
|
+
// ─── Per-subsystem decision methods ───────────────────────────────────────
|
|
39
|
+
/** Auto-TSC: TS 타입 체크 자동 실행 여부 */
|
|
40
|
+
shouldRunAutoTsc(ctx) {
|
|
41
|
+
const base = this.cfg.autoTsc;
|
|
42
|
+
if (base === "OFF")
|
|
43
|
+
return "OFF";
|
|
44
|
+
// single-flight: 이미 이번 iteration에 verify 돌았으면 SKIP
|
|
45
|
+
if (ctx.verifyRanThisIteration)
|
|
46
|
+
return "OFF";
|
|
47
|
+
const tsChanged = ctx.changedFiles.filter(f => f.endsWith(".ts") || f.endsWith(".tsx"));
|
|
48
|
+
const riskyFileChanged = ctx.changedFiles.some(f => f.includes("tsconfig") || f.includes("package.json") ||
|
|
49
|
+
f.includes(".d.ts") || f.includes("index.ts"));
|
|
50
|
+
// BLOCKING 조건: TS 파일 2개 이상 + (risky 파일 변경 or finalize phase)
|
|
51
|
+
if (base === "BLOCKING" || ctx.taskPhase === "finalize" || ctx.taskPhase === "verify") {
|
|
52
|
+
if (tsChanged.length >= 2 || riskyFileChanged)
|
|
53
|
+
return "BLOCKING";
|
|
54
|
+
}
|
|
55
|
+
// 그 외엔 SHADOW
|
|
56
|
+
if (tsChanged.length >= 2 || riskyFileChanged) {
|
|
57
|
+
this._shadow("AutoTSC", `would run: ${tsChanged.length} TS files changed`);
|
|
58
|
+
return "SHADOW";
|
|
59
|
+
}
|
|
60
|
+
return "OFF";
|
|
61
|
+
}
|
|
62
|
+
/** DebateOrchestrator: 복잡한 태스크에서 multi-agent debate */
|
|
63
|
+
shouldRunDebate(ctx) {
|
|
64
|
+
const base = this.cfg.debate;
|
|
65
|
+
if (base === "OFF")
|
|
66
|
+
return "OFF";
|
|
67
|
+
// single-flight
|
|
68
|
+
if (ctx.verifyRanThisIteration)
|
|
69
|
+
return "OFF";
|
|
70
|
+
// BLOCKING 조건: planner confidence 낮음 + 2번 이상 실패
|
|
71
|
+
const lowConfidence = (ctx.plannerConfidence ?? 1) < 0.4;
|
|
72
|
+
const repeatedFailure = ctx.failureCount >= 2 && !!ctx.repeatedErrorSignature;
|
|
73
|
+
if (lowConfidence && repeatedFailure && ctx.riskyWrite) {
|
|
74
|
+
return base === "BLOCKING" ? "BLOCKING" : "SHADOW";
|
|
75
|
+
}
|
|
76
|
+
this._shadow("Debate", "would run: low confidence + repeated failure");
|
|
77
|
+
return "OFF";
|
|
78
|
+
}
|
|
79
|
+
/** SelfReflection.deepVerify: 완료 시점 심층 코드 검증 */
|
|
80
|
+
shouldRunDeepVerify(ctx) {
|
|
81
|
+
const base = this.cfg.deepVerify;
|
|
82
|
+
if (base === "OFF")
|
|
83
|
+
return "OFF";
|
|
84
|
+
// single-flight
|
|
85
|
+
if (ctx.verifyRanThisIteration)
|
|
86
|
+
return "OFF";
|
|
87
|
+
// BLOCKING 조건: finalize/verify phase + 파일 변경 있음
|
|
88
|
+
const hasChanges = ctx.changedFiles.length > 0;
|
|
89
|
+
if ((ctx.taskPhase === "finalize" || ctx.taskPhase === "verify") &&
|
|
90
|
+
hasChanges) {
|
|
91
|
+
return base === "BLOCKING" ? "BLOCKING" : "SHADOW";
|
|
92
|
+
}
|
|
93
|
+
this._shadow("DeepVerify", "would run at completion");
|
|
94
|
+
return "OFF";
|
|
95
|
+
}
|
|
96
|
+
/** SelfReflection.quickVerify: 주기적 경량 검증 */
|
|
97
|
+
shouldRunQuickVerify(ctx) {
|
|
98
|
+
const base = this.cfg.quickVerify;
|
|
99
|
+
if (base === "OFF")
|
|
100
|
+
return "OFF";
|
|
101
|
+
// single-flight
|
|
102
|
+
if (ctx.verifyRanThisIteration)
|
|
103
|
+
return "OFF";
|
|
104
|
+
// BLOCKING 조건: 실패 2회 이상 or 반복 에러
|
|
105
|
+
const repeatedError = ctx.failureCount >= 2 && !!ctx.repeatedErrorSignature;
|
|
106
|
+
if (repeatedError) {
|
|
107
|
+
return base === "BLOCKING" ? "BLOCKING" : "SHADOW";
|
|
108
|
+
}
|
|
109
|
+
// SHADOW: 매 3번마다 로그만
|
|
110
|
+
if (ctx.iteration % 3 === 0) {
|
|
111
|
+
this._shadow("QuickVerify", `would run at iteration ${ctx.iteration}`);
|
|
112
|
+
}
|
|
113
|
+
return "OFF";
|
|
114
|
+
}
|
|
115
|
+
/** QAPipeline: write 후 코드 품질 검사 */
|
|
116
|
+
shouldRunQaPipeline(ctx) {
|
|
117
|
+
const base = this.cfg.qaPipeline;
|
|
118
|
+
if (base === "OFF")
|
|
119
|
+
return "OFF";
|
|
120
|
+
// BLOCKING 조건: finalize phase or write count 누적
|
|
121
|
+
if (ctx.taskPhase === "finalize" || ctx.writeCountSinceVerify >= 5) {
|
|
122
|
+
return base === "BLOCKING" ? "BLOCKING" : "SHADOW";
|
|
123
|
+
}
|
|
124
|
+
this._shadow("QAPipeline", `would run: ${ctx.writeCountSinceVerify} writes since last verify`);
|
|
125
|
+
return "OFF";
|
|
126
|
+
}
|
|
127
|
+
/** SelfDebugLoop.llmFixer: LLM 기반 에러 자동 수정 */
|
|
128
|
+
shouldRunLlmFixer(ctx) {
|
|
129
|
+
const base = this.cfg.llmFixer;
|
|
130
|
+
if (base === "OFF")
|
|
131
|
+
return "OFF";
|
|
132
|
+
// single-flight: 이번 iteration에 이미 실행됐으면 SKIP
|
|
133
|
+
if (ctx.llmFixerRunCount >= 1)
|
|
134
|
+
return "OFF";
|
|
135
|
+
// BLOCKING 조건: 동일 에러 2회 이상 반복
|
|
136
|
+
if (ctx.failureCount >= 2 && !!ctx.repeatedErrorSignature) {
|
|
137
|
+
return base === "BLOCKING" ? "BLOCKING" : "SHADOW";
|
|
138
|
+
}
|
|
139
|
+
this._shadow("LlmFixer", "would run: error detected");
|
|
140
|
+
return "OFF";
|
|
141
|
+
}
|
|
142
|
+
/** ContextBudgetManager.summarize: 컨텍스트 요약으로 공간 확보 */
|
|
143
|
+
shouldRunSummarize(ctx) {
|
|
144
|
+
const base = this.cfg.summarize;
|
|
145
|
+
if (base === "OFF")
|
|
146
|
+
return "OFF";
|
|
147
|
+
// single-flight
|
|
148
|
+
if (ctx.summarizeRanThisIteration)
|
|
149
|
+
return "OFF";
|
|
150
|
+
// BLOCKING 조건: 컨텍스트 75% 초과 (70% 아님 — 더 보수적)
|
|
151
|
+
if (ctx.contextUsageRatio >= 0.75) {
|
|
152
|
+
return base === "BLOCKING" ? "BLOCKING" : "SHADOW";
|
|
153
|
+
}
|
|
154
|
+
// SHADOW 로그: 60% 초과 시
|
|
155
|
+
if (ctx.contextUsageRatio >= 0.60) {
|
|
156
|
+
this._shadow("Summarize", `would run: context at ${Math.round(ctx.contextUsageRatio * 100)}%`);
|
|
157
|
+
}
|
|
158
|
+
return "OFF";
|
|
159
|
+
}
|
|
160
|
+
// ─── Phase 3: Autonomous Engineering Loop guards ─────────────────────────
|
|
161
|
+
/** ResearchAgent: only run when goal requires external information */
|
|
162
|
+
shouldRunResearch(ctx) {
|
|
163
|
+
const base = this.cfg.research;
|
|
164
|
+
if (base === "OFF")
|
|
165
|
+
return "OFF";
|
|
166
|
+
// BLOCKING: only at explore phase start
|
|
167
|
+
if (ctx.taskPhase === "explore" && ctx.iteration === 0) {
|
|
168
|
+
return base === "BLOCKING" ? "BLOCKING" : "SHADOW";
|
|
169
|
+
}
|
|
170
|
+
this._shadow("Research", "would run at explore phase start");
|
|
171
|
+
return "OFF";
|
|
172
|
+
}
|
|
173
|
+
/** PatchTournamentExecutor: only run for high-risk writes in finalize */
|
|
174
|
+
shouldRunTournament(ctx) {
|
|
175
|
+
const base = this.cfg.tournament;
|
|
176
|
+
if (base === "OFF")
|
|
177
|
+
return "OFF";
|
|
178
|
+
// BLOCKING: risky write in finalize phase
|
|
179
|
+
if (ctx.taskPhase === "finalize" && ctx.riskyWrite) {
|
|
180
|
+
return base === "BLOCKING" ? "BLOCKING" : "SHADOW";
|
|
181
|
+
}
|
|
182
|
+
this._shadow("Tournament", "would run: risky write in finalize");
|
|
183
|
+
return "OFF";
|
|
184
|
+
}
|
|
185
|
+
/** IncidentDebugMode: only run when repeated errors detected */
|
|
186
|
+
shouldRunDebugMode(ctx) {
|
|
187
|
+
const base = this.cfg.debugMode;
|
|
188
|
+
if (base === "OFF")
|
|
189
|
+
return "OFF";
|
|
190
|
+
// BLOCKING: 3+ repeated errors with same signature
|
|
191
|
+
if (ctx.failureCount >= 3 && !!ctx.repeatedErrorSignature) {
|
|
192
|
+
return base === "BLOCKING" ? "BLOCKING" : "SHADOW";
|
|
193
|
+
}
|
|
194
|
+
if (ctx.failureCount >= 2) {
|
|
195
|
+
this._shadow("DebugMode", `would run: ${ctx.failureCount} failures`);
|
|
196
|
+
}
|
|
197
|
+
return "OFF";
|
|
198
|
+
}
|
|
199
|
+
// ─── Helpers ──────────────────────────────────────────────────────────────
|
|
200
|
+
_shadow(subsystem, reason) {
|
|
201
|
+
this.onShadow?.(subsystem, reason);
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* 현재 설정 반환 (디버그용).
|
|
205
|
+
*/
|
|
206
|
+
getConfig() {
|
|
207
|
+
return { ...this.cfg };
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Load overrides from a JSON file (e.g. ~/.yuan/policy.json).
|
|
211
|
+
* Only keys that exist in OverheadGovernorConfig are applied.
|
|
212
|
+
* Unknown keys are silently ignored — safe to call with arbitrary files.
|
|
213
|
+
*
|
|
214
|
+
* Example .yuan/policy.json:
|
|
215
|
+
* { "research": "BLOCKING", "tournament": "BLOCKING", "debugMode": "BLOCKING" }
|
|
216
|
+
*/
|
|
217
|
+
static loadFromFile(filePath) {
|
|
218
|
+
try {
|
|
219
|
+
const raw = readFileSync(filePath, "utf-8");
|
|
220
|
+
const parsed = JSON.parse(raw);
|
|
221
|
+
const validModes = new Set(["OFF", "SHADOW", "BLOCKING"]);
|
|
222
|
+
const validKeys = new Set([
|
|
223
|
+
"autoTsc", "debate", "deepVerify", "quickVerify", "qaPipeline",
|
|
224
|
+
"llmFixer", "summarize", "research", "tournament", "debugMode",
|
|
225
|
+
]);
|
|
226
|
+
const result = {};
|
|
227
|
+
for (const [k, v] of Object.entries(parsed)) {
|
|
228
|
+
if (validKeys.has(k) && validModes.has(String(v))) {
|
|
229
|
+
result[k] = v;
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
return result;
|
|
233
|
+
}
|
|
234
|
+
catch {
|
|
235
|
+
return {};
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
//# sourceMappingURL=overhead-governor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"overhead-governor.js","sourceRoot":"","sources":["../src/overhead-governor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module playbook-library
|
|
3
|
+
* @description Strategy Library / Playbook — executable templates for task execution strategies.
|
|
4
|
+
*
|
|
5
|
+
* Storage: ~/.yuan/playbooks/{taskType}.json
|
|
6
|
+
* Each playbook is versioned (version field incremented on update).
|
|
7
|
+
*
|
|
8
|
+
* Design:
|
|
9
|
+
* - Playbooks are executable templates, not text summaries
|
|
10
|
+
* - Task type classified by keyword matching from goal text + file types
|
|
11
|
+
* - Retrieval returns the best matching playbook by confidence
|
|
12
|
+
* - New playbooks can be proposed from trace data
|
|
13
|
+
* - All writes atomic (.tmp + renameSync)
|
|
14
|
+
*/
|
|
15
|
+
import { EventEmitter } from "events";
|
|
16
|
+
export type PlaybookTaskType = "ts-bugfix" | "refactor" | "feature-add" | "test-gen" | "security-fix" | "docs" | "migration" | "performance" | "unknown";
|
|
17
|
+
export interface Playbook {
|
|
18
|
+
id: string;
|
|
19
|
+
version: number;
|
|
20
|
+
taskType: PlaybookTaskType;
|
|
21
|
+
phaseOrder: string[];
|
|
22
|
+
preferredTools: string[];
|
|
23
|
+
cheapChecks: string[];
|
|
24
|
+
escalationConditions: string[];
|
|
25
|
+
evidenceRequirements: string[];
|
|
26
|
+
stopConditions: string[];
|
|
27
|
+
confidence: number;
|
|
28
|
+
usageCount: number;
|
|
29
|
+
successCount: number;
|
|
30
|
+
sourceSessionIds: string[];
|
|
31
|
+
createdAt: string;
|
|
32
|
+
updatedAt: string;
|
|
33
|
+
}
|
|
34
|
+
export interface PlaybookLibraryConfig {
|
|
35
|
+
storageDir?: string;
|
|
36
|
+
}
|
|
37
|
+
export declare class PlaybookLibrary extends EventEmitter {
|
|
38
|
+
private storageDir;
|
|
39
|
+
constructor(config?: PlaybookLibraryConfig);
|
|
40
|
+
private seedDefaults;
|
|
41
|
+
private saveRaw;
|
|
42
|
+
private load;
|
|
43
|
+
/**
|
|
44
|
+
* Query for matching playbook by goal text.
|
|
45
|
+
* Classifies task type via keyword matching, then loads matching playbook.
|
|
46
|
+
* Returns null if no playbook found or confidence < 0.3.
|
|
47
|
+
* Emits agent:playbook_activated when returning a match.
|
|
48
|
+
*/
|
|
49
|
+
query(goal: string): Playbook | null;
|
|
50
|
+
/**
|
|
51
|
+
* Record the outcome of a task run for a given task type.
|
|
52
|
+
* Updates usageCount and successCount, recomputes confidence = successCount/usageCount.
|
|
53
|
+
* Saves the updated playbook.
|
|
54
|
+
*/
|
|
55
|
+
recordOutcome(taskType: PlaybookTaskType, success: boolean): void;
|
|
56
|
+
/**
|
|
57
|
+
* Propose a new playbook draft from trace/run data.
|
|
58
|
+
* Does NOT auto-save — returns a proposed Playbook for human review.
|
|
59
|
+
* Emits agent:playbook_proposed.
|
|
60
|
+
*/
|
|
61
|
+
propose(taskType: PlaybookTaskType, traceData: {
|
|
62
|
+
toolSequence: string[];
|
|
63
|
+
phases: string[];
|
|
64
|
+
sessionId: string;
|
|
65
|
+
}): Playbook;
|
|
66
|
+
/**
|
|
67
|
+
* Save a proposed playbook to disk (call after human approval or high confidence).
|
|
68
|
+
*/
|
|
69
|
+
save(playbook: Playbook): void;
|
|
70
|
+
/**
|
|
71
|
+
* Get all playbooks sorted by confidence desc.
|
|
72
|
+
*/
|
|
73
|
+
getAll(): Playbook[];
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=playbook-library.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"playbook-library.d.ts","sourceRoot":"","sources":["../src/playbook-library.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAQtC,MAAM,MAAM,gBAAgB,GACxB,WAAW,GACX,UAAU,GACV,aAAa,GACb,UAAU,GACV,cAAc,GACd,MAAM,GACN,WAAW,GACX,aAAa,GACb,SAAS,CAAC;AAEd,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,oBAAoB,EAAE,MAAM,EAAE,CAAC;IAC/B,oBAAoB,EAAE,MAAM,EAAE,CAAC;IAC/B,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,qBAAqB;IACpC,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AA+ED,qBAAa,eAAgB,SAAQ,YAAY;IAC/C,OAAO,CAAC,UAAU,CAAS;gBAEf,MAAM,CAAC,EAAE,qBAAqB;IAU1C,OAAO,CAAC,YAAY;IAWpB,OAAO,CAAC,OAAO;IASf,OAAO,CAAC,IAAI;IAYZ;;;;;OAKG;IACH,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI;IAgBpC;;;;OAIG;IACH,aAAa,CAAC,QAAQ,EAAE,gBAAgB,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI;IAejE;;;;OAIG;IACH,OAAO,CACL,QAAQ,EAAE,gBAAgB,EAC1B,SAAS,EAAE;QAAE,YAAY,EAAE,MAAM,EAAE,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,GACzE,QAAQ;IA+BX;;OAEG;IACH,IAAI,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI;IAK9B;;OAEG;IACH,MAAM,IAAI,QAAQ,EAAE;CAmBrB"}
|
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module playbook-library
|
|
3
|
+
* @description Strategy Library / Playbook — executable templates for task execution strategies.
|
|
4
|
+
*
|
|
5
|
+
* Storage: ~/.yuan/playbooks/{taskType}.json
|
|
6
|
+
* Each playbook is versioned (version field incremented on update).
|
|
7
|
+
*
|
|
8
|
+
* Design:
|
|
9
|
+
* - Playbooks are executable templates, not text summaries
|
|
10
|
+
* - Task type classified by keyword matching from goal text + file types
|
|
11
|
+
* - Retrieval returns the best matching playbook by confidence
|
|
12
|
+
* - New playbooks can be proposed from trace data
|
|
13
|
+
* - All writes atomic (.tmp + renameSync)
|
|
14
|
+
*/
|
|
15
|
+
import { EventEmitter } from "events";
|
|
16
|
+
import { existsSync, mkdirSync, readdirSync, readFileSync, renameSync, writeFileSync } from "fs";
|
|
17
|
+
import { homedir } from "os";
|
|
18
|
+
import { join } from "path";
|
|
19
|
+
import { randomUUID } from "crypto";
|
|
20
|
+
// ─── Classifier ───
|
|
21
|
+
function classifyTaskType(goal) {
|
|
22
|
+
const g = goal.toLowerCase();
|
|
23
|
+
if (/fix|bug|error|crash|fail/.test(g) && /ts|type|typescript/.test(g))
|
|
24
|
+
return "ts-bugfix";
|
|
25
|
+
if (/fix|bug|error|crash|fail/.test(g))
|
|
26
|
+
return "ts-bugfix";
|
|
27
|
+
if (/refactor|rename|reorganize|restructure|clean/.test(g))
|
|
28
|
+
return "refactor";
|
|
29
|
+
if (/add|implement|create|build|feature|new/.test(g))
|
|
30
|
+
return "feature-add";
|
|
31
|
+
if (/test|spec|coverage|jest|vitest/.test(g))
|
|
32
|
+
return "test-gen";
|
|
33
|
+
if (/security|vuln|cve|inject|xss|csrf/.test(g))
|
|
34
|
+
return "security-fix";
|
|
35
|
+
if (/doc|readme|comment|jsdoc/.test(g))
|
|
36
|
+
return "docs";
|
|
37
|
+
if (/migrat|upgrade|version|convert/.test(g))
|
|
38
|
+
return "migration";
|
|
39
|
+
if (/perf|optim|speed|slow|latency/.test(g))
|
|
40
|
+
return "performance";
|
|
41
|
+
return "unknown";
|
|
42
|
+
}
|
|
43
|
+
// ─── Default playbooks ───
|
|
44
|
+
function buildDefaults() {
|
|
45
|
+
const now = new Date().toISOString();
|
|
46
|
+
return [
|
|
47
|
+
{
|
|
48
|
+
id: randomUUID(),
|
|
49
|
+
version: 1,
|
|
50
|
+
taskType: "ts-bugfix",
|
|
51
|
+
phaseOrder: ["research", "implement", "verify"],
|
|
52
|
+
preferredTools: ["file_read", "grep", "file_edit", "shell_exec"],
|
|
53
|
+
cheapChecks: ["tsc --noEmit"],
|
|
54
|
+
escalationConditions: ["3+ failures", "risky file changed"],
|
|
55
|
+
evidenceRequirements: ["build passes", "types compile"],
|
|
56
|
+
stopConditions: ["build_success", "error_signature_disappears"],
|
|
57
|
+
confidence: 0.6,
|
|
58
|
+
usageCount: 0,
|
|
59
|
+
successCount: 0,
|
|
60
|
+
sourceSessionIds: [],
|
|
61
|
+
createdAt: now,
|
|
62
|
+
updatedAt: now,
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
id: randomUUID(),
|
|
66
|
+
version: 1,
|
|
67
|
+
taskType: "refactor",
|
|
68
|
+
phaseOrder: ["research", "planning", "implement", "verify", "finalize"],
|
|
69
|
+
preferredTools: ["file_read", "grep", "file_edit"],
|
|
70
|
+
cheapChecks: ["tsc --noEmit", "eslint"],
|
|
71
|
+
escalationConditions: ["impact > 10 files", "public API changed"],
|
|
72
|
+
evidenceRequirements: ["build passes", "tests pass", "no regression"],
|
|
73
|
+
stopConditions: ["tests_pass", "build_success"],
|
|
74
|
+
confidence: 0.6,
|
|
75
|
+
usageCount: 0,
|
|
76
|
+
successCount: 0,
|
|
77
|
+
sourceSessionIds: [],
|
|
78
|
+
createdAt: now,
|
|
79
|
+
updatedAt: now,
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
id: randomUUID(),
|
|
83
|
+
version: 1,
|
|
84
|
+
taskType: "feature-add",
|
|
85
|
+
phaseOrder: ["research", "planning", "implement", "verify", "finalize"],
|
|
86
|
+
preferredTools: ["file_read", "grep", "file_write", "file_edit", "shell_exec"],
|
|
87
|
+
cheapChecks: ["tsc --noEmit", "eslint", "jest --testPathPattern"],
|
|
88
|
+
escalationConditions: ["touching public API", "3+ failures"],
|
|
89
|
+
evidenceRequirements: ["tests written", "build passes", "tests pass"],
|
|
90
|
+
stopConditions: ["tests_pass", "build_success"],
|
|
91
|
+
confidence: 0.5,
|
|
92
|
+
usageCount: 0,
|
|
93
|
+
successCount: 0,
|
|
94
|
+
sourceSessionIds: [],
|
|
95
|
+
createdAt: now,
|
|
96
|
+
updatedAt: now,
|
|
97
|
+
},
|
|
98
|
+
];
|
|
99
|
+
}
|
|
100
|
+
// ─── PlaybookLibrary ───
|
|
101
|
+
export class PlaybookLibrary extends EventEmitter {
|
|
102
|
+
storageDir;
|
|
103
|
+
constructor(config) {
|
|
104
|
+
super();
|
|
105
|
+
this.storageDir =
|
|
106
|
+
config?.storageDir ?? join(homedir(), ".yuan", "playbooks");
|
|
107
|
+
mkdirSync(this.storageDir, { recursive: true });
|
|
108
|
+
this.seedDefaults();
|
|
109
|
+
}
|
|
110
|
+
// ─── Seed defaults on first use ───
|
|
111
|
+
seedDefaults() {
|
|
112
|
+
const files = readdirSync(this.storageDir).filter(f => f.endsWith(".json"));
|
|
113
|
+
if (files.length === 0) {
|
|
114
|
+
for (const pb of buildDefaults()) {
|
|
115
|
+
this.saveRaw(pb);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
// ─── Atomic write helper ───
|
|
120
|
+
saveRaw(playbook) {
|
|
121
|
+
const filePath = join(this.storageDir, `${playbook.taskType}.json`);
|
|
122
|
+
const tmpPath = `${filePath}.tmp`;
|
|
123
|
+
writeFileSync(tmpPath, JSON.stringify(playbook, null, 2), "utf-8");
|
|
124
|
+
renameSync(tmpPath, filePath);
|
|
125
|
+
}
|
|
126
|
+
// ─── Load by taskType ───
|
|
127
|
+
load(taskType) {
|
|
128
|
+
const filePath = join(this.storageDir, `${taskType}.json`);
|
|
129
|
+
if (!existsSync(filePath))
|
|
130
|
+
return null;
|
|
131
|
+
try {
|
|
132
|
+
return JSON.parse(readFileSync(filePath, "utf-8"));
|
|
133
|
+
}
|
|
134
|
+
catch {
|
|
135
|
+
return null;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
// ─── Public API ───
|
|
139
|
+
/**
|
|
140
|
+
* Query for matching playbook by goal text.
|
|
141
|
+
* Classifies task type via keyword matching, then loads matching playbook.
|
|
142
|
+
* Returns null if no playbook found or confidence < 0.3.
|
|
143
|
+
* Emits agent:playbook_activated when returning a match.
|
|
144
|
+
*/
|
|
145
|
+
query(goal) {
|
|
146
|
+
const taskType = classifyTaskType(goal);
|
|
147
|
+
const playbook = this.load(taskType);
|
|
148
|
+
if (!playbook || playbook.confidence < 0.3)
|
|
149
|
+
return null;
|
|
150
|
+
this.emit("agent:playbook_activated", {
|
|
151
|
+
kind: "agent:playbook_activated",
|
|
152
|
+
playbookId: playbook.id,
|
|
153
|
+
taskType: playbook.taskType,
|
|
154
|
+
confidence: playbook.confidence,
|
|
155
|
+
timestamp: Date.now(),
|
|
156
|
+
});
|
|
157
|
+
return playbook;
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Record the outcome of a task run for a given task type.
|
|
161
|
+
* Updates usageCount and successCount, recomputes confidence = successCount/usageCount.
|
|
162
|
+
* Saves the updated playbook.
|
|
163
|
+
*/
|
|
164
|
+
recordOutcome(taskType, success) {
|
|
165
|
+
const playbook = this.load(taskType);
|
|
166
|
+
if (!playbook)
|
|
167
|
+
return;
|
|
168
|
+
playbook.usageCount += 1;
|
|
169
|
+
if (success)
|
|
170
|
+
playbook.successCount += 1;
|
|
171
|
+
playbook.confidence = playbook.usageCount > 0
|
|
172
|
+
? playbook.successCount / playbook.usageCount
|
|
173
|
+
: 0;
|
|
174
|
+
playbook.version += 1;
|
|
175
|
+
playbook.updatedAt = new Date().toISOString();
|
|
176
|
+
this.saveRaw(playbook);
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Propose a new playbook draft from trace/run data.
|
|
180
|
+
* Does NOT auto-save — returns a proposed Playbook for human review.
|
|
181
|
+
* Emits agent:playbook_proposed.
|
|
182
|
+
*/
|
|
183
|
+
propose(taskType, traceData) {
|
|
184
|
+
const now = new Date().toISOString();
|
|
185
|
+
const playbook = {
|
|
186
|
+
id: randomUUID(),
|
|
187
|
+
version: 1,
|
|
188
|
+
taskType,
|
|
189
|
+
phaseOrder: traceData.phases,
|
|
190
|
+
preferredTools: traceData.toolSequence,
|
|
191
|
+
cheapChecks: [],
|
|
192
|
+
escalationConditions: [],
|
|
193
|
+
evidenceRequirements: [],
|
|
194
|
+
stopConditions: [],
|
|
195
|
+
confidence: 0.3,
|
|
196
|
+
usageCount: 0,
|
|
197
|
+
successCount: 0,
|
|
198
|
+
sourceSessionIds: [traceData.sessionId],
|
|
199
|
+
createdAt: now,
|
|
200
|
+
updatedAt: now,
|
|
201
|
+
};
|
|
202
|
+
this.emit("agent:playbook_proposed", {
|
|
203
|
+
kind: "agent:playbook_proposed",
|
|
204
|
+
playbookId: playbook.id,
|
|
205
|
+
taskType: playbook.taskType,
|
|
206
|
+
confidence: playbook.confidence,
|
|
207
|
+
timestamp: Date.now(),
|
|
208
|
+
});
|
|
209
|
+
return playbook;
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Save a proposed playbook to disk (call after human approval or high confidence).
|
|
213
|
+
*/
|
|
214
|
+
save(playbook) {
|
|
215
|
+
playbook.updatedAt = new Date().toISOString();
|
|
216
|
+
this.saveRaw(playbook);
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Get all playbooks sorted by confidence desc.
|
|
220
|
+
*/
|
|
221
|
+
getAll() {
|
|
222
|
+
const results = [];
|
|
223
|
+
try {
|
|
224
|
+
const files = readdirSync(this.storageDir).filter(f => f.endsWith(".json"));
|
|
225
|
+
for (const file of files) {
|
|
226
|
+
try {
|
|
227
|
+
const pb = JSON.parse(readFileSync(join(this.storageDir, file), "utf-8"));
|
|
228
|
+
results.push(pb);
|
|
229
|
+
}
|
|
230
|
+
catch {
|
|
231
|
+
// skip corrupt files
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
catch {
|
|
236
|
+
// storageDir unreadable
|
|
237
|
+
}
|
|
238
|
+
return results.sort((a, b) => b.confidence - a.confidence);
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
//# sourceMappingURL=playbook-library.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"playbook-library.js","sourceRoot":"","sources":["../src/playbook-library.ts"],"names":[],"mappings":"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"}
|