darwin-agents 0.4.4
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 +21 -0
- package/README.md +245 -0
- package/dist/agents/analyst.d.ts +11 -0
- package/dist/agents/analyst.d.ts.map +1 -0
- package/dist/agents/analyst.js +78 -0
- package/dist/agents/analyst.js.map +1 -0
- package/dist/agents/blog-writer.d.ts +13 -0
- package/dist/agents/blog-writer.d.ts.map +1 -0
- package/dist/agents/blog-writer.js +59 -0
- package/dist/agents/blog-writer.js.map +1 -0
- package/dist/agents/critic.d.ts +11 -0
- package/dist/agents/critic.d.ts.map +1 -0
- package/dist/agents/critic.js +57 -0
- package/dist/agents/critic.js.map +1 -0
- package/dist/agents/index.d.ts +15 -0
- package/dist/agents/index.d.ts.map +1 -0
- package/dist/agents/index.js +31 -0
- package/dist/agents/index.js.map +1 -0
- package/dist/agents/investigator-critic.d.ts +10 -0
- package/dist/agents/investigator-critic.d.ts.map +1 -0
- package/dist/agents/investigator-critic.js +78 -0
- package/dist/agents/investigator-critic.js.map +1 -0
- package/dist/agents/investigator.d.ts +13 -0
- package/dist/agents/investigator.d.ts.map +1 -0
- package/dist/agents/investigator.js +105 -0
- package/dist/agents/investigator.js.map +1 -0
- package/dist/agents/marketing.d.ts +13 -0
- package/dist/agents/marketing.d.ts.map +1 -0
- package/dist/agents/marketing.js +59 -0
- package/dist/agents/marketing.js.map +1 -0
- package/dist/agents/researcher.d.ts +11 -0
- package/dist/agents/researcher.d.ts.map +1 -0
- package/dist/agents/researcher.js +68 -0
- package/dist/agents/researcher.js.map +1 -0
- package/dist/agents/writer.d.ts +9 -0
- package/dist/agents/writer.d.ts.map +1 -0
- package/dist/agents/writer.js +47 -0
- package/dist/agents/writer.js.map +1 -0
- package/dist/cli/create.d.ts +11 -0
- package/dist/cli/create.d.ts.map +1 -0
- package/dist/cli/create.js +104 -0
- package/dist/cli/create.js.map +1 -0
- package/dist/cli/evolve.d.ts +13 -0
- package/dist/cli/evolve.d.ts.map +1 -0
- package/dist/cli/evolve.js +69 -0
- package/dist/cli/evolve.js.map +1 -0
- package/dist/cli/index.d.ts +13 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +84 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/init.d.ts +12 -0
- package/dist/cli/init.d.ts.map +1 -0
- package/dist/cli/init.js +68 -0
- package/dist/cli/init.js.map +1 -0
- package/dist/cli/run.d.ts +7 -0
- package/dist/cli/run.d.ts.map +1 -0
- package/dist/cli/run.js +371 -0
- package/dist/cli/run.js.map +1 -0
- package/dist/cli/status.d.ts +7 -0
- package/dist/cli/status.d.ts.map +1 -0
- package/dist/cli/status.js +123 -0
- package/dist/cli/status.js.map +1 -0
- package/dist/core/agent.d.ts +53 -0
- package/dist/core/agent.d.ts.map +1 -0
- package/dist/core/agent.js +172 -0
- package/dist/core/agent.js.map +1 -0
- package/dist/core/runner.d.ts +64 -0
- package/dist/core/runner.d.ts.map +1 -0
- package/dist/core/runner.js +203 -0
- package/dist/core/runner.js.map +1 -0
- package/dist/evolution/loop.d.ts +100 -0
- package/dist/evolution/loop.d.ts.map +1 -0
- package/dist/evolution/loop.js +424 -0
- package/dist/evolution/loop.js.map +1 -0
- package/dist/evolution/multi-critic.d.ts +58 -0
- package/dist/evolution/multi-critic.d.ts.map +1 -0
- package/dist/evolution/multi-critic.js +324 -0
- package/dist/evolution/multi-critic.js.map +1 -0
- package/dist/evolution/notifications.d.ts +32 -0
- package/dist/evolution/notifications.d.ts.map +1 -0
- package/dist/evolution/notifications.js +92 -0
- package/dist/evolution/notifications.js.map +1 -0
- package/dist/evolution/optimizer.d.ts +64 -0
- package/dist/evolution/optimizer.d.ts.map +1 -0
- package/dist/evolution/optimizer.js +223 -0
- package/dist/evolution/optimizer.js.map +1 -0
- package/dist/evolution/patterns.d.ts +63 -0
- package/dist/evolution/patterns.d.ts.map +1 -0
- package/dist/evolution/patterns.js +297 -0
- package/dist/evolution/patterns.js.map +1 -0
- package/dist/evolution/safety.d.ts +76 -0
- package/dist/evolution/safety.d.ts.map +1 -0
- package/dist/evolution/safety.js +182 -0
- package/dist/evolution/safety.js.map +1 -0
- package/dist/evolution/tracker.d.ts +48 -0
- package/dist/evolution/tracker.d.ts.map +1 -0
- package/dist/evolution/tracker.js +163 -0
- package/dist/evolution/tracker.js.map +1 -0
- package/dist/index.d.ts +32 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +35 -0
- package/dist/index.js.map +1 -0
- package/dist/memory/index.d.ts +32 -0
- package/dist/memory/index.d.ts.map +1 -0
- package/dist/memory/index.js +49 -0
- package/dist/memory/index.js.map +1 -0
- package/dist/memory/postgres-memory.d.ts +52 -0
- package/dist/memory/postgres-memory.d.ts.map +1 -0
- package/dist/memory/postgres-memory.js +515 -0
- package/dist/memory/postgres-memory.js.map +1 -0
- package/dist/memory/sqlite-memory.d.ts +36 -0
- package/dist/memory/sqlite-memory.d.ts.map +1 -0
- package/dist/memory/sqlite-memory.js +380 -0
- package/dist/memory/sqlite-memory.js.map +1 -0
- package/dist/providers/anthropic.d.ts +20 -0
- package/dist/providers/anthropic.d.ts.map +1 -0
- package/dist/providers/anthropic.js +82 -0
- package/dist/providers/anthropic.js.map +1 -0
- package/dist/providers/claude-cli.d.ts +35 -0
- package/dist/providers/claude-cli.d.ts.map +1 -0
- package/dist/providers/claude-cli.js +143 -0
- package/dist/providers/claude-cli.js.map +1 -0
- package/dist/providers/index.d.ts +39 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +58 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/ollama.d.ts +17 -0
- package/dist/providers/ollama.d.ts.map +1 -0
- package/dist/providers/ollama.js +64 -0
- package/dist/providers/ollama.js.map +1 -0
- package/dist/providers/openai.d.ts +19 -0
- package/dist/providers/openai.d.ts.map +1 -0
- package/dist/providers/openai.js +75 -0
- package/dist/providers/openai.js.map +1 -0
- package/dist/providers/types.d.ts +62 -0
- package/dist/providers/types.d.ts.map +1 -0
- package/dist/providers/types.js +9 -0
- package/dist/providers/types.js.map +1 -0
- package/dist/types.d.ts +221 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +19 -0
- package/dist/types.js.map +1 -0
- package/package.json +81 -0
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Darwin — Evolution Loop
|
|
3
|
+
*
|
|
4
|
+
* The core evolution cycle. Called after every agent run, it:
|
|
5
|
+
* 1. Records the experiment
|
|
6
|
+
* 2. Checks for failure rollback
|
|
7
|
+
* 3. Manages A/B tests between prompt versions
|
|
8
|
+
* 4. Triggers prompt optimization when enough data exists
|
|
9
|
+
*
|
|
10
|
+
* This is the brain of Darwin's self-evolution.
|
|
11
|
+
*/
|
|
12
|
+
import type { AgentDefinition, DarwinExperiment, DarwinPattern, MemoryProvider } from '../types.js';
|
|
13
|
+
import type { ExperimentTracker } from './tracker.js';
|
|
14
|
+
import type { PromptOptimizer } from './optimizer.js';
|
|
15
|
+
import type { SafetyGate } from './safety.js';
|
|
16
|
+
import type { PatternDetector } from './patterns.js';
|
|
17
|
+
import type { NotificationConfig } from './notifications.js';
|
|
18
|
+
export interface EvolutionResult {
|
|
19
|
+
patternsFound: DarwinPattern[];
|
|
20
|
+
promptEvolved: boolean;
|
|
21
|
+
abTestStarted: boolean;
|
|
22
|
+
abTestCompleted: boolean;
|
|
23
|
+
rolledBack: boolean;
|
|
24
|
+
newVersion?: string;
|
|
25
|
+
message: string;
|
|
26
|
+
}
|
|
27
|
+
interface DarwinLoopDeps {
|
|
28
|
+
memory: MemoryProvider;
|
|
29
|
+
tracker: ExperimentTracker;
|
|
30
|
+
optimizer: PromptOptimizer;
|
|
31
|
+
safety: SafetyGate;
|
|
32
|
+
patterns: PatternDetector;
|
|
33
|
+
/** Agent definition — used to pass tool context to optimizer */
|
|
34
|
+
agent?: AgentDefinition;
|
|
35
|
+
/** Notification config (Telegram alerts) — auto-loaded from env if not set */
|
|
36
|
+
notifications?: NotificationConfig;
|
|
37
|
+
}
|
|
38
|
+
export declare class DarwinLoop {
|
|
39
|
+
private memory;
|
|
40
|
+
private tracker;
|
|
41
|
+
private optimizer;
|
|
42
|
+
private safety;
|
|
43
|
+
private patterns;
|
|
44
|
+
private agent?;
|
|
45
|
+
private notifications;
|
|
46
|
+
constructor(deps: DarwinLoopDeps);
|
|
47
|
+
/**
|
|
48
|
+
* Called AFTER every agent run. Drives the evolution cycle.
|
|
49
|
+
*
|
|
50
|
+
* Flow:
|
|
51
|
+
* 0. Detect incomplete runs (skip them)
|
|
52
|
+
* 1. Record experiment
|
|
53
|
+
* 2. Rollback check (consecutive failures)
|
|
54
|
+
* 3. A/B test management (if active)
|
|
55
|
+
* 4. Validate data quality before evolving
|
|
56
|
+
* 5. Evolution trigger (if enough data and no active test)
|
|
57
|
+
*/
|
|
58
|
+
afterRun(experiment: DarwinExperiment): Promise<EvolutionResult>;
|
|
59
|
+
private handleABTest;
|
|
60
|
+
/**
|
|
61
|
+
* Roll back to the last known good prompt version.
|
|
62
|
+
* Returns true if a rollback was performed.
|
|
63
|
+
*/
|
|
64
|
+
private rollback;
|
|
65
|
+
/**
|
|
66
|
+
* Activate a specific prompt version and deactivate all others.
|
|
67
|
+
*/
|
|
68
|
+
private activateVersion;
|
|
69
|
+
/**
|
|
70
|
+
* Extract recent critic feedback reports from experiments.
|
|
71
|
+
*
|
|
72
|
+
* Returns up to `limit` feedback report texts from the most recent experiments
|
|
73
|
+
* that have critic feedback. Experiments are already ordered by started_at DESC
|
|
74
|
+
* from loadExperiments(), so we just filter for ones with feedback.
|
|
75
|
+
*/
|
|
76
|
+
private getRecentFeedback;
|
|
77
|
+
/**
|
|
78
|
+
* Increment version string: "v1" -> "v2", "v12" -> "v13".
|
|
79
|
+
*/
|
|
80
|
+
private nextVersion;
|
|
81
|
+
/**
|
|
82
|
+
* Check if a run is incomplete (agent ran out of turns or produced no real output).
|
|
83
|
+
* Incomplete runs are NOT recorded as experiments to avoid poisoning the data.
|
|
84
|
+
*
|
|
85
|
+
* Checks output length regardless of success flag — a 300-char "successful" run
|
|
86
|
+
* is still garbage data that shouldn't influence evolution.
|
|
87
|
+
*/
|
|
88
|
+
private isIncompleteRun;
|
|
89
|
+
/**
|
|
90
|
+
* Validate that experiment data is clean enough for evolution.
|
|
91
|
+
* Prevents garbage-in-garbage-out (e.g., broken search backend producing 0 sources).
|
|
92
|
+
*/
|
|
93
|
+
private validateDataQuality;
|
|
94
|
+
/**
|
|
95
|
+
* Build a human-readable change reason from detected patterns.
|
|
96
|
+
*/
|
|
97
|
+
private buildChangeReason;
|
|
98
|
+
}
|
|
99
|
+
export {};
|
|
100
|
+
//# sourceMappingURL=loop.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loop.d.ts","sourceRoot":"","sources":["../../src/evolution/loop.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAEV,eAAe,EACf,gBAAgB,EAChB,aAAa,EACb,cAAc,EAEf,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,KAAK,EAAE,eAAe,EAAoB,MAAM,gBAAgB,CAAC;AACxE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAK7D,MAAM,WAAW,eAAe;IAC9B,aAAa,EAAE,aAAa,EAAE,CAAC;IAC/B,aAAa,EAAE,OAAO,CAAC;IACvB,aAAa,EAAE,OAAO,CAAC;IACvB,eAAe,EAAE,OAAO,CAAC;IACzB,UAAU,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;CACjB;AAID,UAAU,cAAc;IACtB,MAAM,EAAE,cAAc,CAAC;IACvB,OAAO,EAAE,iBAAiB,CAAC;IAC3B,SAAS,EAAE,eAAe,CAAC;IAC3B,MAAM,EAAE,UAAU,CAAC;IACnB,QAAQ,EAAE,eAAe,CAAC;IAC1B,gEAAgE;IAChE,KAAK,CAAC,EAAE,eAAe,CAAC;IACxB,8EAA8E;IAC9E,aAAa,CAAC,EAAE,kBAAkB,CAAC;CACpC;AAYD,qBAAa,UAAU;IACrB,OAAO,CAAC,MAAM,CAAiB;IAC/B,OAAO,CAAC,OAAO,CAAoB;IACnC,OAAO,CAAC,SAAS,CAAkB;IACnC,OAAO,CAAC,MAAM,CAAa;IAC3B,OAAO,CAAC,QAAQ,CAAkB;IAClC,OAAO,CAAC,KAAK,CAAC,CAAkB;IAChC,OAAO,CAAC,aAAa,CAAqB;gBAE9B,IAAI,EAAE,cAAc;IAUhC;;;;;;;;;;OAUG;IACG,QAAQ,CAAC,UAAU,EAAE,gBAAgB,GAAG,OAAO,CAAC,eAAe,CAAC;YA4NxD,YAAY;IAiG1B;;;OAGG;YACW,QAAQ;IA8BtB;;OAEG;YACW,eAAe;IAe7B;;;;;;OAMG;YACW,iBAAiB;IAe/B;;OAEG;IACH,OAAO,CAAC,WAAW;IAWnB;;;;;;OAMG;IACH,OAAO,CAAC,eAAe;IAKvB;;;OAGG;YACW,mBAAmB;IAiDjC;;OAEG;IACH,OAAO,CAAC,iBAAiB;CAsB1B"}
|
|
@@ -0,0 +1,424 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Darwin — Evolution Loop
|
|
3
|
+
*
|
|
4
|
+
* The core evolution cycle. Called after every agent run, it:
|
|
5
|
+
* 1. Records the experiment
|
|
6
|
+
* 2. Checks for failure rollback
|
|
7
|
+
* 3. Manages A/B tests between prompt versions
|
|
8
|
+
* 4. Triggers prompt optimization when enough data exists
|
|
9
|
+
*
|
|
10
|
+
* This is the brain of Darwin's self-evolution.
|
|
11
|
+
*/
|
|
12
|
+
import { notifyABTestComplete, notifyEvolutionStarted, notifyRollback } from './notifications.js';
|
|
13
|
+
// ─── Validation Constants ─────────────────────────────
|
|
14
|
+
/** Default minimum output length (overridden by agent.evolution.minOutputLength) */
|
|
15
|
+
const DEFAULT_MIN_VALID_OUTPUT = 2000;
|
|
16
|
+
/** Minimum % of runs with sources needed before evolution triggers */
|
|
17
|
+
const MIN_SOURCE_COVERAGE = 0.5;
|
|
18
|
+
// ─── Loop ──────────────────────────────────────────────
|
|
19
|
+
export class DarwinLoop {
|
|
20
|
+
memory;
|
|
21
|
+
tracker;
|
|
22
|
+
optimizer;
|
|
23
|
+
safety;
|
|
24
|
+
patterns;
|
|
25
|
+
agent;
|
|
26
|
+
notifications;
|
|
27
|
+
constructor(deps) {
|
|
28
|
+
this.memory = deps.memory;
|
|
29
|
+
this.tracker = deps.tracker;
|
|
30
|
+
this.optimizer = deps.optimizer;
|
|
31
|
+
this.safety = deps.safety;
|
|
32
|
+
this.patterns = deps.patterns;
|
|
33
|
+
this.agent = deps.agent;
|
|
34
|
+
this.notifications = deps.notifications ?? {};
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Called AFTER every agent run. Drives the evolution cycle.
|
|
38
|
+
*
|
|
39
|
+
* Flow:
|
|
40
|
+
* 0. Detect incomplete runs (skip them)
|
|
41
|
+
* 1. Record experiment
|
|
42
|
+
* 2. Rollback check (consecutive failures)
|
|
43
|
+
* 3. A/B test management (if active)
|
|
44
|
+
* 4. Validate data quality before evolving
|
|
45
|
+
* 5. Evolution trigger (if enough data and no active test)
|
|
46
|
+
*/
|
|
47
|
+
async afterRun(experiment) {
|
|
48
|
+
const result = {
|
|
49
|
+
patternsFound: [],
|
|
50
|
+
promptEvolved: false,
|
|
51
|
+
abTestStarted: false,
|
|
52
|
+
abTestCompleted: false,
|
|
53
|
+
rolledBack: false,
|
|
54
|
+
message: '',
|
|
55
|
+
};
|
|
56
|
+
const agent = experiment.agentName;
|
|
57
|
+
// ── Step 0: Incomplete Run Detection (P1-3) ─────
|
|
58
|
+
if (this.isIncompleteRun(experiment)) {
|
|
59
|
+
// Track failure in A/B test if one is active
|
|
60
|
+
const preState = await this.memory.getState();
|
|
61
|
+
const activeTest = preState.abTests[agent] ?? null;
|
|
62
|
+
if (activeTest) {
|
|
63
|
+
// Atomically increment failure counts inside callback (prevents stale-read race)
|
|
64
|
+
await this.memory.updateState((s) => {
|
|
65
|
+
const test = s.abTests[agent];
|
|
66
|
+
if (!test)
|
|
67
|
+
return s;
|
|
68
|
+
if (experiment.promptVersion === test.versionA) {
|
|
69
|
+
test.failsA = (test.failsA ?? 0) + 1;
|
|
70
|
+
}
|
|
71
|
+
else if (experiment.promptVersion === test.versionB) {
|
|
72
|
+
test.failsB = (test.failsB ?? 0) + 1;
|
|
73
|
+
}
|
|
74
|
+
return s;
|
|
75
|
+
});
|
|
76
|
+
// Re-read state after atomic update for evaluation
|
|
77
|
+
const postState = await this.memory.getState();
|
|
78
|
+
const currentTest = postState.abTests[agent];
|
|
79
|
+
if (!currentTest) {
|
|
80
|
+
result.message = `Incomplete run. A/B test cleared concurrently.`;
|
|
81
|
+
return result;
|
|
82
|
+
}
|
|
83
|
+
// Check if this version should auto-lose due to unreliability
|
|
84
|
+
const evalResult = this.safety.evaluateABTest(0, 0, currentTest.runsA, currentTest.runsB, currentTest.failsA ?? 0, currentTest.failsB ?? 0, currentTest.minRuns);
|
|
85
|
+
if (evalResult !== 'continue') {
|
|
86
|
+
const winner = evalResult === 'a_wins' ? currentTest.versionA : currentTest.versionB;
|
|
87
|
+
const loser = evalResult === 'a_wins' ? currentTest.versionB : currentTest.versionA;
|
|
88
|
+
await this.activateVersion(agent, winner);
|
|
89
|
+
await this.memory.updateState((s) => {
|
|
90
|
+
s.abTests[agent] = null;
|
|
91
|
+
s.lastKnownGood[agent] = winner;
|
|
92
|
+
s.activeVersions[agent] = winner;
|
|
93
|
+
return s;
|
|
94
|
+
});
|
|
95
|
+
result.abTestCompleted = true;
|
|
96
|
+
result.message = `A/B test auto-ended: ${loser} too unreliable. ${winner} wins.`;
|
|
97
|
+
return result;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
result.message = `Incomplete run detected (output: ${experiment.metrics.outputLength} chars). Skipping — not counted for evolution.`;
|
|
101
|
+
return result;
|
|
102
|
+
}
|
|
103
|
+
// ── Step 1: Record ────────────────────────────────
|
|
104
|
+
await this.tracker.recordExperiment(experiment);
|
|
105
|
+
// ── Step 2: Rollback check ────────────────────────
|
|
106
|
+
const state = await this.memory.getState();
|
|
107
|
+
const failures = state.consecutiveFailures[agent] ?? 0;
|
|
108
|
+
if (this.safety.shouldRollback(failures)) {
|
|
109
|
+
const rolledBack = await this.rollback(agent);
|
|
110
|
+
if (rolledBack) {
|
|
111
|
+
result.rolledBack = true;
|
|
112
|
+
result.message = `Rolled back to last known good version after ${failures} consecutive failures.`;
|
|
113
|
+
const rolledBackState = await this.memory.getState();
|
|
114
|
+
notifyRollback(this.notifications, agent, rolledBackState.activeVersions[agent] ?? 'unknown', failures).catch(() => { });
|
|
115
|
+
return result;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
// ── Step 3: A/B test management ───────────────────
|
|
119
|
+
const activeTest = state.abTests[agent] ?? null;
|
|
120
|
+
if (activeTest) {
|
|
121
|
+
const testResult = await this.handleABTest(agent, experiment, activeTest);
|
|
122
|
+
result.abTestCompleted = testResult.completed;
|
|
123
|
+
if (testResult.completed) {
|
|
124
|
+
result.message = testResult.message;
|
|
125
|
+
if (testResult.winner) {
|
|
126
|
+
result.newVersion = testResult.winner;
|
|
127
|
+
result.promptEvolved = testResult.winner !== activeTest.versionA;
|
|
128
|
+
}
|
|
129
|
+
return result;
|
|
130
|
+
}
|
|
131
|
+
// Test still running — just record which bucket this was in
|
|
132
|
+
const failInfoA = (activeTest.failsA ?? 0) > 0 ? `, ${activeTest.failsA} fails` : '';
|
|
133
|
+
const failInfoB = (activeTest.failsB ?? 0) > 0 ? `, ${activeTest.failsB} fails` : '';
|
|
134
|
+
result.message = `A/B test in progress: ${activeTest.versionA} (${activeTest.runsA} runs${failInfoA}) vs ${activeTest.versionB} (${activeTest.runsB} runs${failInfoB}).`;
|
|
135
|
+
return result;
|
|
136
|
+
}
|
|
137
|
+
// ── Step 4: Check if we should evolve ─────────────
|
|
138
|
+
const stats = await this.tracker.getStats(agent);
|
|
139
|
+
if (!this.safety.canEvolve(agent, stats)) {
|
|
140
|
+
result.message = `Collecting data: ${stats.totalRuns} runs so far, need more before evolving.`;
|
|
141
|
+
return result;
|
|
142
|
+
}
|
|
143
|
+
// Detect patterns
|
|
144
|
+
const detectedPatterns = await this.patterns.detectPatterns(agent);
|
|
145
|
+
result.patternsFound = detectedPatterns;
|
|
146
|
+
// Only evolve if there are actionable patterns
|
|
147
|
+
const hasWeaknesses = detectedPatterns.some((p) => p.type === 'weakness');
|
|
148
|
+
const hasNegativeTrend = detectedPatterns.some((p) => p.type === 'trend' && p.description.includes('declining'));
|
|
149
|
+
if (!hasWeaknesses && !hasNegativeTrend) {
|
|
150
|
+
result.message = `${detectedPatterns.length} patterns found, but no weaknesses or negative trends — no evolution needed.`;
|
|
151
|
+
return result;
|
|
152
|
+
}
|
|
153
|
+
// ── Step 5: Input Validation (P0-1) ─────────────
|
|
154
|
+
const validation = await this.validateDataQuality(agent);
|
|
155
|
+
if (!validation.valid) {
|
|
156
|
+
result.message = `Data quality check failed: ${validation.reason}. Skipping evolution.`;
|
|
157
|
+
return result;
|
|
158
|
+
}
|
|
159
|
+
// Generate a new prompt variant
|
|
160
|
+
const activePrompt = await this.memory.getActivePrompt(agent);
|
|
161
|
+
if (!activePrompt) {
|
|
162
|
+
result.message = 'No active prompt found — cannot evolve.';
|
|
163
|
+
return result;
|
|
164
|
+
}
|
|
165
|
+
// Build tool context (P0-2) and category stats (P2-5) for optimizer
|
|
166
|
+
const toolContext = this.agent
|
|
167
|
+
? { mcp: this.agent.mcp, tools: this.agent.tools }
|
|
168
|
+
: undefined;
|
|
169
|
+
const catStats = await this.tracker.getStatsByCategory(agent);
|
|
170
|
+
// Extract recent critic feedback reports for the optimizer.
|
|
171
|
+
// The optimizer previously only saw aggregated stats but not WHY runs scored poorly.
|
|
172
|
+
const recentFeedback = await this.getRecentFeedback(agent, 5);
|
|
173
|
+
const newPromptText = await this.optimizer.generateVariant(activePrompt.promptText, detectedPatterns, stats, toolContext, catStats, recentFeedback);
|
|
174
|
+
// Create a new prompt version
|
|
175
|
+
const newVersion = this.nextVersion(activePrompt.version);
|
|
176
|
+
const newPromptVersion = {
|
|
177
|
+
version: newVersion,
|
|
178
|
+
agentName: agent,
|
|
179
|
+
promptText: newPromptText,
|
|
180
|
+
createdAt: new Date().toISOString(),
|
|
181
|
+
parentVersion: activePrompt.version,
|
|
182
|
+
changeReason: this.buildChangeReason(detectedPatterns),
|
|
183
|
+
active: false, // Not active yet — going into A/B test
|
|
184
|
+
stats: { totalRuns: 0, avgQuality: 0, avgDuration: 0, successRate: 0, avgSourceCount: 0 },
|
|
185
|
+
};
|
|
186
|
+
await this.memory.savePromptVersion(newPromptVersion);
|
|
187
|
+
// Compute dynamic minRuns based on quality score variance
|
|
188
|
+
const allExperiments = await this.memory.loadExperiments(agent);
|
|
189
|
+
const agentMinRuns = this.agent?.evolution?.minRuns;
|
|
190
|
+
const dynamicMinRuns = this.safety.computeDynamicMinRuns(allExperiments, agentMinRuns);
|
|
191
|
+
// Start A/B test
|
|
192
|
+
const newTest = {
|
|
193
|
+
versionA: activePrompt.version,
|
|
194
|
+
versionB: newVersion,
|
|
195
|
+
runsA: 0,
|
|
196
|
+
runsB: 0,
|
|
197
|
+
failsA: 0,
|
|
198
|
+
failsB: 0,
|
|
199
|
+
minRuns: dynamicMinRuns,
|
|
200
|
+
startedAt: new Date().toISOString(),
|
|
201
|
+
};
|
|
202
|
+
await this.memory.updateState((s) => {
|
|
203
|
+
s.abTests[agent] = newTest;
|
|
204
|
+
return s;
|
|
205
|
+
});
|
|
206
|
+
result.promptEvolved = true;
|
|
207
|
+
result.abTestStarted = true;
|
|
208
|
+
result.newVersion = newVersion;
|
|
209
|
+
result.message = `New prompt ${newVersion} generated. A/B test started: ${activePrompt.version} vs ${newVersion} (minRuns: ${dynamicMinRuns}).`;
|
|
210
|
+
// Notify via Telegram (non-blocking)
|
|
211
|
+
notifyEvolutionStarted(this.notifications, agent, activePrompt.version, newVersion, this.buildChangeReason(detectedPatterns)).catch(() => { });
|
|
212
|
+
return result;
|
|
213
|
+
}
|
|
214
|
+
// ─── A/B Test Handling ─────────────────────────────
|
|
215
|
+
async handleABTest(agentName, experiment, test) {
|
|
216
|
+
// Atomically increment run counts inside callback (prevents stale-read race)
|
|
217
|
+
await this.memory.updateState((s) => {
|
|
218
|
+
const t = s.abTests[agentName];
|
|
219
|
+
if (!t)
|
|
220
|
+
return s;
|
|
221
|
+
if (experiment.promptVersion === t.versionA) {
|
|
222
|
+
t.runsA++;
|
|
223
|
+
}
|
|
224
|
+
else if (experiment.promptVersion === t.versionB) {
|
|
225
|
+
t.runsB++;
|
|
226
|
+
}
|
|
227
|
+
return s;
|
|
228
|
+
});
|
|
229
|
+
// Re-read the updated test state for evaluation
|
|
230
|
+
const postState = await this.memory.getState();
|
|
231
|
+
const currentTest = postState.abTests[agentName];
|
|
232
|
+
if (!currentTest) {
|
|
233
|
+
return { completed: false, message: 'A/B test cleared concurrently.' };
|
|
234
|
+
}
|
|
235
|
+
// Get composite scores — only from A/B test period
|
|
236
|
+
// Use agent-specific metric weights if configured.
|
|
237
|
+
const agentWeights = this.agent?.evolution?.metrics;
|
|
238
|
+
const compositeA = await this.tracker.getAverageComposite(agentName, currentTest.versionA, agentWeights, currentTest.startedAt);
|
|
239
|
+
const compositeB = await this.tracker.getAverageComposite(agentName, currentTest.versionB, agentWeights, currentTest.startedAt);
|
|
240
|
+
// Evaluate the test (including reliability from failure counts)
|
|
241
|
+
const outcome = this.safety.evaluateABTest(compositeA, compositeB, currentTest.runsA, currentTest.runsB, currentTest.failsA ?? 0, currentTest.failsB ?? 0, currentTest.minRuns);
|
|
242
|
+
if (outcome === 'continue') {
|
|
243
|
+
return { completed: false, message: 'A/B test continues.' };
|
|
244
|
+
}
|
|
245
|
+
// Test is complete — determine winner
|
|
246
|
+
let winner = outcome === 'a_wins' ? currentTest.versionA : currentTest.versionB;
|
|
247
|
+
let loser = outcome === 'a_wins' ? currentTest.versionB : currentTest.versionA;
|
|
248
|
+
// Regression check: if the challenger (B) won, verify it doesn't regress below A
|
|
249
|
+
if (outcome === 'b_wins') {
|
|
250
|
+
const passesRegression = this.safety.checkRegression(compositeA, compositeB);
|
|
251
|
+
if (!passesRegression) {
|
|
252
|
+
// B won on score but regressed on safety threshold — revert to A
|
|
253
|
+
winner = currentTest.versionA;
|
|
254
|
+
loser = currentTest.versionB;
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
// Activate winner, deactivate loser
|
|
258
|
+
await this.activateVersion(agentName, winner);
|
|
259
|
+
// Update state atomically: clear test, set last-known-good
|
|
260
|
+
await this.memory.updateState((s) => {
|
|
261
|
+
s.abTests[agentName] = null;
|
|
262
|
+
s.lastKnownGood[agentName] = winner;
|
|
263
|
+
s.activeVersions[agentName] = winner;
|
|
264
|
+
return s;
|
|
265
|
+
});
|
|
266
|
+
const scoreMsg = `(composite: ${outcome === 'a_wins' ? compositeA.toFixed(3) : compositeB.toFixed(3)} vs ${outcome === 'a_wins' ? compositeB.toFixed(3) : compositeA.toFixed(3)})`;
|
|
267
|
+
// Notify via Telegram (non-blocking)
|
|
268
|
+
const winnerScore = outcome === 'a_wins' ? compositeA : compositeB;
|
|
269
|
+
const loserScore = outcome === 'a_wins' ? compositeB : compositeA;
|
|
270
|
+
notifyABTestComplete(this.notifications, agentName, winner, loser, winnerScore, loserScore)
|
|
271
|
+
.catch(() => { });
|
|
272
|
+
return {
|
|
273
|
+
completed: true,
|
|
274
|
+
winner,
|
|
275
|
+
message: `A/B test complete: ${winner} wins over ${loser} ${scoreMsg}.`,
|
|
276
|
+
};
|
|
277
|
+
}
|
|
278
|
+
// ─── Rollback ──────────────────────────────────────
|
|
279
|
+
/**
|
|
280
|
+
* Roll back to the last known good prompt version.
|
|
281
|
+
* Returns true if a rollback was performed.
|
|
282
|
+
*/
|
|
283
|
+
async rollback(agentName) {
|
|
284
|
+
const state = await this.memory.getState();
|
|
285
|
+
const lastGood = state.lastKnownGood[agentName];
|
|
286
|
+
if (!lastGood) {
|
|
287
|
+
return false;
|
|
288
|
+
}
|
|
289
|
+
const currentVersion = state.activeVersions[agentName];
|
|
290
|
+
if (currentVersion === lastGood) {
|
|
291
|
+
// Already on last-known-good — nothing to roll back
|
|
292
|
+
return false;
|
|
293
|
+
}
|
|
294
|
+
// Activate the last-known-good version
|
|
295
|
+
await this.activateVersion(agentName, lastGood);
|
|
296
|
+
// Atomically clear A/B test and reset failure counter
|
|
297
|
+
await this.memory.updateState((s) => {
|
|
298
|
+
s.abTests[agentName] = null;
|
|
299
|
+
s.activeVersions[agentName] = lastGood;
|
|
300
|
+
s.consecutiveFailures[agentName] = 0;
|
|
301
|
+
return s;
|
|
302
|
+
});
|
|
303
|
+
return true;
|
|
304
|
+
}
|
|
305
|
+
// ─── Helpers ───────────────────────────────────────
|
|
306
|
+
/**
|
|
307
|
+
* Activate a specific prompt version and deactivate all others.
|
|
308
|
+
*/
|
|
309
|
+
async activateVersion(agentName, version) {
|
|
310
|
+
const allVersions = await this.memory.getAllPromptVersions(agentName);
|
|
311
|
+
for (const pv of allVersions) {
|
|
312
|
+
const shouldBeActive = pv.version === version;
|
|
313
|
+
if (pv.active !== shouldBeActive) {
|
|
314
|
+
pv.active = shouldBeActive;
|
|
315
|
+
await this.memory.savePromptVersion(pv);
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
/**
|
|
320
|
+
* Extract recent critic feedback reports from experiments.
|
|
321
|
+
*
|
|
322
|
+
* Returns up to `limit` feedback report texts from the most recent experiments
|
|
323
|
+
* that have critic feedback. Experiments are already ordered by started_at DESC
|
|
324
|
+
* from loadExperiments(), so we just filter for ones with feedback.
|
|
325
|
+
*/
|
|
326
|
+
async getRecentFeedback(agentName, limit) {
|
|
327
|
+
const experiments = await this.memory.loadExperiments(agentName);
|
|
328
|
+
const feedback = [];
|
|
329
|
+
for (const exp of experiments) {
|
|
330
|
+
if (feedback.length >= limit)
|
|
331
|
+
break;
|
|
332
|
+
if (exp.feedback?.report) {
|
|
333
|
+
const header = `Score: ${exp.feedback.score}/10 | Task: "${exp.task}" | Version: ${exp.promptVersion}`;
|
|
334
|
+
feedback.push(`${header}\n${exp.feedback.report}`);
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
return feedback;
|
|
338
|
+
}
|
|
339
|
+
/**
|
|
340
|
+
* Increment version string: "v1" -> "v2", "v12" -> "v13".
|
|
341
|
+
*/
|
|
342
|
+
nextVersion(current) {
|
|
343
|
+
const match = current.match(/^v(\d+)$/);
|
|
344
|
+
if (match) {
|
|
345
|
+
return `v${parseInt(match[1], 10) + 1}`;
|
|
346
|
+
}
|
|
347
|
+
// Fallback: append a version number
|
|
348
|
+
return `${current}-v2`;
|
|
349
|
+
}
|
|
350
|
+
// ─── Input Validation (P0-1) ─────────────────────
|
|
351
|
+
/**
|
|
352
|
+
* Check if a run is incomplete (agent ran out of turns or produced no real output).
|
|
353
|
+
* Incomplete runs are NOT recorded as experiments to avoid poisoning the data.
|
|
354
|
+
*
|
|
355
|
+
* Checks output length regardless of success flag — a 300-char "successful" run
|
|
356
|
+
* is still garbage data that shouldn't influence evolution.
|
|
357
|
+
*/
|
|
358
|
+
isIncompleteRun(experiment) {
|
|
359
|
+
const minOutput = this.agent?.evolution?.minOutputLength ?? DEFAULT_MIN_VALID_OUTPUT;
|
|
360
|
+
return experiment.metrics.outputLength < minOutput;
|
|
361
|
+
}
|
|
362
|
+
/**
|
|
363
|
+
* Validate that experiment data is clean enough for evolution.
|
|
364
|
+
* Prevents garbage-in-garbage-out (e.g., broken search backend producing 0 sources).
|
|
365
|
+
*/
|
|
366
|
+
async validateDataQuality(agentName) {
|
|
367
|
+
const experiments = await this.memory.loadExperiments(agentName);
|
|
368
|
+
if (experiments.length === 0) {
|
|
369
|
+
return { valid: false, reason: 'No experiments recorded' };
|
|
370
|
+
}
|
|
371
|
+
// Check: at least MIN_SOURCE_COVERAGE of runs have sources > 0
|
|
372
|
+
// Only enforce for agents that rely on sources (sourceCount weight > 0.05)
|
|
373
|
+
const sourceWeight = this.agent?.evolution?.metrics?.sourceCount ?? 0.15;
|
|
374
|
+
if (sourceWeight > 0.05) {
|
|
375
|
+
const withSources = experiments.filter((e) => e.metrics.sourceCount > 0);
|
|
376
|
+
const sourceCoverage = withSources.length / experiments.length;
|
|
377
|
+
if (sourceCoverage < MIN_SOURCE_COVERAGE) {
|
|
378
|
+
return {
|
|
379
|
+
valid: false,
|
|
380
|
+
reason: `Only ${(sourceCoverage * 100).toFixed(0)}% of runs have sources (need ${(MIN_SOURCE_COVERAGE * 100).toFixed(0)}%). Possible tool/search outage.`,
|
|
381
|
+
};
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
// Check: at least half of runs have quality scores
|
|
385
|
+
const withQuality = experiments.filter((e) => e.metrics.qualityScore !== null);
|
|
386
|
+
if (withQuality.length < experiments.length * 0.5) {
|
|
387
|
+
return {
|
|
388
|
+
valid: false,
|
|
389
|
+
reason: `Only ${withQuality.length}/${experiments.length} runs have quality scores. Critic may be failing.`,
|
|
390
|
+
};
|
|
391
|
+
}
|
|
392
|
+
// Check: no sudden metric collapse (last 3 runs all 0 sources = tool outage).
|
|
393
|
+
// loadExperiments() returns DESC order (newest first), so slice(0, 3) gets the latest.
|
|
394
|
+
// Only enforce for agents that rely on sources.
|
|
395
|
+
if (sourceWeight > 0.05) {
|
|
396
|
+
const recent = experiments.slice(0, 3);
|
|
397
|
+
if (recent.length >= 3 && recent.every((e) => e.metrics.sourceCount === 0)) {
|
|
398
|
+
return {
|
|
399
|
+
valid: false,
|
|
400
|
+
reason: 'Last 3 runs have 0 sources — likely search backend outage.',
|
|
401
|
+
};
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
return { valid: true, reason: 'Data quality OK' };
|
|
405
|
+
}
|
|
406
|
+
/**
|
|
407
|
+
* Build a human-readable change reason from detected patterns.
|
|
408
|
+
*/
|
|
409
|
+
buildChangeReason(patterns) {
|
|
410
|
+
const weaknesses = patterns.filter((p) => p.type === 'weakness');
|
|
411
|
+
const trends = patterns.filter((p) => p.type === 'trend' && p.description.includes('declining'));
|
|
412
|
+
const reasons = [];
|
|
413
|
+
if (weaknesses.length > 0) {
|
|
414
|
+
reasons.push(`Address ${weaknesses.length} weakness${weaknesses.length > 1 ? 'es' : ''}: ${weaknesses.map((w) => w.description).join('; ')}`);
|
|
415
|
+
}
|
|
416
|
+
if (trends.length > 0) {
|
|
417
|
+
reasons.push(`Counter declining trend`);
|
|
418
|
+
}
|
|
419
|
+
return reasons.length > 0
|
|
420
|
+
? reasons.join('. ')
|
|
421
|
+
: 'Optimization based on detected patterns';
|
|
422
|
+
}
|
|
423
|
+
}
|
|
424
|
+
//# sourceMappingURL=loop.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loop.js","sourceRoot":"","sources":["../../src/evolution/loop.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Darwin — Multi-Critic Evaluator
|
|
3
|
+
*
|
|
4
|
+
* Runs 3 specialized critics in parallel and takes the median score.
|
|
5
|
+
* More robust than a single critic — reduces bias and random variance.
|
|
6
|
+
*
|
|
7
|
+
* Agent-aware: Different agents get different evaluation criteria.
|
|
8
|
+
*
|
|
9
|
+
* Investigator Critics:
|
|
10
|
+
* A: Facts & Sources — accuracy, citations, primary documents
|
|
11
|
+
* B: Honesty & Courage — intellectual bravery, clear positions, uncomfortable truths
|
|
12
|
+
* C: Completeness & Structure — full investigation, proper format, both sides covered
|
|
13
|
+
*
|
|
14
|
+
* Writer Critics:
|
|
15
|
+
* A: Task Compliance & Accuracy — did the writer follow the brief? Correct claims?
|
|
16
|
+
* B: Persuasion & Voice — tone, engagement, conviction, audience awareness
|
|
17
|
+
* C: Substance & Originality — depth, concrete value, fresh angles
|
|
18
|
+
*/
|
|
19
|
+
/** Critic prompt definition */
|
|
20
|
+
export interface CriticPromptDef {
|
|
21
|
+
name: string;
|
|
22
|
+
prompt: string;
|
|
23
|
+
}
|
|
24
|
+
/** Score result from a single critic */
|
|
25
|
+
export interface CriticScore {
|
|
26
|
+
critic: string;
|
|
27
|
+
score: number;
|
|
28
|
+
report: string;
|
|
29
|
+
}
|
|
30
|
+
/** Combined result from multi-critic evaluation */
|
|
31
|
+
export interface MultiCriticResult {
|
|
32
|
+
/** Median score across all critics */
|
|
33
|
+
medianScore: number;
|
|
34
|
+
/** Individual critic results */
|
|
35
|
+
critics: CriticScore[];
|
|
36
|
+
/** Combined report text */
|
|
37
|
+
combinedReport: string;
|
|
38
|
+
}
|
|
39
|
+
/** Function that runs a critic and returns its output */
|
|
40
|
+
export type RunCriticFn = (systemPrompt: string, task: string, criticName: string) => Promise<string>;
|
|
41
|
+
/**
|
|
42
|
+
* Get the right critic prompts for an agent.
|
|
43
|
+
* Falls back to investigator prompts for unknown agents (backward-compatible).
|
|
44
|
+
*/
|
|
45
|
+
export declare function getCriticPrompts(agentName: string): CriticPromptDef[];
|
|
46
|
+
/** @deprecated Use getCriticPrompts(agentName) instead. Kept for backward compatibility. */
|
|
47
|
+
export declare const CRITIC_PROMPTS: CriticPromptDef[];
|
|
48
|
+
/**
|
|
49
|
+
* Run multiple specialized critics and return the median score.
|
|
50
|
+
* Critics are selected based on the agent being evaluated.
|
|
51
|
+
*
|
|
52
|
+
* @param agentOutput - The agent's output to evaluate
|
|
53
|
+
* @param task - The original task description
|
|
54
|
+
* @param runCritic - Function to run a critic (injected, uses Claude CLI)
|
|
55
|
+
* @param agentName - Name of the agent being evaluated (determines which critic set to use)
|
|
56
|
+
*/
|
|
57
|
+
export declare function runMultiCritic(agentOutput: string, task: string, runCritic: RunCriticFn, agentName?: string): Promise<MultiCriticResult>;
|
|
58
|
+
//# sourceMappingURL=multi-critic.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"multi-critic.d.ts","sourceRoot":"","sources":["../../src/evolution/multi-critic.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,+BAA+B;AAC/B,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wCAAwC;AACxC,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,mDAAmD;AACnD,MAAM,WAAW,iBAAiB;IAChC,sCAAsC;IACtC,WAAW,EAAE,MAAM,CAAC;IACpB,gCAAgC;IAChC,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,2BAA2B;IAC3B,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,yDAAyD;AACzD,MAAM,MAAM,WAAW,GAAG,CAAC,YAAY,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;AA4PtG;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,eAAe,EAAE,CAErE;AAED,4FAA4F;AAC5F,eAAO,MAAM,cAAc,EAAE,eAAe,EAAyB,CAAC;AAYtE;;;;;;;;GAQG;AACH,wBAAsB,cAAc,CAClC,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,WAAW,EACtB,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,iBAAiB,CAAC,CA+C5B"}
|