darwin-agents 0.7.1 → 0.8.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 +33 -1
- package/dist/src/cli/evolution-flags.d.ts +40 -0
- package/dist/src/cli/evolution-flags.d.ts.map +1 -0
- package/dist/src/cli/evolution-flags.js +106 -0
- package/dist/src/cli/evolution-flags.js.map +1 -0
- package/dist/src/cli/evolve.d.ts +10 -1
- package/dist/src/cli/evolve.d.ts.map +1 -1
- package/dist/src/cli/evolve.js +93 -8
- package/dist/src/cli/evolve.js.map +1 -1
- package/dist/src/cli/index.js +13 -0
- package/dist/src/cli/index.js.map +1 -1
- package/dist/src/cli/run.d.ts.map +1 -1
- package/dist/src/cli/run.js +38 -69
- package/dist/src/cli/run.js.map +1 -1
- package/dist/src/evolution/build-loop.d.ts +20 -0
- package/dist/src/evolution/build-loop.d.ts.map +1 -0
- package/dist/src/evolution/build-loop.js +67 -0
- package/dist/src/evolution/build-loop.js.map +1 -0
- package/dist/src/evolution/enabled-state.d.ts +59 -0
- package/dist/src/evolution/enabled-state.d.ts.map +1 -0
- package/dist/src/evolution/enabled-state.js +122 -0
- package/dist/src/evolution/enabled-state.js.map +1 -0
- package/dist/src/evolution/loop.d.ts +46 -0
- package/dist/src/evolution/loop.d.ts.map +1 -1
- package/dist/src/evolution/loop.js +119 -1
- package/dist/src/evolution/loop.js.map +1 -1
- package/dist/src/evolution/parse-score.d.ts +35 -0
- package/dist/src/evolution/parse-score.d.ts.map +1 -0
- package/dist/src/evolution/parse-score.js +115 -0
- package/dist/src/evolution/parse-score.js.map +1 -0
- package/dist/src/evolution/tracker.d.ts +13 -0
- package/dist/src/evolution/tracker.d.ts.map +1 -1
- package/dist/src/evolution/tracker.js +34 -0
- package/dist/src/evolution/tracker.js.map +1 -1
- package/dist/src/index.d.ts +2 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +4 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/memory/postgres-memory.d.ts.map +1 -1
- package/dist/src/memory/postgres-memory.js +1 -0
- package/dist/src/memory/postgres-memory.js.map +1 -1
- package/dist/src/memory/sqlite-memory.d.ts.map +1 -1
- package/dist/src/memory/sqlite-memory.js +1 -0
- package/dist/src/memory/sqlite-memory.js.map +1 -1
- package/dist/src/types.d.ts +45 -0
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/types.js.map +1 -1
- package/package.json +1 -1
- package/dist/agents/analyst.d.ts +0 -11
- package/dist/agents/analyst.d.ts.map +0 -1
- package/dist/agents/analyst.js +0 -78
- package/dist/agents/analyst.js.map +0 -1
- package/dist/agents/blog-writer.d.ts +0 -13
- package/dist/agents/blog-writer.d.ts.map +0 -1
- package/dist/agents/blog-writer.js +0 -59
- package/dist/agents/blog-writer.js.map +0 -1
- package/dist/agents/critic.d.ts +0 -11
- package/dist/agents/critic.d.ts.map +0 -1
- package/dist/agents/critic.js +0 -57
- package/dist/agents/critic.js.map +0 -1
- package/dist/agents/index.d.ts +0 -15
- package/dist/agents/index.d.ts.map +0 -1
- package/dist/agents/index.js +0 -31
- package/dist/agents/index.js.map +0 -1
- package/dist/agents/investigator-critic.d.ts +0 -10
- package/dist/agents/investigator-critic.d.ts.map +0 -1
- package/dist/agents/investigator-critic.js +0 -78
- package/dist/agents/investigator-critic.js.map +0 -1
- package/dist/agents/investigator.d.ts +0 -13
- package/dist/agents/investigator.d.ts.map +0 -1
- package/dist/agents/investigator.js +0 -105
- package/dist/agents/investigator.js.map +0 -1
- package/dist/agents/marketing.d.ts +0 -13
- package/dist/agents/marketing.d.ts.map +0 -1
- package/dist/agents/marketing.js +0 -59
- package/dist/agents/marketing.js.map +0 -1
- package/dist/agents/researcher.d.ts +0 -11
- package/dist/agents/researcher.d.ts.map +0 -1
- package/dist/agents/researcher.js +0 -68
- package/dist/agents/researcher.js.map +0 -1
- package/dist/agents/writer.d.ts +0 -9
- package/dist/agents/writer.d.ts.map +0 -1
- package/dist/agents/writer.js +0 -47
- package/dist/agents/writer.js.map +0 -1
- package/dist/cli/create.d.ts +0 -11
- package/dist/cli/create.d.ts.map +0 -1
- package/dist/cli/create.js +0 -104
- package/dist/cli/create.js.map +0 -1
- package/dist/cli/evolve.d.ts +0 -13
- package/dist/cli/evolve.d.ts.map +0 -1
- package/dist/cli/evolve.js +0 -69
- package/dist/cli/evolve.js.map +0 -1
- package/dist/cli/index.d.ts +0 -13
- package/dist/cli/index.d.ts.map +0 -1
- package/dist/cli/index.js +0 -84
- package/dist/cli/index.js.map +0 -1
- package/dist/cli/init.d.ts +0 -12
- package/dist/cli/init.d.ts.map +0 -1
- package/dist/cli/init.js +0 -68
- package/dist/cli/init.js.map +0 -1
- package/dist/cli/run.d.ts +0 -7
- package/dist/cli/run.d.ts.map +0 -1
- package/dist/cli/run.js +0 -371
- package/dist/cli/run.js.map +0 -1
- package/dist/cli/status.d.ts +0 -7
- package/dist/cli/status.d.ts.map +0 -1
- package/dist/cli/status.js +0 -123
- package/dist/cli/status.js.map +0 -1
- package/dist/core/agent.d.ts +0 -53
- package/dist/core/agent.d.ts.map +0 -1
- package/dist/core/agent.js +0 -172
- package/dist/core/agent.js.map +0 -1
- package/dist/core/runner.d.ts +0 -75
- package/dist/core/runner.d.ts.map +0 -1
- package/dist/core/runner.js +0 -255
- package/dist/core/runner.js.map +0 -1
- package/dist/evolution/loop.d.ts +0 -100
- package/dist/evolution/loop.d.ts.map +0 -1
- package/dist/evolution/loop.js +0 -424
- package/dist/evolution/loop.js.map +0 -1
- package/dist/evolution/multi-critic.d.ts +0 -58
- package/dist/evolution/multi-critic.d.ts.map +0 -1
- package/dist/evolution/multi-critic.js +0 -326
- package/dist/evolution/multi-critic.js.map +0 -1
- package/dist/evolution/notifications.d.ts +0 -32
- package/dist/evolution/notifications.d.ts.map +0 -1
- package/dist/evolution/notifications.js +0 -92
- package/dist/evolution/notifications.js.map +0 -1
- package/dist/evolution/optimizer.d.ts +0 -64
- package/dist/evolution/optimizer.d.ts.map +0 -1
- package/dist/evolution/optimizer.js +0 -223
- package/dist/evolution/optimizer.js.map +0 -1
- package/dist/evolution/patterns.d.ts +0 -63
- package/dist/evolution/patterns.d.ts.map +0 -1
- package/dist/evolution/patterns.js +0 -297
- package/dist/evolution/patterns.js.map +0 -1
- package/dist/evolution/safety.d.ts +0 -76
- package/dist/evolution/safety.d.ts.map +0 -1
- package/dist/evolution/safety.js +0 -182
- package/dist/evolution/safety.js.map +0 -1
- package/dist/evolution/tracker.d.ts +0 -48
- package/dist/evolution/tracker.d.ts.map +0 -1
- package/dist/evolution/tracker.js +0 -163
- package/dist/evolution/tracker.js.map +0 -1
- package/dist/index.d.ts +0 -32
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -35
- package/dist/index.js.map +0 -1
- package/dist/memory/index.d.ts +0 -32
- package/dist/memory/index.d.ts.map +0 -1
- package/dist/memory/index.js +0 -49
- package/dist/memory/index.js.map +0 -1
- package/dist/memory/postgres-memory.d.ts +0 -52
- package/dist/memory/postgres-memory.d.ts.map +0 -1
- package/dist/memory/postgres-memory.js +0 -515
- package/dist/memory/postgres-memory.js.map +0 -1
- package/dist/memory/sqlite-memory.d.ts +0 -36
- package/dist/memory/sqlite-memory.d.ts.map +0 -1
- package/dist/memory/sqlite-memory.js +0 -380
- package/dist/memory/sqlite-memory.js.map +0 -1
- package/dist/providers/anthropic.d.ts +0 -20
- package/dist/providers/anthropic.d.ts.map +0 -1
- package/dist/providers/anthropic.js +0 -82
- package/dist/providers/anthropic.js.map +0 -1
- package/dist/providers/claude-cli.d.ts +0 -35
- package/dist/providers/claude-cli.d.ts.map +0 -1
- package/dist/providers/claude-cli.js +0 -153
- package/dist/providers/claude-cli.js.map +0 -1
- package/dist/providers/index.d.ts +0 -39
- package/dist/providers/index.d.ts.map +0 -1
- package/dist/providers/index.js +0 -58
- package/dist/providers/index.js.map +0 -1
- package/dist/providers/ollama.d.ts +0 -17
- package/dist/providers/ollama.d.ts.map +0 -1
- package/dist/providers/ollama.js +0 -64
- package/dist/providers/ollama.js.map +0 -1
- package/dist/providers/openai.d.ts +0 -19
- package/dist/providers/openai.d.ts.map +0 -1
- package/dist/providers/openai.js +0 -75
- package/dist/providers/openai.js.map +0 -1
- package/dist/providers/types.d.ts +0 -62
- package/dist/providers/types.d.ts.map +0 -1
- package/dist/providers/types.js +0 -9
- package/dist/providers/types.js.map +0 -1
- package/dist/types.d.ts +0 -221
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js +0 -19
- package/dist/types.js.map +0 -1
package/README.md
CHANGED
|
@@ -329,6 +329,11 @@ Actual numbers from **419 runs across 19 agents** in our internal `darwin_db`
|
|
|
329
329
|
not synthetic benchmarks. "Success" means the run completed and produced valid
|
|
330
330
|
output (100% across 419 runs); "quality" is the critic's separate 1–10 score.
|
|
331
331
|
|
|
332
|
+
> Those 19 are our own internal + custom agents; the package ships **8 built-in
|
|
333
|
+
> agents** by default (`writer`, `researcher`, `critic`, `analyst`,
|
|
334
|
+
> `investigator`, `investigator-critic`, `marketing`, `blog-writer`) — the table
|
|
335
|
+
> below shows the four with enough runs to report.
|
|
336
|
+
|
|
332
337
|
```
|
|
333
338
|
Agent Runs Avg quality
|
|
334
339
|
writer 172 6.94 / 10
|
|
@@ -402,12 +407,39 @@ darwin run analyst --path ./src # Analyze a codebase
|
|
|
402
407
|
darwin status # Overview of all agents
|
|
403
408
|
darwin status writer # Detailed agent stats + evolution history
|
|
404
409
|
|
|
405
|
-
darwin evolve writer --enable # Enable self-evolution
|
|
410
|
+
darwin evolve writer --enable # Enable self-evolution (persisted)
|
|
411
|
+
darwin evolve writer --disable # Disable self-evolution (persisted)
|
|
406
412
|
darwin evolve writer --reset # Reset to v1
|
|
413
|
+
darwin evolve writer --force # Force one optimization cycle now
|
|
407
414
|
|
|
408
415
|
darwin create my-agent # Scaffold a new agent
|
|
409
416
|
```
|
|
410
417
|
|
|
418
|
+
### Advanced evolution flags
|
|
419
|
+
|
|
420
|
+
The v0.6/v0.7 evolution strategies are reachable from the CLI. `darwin evolve`
|
|
421
|
+
**persists** them onto the agent (they survive process exit); `darwin run`
|
|
422
|
+
accepts the same flags as a one-off override for a single run.
|
|
423
|
+
|
|
424
|
+
```bash
|
|
425
|
+
# Persist: reflect with GEPA + a stronger reflection model, pick parents by coverage
|
|
426
|
+
darwin evolve writer --gepa --reflection-model claude-opus-4-8 --coverage
|
|
427
|
+
|
|
428
|
+
# One-off for a single run
|
|
429
|
+
darwin run writer "Explain consensus" --gepa --pareto-gate
|
|
430
|
+
```
|
|
431
|
+
|
|
432
|
+
| Flag | What it does |
|
|
433
|
+
|------|--------------|
|
|
434
|
+
| `--gepa` / `--no-gepa` | GEPA-style reflective prompt mutation (vs. the legacy stats optimizer) |
|
|
435
|
+
| `--merge` / `--no-merge` | GEPA system-aware merge of two Pareto-front prompts as a challenger source |
|
|
436
|
+
| `--pareto-gate` / `--no-pareto-gate` | Reject an A/B winner that regressed on any objective |
|
|
437
|
+
| `--coverage` / `--no-coverage` | Pick the reflection parent by per-task-type coverage breadth (GEPA Algorithm 2) |
|
|
438
|
+
| `--reflection-model <id>` | Use a stronger model for GEPA reflection (the documented leverage point) |
|
|
439
|
+
|
|
440
|
+
All default to **off** — the baseline single-objective evolution loop is
|
|
441
|
+
unchanged unless you opt in.
|
|
442
|
+
|
|
411
443
|
## Storage: SQLite or PostgreSQL — both free, both MIT
|
|
412
444
|
|
|
413
445
|
Darwin runs on SQLite by default (zero config, single file) and on PostgreSQL
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Darwin CLI — shared parser for the advanced evolution-config flags.
|
|
3
|
+
*
|
|
4
|
+
* Both `darwin run` and `darwin evolve` accept the same knobs that toggle the
|
|
5
|
+
* v0.6/v0.7 evolution config (GEPA reflective optimizer, system-aware merge,
|
|
6
|
+
* Pareto activation gate, instance-wise coverage selection, and the reflection
|
|
7
|
+
* model). This module centralises the flag spelling + parsing so the two
|
|
8
|
+
* commands stay in sync.
|
|
9
|
+
*
|
|
10
|
+
* --gepa / --no-gepa
|
|
11
|
+
* --merge / --no-merge
|
|
12
|
+
* --pareto-gate / --no-pareto-gate
|
|
13
|
+
* --coverage / --no-coverage
|
|
14
|
+
* --reflection-model <model-id>
|
|
15
|
+
*/
|
|
16
|
+
import type { EvolutionConfigOverride } from '../types.js';
|
|
17
|
+
/** True when `arg` is one of the evolution-config flags this module handles. */
|
|
18
|
+
export declare function isEvolutionConfigFlag(arg: string): boolean;
|
|
19
|
+
/**
|
|
20
|
+
* Apply a single recognised evolution flag to `target`, mutating it in place.
|
|
21
|
+
*
|
|
22
|
+
* Returns the number of EXTRA argv tokens consumed (1 for `--reflection-model`
|
|
23
|
+
* which takes a value, 0 for the boolean flags). Callers that walk argv use the
|
|
24
|
+
* return value to advance their index. Unknown flags are ignored (return 0) —
|
|
25
|
+
* use {@link isEvolutionConfigFlag} to gate first.
|
|
26
|
+
*/
|
|
27
|
+
export declare function applyEvolutionFlag(arg: string, nextArg: string | undefined, target: EvolutionConfigOverride): number;
|
|
28
|
+
/**
|
|
29
|
+
* Parse an argv slice into an {@link EvolutionConfigOverride}, returning the
|
|
30
|
+
* override plus the tokens that were NOT consumed (so the caller can keep
|
|
31
|
+
* parsing its own flags / positionals). Only the evolution-config flags above
|
|
32
|
+
* are recognised; everything else is passed through untouched.
|
|
33
|
+
*/
|
|
34
|
+
export declare function parseEvolutionConfigFlags(args: string[]): {
|
|
35
|
+
override: EvolutionConfigOverride;
|
|
36
|
+
rest: string[];
|
|
37
|
+
};
|
|
38
|
+
/** True when the override carries at least one set flag. */
|
|
39
|
+
export declare function hasAnyEvolutionFlag(override: EvolutionConfigOverride): boolean;
|
|
40
|
+
//# sourceMappingURL=evolution-flags.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evolution-flags.d.ts","sourceRoot":"","sources":["../../../src/cli/evolution-flags.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AAE3D,gFAAgF;AAChF,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAe1D;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,MAAM,GAAG,SAAS,EAC3B,MAAM,EAAE,uBAAuB,GAC9B,MAAM,CAmCR;AAED;;;;;GAKG;AACH,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG;IACzD,QAAQ,EAAE,uBAAuB,CAAC;IAClC,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB,CAaA;AAED,4DAA4D;AAC5D,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,uBAAuB,GAAG,OAAO,CAQ9E"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Darwin CLI — shared parser for the advanced evolution-config flags.
|
|
3
|
+
*
|
|
4
|
+
* Both `darwin run` and `darwin evolve` accept the same knobs that toggle the
|
|
5
|
+
* v0.6/v0.7 evolution config (GEPA reflective optimizer, system-aware merge,
|
|
6
|
+
* Pareto activation gate, instance-wise coverage selection, and the reflection
|
|
7
|
+
* model). This module centralises the flag spelling + parsing so the two
|
|
8
|
+
* commands stay in sync.
|
|
9
|
+
*
|
|
10
|
+
* --gepa / --no-gepa
|
|
11
|
+
* --merge / --no-merge
|
|
12
|
+
* --pareto-gate / --no-pareto-gate
|
|
13
|
+
* --coverage / --no-coverage
|
|
14
|
+
* --reflection-model <model-id>
|
|
15
|
+
*/
|
|
16
|
+
/** True when `arg` is one of the evolution-config flags this module handles. */
|
|
17
|
+
export function isEvolutionConfigFlag(arg) {
|
|
18
|
+
switch (arg) {
|
|
19
|
+
case '--gepa':
|
|
20
|
+
case '--no-gepa':
|
|
21
|
+
case '--merge':
|
|
22
|
+
case '--no-merge':
|
|
23
|
+
case '--pareto-gate':
|
|
24
|
+
case '--no-pareto-gate':
|
|
25
|
+
case '--coverage':
|
|
26
|
+
case '--no-coverage':
|
|
27
|
+
case '--reflection-model':
|
|
28
|
+
return true;
|
|
29
|
+
default:
|
|
30
|
+
return false;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Apply a single recognised evolution flag to `target`, mutating it in place.
|
|
35
|
+
*
|
|
36
|
+
* Returns the number of EXTRA argv tokens consumed (1 for `--reflection-model`
|
|
37
|
+
* which takes a value, 0 for the boolean flags). Callers that walk argv use the
|
|
38
|
+
* return value to advance their index. Unknown flags are ignored (return 0) —
|
|
39
|
+
* use {@link isEvolutionConfigFlag} to gate first.
|
|
40
|
+
*/
|
|
41
|
+
export function applyEvolutionFlag(arg, nextArg, target) {
|
|
42
|
+
switch (arg) {
|
|
43
|
+
case '--gepa':
|
|
44
|
+
target.useGepa = true;
|
|
45
|
+
return 0;
|
|
46
|
+
case '--no-gepa':
|
|
47
|
+
target.useGepa = false;
|
|
48
|
+
return 0;
|
|
49
|
+
case '--merge':
|
|
50
|
+
target.useMerge = true;
|
|
51
|
+
return 0;
|
|
52
|
+
case '--no-merge':
|
|
53
|
+
target.useMerge = false;
|
|
54
|
+
return 0;
|
|
55
|
+
case '--pareto-gate':
|
|
56
|
+
target.paretoGate = true;
|
|
57
|
+
return 0;
|
|
58
|
+
case '--no-pareto-gate':
|
|
59
|
+
target.paretoGate = false;
|
|
60
|
+
return 0;
|
|
61
|
+
case '--coverage':
|
|
62
|
+
target.useCoverage = true;
|
|
63
|
+
return 0;
|
|
64
|
+
case '--no-coverage':
|
|
65
|
+
target.useCoverage = false;
|
|
66
|
+
return 0;
|
|
67
|
+
case '--reflection-model':
|
|
68
|
+
if (nextArg !== undefined) {
|
|
69
|
+
target.reflectionModel = nextArg;
|
|
70
|
+
return 1;
|
|
71
|
+
}
|
|
72
|
+
return 0;
|
|
73
|
+
default:
|
|
74
|
+
return 0;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Parse an argv slice into an {@link EvolutionConfigOverride}, returning the
|
|
79
|
+
* override plus the tokens that were NOT consumed (so the caller can keep
|
|
80
|
+
* parsing its own flags / positionals). Only the evolution-config flags above
|
|
81
|
+
* are recognised; everything else is passed through untouched.
|
|
82
|
+
*/
|
|
83
|
+
export function parseEvolutionConfigFlags(args) {
|
|
84
|
+
const override = {};
|
|
85
|
+
const rest = [];
|
|
86
|
+
for (let i = 0; i < args.length; i++) {
|
|
87
|
+
const arg = args[i];
|
|
88
|
+
if (isEvolutionConfigFlag(arg)) {
|
|
89
|
+
const consumed = applyEvolutionFlag(arg, args[i + 1], override);
|
|
90
|
+
i += consumed;
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
rest.push(arg);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
return { override, rest };
|
|
97
|
+
}
|
|
98
|
+
/** True when the override carries at least one set flag. */
|
|
99
|
+
export function hasAnyEvolutionFlag(override) {
|
|
100
|
+
return (override.useGepa !== undefined ||
|
|
101
|
+
override.useMerge !== undefined ||
|
|
102
|
+
override.paretoGate !== undefined ||
|
|
103
|
+
override.useCoverage !== undefined ||
|
|
104
|
+
override.reflectionModel !== undefined);
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=evolution-flags.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evolution-flags.js","sourceRoot":"","sources":["../../../src/cli/evolution-flags.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAIH,gFAAgF;AAChF,MAAM,UAAU,qBAAqB,CAAC,GAAW;IAC/C,QAAQ,GAAG,EAAE,CAAC;QACZ,KAAK,QAAQ,CAAC;QACd,KAAK,WAAW,CAAC;QACjB,KAAK,SAAS,CAAC;QACf,KAAK,YAAY,CAAC;QAClB,KAAK,eAAe,CAAC;QACrB,KAAK,kBAAkB,CAAC;QACxB,KAAK,YAAY,CAAC;QAClB,KAAK,eAAe,CAAC;QACrB,KAAK,oBAAoB;YACvB,OAAO,IAAI,CAAC;QACd;YACE,OAAO,KAAK,CAAC;IACjB,CAAC;AACH,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,kBAAkB,CAChC,GAAW,EACX,OAA2B,EAC3B,MAA+B;IAE/B,QAAQ,GAAG,EAAE,CAAC;QACZ,KAAK,QAAQ;YACX,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC;YACtB,OAAO,CAAC,CAAC;QACX,KAAK,WAAW;YACd,MAAM,CAAC,OAAO,GAAG,KAAK,CAAC;YACvB,OAAO,CAAC,CAAC;QACX,KAAK,SAAS;YACZ,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC;YACvB,OAAO,CAAC,CAAC;QACX,KAAK,YAAY;YACf,MAAM,CAAC,QAAQ,GAAG,KAAK,CAAC;YACxB,OAAO,CAAC,CAAC;QACX,KAAK,eAAe;YAClB,MAAM,CAAC,UAAU,GAAG,IAAI,CAAC;YACzB,OAAO,CAAC,CAAC;QACX,KAAK,kBAAkB;YACrB,MAAM,CAAC,UAAU,GAAG,KAAK,CAAC;YAC1B,OAAO,CAAC,CAAC;QACX,KAAK,YAAY;YACf,MAAM,CAAC,WAAW,GAAG,IAAI,CAAC;YAC1B,OAAO,CAAC,CAAC;QACX,KAAK,eAAe;YAClB,MAAM,CAAC,WAAW,GAAG,KAAK,CAAC;YAC3B,OAAO,CAAC,CAAC;QACX,KAAK,oBAAoB;YACvB,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;gBAC1B,MAAM,CAAC,eAAe,GAAG,OAAO,CAAC;gBACjC,OAAO,CAAC,CAAC;YACX,CAAC;YACD,OAAO,CAAC,CAAC;QACX;YACE,OAAO,CAAC,CAAC;IACb,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,yBAAyB,CAAC,IAAc;IAItD,MAAM,QAAQ,GAA4B,EAAE,CAAC;IAC7C,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAE,CAAC;QACrB,IAAI,qBAAqB,CAAC,GAAG,CAAC,EAAE,CAAC;YAC/B,MAAM,QAAQ,GAAG,kBAAkB,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;YAChE,CAAC,IAAI,QAAQ,CAAC;QAChB,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACjB,CAAC;IACH,CAAC;IACD,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AAC5B,CAAC;AAED,4DAA4D;AAC5D,MAAM,UAAU,mBAAmB,CAAC,QAAiC;IACnE,OAAO,CACL,QAAQ,CAAC,OAAO,KAAK,SAAS;QAC9B,QAAQ,CAAC,QAAQ,KAAK,SAAS;QAC/B,QAAQ,CAAC,UAAU,KAAK,SAAS;QACjC,QAAQ,CAAC,WAAW,KAAK,SAAS;QAClC,QAAQ,CAAC,eAAe,KAAK,SAAS,CACvC,CAAC;AACJ,CAAC"}
|
package/dist/src/cli/evolve.d.ts
CHANGED
|
@@ -7,7 +7,16 @@
|
|
|
7
7
|
* darwin evolve researcher --enable
|
|
8
8
|
* darwin evolve researcher --disable
|
|
9
9
|
* darwin evolve researcher --reset
|
|
10
|
-
* darwin evolve researcher --force
|
|
10
|
+
* darwin evolve researcher --force (force one optimization now)
|
|
11
|
+
* darwin evolve researcher --gepa --coverage (persist advanced config flags)
|
|
12
|
+
* darwin evolve researcher --reflection-model claude-opus-4-8
|
|
13
|
+
*
|
|
14
|
+
* Advanced flags (persisted, also accepted by `darwin run`):
|
|
15
|
+
* --gepa / --no-gepa GEPA reflective optimizer
|
|
16
|
+
* --merge / --no-merge GEPA system-aware merge
|
|
17
|
+
* --pareto-gate / --no-pareto-gate multi-objective A/B activation gate
|
|
18
|
+
* --coverage / --no-coverage instance-wise coverage selection
|
|
19
|
+
* --reflection-model <id> stronger reflection model for GEPA
|
|
11
20
|
*/
|
|
12
21
|
export declare function evolveCommand(args: string[]): Promise<void>;
|
|
13
22
|
//# sourceMappingURL=evolve.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"evolve.d.ts","sourceRoot":"","sources":["../../../src/cli/evolve.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"evolve.d.ts","sourceRoot":"","sources":["../../../src/cli/evolve.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAeH,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAkGjE"}
|
package/dist/src/cli/evolve.js
CHANGED
|
@@ -7,28 +7,52 @@
|
|
|
7
7
|
* darwin evolve researcher --enable
|
|
8
8
|
* darwin evolve researcher --disable
|
|
9
9
|
* darwin evolve researcher --reset
|
|
10
|
-
* darwin evolve researcher --force
|
|
10
|
+
* darwin evolve researcher --force (force one optimization now)
|
|
11
|
+
* darwin evolve researcher --gepa --coverage (persist advanced config flags)
|
|
12
|
+
* darwin evolve researcher --reflection-model claude-opus-4-8
|
|
13
|
+
*
|
|
14
|
+
* Advanced flags (persisted, also accepted by `darwin run`):
|
|
15
|
+
* --gepa / --no-gepa GEPA reflective optimizer
|
|
16
|
+
* --merge / --no-merge GEPA system-aware merge
|
|
17
|
+
* --pareto-gate / --no-pareto-gate multi-objective A/B activation gate
|
|
18
|
+
* --coverage / --no-coverage instance-wise coverage selection
|
|
19
|
+
* --reflection-model <id> stronger reflection model for GEPA
|
|
11
20
|
*/
|
|
12
21
|
import { createMemory } from '../memory/index.js';
|
|
13
22
|
import { loadConfig } from '../core/agent.js';
|
|
14
23
|
import { builtinAgents } from '../agents/index.js';
|
|
24
|
+
import { resolveEvolutionEnabled, resolveEvolutionConfig, setEvolutionEnabled, setEvolutionConfigOverrides, } from '../evolution/enabled-state.js';
|
|
25
|
+
import { buildEvolutionLoop } from '../evolution/build-loop.js';
|
|
26
|
+
import { parseEvolutionConfigFlags, hasAnyEvolutionFlag } from './evolution-flags.js';
|
|
15
27
|
export async function evolveCommand(args) {
|
|
16
28
|
const agentName = args[0];
|
|
17
29
|
if (!agentName) {
|
|
18
|
-
throw new Error('Usage: darwin evolve <agent> [--enable|--disable|--reset|--force]');
|
|
30
|
+
throw new Error('Usage: darwin evolve <agent> [--enable|--disable|--reset|--force|--gepa|--coverage|…]');
|
|
19
31
|
}
|
|
20
32
|
const agent = builtinAgents[agentName];
|
|
21
33
|
if (!agent) {
|
|
22
34
|
throw new Error(`Unknown agent: "${agentName}". Available: ${Object.keys(builtinAgents).join(', ')}`);
|
|
23
35
|
}
|
|
24
|
-
|
|
36
|
+
// Separate the advanced evolution-config flags from the action flags.
|
|
37
|
+
const { override, rest: flags } = parseEvolutionConfigFlags(args.slice(1));
|
|
25
38
|
const config = await loadConfig();
|
|
26
39
|
const memory = createMemory(config);
|
|
27
40
|
await memory.init();
|
|
41
|
+
// Persist advanced-config flags FIRST (so e.g. `--force --gepa` forces with
|
|
42
|
+
// GEPA on, and `--gepa --coverage` alone just records the config).
|
|
43
|
+
if (hasAnyEvolutionFlag(override)) {
|
|
44
|
+
await setEvolutionConfigOverrides(memory, agentName, override);
|
|
45
|
+
console.log(`[darwin] Evolution config updated for ${agentName}: ${describeOverride(override)}`);
|
|
46
|
+
}
|
|
28
47
|
if (flags.includes('--enable')) {
|
|
48
|
+
// Persist the override into DarwinState so it survives process exit.
|
|
49
|
+
// (Mutating the in-memory singleton alone was the v0.7.1 bug — the flag
|
|
50
|
+
// was gone the moment the CLI process ended and `darwin run` read the
|
|
51
|
+
// static source default again.)
|
|
29
52
|
if (agent.evolution) {
|
|
30
53
|
agent.evolution.enabled = true;
|
|
31
54
|
}
|
|
55
|
+
await setEvolutionEnabled(memory, agentName, true);
|
|
32
56
|
console.log(`[darwin] Evolution ENABLED for ${agentName}`);
|
|
33
57
|
console.log(`[darwin] The critic will evaluate runs and Darwin will optimize prompts automatically.`);
|
|
34
58
|
}
|
|
@@ -36,6 +60,7 @@ export async function evolveCommand(args) {
|
|
|
36
60
|
if (agent.evolution) {
|
|
37
61
|
agent.evolution.enabled = false;
|
|
38
62
|
}
|
|
63
|
+
await setEvolutionEnabled(memory, agentName, false);
|
|
39
64
|
console.log(`[darwin] Evolution DISABLED for ${agentName}`);
|
|
40
65
|
}
|
|
41
66
|
else if (flags.includes('--reset')) {
|
|
@@ -47,23 +72,83 @@ export async function evolveCommand(args) {
|
|
|
47
72
|
console.log(`[darwin] Evolution RESET for ${agentName}. Back to v1.`);
|
|
48
73
|
}
|
|
49
74
|
else if (flags.includes('--force')) {
|
|
50
|
-
|
|
51
|
-
|
|
75
|
+
// On-demand manual trigger: run the loop's variant-generation + A/B-start
|
|
76
|
+
// path ONCE, bypassing the "enough runs / actionable patterns / data
|
|
77
|
+
// quality" gates of the automatic loop. Uses the experiments collected so
|
|
78
|
+
// far. Refuses cleanly when there is nothing to mutate from (no active
|
|
79
|
+
// prompt / no experiments) or a test is already running.
|
|
80
|
+
console.log(`[darwin] Forcing evolution for ${agentName}...`);
|
|
81
|
+
// Build the loop with the resolved advanced config (persisted overrides +
|
|
82
|
+
// any flags passed on this command line) so `--force --gepa` etc. take
|
|
83
|
+
// effect for the forced cycle.
|
|
84
|
+
const state = await memory.getState();
|
|
85
|
+
const resolvedEvolution = resolveEvolutionConfig(agent, state);
|
|
86
|
+
const evolutionAgent = resolvedEvolution
|
|
87
|
+
? { ...agent, evolution: resolvedEvolution }
|
|
88
|
+
: agent;
|
|
89
|
+
const loop = buildEvolutionLoop(evolutionAgent, config, memory);
|
|
90
|
+
const evoResult = await loop.forceEvolve(agentName);
|
|
91
|
+
if (evoResult.abTestStarted) {
|
|
92
|
+
console.log(`[darwin] EVOLVED: ${evoResult.message}`);
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
console.log(`[darwin] ${evoResult.message}`);
|
|
96
|
+
}
|
|
97
|
+
if (evoResult.patternsFound.length > 0) {
|
|
98
|
+
console.log(`[darwin] Patterns detected:`);
|
|
99
|
+
for (const p of evoResult.patternsFound.slice(0, 5)) {
|
|
100
|
+
console.log(` ${p.type}: ${p.description}`);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
52
103
|
}
|
|
53
|
-
else {
|
|
54
|
-
// Show current status
|
|
104
|
+
else if (!hasAnyEvolutionFlag(override)) {
|
|
105
|
+
// Show current status (only when no config flag was the whole command —
|
|
106
|
+
// a bare `--gepa` already printed its confirmation above).
|
|
55
107
|
const state = await memory.getState();
|
|
56
108
|
const version = state.activeVersions[agentName] ?? 'v1';
|
|
57
109
|
const runs = state.experimentCounts[agentName] ?? 0;
|
|
58
110
|
const abTest = state.abTests[agentName];
|
|
59
|
-
|
|
111
|
+
// Reflect the PERSISTED override (set by --enable/--disable) so `darwin
|
|
112
|
+
// evolve <agent>` reports the same enabled-state `darwin run` will act on.
|
|
113
|
+
const enabled = resolveEvolutionEnabled(agent, state);
|
|
114
|
+
const evo = resolveEvolutionConfig(agent, state);
|
|
60
115
|
console.log(`\n[darwin] Evolution for ${agentName}:`);
|
|
61
116
|
console.log(` Enabled: ${enabled ? 'yes' : 'no'}`);
|
|
62
117
|
console.log(` Version: ${version}`);
|
|
63
118
|
console.log(` Runs: ${runs}`);
|
|
64
119
|
console.log(` A/B Test: ${abTest ? `${abTest.versionA} vs ${abTest.versionB}` : 'none'}`);
|
|
65
120
|
console.log(` Min Runs: ${agent.evolution?.minRuns ?? 5}`);
|
|
121
|
+
console.log(` Advanced: ${describeConfig(evo)}`);
|
|
66
122
|
}
|
|
67
123
|
await memory.close();
|
|
68
124
|
}
|
|
125
|
+
/** One-line summary of which advanced flags an override set (for confirmation). */
|
|
126
|
+
function describeOverride(o) {
|
|
127
|
+
const parts = [];
|
|
128
|
+
if (o.useGepa !== undefined)
|
|
129
|
+
parts.push(`gepa=${o.useGepa}`);
|
|
130
|
+
if (o.useMerge !== undefined)
|
|
131
|
+
parts.push(`merge=${o.useMerge}`);
|
|
132
|
+
if (o.paretoGate !== undefined)
|
|
133
|
+
parts.push(`paretoGate=${o.paretoGate}`);
|
|
134
|
+
if (o.useCoverage !== undefined)
|
|
135
|
+
parts.push(`coverage=${o.useCoverage}`);
|
|
136
|
+
if (o.reflectionModel !== undefined)
|
|
137
|
+
parts.push(`reflectionModel=${o.reflectionModel}`);
|
|
138
|
+
return parts.length > 0 ? parts.join(', ') : '(none)';
|
|
139
|
+
}
|
|
140
|
+
/** One-line summary of the effective advanced config for the status view. */
|
|
141
|
+
function describeConfig(evo) {
|
|
142
|
+
if (!evo)
|
|
143
|
+
return '(no evolution config)';
|
|
144
|
+
const parts = [
|
|
145
|
+
`gepa=${evo.useGepa ?? false}`,
|
|
146
|
+
`merge=${evo.useMerge ?? false}`,
|
|
147
|
+
`paretoGate=${evo.paretoGate ?? false}`,
|
|
148
|
+
`coverage=${evo.useCoverage ?? false}`,
|
|
149
|
+
];
|
|
150
|
+
if (evo.reflectionModel)
|
|
151
|
+
parts.push(`reflectionModel=${evo.reflectionModel}`);
|
|
152
|
+
return parts.join(', ');
|
|
153
|
+
}
|
|
69
154
|
//# sourceMappingURL=evolve.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"evolve.js","sourceRoot":"","sources":["../../../src/cli/evolve.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"evolve.js","sourceRoot":"","sources":["../../../src/cli/evolve.ts"],"names":[],"mappings":"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"}
|
package/dist/src/cli/index.js
CHANGED
|
@@ -36,6 +36,12 @@ const HELP = `
|
|
|
36
36
|
darwin run analyst --path ./src
|
|
37
37
|
darwin status researcher
|
|
38
38
|
darwin evolve researcher --enable
|
|
39
|
+
darwin evolve researcher --force
|
|
40
|
+
|
|
41
|
+
Evolve flags:
|
|
42
|
+
--enable / --disable Persistently turn self-evolution on/off for an agent
|
|
43
|
+
--reset Reset the agent back to its v1 prompt
|
|
44
|
+
--force Force one optimization cycle now (needs >=1 prior run)
|
|
39
45
|
|
|
40
46
|
Options:
|
|
41
47
|
--task-type <type> Categorize the task (tech, webdesign, market, general)
|
|
@@ -44,6 +50,13 @@ const HELP = `
|
|
|
44
50
|
--model <model> Override LLM model
|
|
45
51
|
--verbose Show detailed output
|
|
46
52
|
--help Show this help
|
|
53
|
+
|
|
54
|
+
Advanced evolution flags (run + evolve; persisted by evolve):
|
|
55
|
+
--gepa / --no-gepa GEPA reflective optimizer
|
|
56
|
+
--merge / --no-merge GEPA system-aware merge
|
|
57
|
+
--pareto-gate / --no-pareto-gate multi-objective A/B activation gate
|
|
58
|
+
--coverage / --no-coverage instance-wise coverage selection
|
|
59
|
+
--reflection-model <id> stronger reflection model for GEPA
|
|
47
60
|
`;
|
|
48
61
|
async function main() {
|
|
49
62
|
const args = process.argv.slice(2);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cli/index.ts"],"names":[],"mappings":";AACA;;;;;;;;;GASG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,IAAI,GAAG
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cli/index.ts"],"names":[],"mappings":";AACA;;;;;;;;;GASG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,IAAI,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2CZ,CAAC;AAEF,KAAK,UAAU,IAAI;IACjB,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAEnC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACxE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAClB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IAExB,IAAI,CAAC;QACH,QAAQ,OAAO,EAAE,CAAC;YAChB,KAAK,KAAK;gBACR,MAAM,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;gBAChC,MAAM;YACR,KAAK,QAAQ;gBACX,MAAM,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;gBACnC,MAAM;YACR,KAAK,QAAQ;gBACX,MAAM,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;gBACnC,MAAM;YACR,KAAK,QAAQ;gBACX,MAAM,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;gBACnC,MAAM;YACR,KAAK,MAAM;gBACT,MAAM,WAAW,EAAE,CAAC;gBACpB,MAAM;YACR;gBACE,OAAO,CAAC,KAAK,CAAC,oBAAoB,OAAO,EAAE,CAAC,CAAC;gBAC7C,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBAClB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,qBAAsB,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;QAC7D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../../src/cli/run.ts"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../../src/cli/run.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AA8JH,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAoB9D"}
|
package/dist/src/cli/run.js
CHANGED
|
@@ -7,15 +7,13 @@ import { builtinAgents } from '../agents/index.js';
|
|
|
7
7
|
import { createMemory } from '../memory/index.js';
|
|
8
8
|
import { runAgent } from '../core/runner.js';
|
|
9
9
|
import { loadConfig } from '../core/agent.js';
|
|
10
|
-
import { DarwinLoop } from '../evolution/loop.js';
|
|
11
|
-
import { ExperimentTracker } from '../evolution/tracker.js';
|
|
12
|
-
import { PatternDetector } from '../evolution/patterns.js';
|
|
13
|
-
import { PromptOptimizer } from '../evolution/optimizer.js';
|
|
14
|
-
import { GepaOptimizer } from '../evolution/optimizer-gepa.js';
|
|
15
|
-
import { SafetyGate } from '../evolution/safety.js';
|
|
16
10
|
import { runMultiCritic, getCriticPrompts } from '../evolution/multi-critic.js';
|
|
17
|
-
import { loadNotificationConfig } from '../evolution/notifications.js';
|
|
18
11
|
import { createProvider } from '../providers/index.js';
|
|
12
|
+
import { resolveEvolutionEnabled } from '../evolution/enabled-state.js';
|
|
13
|
+
import { parseCriticScore } from '../evolution/parse-score.js';
|
|
14
|
+
import { resolveEvolutionConfig } from '../evolution/enabled-state.js';
|
|
15
|
+
import { buildEvolutionLoop } from '../evolution/build-loop.js';
|
|
16
|
+
import { isEvolutionConfigFlag, applyEvolutionFlag } from './evolution-flags.js';
|
|
19
17
|
/**
|
|
20
18
|
* Auto-detect available API keys and assign different providers to critics.
|
|
21
19
|
* Reduces LLM-as-judge bias by using multiple model families.
|
|
@@ -72,6 +70,7 @@ function parseRunArgs(args) {
|
|
|
72
70
|
noEvolve: false,
|
|
73
71
|
noCritic: false,
|
|
74
72
|
verbose: false,
|
|
73
|
+
evolutionOverride: {},
|
|
75
74
|
};
|
|
76
75
|
const positional = [];
|
|
77
76
|
for (let i = 0; i < args.length; i++) {
|
|
@@ -103,7 +102,12 @@ function parseRunArgs(args) {
|
|
|
103
102
|
flags.verbose = true;
|
|
104
103
|
break;
|
|
105
104
|
default:
|
|
106
|
-
|
|
105
|
+
if (isEvolutionConfigFlag(arg)) {
|
|
106
|
+
i += applyEvolutionFlag(arg, args[i + 1], flags.evolutionOverride);
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
positional.push(arg);
|
|
110
|
+
}
|
|
107
111
|
}
|
|
108
112
|
}
|
|
109
113
|
flags.agentName = positional[0] ?? '';
|
|
@@ -161,11 +165,17 @@ async function runCommandInner(flags, agent, config, memory) {
|
|
|
161
165
|
if (provider)
|
|
162
166
|
console.log(`[darwin] Provider: ${provider.name}`);
|
|
163
167
|
console.log('');
|
|
168
|
+
// Resolve the effective evolution-enabled flag ONCE from persisted state.
|
|
169
|
+
// `darwin evolve --enable/--disable` records the override in DarwinState; a
|
|
170
|
+
// persisted value wins over the agent definition's static default. Reading
|
|
171
|
+
// the static `agent.evolution?.enabled` directly (the v0.7.1 behaviour) lost
|
|
172
|
+
// the toggle across processes.
|
|
173
|
+
const preState = await memory.getState();
|
|
174
|
+
const evolutionEnabled = resolveEvolutionEnabled(agent, preState);
|
|
164
175
|
// A/B test routing: check if there's an active test and pick a version
|
|
165
176
|
let activePromptVersion = 'v1';
|
|
166
177
|
let agentToRun = agent;
|
|
167
178
|
{
|
|
168
|
-
const preState = await memory.getState();
|
|
169
179
|
const abTest = preState.abTests[agent.name] ?? null;
|
|
170
180
|
if (abTest) {
|
|
171
181
|
// Round-robin: pick whichever version has fewer runs
|
|
@@ -227,7 +237,7 @@ async function runCommandInner(flags, agent, config, memory) {
|
|
|
227
237
|
}
|
|
228
238
|
// Save experiment — tracker.recordExperiment() handles this for evolution-enabled agents.
|
|
229
239
|
// Only save here for non-evolution agents to avoid double-save.
|
|
230
|
-
if (!
|
|
240
|
+
if (!evolutionEnabled) {
|
|
231
241
|
await memory.saveExperiment(result.experiment);
|
|
232
242
|
await memory.updateState((state) => {
|
|
233
243
|
state.experimentCounts[agent.name] = (state.experimentCounts[agent.name] ?? 0) + 1;
|
|
@@ -238,8 +248,8 @@ async function runCommandInner(flags, agent, config, memory) {
|
|
|
238
248
|
});
|
|
239
249
|
}
|
|
240
250
|
// Run critic evaluation (unless skipped)
|
|
241
|
-
if (!flags.noCritic && agent.name !== 'critic' && agent.name !== 'investigator-critic' && agent.name !== 'multi-critic' &&
|
|
242
|
-
const evaluatorName = agent.evolution
|
|
251
|
+
if (!flags.noCritic && agent.name !== 'critic' && agent.name !== 'investigator-critic' && agent.name !== 'multi-critic' && evolutionEnabled) {
|
|
252
|
+
const evaluatorName = agent.evolution?.evaluator ?? 'critic';
|
|
243
253
|
if (evaluatorName === 'multi-critic') {
|
|
244
254
|
// ── Multi-Critic Mode — Multi-Model ───────────
|
|
245
255
|
const criticProviders = resolveCriticProviders(agent.name);
|
|
@@ -290,18 +300,11 @@ async function runCommandInner(flags, agent, config, memory) {
|
|
|
290
300
|
taskType: 'evaluation',
|
|
291
301
|
autonomous: true,
|
|
292
302
|
});
|
|
293
|
-
// Parse critic score
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
if (fallback) {
|
|
299
|
-
score = parseFloat(fallback[1]);
|
|
300
|
-
}
|
|
301
|
-
}
|
|
302
|
-
if (score !== null) {
|
|
303
|
-
score = Math.max(1, Math.min(10, score));
|
|
304
|
-
}
|
|
303
|
+
// Parse critic score with the shared robust extractor (handles
|
|
304
|
+
// ===SCORE===, N/10, "N out of 10", "rating: N", "I'd rate this N", …;
|
|
305
|
+
// already clamped to 1–10). Previously only ===SCORE=== + a bare N/10
|
|
306
|
+
// were handled, silently dropping every other phrasing from evolution.
|
|
307
|
+
const score = parseCriticScore(criticResult.output);
|
|
305
308
|
if (score !== null) {
|
|
306
309
|
result.experiment.metrics.qualityScore = score;
|
|
307
310
|
result.experiment.feedback = {
|
|
@@ -315,51 +318,17 @@ async function runCommandInner(flags, agent, config, memory) {
|
|
|
315
318
|
}
|
|
316
319
|
}
|
|
317
320
|
// Darwin evolution loop (unless skipped)
|
|
318
|
-
if (!flags.noEvolve &&
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
//
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
systemPrompt: 'You are a prompt optimization expert. Return ONLY the improved prompt text.',
|
|
330
|
-
maxTurns: 3,
|
|
331
|
-
model: 'claude-sonnet-4-6',
|
|
332
|
-
}, metaPrompt, { config, taskType: 'optimization', autonomous: true });
|
|
333
|
-
return optimizerResult.output;
|
|
334
|
-
});
|
|
335
|
-
// v0.6.0 — GEPA reflective optimizer (opt-in via agent.evolution.useGepa).
|
|
336
|
-
// Routes the reflection LLM call through a (ideally STRONGER) model: GEPA's
|
|
337
|
-
// published guidance + the Decagon production ablation both find the
|
|
338
|
-
// reflection model is the leverage point — a weak reflector can leave the
|
|
339
|
-
// prompt unchanged. Warn if useGepa is on but no reflectionModel is set.
|
|
340
|
-
let gepa;
|
|
341
|
-
if (agent.evolution?.useGepa) {
|
|
342
|
-
const reflectionModel = agent.evolution.reflectionModel;
|
|
343
|
-
if (!reflectionModel) {
|
|
344
|
-
console.warn('[darwin] evolution.useGepa is on but no evolution.reflectionModel is set — ' +
|
|
345
|
-
'reflection will use the agent model. GEPA works best with a STRONGER reflection ' +
|
|
346
|
-
'model (e.g. claude-opus-4-8); set agent.evolution.reflectionModel to silence this.');
|
|
347
|
-
}
|
|
348
|
-
gepa = new GepaOptimizer(async (reflectionPrompt) => {
|
|
349
|
-
const reflectionResult = await runAgent({
|
|
350
|
-
name: 'reflector',
|
|
351
|
-
role: 'GEPA Reflector',
|
|
352
|
-
description: 'Reflective prompt mutator (GEPA smallest-possible-edit)',
|
|
353
|
-
type: 'llm',
|
|
354
|
-
systemPrompt: 'You are a prompt-engineering reflector. Return ONLY the mutated prompt text.',
|
|
355
|
-
maxTurns: 3,
|
|
356
|
-
model: reflectionModel ?? agent.model ?? 'claude-sonnet-4-6',
|
|
357
|
-
}, reflectionPrompt, { config, taskType: 'reflection', autonomous: true });
|
|
358
|
-
return reflectionResult.output;
|
|
359
|
-
});
|
|
360
|
-
}
|
|
361
|
-
const notifications = loadNotificationConfig();
|
|
362
|
-
const loop = new DarwinLoop({ memory, tracker, optimizer, safety, patterns, agent, notifications, gepa });
|
|
321
|
+
if (!flags.noEvolve && evolutionEnabled) {
|
|
322
|
+
// Resolve the advanced evolution config: static definition < persisted
|
|
323
|
+
// overrides (darwin evolve --gepa/…) < this run's CLI flags. The resulting
|
|
324
|
+
// config drives both the GEPA wiring and the loop. With no overrides set,
|
|
325
|
+
// resolvedEvolution === the static config, so the loop is wired exactly as
|
|
326
|
+
// before (default path unchanged).
|
|
327
|
+
const resolvedEvolution = resolveEvolutionConfig(agent, preState, flags.evolutionOverride);
|
|
328
|
+
const evolutionAgent = resolvedEvolution
|
|
329
|
+
? { ...agent, evolution: resolvedEvolution }
|
|
330
|
+
: agent;
|
|
331
|
+
const loop = buildEvolutionLoop(evolutionAgent, config, memory);
|
|
363
332
|
console.log(`\n[darwin] Evolution: Running Darwin loop...`);
|
|
364
333
|
const evoResult = await loop.afterRun(result.experiment);
|
|
365
334
|
if (evoResult.rolledBack) {
|