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.
Files changed (188) hide show
  1. package/README.md +33 -1
  2. package/dist/src/cli/evolution-flags.d.ts +40 -0
  3. package/dist/src/cli/evolution-flags.d.ts.map +1 -0
  4. package/dist/src/cli/evolution-flags.js +106 -0
  5. package/dist/src/cli/evolution-flags.js.map +1 -0
  6. package/dist/src/cli/evolve.d.ts +10 -1
  7. package/dist/src/cli/evolve.d.ts.map +1 -1
  8. package/dist/src/cli/evolve.js +93 -8
  9. package/dist/src/cli/evolve.js.map +1 -1
  10. package/dist/src/cli/index.js +13 -0
  11. package/dist/src/cli/index.js.map +1 -1
  12. package/dist/src/cli/run.d.ts.map +1 -1
  13. package/dist/src/cli/run.js +38 -69
  14. package/dist/src/cli/run.js.map +1 -1
  15. package/dist/src/evolution/build-loop.d.ts +20 -0
  16. package/dist/src/evolution/build-loop.d.ts.map +1 -0
  17. package/dist/src/evolution/build-loop.js +67 -0
  18. package/dist/src/evolution/build-loop.js.map +1 -0
  19. package/dist/src/evolution/enabled-state.d.ts +59 -0
  20. package/dist/src/evolution/enabled-state.d.ts.map +1 -0
  21. package/dist/src/evolution/enabled-state.js +122 -0
  22. package/dist/src/evolution/enabled-state.js.map +1 -0
  23. package/dist/src/evolution/loop.d.ts +46 -0
  24. package/dist/src/evolution/loop.d.ts.map +1 -1
  25. package/dist/src/evolution/loop.js +119 -1
  26. package/dist/src/evolution/loop.js.map +1 -1
  27. package/dist/src/evolution/parse-score.d.ts +35 -0
  28. package/dist/src/evolution/parse-score.d.ts.map +1 -0
  29. package/dist/src/evolution/parse-score.js +115 -0
  30. package/dist/src/evolution/parse-score.js.map +1 -0
  31. package/dist/src/evolution/tracker.d.ts +13 -0
  32. package/dist/src/evolution/tracker.d.ts.map +1 -1
  33. package/dist/src/evolution/tracker.js +34 -0
  34. package/dist/src/evolution/tracker.js.map +1 -1
  35. package/dist/src/index.d.ts +2 -1
  36. package/dist/src/index.d.ts.map +1 -1
  37. package/dist/src/index.js +4 -0
  38. package/dist/src/index.js.map +1 -1
  39. package/dist/src/memory/postgres-memory.d.ts.map +1 -1
  40. package/dist/src/memory/postgres-memory.js +1 -0
  41. package/dist/src/memory/postgres-memory.js.map +1 -1
  42. package/dist/src/memory/sqlite-memory.d.ts.map +1 -1
  43. package/dist/src/memory/sqlite-memory.js +1 -0
  44. package/dist/src/memory/sqlite-memory.js.map +1 -1
  45. package/dist/src/types.d.ts +45 -0
  46. package/dist/src/types.d.ts.map +1 -1
  47. package/dist/src/types.js.map +1 -1
  48. package/package.json +1 -1
  49. package/dist/agents/analyst.d.ts +0 -11
  50. package/dist/agents/analyst.d.ts.map +0 -1
  51. package/dist/agents/analyst.js +0 -78
  52. package/dist/agents/analyst.js.map +0 -1
  53. package/dist/agents/blog-writer.d.ts +0 -13
  54. package/dist/agents/blog-writer.d.ts.map +0 -1
  55. package/dist/agents/blog-writer.js +0 -59
  56. package/dist/agents/blog-writer.js.map +0 -1
  57. package/dist/agents/critic.d.ts +0 -11
  58. package/dist/agents/critic.d.ts.map +0 -1
  59. package/dist/agents/critic.js +0 -57
  60. package/dist/agents/critic.js.map +0 -1
  61. package/dist/agents/index.d.ts +0 -15
  62. package/dist/agents/index.d.ts.map +0 -1
  63. package/dist/agents/index.js +0 -31
  64. package/dist/agents/index.js.map +0 -1
  65. package/dist/agents/investigator-critic.d.ts +0 -10
  66. package/dist/agents/investigator-critic.d.ts.map +0 -1
  67. package/dist/agents/investigator-critic.js +0 -78
  68. package/dist/agents/investigator-critic.js.map +0 -1
  69. package/dist/agents/investigator.d.ts +0 -13
  70. package/dist/agents/investigator.d.ts.map +0 -1
  71. package/dist/agents/investigator.js +0 -105
  72. package/dist/agents/investigator.js.map +0 -1
  73. package/dist/agents/marketing.d.ts +0 -13
  74. package/dist/agents/marketing.d.ts.map +0 -1
  75. package/dist/agents/marketing.js +0 -59
  76. package/dist/agents/marketing.js.map +0 -1
  77. package/dist/agents/researcher.d.ts +0 -11
  78. package/dist/agents/researcher.d.ts.map +0 -1
  79. package/dist/agents/researcher.js +0 -68
  80. package/dist/agents/researcher.js.map +0 -1
  81. package/dist/agents/writer.d.ts +0 -9
  82. package/dist/agents/writer.d.ts.map +0 -1
  83. package/dist/agents/writer.js +0 -47
  84. package/dist/agents/writer.js.map +0 -1
  85. package/dist/cli/create.d.ts +0 -11
  86. package/dist/cli/create.d.ts.map +0 -1
  87. package/dist/cli/create.js +0 -104
  88. package/dist/cli/create.js.map +0 -1
  89. package/dist/cli/evolve.d.ts +0 -13
  90. package/dist/cli/evolve.d.ts.map +0 -1
  91. package/dist/cli/evolve.js +0 -69
  92. package/dist/cli/evolve.js.map +0 -1
  93. package/dist/cli/index.d.ts +0 -13
  94. package/dist/cli/index.d.ts.map +0 -1
  95. package/dist/cli/index.js +0 -84
  96. package/dist/cli/index.js.map +0 -1
  97. package/dist/cli/init.d.ts +0 -12
  98. package/dist/cli/init.d.ts.map +0 -1
  99. package/dist/cli/init.js +0 -68
  100. package/dist/cli/init.js.map +0 -1
  101. package/dist/cli/run.d.ts +0 -7
  102. package/dist/cli/run.d.ts.map +0 -1
  103. package/dist/cli/run.js +0 -371
  104. package/dist/cli/run.js.map +0 -1
  105. package/dist/cli/status.d.ts +0 -7
  106. package/dist/cli/status.d.ts.map +0 -1
  107. package/dist/cli/status.js +0 -123
  108. package/dist/cli/status.js.map +0 -1
  109. package/dist/core/agent.d.ts +0 -53
  110. package/dist/core/agent.d.ts.map +0 -1
  111. package/dist/core/agent.js +0 -172
  112. package/dist/core/agent.js.map +0 -1
  113. package/dist/core/runner.d.ts +0 -75
  114. package/dist/core/runner.d.ts.map +0 -1
  115. package/dist/core/runner.js +0 -255
  116. package/dist/core/runner.js.map +0 -1
  117. package/dist/evolution/loop.d.ts +0 -100
  118. package/dist/evolution/loop.d.ts.map +0 -1
  119. package/dist/evolution/loop.js +0 -424
  120. package/dist/evolution/loop.js.map +0 -1
  121. package/dist/evolution/multi-critic.d.ts +0 -58
  122. package/dist/evolution/multi-critic.d.ts.map +0 -1
  123. package/dist/evolution/multi-critic.js +0 -326
  124. package/dist/evolution/multi-critic.js.map +0 -1
  125. package/dist/evolution/notifications.d.ts +0 -32
  126. package/dist/evolution/notifications.d.ts.map +0 -1
  127. package/dist/evolution/notifications.js +0 -92
  128. package/dist/evolution/notifications.js.map +0 -1
  129. package/dist/evolution/optimizer.d.ts +0 -64
  130. package/dist/evolution/optimizer.d.ts.map +0 -1
  131. package/dist/evolution/optimizer.js +0 -223
  132. package/dist/evolution/optimizer.js.map +0 -1
  133. package/dist/evolution/patterns.d.ts +0 -63
  134. package/dist/evolution/patterns.d.ts.map +0 -1
  135. package/dist/evolution/patterns.js +0 -297
  136. package/dist/evolution/patterns.js.map +0 -1
  137. package/dist/evolution/safety.d.ts +0 -76
  138. package/dist/evolution/safety.d.ts.map +0 -1
  139. package/dist/evolution/safety.js +0 -182
  140. package/dist/evolution/safety.js.map +0 -1
  141. package/dist/evolution/tracker.d.ts +0 -48
  142. package/dist/evolution/tracker.d.ts.map +0 -1
  143. package/dist/evolution/tracker.js +0 -163
  144. package/dist/evolution/tracker.js.map +0 -1
  145. package/dist/index.d.ts +0 -32
  146. package/dist/index.d.ts.map +0 -1
  147. package/dist/index.js +0 -35
  148. package/dist/index.js.map +0 -1
  149. package/dist/memory/index.d.ts +0 -32
  150. package/dist/memory/index.d.ts.map +0 -1
  151. package/dist/memory/index.js +0 -49
  152. package/dist/memory/index.js.map +0 -1
  153. package/dist/memory/postgres-memory.d.ts +0 -52
  154. package/dist/memory/postgres-memory.d.ts.map +0 -1
  155. package/dist/memory/postgres-memory.js +0 -515
  156. package/dist/memory/postgres-memory.js.map +0 -1
  157. package/dist/memory/sqlite-memory.d.ts +0 -36
  158. package/dist/memory/sqlite-memory.d.ts.map +0 -1
  159. package/dist/memory/sqlite-memory.js +0 -380
  160. package/dist/memory/sqlite-memory.js.map +0 -1
  161. package/dist/providers/anthropic.d.ts +0 -20
  162. package/dist/providers/anthropic.d.ts.map +0 -1
  163. package/dist/providers/anthropic.js +0 -82
  164. package/dist/providers/anthropic.js.map +0 -1
  165. package/dist/providers/claude-cli.d.ts +0 -35
  166. package/dist/providers/claude-cli.d.ts.map +0 -1
  167. package/dist/providers/claude-cli.js +0 -153
  168. package/dist/providers/claude-cli.js.map +0 -1
  169. package/dist/providers/index.d.ts +0 -39
  170. package/dist/providers/index.d.ts.map +0 -1
  171. package/dist/providers/index.js +0 -58
  172. package/dist/providers/index.js.map +0 -1
  173. package/dist/providers/ollama.d.ts +0 -17
  174. package/dist/providers/ollama.d.ts.map +0 -1
  175. package/dist/providers/ollama.js +0 -64
  176. package/dist/providers/ollama.js.map +0 -1
  177. package/dist/providers/openai.d.ts +0 -19
  178. package/dist/providers/openai.d.ts.map +0 -1
  179. package/dist/providers/openai.js +0 -75
  180. package/dist/providers/openai.js.map +0 -1
  181. package/dist/providers/types.d.ts +0 -62
  182. package/dist/providers/types.d.ts.map +0 -1
  183. package/dist/providers/types.js +0 -9
  184. package/dist/providers/types.js.map +0 -1
  185. package/dist/types.d.ts +0 -221
  186. package/dist/types.d.ts.map +0 -1
  187. package/dist/types.js +0 -19
  188. 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"}
@@ -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 (force optimization now)
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;;;;;;;;;;GAUG;AAMH,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAsDjE"}
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"}
@@ -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 (force optimization now)
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
- const flags = args.slice(1);
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
- console.log(`[darwin] Force evolution is not yet available.`);
51
- console.log(`[darwin] Run the agent normally Darwin will evolve automatically after enough runs.`);
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
- const enabled = agent.evolution?.enabled ?? false;
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":"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"}
1
+ {"version":3,"file":"evolve.js","sourceRoot":"","sources":["../../../src/cli/evolve.ts"],"names":[],"mappings":"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"}
@@ -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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8BZ,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
+ {"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;AAwJH,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAoB9D"}
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"}
@@ -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
- positional.push(arg);
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 (!agent.evolution?.enabled) {
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' && agent.evolution?.enabled) {
242
- const evaluatorName = agent.evolution.evaluator ?? 'critic';
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 (primary: ===SCORE=== format, fallback: "X/10" pattern)
294
- const scoreMatch = criticResult.output.match(/===SCORE===\s*(\d+(?:\.\d+)?)/);
295
- let score = scoreMatch ? parseFloat(scoreMatch[1]) : null;
296
- if (score === null) {
297
- const fallback = criticResult.output.match(/\b(\d+(?:\.\d+)?)\s*\/\s*10\b/);
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 && agent.evolution?.enabled) {
319
- const tracker = new ExperimentTracker(memory);
320
- const patterns = new PatternDetector(memory);
321
- const safety = new SafetyGate();
322
- // The optimizer uses Claude CLI to generate improved prompts
323
- const optimizer = new PromptOptimizer(async (metaPrompt) => {
324
- const optimizerResult = await runAgent({
325
- name: 'optimizer',
326
- role: 'Prompt Optimizer',
327
- description: 'Generates improved prompt variants',
328
- type: 'llm',
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) {