@kernel.chat/kbot 2.11.0 → 2.12.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/README.md +1 -1
- package/dist/agent.d.ts.map +1 -1
- package/dist/agent.js +11 -0
- package/dist/agent.js.map +1 -1
- package/dist/agents/agents.test.d.ts +2 -0
- package/dist/agents/agents.test.d.ts.map +1 -0
- package/dist/agents/agents.test.js +127 -0
- package/dist/agents/agents.test.js.map +1 -0
- package/dist/cli.js +68 -1
- package/dist/cli.js.map +1 -1
- package/dist/evolution.d.ts +112 -0
- package/dist/evolution.d.ts.map +1 -0
- package/dist/evolution.js +642 -0
- package/dist/evolution.js.map +1 -0
- package/dist/evolution.test.d.ts +2 -0
- package/dist/evolution.test.d.ts.map +1 -0
- package/dist/evolution.test.js +160 -0
- package/dist/evolution.test.js.map +1 -0
- package/dist/ide/acp-server.js +2 -2
- package/dist/quality-diversity.d.ts +106 -0
- package/dist/quality-diversity.d.ts.map +1 -0
- package/dist/quality-diversity.js +296 -0
- package/dist/quality-diversity.js.map +1 -0
- package/dist/tools/comfyui-plugin.d.ts +2 -0
- package/dist/tools/comfyui-plugin.d.ts.map +1 -0
- package/dist/tools/comfyui-plugin.js +523 -0
- package/dist/tools/comfyui-plugin.js.map +1 -0
- package/dist/tools/creative.test.d.ts +2 -0
- package/dist/tools/creative.test.d.ts.map +1 -0
- package/dist/tools/creative.test.js +281 -0
- package/dist/tools/creative.test.js.map +1 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +5 -1
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/magenta-plugin.d.ts +2 -0
- package/dist/tools/magenta-plugin.d.ts.map +1 -0
- package/dist/tools/magenta-plugin.js +405 -0
- package/dist/tools/magenta-plugin.js.map +1 -0
- package/dist/ui.js +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,642 @@
|
|
|
1
|
+
// K:BOT Self-Evolution Loop — Automated Source Code Improvement
|
|
2
|
+
//
|
|
3
|
+
// CONCEPT: kbot identifies its own weaknesses, proposes code changes,
|
|
4
|
+
// validates them (typecheck + tests), scores the improvement, and
|
|
5
|
+
// applies or rolls back. The first self-evolving open-source CLI agent.
|
|
6
|
+
//
|
|
7
|
+
// SAFETY:
|
|
8
|
+
// - Only modifies files in packages/kbot/src/ (never node_modules, configs, etc.)
|
|
9
|
+
// - Never modifies evolution.ts, cli.ts, or test files (prevents recursive traps)
|
|
10
|
+
// - Uses git stash for instant rollback on any failure
|
|
11
|
+
// - Requires clean working tree before starting
|
|
12
|
+
// - Never auto-publishes or pushes
|
|
13
|
+
// - Max 3 changes per cycle (bounded blast radius)
|
|
14
|
+
// - All changes logged to ~/.kbot/evolution-log.json
|
|
15
|
+
//
|
|
16
|
+
// FLOW: diagnose → propose → validate → score → apply/rollback → log
|
|
17
|
+
import { homedir } from 'node:os';
|
|
18
|
+
import { join } from 'node:path';
|
|
19
|
+
import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'node:fs';
|
|
20
|
+
import { execSync } from 'node:child_process';
|
|
21
|
+
// ── File paths ──
|
|
22
|
+
const KBOT_DIR = join(homedir(), '.kbot');
|
|
23
|
+
const LOG_FILE = join(KBOT_DIR, 'evolution-log.json');
|
|
24
|
+
// Files that must NEVER be modified by the evolution loop
|
|
25
|
+
const PROTECTED_FILES = [
|
|
26
|
+
'src/evolution.ts',
|
|
27
|
+
'src/cli.ts',
|
|
28
|
+
'src/auth.ts', // never touch auth — security-critical
|
|
29
|
+
'vitest.config.ts',
|
|
30
|
+
'package.json',
|
|
31
|
+
'tsconfig.json',
|
|
32
|
+
];
|
|
33
|
+
const PROTECTED_PATTERNS = [
|
|
34
|
+
/\.test\.(ts|tsx)$/, // never modify tests
|
|
35
|
+
/\.spec\.(ts|tsx)$/,
|
|
36
|
+
/^node_modules\//,
|
|
37
|
+
/^dist\//,
|
|
38
|
+
];
|
|
39
|
+
// ── Helpers ──
|
|
40
|
+
function ensureDir() {
|
|
41
|
+
if (!existsSync(KBOT_DIR))
|
|
42
|
+
mkdirSync(KBOT_DIR, { recursive: true });
|
|
43
|
+
}
|
|
44
|
+
function loadLog() {
|
|
45
|
+
ensureDir();
|
|
46
|
+
if (!existsSync(LOG_FILE))
|
|
47
|
+
return [];
|
|
48
|
+
try {
|
|
49
|
+
return JSON.parse(readFileSync(LOG_FILE, 'utf-8'));
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
return [];
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
function saveLog(log) {
|
|
56
|
+
ensureDir();
|
|
57
|
+
// Keep only last 50 cycles
|
|
58
|
+
const trimmed = log.slice(-50);
|
|
59
|
+
writeFileSync(LOG_FILE, JSON.stringify(trimmed, null, 2), 'utf-8');
|
|
60
|
+
}
|
|
61
|
+
function isProtectedFile(relPath) {
|
|
62
|
+
if (PROTECTED_FILES.includes(relPath))
|
|
63
|
+
return true;
|
|
64
|
+
return PROTECTED_PATTERNS.some(p => p.test(relPath));
|
|
65
|
+
}
|
|
66
|
+
/** Find the kbot package root */
|
|
67
|
+
function findKbotRoot() {
|
|
68
|
+
// Try relative to this file first
|
|
69
|
+
const candidates = [
|
|
70
|
+
join(process.cwd(), 'packages/kbot'),
|
|
71
|
+
join(import.meta.dirname || process.cwd(), '..'),
|
|
72
|
+
];
|
|
73
|
+
for (const c of candidates) {
|
|
74
|
+
if (existsSync(join(c, 'package.json'))) {
|
|
75
|
+
try {
|
|
76
|
+
const pkg = JSON.parse(readFileSync(join(c, 'package.json'), 'utf-8'));
|
|
77
|
+
if (pkg.name === '@kernel.chat/kbot')
|
|
78
|
+
return c;
|
|
79
|
+
}
|
|
80
|
+
catch { /* continue */ }
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
throw new Error('Cannot find kbot package root. Run from the project directory.');
|
|
84
|
+
}
|
|
85
|
+
// ══════════════════════════════════════════════════════════════════
|
|
86
|
+
// 1. DIAGNOSE — Find weaknesses from skill profile + learning data
|
|
87
|
+
// ══════════════════════════════════════════════════════════════════
|
|
88
|
+
/**
|
|
89
|
+
* Analyze kbot's performance data to find areas for improvement.
|
|
90
|
+
* Uses the confidence engine's skill profile + learning stats.
|
|
91
|
+
*/
|
|
92
|
+
export function diagnose() {
|
|
93
|
+
const weaknesses = [];
|
|
94
|
+
// Pull skill profile data
|
|
95
|
+
try {
|
|
96
|
+
// Dynamic import would be async — use require-style for sync diagnosis
|
|
97
|
+
const skillFile = join(KBOT_DIR, 'skill-profile.json');
|
|
98
|
+
const confFile = join(KBOT_DIR, 'confidence.json');
|
|
99
|
+
const statsFile = join(KBOT_DIR, 'memory', 'stats.json');
|
|
100
|
+
// Check skill weaknesses
|
|
101
|
+
if (existsSync(skillFile)) {
|
|
102
|
+
const skills = JSON.parse(readFileSync(skillFile, 'utf-8')).skills || {};
|
|
103
|
+
for (const [domain, data] of Object.entries(skills)) {
|
|
104
|
+
if (data.sampleSize < 3)
|
|
105
|
+
continue;
|
|
106
|
+
const rate = data.successCount / data.sampleSize;
|
|
107
|
+
if (rate < 0.5) {
|
|
108
|
+
weaknesses.push({
|
|
109
|
+
area: domain,
|
|
110
|
+
description: `Low success rate in ${domain} tasks (${Math.round(rate * 100)}%)`,
|
|
111
|
+
severity: rate < 0.3 ? 'high' : 'medium',
|
|
112
|
+
evidence: `${data.successCount}/${data.sampleSize} successes`,
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
// Check calibration — are we systematically overconfident?
|
|
118
|
+
if (existsSync(confFile)) {
|
|
119
|
+
const cal = JSON.parse(readFileSync(confFile, 'utf-8'));
|
|
120
|
+
if (cal.avgError > 0.25 && (cal.entries?.length || 0) >= 5) {
|
|
121
|
+
weaknesses.push({
|
|
122
|
+
area: 'confidence-calibration',
|
|
123
|
+
description: `Confidence predictions are poorly calibrated (avg error: ${(cal.avgError * 100).toFixed(0)}%)`,
|
|
124
|
+
severity: cal.avgError > 0.4 ? 'high' : 'medium',
|
|
125
|
+
evidence: `${cal.entries.length} calibration entries, avg error ${cal.avgError.toFixed(3)}`,
|
|
126
|
+
targetFile: 'src/confidence.ts',
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
// Check learning stats — look for patterns with low success
|
|
131
|
+
if (existsSync(statsFile)) {
|
|
132
|
+
const stats = JSON.parse(readFileSync(statsFile, 'utf-8'));
|
|
133
|
+
if (stats.totalMessages > 50 && stats.toolErrorRate > 0.15) {
|
|
134
|
+
weaknesses.push({
|
|
135
|
+
area: 'tool-execution',
|
|
136
|
+
description: `High tool error rate (${(stats.toolErrorRate * 100).toFixed(0)}%)`,
|
|
137
|
+
severity: stats.toolErrorRate > 0.3 ? 'high' : 'medium',
|
|
138
|
+
evidence: `${stats.totalMessages} messages, ${(stats.toolErrorRate * 100).toFixed(0)}% tool errors`,
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
// Check for common code quality signals
|
|
143
|
+
const kbotRoot = findKbotRoot();
|
|
144
|
+
const srcDir = join(kbotRoot, 'src');
|
|
145
|
+
// Look for TODO/FIXME/HACK comments as improvement signals
|
|
146
|
+
try {
|
|
147
|
+
const result = execSync(`grep -rn "TODO\\|FIXME\\|HACK\\|XXX" "${srcDir}" --include="*.ts" | head -20`, { encoding: 'utf-8', timeout: 5000 }).trim();
|
|
148
|
+
if (result) {
|
|
149
|
+
const todoCount = result.split('\n').filter(l => l.trim()).length;
|
|
150
|
+
if (todoCount >= 3) {
|
|
151
|
+
weaknesses.push({
|
|
152
|
+
area: 'code-quality',
|
|
153
|
+
description: `${todoCount} TODO/FIXME/HACK markers in source code`,
|
|
154
|
+
severity: todoCount > 10 ? 'medium' : 'low',
|
|
155
|
+
evidence: `Found ${todoCount} markers via grep`,
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
catch { /* grep not critical */ }
|
|
161
|
+
}
|
|
162
|
+
catch (err) {
|
|
163
|
+
// Diagnosis failure is not fatal — return what we have
|
|
164
|
+
if (process.env.KBOT_DEBUG) {
|
|
165
|
+
console.error('[evolution] diagnose error:', err.message);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
// Sort by severity (high first)
|
|
169
|
+
const severityOrder = { high: 0, medium: 1, low: 2 };
|
|
170
|
+
weaknesses.sort((a, b) => severityOrder[a.severity] - severityOrder[b.severity]);
|
|
171
|
+
return weaknesses;
|
|
172
|
+
}
|
|
173
|
+
// ══════════════════════════════════════════════════════════════════
|
|
174
|
+
// 2. PROPOSE — Use LLM to generate code improvements
|
|
175
|
+
// ══════════════════════════════════════════════════════════════════
|
|
176
|
+
/**
|
|
177
|
+
* Ask the LLM to propose a code improvement for a weakness.
|
|
178
|
+
* Reuses the auth/provider pattern from self-eval.ts.
|
|
179
|
+
*/
|
|
180
|
+
export async function proposeImprovement(weakness) {
|
|
181
|
+
// Determine which file to improve
|
|
182
|
+
const kbotRoot = findKbotRoot();
|
|
183
|
+
const targetFile = weakness.targetFile || guessTargetFile(weakness.area);
|
|
184
|
+
if (!targetFile)
|
|
185
|
+
return null;
|
|
186
|
+
if (isProtectedFile(targetFile))
|
|
187
|
+
return null;
|
|
188
|
+
const absPath = join(kbotRoot, targetFile);
|
|
189
|
+
if (!existsSync(absPath))
|
|
190
|
+
return null;
|
|
191
|
+
const original = readFileSync(absPath, 'utf-8');
|
|
192
|
+
// Truncate very large files to keep prompt costs reasonable
|
|
193
|
+
const maxSourceChars = 8000;
|
|
194
|
+
const source = original.length > maxSourceChars
|
|
195
|
+
? original.slice(0, maxSourceChars) + '\n// ... (truncated)'
|
|
196
|
+
: original;
|
|
197
|
+
const prompt = buildProposalPrompt(weakness, targetFile, source);
|
|
198
|
+
try {
|
|
199
|
+
const { getByokKey, getByokProvider, getProvider, getProviderModel } = await import('./auth.js');
|
|
200
|
+
const apiKey = getByokKey();
|
|
201
|
+
if (!apiKey)
|
|
202
|
+
return null;
|
|
203
|
+
const byokProvider = getByokProvider();
|
|
204
|
+
const provider = getProvider(byokProvider);
|
|
205
|
+
const model = getProviderModel(byokProvider, 'default');
|
|
206
|
+
const headers = { 'Content-Type': 'application/json' };
|
|
207
|
+
if (provider.authHeader === 'x-api-key') {
|
|
208
|
+
headers['x-api-key'] = apiKey;
|
|
209
|
+
headers['anthropic-version'] = '2023-06-01';
|
|
210
|
+
}
|
|
211
|
+
else if (apiKey && apiKey !== 'local') {
|
|
212
|
+
headers['Authorization'] = `Bearer ${apiKey}`;
|
|
213
|
+
}
|
|
214
|
+
let body;
|
|
215
|
+
let url;
|
|
216
|
+
if (provider.apiStyle === 'anthropic') {
|
|
217
|
+
url = provider.apiUrl;
|
|
218
|
+
body = JSON.stringify({
|
|
219
|
+
model,
|
|
220
|
+
max_tokens: 4096,
|
|
221
|
+
messages: [{ role: 'user', content: prompt }],
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
else if (provider.apiStyle === 'google') {
|
|
225
|
+
url = `${provider.apiUrl}/${model}:generateContent?key=${apiKey}`;
|
|
226
|
+
body = JSON.stringify({
|
|
227
|
+
contents: [{ parts: [{ text: prompt }] }],
|
|
228
|
+
generationConfig: { maxOutputTokens: 4096 },
|
|
229
|
+
});
|
|
230
|
+
}
|
|
231
|
+
else {
|
|
232
|
+
url = provider.apiUrl;
|
|
233
|
+
body = JSON.stringify({
|
|
234
|
+
model,
|
|
235
|
+
max_tokens: 4096,
|
|
236
|
+
messages: [{ role: 'user', content: prompt }],
|
|
237
|
+
});
|
|
238
|
+
}
|
|
239
|
+
const res = await fetch(url, {
|
|
240
|
+
method: 'POST',
|
|
241
|
+
headers,
|
|
242
|
+
body,
|
|
243
|
+
signal: AbortSignal.timeout(60_000),
|
|
244
|
+
});
|
|
245
|
+
if (!res.ok)
|
|
246
|
+
return null;
|
|
247
|
+
const data = await res.json();
|
|
248
|
+
let text = '';
|
|
249
|
+
if (provider.apiStyle === 'anthropic') {
|
|
250
|
+
const blocks = data.content || [];
|
|
251
|
+
text = blocks.filter(b => b.type === 'text').map(b => b.text || '').join('');
|
|
252
|
+
}
|
|
253
|
+
else if (provider.apiStyle === 'google') {
|
|
254
|
+
const candidates = data.candidates || [];
|
|
255
|
+
text = candidates[0]?.content?.parts?.map(p => p.text).join('') || '';
|
|
256
|
+
}
|
|
257
|
+
else {
|
|
258
|
+
const choices = data.choices || [];
|
|
259
|
+
text = choices[0]?.message?.content || '';
|
|
260
|
+
}
|
|
261
|
+
// Parse the response — expect a code block with the improved file
|
|
262
|
+
const patch = extractCodeBlock(text);
|
|
263
|
+
if (!patch)
|
|
264
|
+
return null;
|
|
265
|
+
// Basic sanity: patch should be at least 50% the size of original
|
|
266
|
+
if (patch.length < original.length * 0.5)
|
|
267
|
+
return null;
|
|
268
|
+
return {
|
|
269
|
+
file: targetFile,
|
|
270
|
+
description: extractDescription(text),
|
|
271
|
+
weakness,
|
|
272
|
+
patch,
|
|
273
|
+
original,
|
|
274
|
+
};
|
|
275
|
+
}
|
|
276
|
+
catch {
|
|
277
|
+
return null;
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
function buildProposalPrompt(weakness, file, source) {
|
|
281
|
+
return `You are improving the source code of K:BOT, an open-source terminal AI agent.
|
|
282
|
+
|
|
283
|
+
WEAKNESS DETECTED:
|
|
284
|
+
- Area: ${weakness.area}
|
|
285
|
+
- Issue: ${weakness.description}
|
|
286
|
+
- Severity: ${weakness.severity}
|
|
287
|
+
- Evidence: ${weakness.evidence}
|
|
288
|
+
|
|
289
|
+
FILE TO IMPROVE: ${file}
|
|
290
|
+
|
|
291
|
+
CURRENT SOURCE:
|
|
292
|
+
\`\`\`typescript
|
|
293
|
+
${source}
|
|
294
|
+
\`\`\`
|
|
295
|
+
|
|
296
|
+
RULES:
|
|
297
|
+
1. Make the MINIMAL change needed to address the weakness
|
|
298
|
+
2. Keep all existing exports and function signatures
|
|
299
|
+
3. Do NOT change import paths
|
|
300
|
+
4. Do NOT add new dependencies
|
|
301
|
+
5. Preserve the coding style (2-space indent, single quotes, no semicolons at line ends where absent)
|
|
302
|
+
6. The change must pass \`npx tsc --noEmit\` and \`npx vitest run\`
|
|
303
|
+
|
|
304
|
+
Respond with:
|
|
305
|
+
1. A one-line description of your change
|
|
306
|
+
2. The COMPLETE improved file in a single typescript code block
|
|
307
|
+
|
|
308
|
+
DESCRIPTION: <your one-line description>
|
|
309
|
+
|
|
310
|
+
\`\`\`typescript
|
|
311
|
+
<complete improved file>
|
|
312
|
+
\`\`\``;
|
|
313
|
+
}
|
|
314
|
+
function extractCodeBlock(text) {
|
|
315
|
+
const match = text.match(/```(?:typescript|ts)?\n([\s\S]*?)```/);
|
|
316
|
+
return match ? match[1].trim() : null;
|
|
317
|
+
}
|
|
318
|
+
function extractDescription(text) {
|
|
319
|
+
const match = text.match(/DESCRIPTION:\s*(.+)/i);
|
|
320
|
+
return match ? match[1].trim() : 'Code improvement';
|
|
321
|
+
}
|
|
322
|
+
function guessTargetFile(area) {
|
|
323
|
+
const areaMap = {
|
|
324
|
+
'typescript': 'src/agent.ts',
|
|
325
|
+
'javascript': 'src/agent.ts',
|
|
326
|
+
'streaming': 'src/streaming.ts',
|
|
327
|
+
'tool-execution': 'src/agent.ts',
|
|
328
|
+
'routing': 'src/learned-router.ts',
|
|
329
|
+
'confidence-calibration': 'src/confidence.ts',
|
|
330
|
+
'learning': 'src/learning.ts',
|
|
331
|
+
'memory': 'src/memory.ts',
|
|
332
|
+
'planning': 'src/planner.ts',
|
|
333
|
+
'context': 'src/context-manager.ts',
|
|
334
|
+
'code-quality': 'src/agent.ts',
|
|
335
|
+
'testing': 'src/agent.ts',
|
|
336
|
+
'search': 'src/tools/search.ts',
|
|
337
|
+
'git': 'src/tools/git.ts',
|
|
338
|
+
'devops': 'src/tools/bash.ts',
|
|
339
|
+
};
|
|
340
|
+
return areaMap[area] || null;
|
|
341
|
+
}
|
|
342
|
+
// ══════════════════════════════════════════════════════════════════
|
|
343
|
+
// 3. VALIDATE — Typecheck + test the proposed change
|
|
344
|
+
// ══════════════════════════════════════════════════════════════════
|
|
345
|
+
/**
|
|
346
|
+
* Apply a proposal temporarily and run validation (tsc + vitest).
|
|
347
|
+
* Returns true if the change passes, false otherwise.
|
|
348
|
+
*/
|
|
349
|
+
export function validate(proposal) {
|
|
350
|
+
const kbotRoot = findKbotRoot();
|
|
351
|
+
const absPath = join(kbotRoot, proposal.file);
|
|
352
|
+
// Write the patched file
|
|
353
|
+
writeFileSync(absPath, proposal.patch, 'utf-8');
|
|
354
|
+
try {
|
|
355
|
+
// Type check
|
|
356
|
+
execSync('npx tsc --noEmit', {
|
|
357
|
+
cwd: kbotRoot,
|
|
358
|
+
encoding: 'utf-8',
|
|
359
|
+
timeout: 60_000,
|
|
360
|
+
stdio: 'pipe',
|
|
361
|
+
});
|
|
362
|
+
}
|
|
363
|
+
catch (err) {
|
|
364
|
+
// Rollback
|
|
365
|
+
writeFileSync(absPath, proposal.original, 'utf-8');
|
|
366
|
+
const stderr = err.stderr || '';
|
|
367
|
+
return { passes: false, errors: `Typecheck failed:\n${stderr.slice(0, 500)}` };
|
|
368
|
+
}
|
|
369
|
+
try {
|
|
370
|
+
// Run tests
|
|
371
|
+
execSync('npx vitest run --reporter=verbose 2>&1', {
|
|
372
|
+
cwd: kbotRoot,
|
|
373
|
+
encoding: 'utf-8',
|
|
374
|
+
timeout: 120_000,
|
|
375
|
+
stdio: 'pipe',
|
|
376
|
+
});
|
|
377
|
+
}
|
|
378
|
+
catch (err) {
|
|
379
|
+
// Rollback
|
|
380
|
+
writeFileSync(absPath, proposal.original, 'utf-8');
|
|
381
|
+
const stderr = err.stderr || err.stdout || '';
|
|
382
|
+
return { passes: false, errors: `Tests failed:\n${stderr.slice(0, 500)}` };
|
|
383
|
+
}
|
|
384
|
+
return { passes: true, errors: '' };
|
|
385
|
+
}
|
|
386
|
+
export function scoreMetrics(source) {
|
|
387
|
+
const lines = source.split('\n');
|
|
388
|
+
const loc = lines.filter(l => l.trim() && !l.trim().startsWith('//')).length;
|
|
389
|
+
// Simple complexity: count if/else/for/while/switch/catch/? (ternary)
|
|
390
|
+
const complexity = (source.match(/\b(if|else|for|while|switch|catch|case)\b|\?.*:/g) || []).length;
|
|
391
|
+
const todoCount = (source.match(/\b(TODO|FIXME|HACK|XXX)\b/g) || []).length;
|
|
392
|
+
const exportCount = (source.match(/\bexport\s+(function|const|class|interface|type|enum)\b/g) || []).length;
|
|
393
|
+
return { loc, complexity, todoCount, exportCount };
|
|
394
|
+
}
|
|
395
|
+
/**
|
|
396
|
+
* Compute a delta score between before/after metrics.
|
|
397
|
+
* Positive = improvement, negative = regression.
|
|
398
|
+
*/
|
|
399
|
+
export function computeDelta(before, after) {
|
|
400
|
+
let delta = 0;
|
|
401
|
+
// Fewer TODOs is better
|
|
402
|
+
delta += (before.todoCount - after.todoCount) * 0.2;
|
|
403
|
+
// Lower complexity (if significant) is better
|
|
404
|
+
if (before.complexity > 0) {
|
|
405
|
+
const complexityReduction = (before.complexity - after.complexity) / before.complexity;
|
|
406
|
+
delta += complexityReduction * 0.3;
|
|
407
|
+
}
|
|
408
|
+
// Breaking exports is bad — any lost export is a -1.0 penalty
|
|
409
|
+
if (after.exportCount < before.exportCount) {
|
|
410
|
+
delta -= (before.exportCount - after.exportCount) * 1.0;
|
|
411
|
+
}
|
|
412
|
+
// LOC change: slight preference for smaller (but not drastic reduction)
|
|
413
|
+
if (before.loc > 0) {
|
|
414
|
+
const locChange = (before.loc - after.loc) / before.loc;
|
|
415
|
+
if (locChange > 0 && locChange < 0.3) {
|
|
416
|
+
delta += locChange * 0.1; // slight reward for trimming
|
|
417
|
+
}
|
|
418
|
+
else if (locChange > 0.3) {
|
|
419
|
+
delta -= 0.5; // suspicious: lost too much code
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
return Math.round(delta * 1000) / 1000;
|
|
423
|
+
}
|
|
424
|
+
// ══════════════════════════════════════════════════════════════════
|
|
425
|
+
// 5. RUN EVOLUTION CYCLE — Full orchestrator
|
|
426
|
+
// ══════════════════════════════════════════════════════════════════
|
|
427
|
+
/**
|
|
428
|
+
* Run one evolution cycle:
|
|
429
|
+
* 1. Check for clean working tree
|
|
430
|
+
* 2. Diagnose weaknesses
|
|
431
|
+
* 3. For each weakness (max 3): propose → validate → score → apply/rollback
|
|
432
|
+
* 4. Log everything
|
|
433
|
+
*/
|
|
434
|
+
export async function runEvolutionCycle() {
|
|
435
|
+
const cycleId = `evo-${Date.now()}`;
|
|
436
|
+
const cycle = {
|
|
437
|
+
id: cycleId,
|
|
438
|
+
startedAt: new Date().toISOString(),
|
|
439
|
+
weaknesses: [],
|
|
440
|
+
proposals: [],
|
|
441
|
+
results: [],
|
|
442
|
+
status: 'running',
|
|
443
|
+
};
|
|
444
|
+
try {
|
|
445
|
+
const kbotRoot = findKbotRoot();
|
|
446
|
+
// Safety: check for clean working tree
|
|
447
|
+
try {
|
|
448
|
+
const gitStatus = execSync('git status --porcelain', {
|
|
449
|
+
cwd: kbotRoot,
|
|
450
|
+
encoding: 'utf-8',
|
|
451
|
+
timeout: 5000,
|
|
452
|
+
}).trim();
|
|
453
|
+
if (gitStatus) {
|
|
454
|
+
// Stash changes for safety
|
|
455
|
+
execSync('git stash push -m "kbot-evolution-safety-stash"', {
|
|
456
|
+
cwd: kbotRoot,
|
|
457
|
+
encoding: 'utf-8',
|
|
458
|
+
timeout: 10000,
|
|
459
|
+
});
|
|
460
|
+
}
|
|
461
|
+
}
|
|
462
|
+
catch {
|
|
463
|
+
// Not a git repo or git not available — proceed without safety net
|
|
464
|
+
}
|
|
465
|
+
// Step 1: Diagnose
|
|
466
|
+
const weaknesses = diagnose();
|
|
467
|
+
cycle.weaknesses = weaknesses;
|
|
468
|
+
if (weaknesses.length === 0) {
|
|
469
|
+
cycle.status = 'completed';
|
|
470
|
+
cycle.endedAt = new Date().toISOString();
|
|
471
|
+
cycle.results.push({
|
|
472
|
+
status: 'skipped',
|
|
473
|
+
reason: 'No weaknesses detected — kbot is performing well',
|
|
474
|
+
weakness: { area: 'none', description: 'No issues found', severity: 'low', evidence: 'clean diagnosis' },
|
|
475
|
+
delta: 0,
|
|
476
|
+
timestamp: new Date().toISOString(),
|
|
477
|
+
});
|
|
478
|
+
appendToLog(cycle);
|
|
479
|
+
return cycle;
|
|
480
|
+
}
|
|
481
|
+
// Step 2: Process top 3 weaknesses
|
|
482
|
+
const targetWeaknesses = weaknesses.slice(0, 3);
|
|
483
|
+
for (const weakness of targetWeaknesses) {
|
|
484
|
+
// Propose
|
|
485
|
+
const proposal = await proposeImprovement(weakness);
|
|
486
|
+
if (!proposal) {
|
|
487
|
+
cycle.results.push({
|
|
488
|
+
status: 'skipped',
|
|
489
|
+
reason: 'Could not generate a valid proposal',
|
|
490
|
+
weakness,
|
|
491
|
+
delta: 0,
|
|
492
|
+
timestamp: new Date().toISOString(),
|
|
493
|
+
});
|
|
494
|
+
continue;
|
|
495
|
+
}
|
|
496
|
+
cycle.proposals.push(proposal);
|
|
497
|
+
// Score before
|
|
498
|
+
const beforeMetrics = scoreMetrics(proposal.original);
|
|
499
|
+
// Validate (writes file, runs tsc + vitest)
|
|
500
|
+
const validation = validate(proposal);
|
|
501
|
+
if (!validation.passes) {
|
|
502
|
+
// validate() already rolled back the file
|
|
503
|
+
cycle.results.push({
|
|
504
|
+
status: 'rolled-back',
|
|
505
|
+
reason: validation.errors,
|
|
506
|
+
weakness,
|
|
507
|
+
delta: 0,
|
|
508
|
+
timestamp: new Date().toISOString(),
|
|
509
|
+
});
|
|
510
|
+
continue;
|
|
511
|
+
}
|
|
512
|
+
// Score after (file is still patched from validate())
|
|
513
|
+
const afterMetrics = scoreMetrics(proposal.patch);
|
|
514
|
+
const delta = computeDelta(beforeMetrics, afterMetrics);
|
|
515
|
+
if (delta < -0.1) {
|
|
516
|
+
// Negative delta — rollback even though it passes
|
|
517
|
+
const absPath = join(kbotRoot, proposal.file);
|
|
518
|
+
writeFileSync(absPath, proposal.original, 'utf-8');
|
|
519
|
+
cycle.results.push({
|
|
520
|
+
status: 'rolled-back',
|
|
521
|
+
reason: `Negative quality delta (${delta.toFixed(3)}) — change makes code worse`,
|
|
522
|
+
weakness,
|
|
523
|
+
delta,
|
|
524
|
+
timestamp: new Date().toISOString(),
|
|
525
|
+
});
|
|
526
|
+
continue;
|
|
527
|
+
}
|
|
528
|
+
// Apply! File is already written by validate()
|
|
529
|
+
cycle.results.push({
|
|
530
|
+
status: 'applied',
|
|
531
|
+
reason: `${proposal.description} (delta: +${delta.toFixed(3)})`,
|
|
532
|
+
weakness,
|
|
533
|
+
delta,
|
|
534
|
+
timestamp: new Date().toISOString(),
|
|
535
|
+
});
|
|
536
|
+
}
|
|
537
|
+
cycle.status = 'completed';
|
|
538
|
+
}
|
|
539
|
+
catch (err) {
|
|
540
|
+
cycle.status = 'failed';
|
|
541
|
+
cycle.error = err instanceof Error ? err.message : String(err);
|
|
542
|
+
}
|
|
543
|
+
cycle.endedAt = new Date().toISOString();
|
|
544
|
+
appendToLog(cycle);
|
|
545
|
+
return cycle;
|
|
546
|
+
}
|
|
547
|
+
function appendToLog(cycle) {
|
|
548
|
+
const log = loadLog();
|
|
549
|
+
log.push(cycle);
|
|
550
|
+
saveLog(log);
|
|
551
|
+
}
|
|
552
|
+
// ══════════════════════════════════════════════════════════════════
|
|
553
|
+
// 6. STATUS + REPORTING
|
|
554
|
+
// ══════════════════════════════════════════════════════════════════
|
|
555
|
+
/** Get the full evolution log */
|
|
556
|
+
export function getEvolutionLog() {
|
|
557
|
+
return loadLog();
|
|
558
|
+
}
|
|
559
|
+
/** Get a summary of evolution activity */
|
|
560
|
+
export function getEvolutionStats() {
|
|
561
|
+
const log = loadLog();
|
|
562
|
+
let totalApplied = 0;
|
|
563
|
+
let totalRolledBack = 0;
|
|
564
|
+
let totalSkipped = 0;
|
|
565
|
+
let totalDelta = 0;
|
|
566
|
+
let deltaCount = 0;
|
|
567
|
+
for (const cycle of log) {
|
|
568
|
+
for (const result of cycle.results) {
|
|
569
|
+
if (result.status === 'applied') {
|
|
570
|
+
totalApplied++;
|
|
571
|
+
totalDelta += result.delta;
|
|
572
|
+
deltaCount++;
|
|
573
|
+
}
|
|
574
|
+
else if (result.status === 'rolled-back') {
|
|
575
|
+
totalRolledBack++;
|
|
576
|
+
}
|
|
577
|
+
else {
|
|
578
|
+
totalSkipped++;
|
|
579
|
+
}
|
|
580
|
+
}
|
|
581
|
+
}
|
|
582
|
+
return {
|
|
583
|
+
totalCycles: log.length,
|
|
584
|
+
totalApplied,
|
|
585
|
+
totalRolledBack,
|
|
586
|
+
totalSkipped,
|
|
587
|
+
avgDelta: deltaCount > 0 ? Math.round((totalDelta / deltaCount) * 1000) / 1000 : 0,
|
|
588
|
+
lastCycle: log.length > 0 ? log[log.length - 1].endedAt || log[log.length - 1].startedAt : null,
|
|
589
|
+
};
|
|
590
|
+
}
|
|
591
|
+
/** Format evolution status for terminal display */
|
|
592
|
+
export function formatEvolutionStatus() {
|
|
593
|
+
const stats = getEvolutionStats();
|
|
594
|
+
const lines = [];
|
|
595
|
+
lines.push('=== K:BOT Evolution Engine ===');
|
|
596
|
+
lines.push('');
|
|
597
|
+
lines.push(`Cycles run: ${stats.totalCycles}`);
|
|
598
|
+
lines.push(`Applied: ${stats.totalApplied}`);
|
|
599
|
+
lines.push(`Rolled back: ${stats.totalRolledBack}`);
|
|
600
|
+
lines.push(`Skipped: ${stats.totalSkipped}`);
|
|
601
|
+
lines.push(`Avg improvement: ${stats.avgDelta >= 0 ? '+' : ''}${stats.avgDelta.toFixed(3)}`);
|
|
602
|
+
if (stats.lastCycle) {
|
|
603
|
+
const ago = Date.now() - new Date(stats.lastCycle).getTime();
|
|
604
|
+
const hours = Math.round(ago / 3600000);
|
|
605
|
+
lines.push(`Last cycle: ${hours < 24 ? `${hours}h ago` : `${Math.round(hours / 24)}d ago`}`);
|
|
606
|
+
}
|
|
607
|
+
else {
|
|
608
|
+
lines.push('Last cycle: never');
|
|
609
|
+
}
|
|
610
|
+
// Show recent results
|
|
611
|
+
const log = loadLog();
|
|
612
|
+
if (log.length > 0) {
|
|
613
|
+
const recent = log[log.length - 1];
|
|
614
|
+
lines.push('');
|
|
615
|
+
lines.push(`Latest cycle (${recent.id}):`);
|
|
616
|
+
lines.push(` Status: ${recent.status}`);
|
|
617
|
+
lines.push(` Weaknesses: ${recent.weaknesses.length}`);
|
|
618
|
+
for (const r of recent.results) {
|
|
619
|
+
const icon = r.status === 'applied' ? '✓' : r.status === 'rolled-back' ? '✗' : '○';
|
|
620
|
+
lines.push(` ${icon} ${r.weakness.area}: ${r.reason.slice(0, 80)}`);
|
|
621
|
+
}
|
|
622
|
+
}
|
|
623
|
+
return lines.join('\n');
|
|
624
|
+
}
|
|
625
|
+
/** Format diagnosis output for terminal display */
|
|
626
|
+
export function formatDiagnosis(weaknesses) {
|
|
627
|
+
if (weaknesses.length === 0) {
|
|
628
|
+
return 'No weaknesses detected. K:BOT is performing well.';
|
|
629
|
+
}
|
|
630
|
+
const lines = [`Found ${weaknesses.length} weakness${weaknesses.length > 1 ? 'es' : ''}:`, ''];
|
|
631
|
+
for (const w of weaknesses) {
|
|
632
|
+
const icon = w.severity === 'high' ? '▲' : w.severity === 'medium' ? '●' : '○';
|
|
633
|
+
lines.push(` ${icon} [${w.severity}] ${w.area}`);
|
|
634
|
+
lines.push(` ${w.description}`);
|
|
635
|
+
lines.push(` Evidence: ${w.evidence}`);
|
|
636
|
+
if (w.targetFile)
|
|
637
|
+
lines.push(` Target: ${w.targetFile}`);
|
|
638
|
+
lines.push('');
|
|
639
|
+
}
|
|
640
|
+
return lines.join('\n');
|
|
641
|
+
}
|
|
642
|
+
//# sourceMappingURL=evolution.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evolution.js","sourceRoot":"","sources":["../src/evolution.ts"],"names":[],"mappings":"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"}
|