darwin-agents 0.8.0 → 0.9.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/CHANGELOG.md +62 -0
- package/README.md +29 -0
- package/dist/src/cli/canary.d.ts +13 -0
- package/dist/src/cli/canary.d.ts.map +1 -0
- package/dist/src/cli/canary.js +66 -0
- package/dist/src/cli/canary.js.map +1 -0
- package/dist/src/cli/index.js +5 -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 +16 -1
- package/dist/src/cli/run.js.map +1 -1
- package/dist/src/evolution/canary.d.ts +164 -0
- package/dist/src/evolution/canary.d.ts.map +1 -0
- package/dist/src/evolution/canary.js +244 -0
- package/dist/src/evolution/canary.js.map +1 -0
- package/dist/src/evolution/critic-families.d.ts +51 -0
- package/dist/src/evolution/critic-families.d.ts.map +1 -0
- package/dist/src/evolution/critic-families.js +51 -0
- package/dist/src/evolution/critic-families.js.map +1 -0
- package/dist/src/index.d.ts +1 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +6 -0
- package/dist/src/index.js.map +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,68 @@
|
|
|
2
2
|
|
|
3
3
|
## [Unreleased]
|
|
4
4
|
|
|
5
|
+
## [0.9.0] — 2026-06-21
|
|
6
|
+
|
|
7
|
+
### Added
|
|
8
|
+
|
|
9
|
+
- **Validate-by-reproduce drift-detection canary** (Phase 2 A5) — new
|
|
10
|
+
`src/evolution/canary.ts` + a `darwin canary <agent>` command. The A/B gate
|
|
11
|
+
guards prompt *quality*; the canary guards *behaviour*. It compares an agent's
|
|
12
|
+
recent execution trajectories (captured in A1) against a frozen baseline using
|
|
13
|
+
tolerance-based metrics — unordered tool-set Jaccard, ordered tool-sequence
|
|
14
|
+
similarity, turn-count ratio, error-rate delta — and flags drift the score can
|
|
15
|
+
miss (a model update or a broken tool changing *how* the agent works while the
|
|
16
|
+
quality score stays flat). Exact-hash equivalence is deliberately avoided (LLM
|
|
17
|
+
runs are non-deterministic). Drift requires a *pattern* (default ≥2 of N runs),
|
|
18
|
+
and the baseline is pinned to the active prompt version so an intentional
|
|
19
|
+
evolution reports `insufficient-data` (re-baseline) rather than a false alarm.
|
|
20
|
+
Pure and zero-dep; `--json` + `--exit-on-drift` for CI. The metrics and the
|
|
21
|
+
`runCanaryOverExperiments` orchestrator are exported from the package root so
|
|
22
|
+
consumers can run the same check on their own captured trajectories.
|
|
23
|
+
|
|
24
|
+
- **Cross-family critic diversity check** (`src/evolution/critic-families.ts`).
|
|
25
|
+
Multi-critic evaluation spreads critics across model families to reduce
|
|
26
|
+
LLM-as-judge bias — but only when more than one provider key is present.
|
|
27
|
+
Otherwise all three critics collapse onto a single family (`claude-cli` and
|
|
28
|
+
`anthropic-api` are the *same* family, differing only in latency) with no
|
|
29
|
+
signal to the operator. The run path now warns when the critics share one
|
|
30
|
+
family, and hard-fails when `DARWIN_REQUIRE_CROSS_FAMILY` is set (CI / strict
|
|
31
|
+
setups). Default behaviour is unchanged apart from the new warning.
|
|
32
|
+
|
|
33
|
+
## [0.8.0] — 2026-06-21
|
|
34
|
+
|
|
35
|
+
**Evolution wired end-to-end through the CLI, plus three correctness fixes.** The
|
|
36
|
+
v0.7 evolution surfaces existed but the `darwin evolve` command couldn't fully
|
|
37
|
+
drive them; this release closes that gap and hardens score parsing. The
|
|
38
|
+
automatic loop is behaviour-preserving — the gated path still passes the
|
|
39
|
+
existing loop/GEPA suites unchanged.
|
|
40
|
+
|
|
41
|
+
### Added
|
|
42
|
+
|
|
43
|
+
- **`darwin evolve <agent> --force`** now runs the loop's real
|
|
44
|
+
variant-generation + A/B-start path on demand (`DarwinLoop.forceEvolve()`),
|
|
45
|
+
bypassing the automatic "enough runs / actionable patterns / data quality"
|
|
46
|
+
gates while still refusing the impossible cases (no active prompt, no recorded
|
|
47
|
+
experiments, an A/B test already running). It was previously a stub that
|
|
48
|
+
printed "not yet available" while the help text advertised it.
|
|
49
|
+
- **`src/evolution/build-loop.ts`** — shared loop wiring (legacy optimizer +
|
|
50
|
+
opt-in GEPA) used by both `cli/run.ts` and the new `--force` command.
|
|
51
|
+
|
|
52
|
+
### Fixed
|
|
53
|
+
|
|
54
|
+
- **`darwin evolve <agent> --enable|--disable` now persists.** The flag mutated
|
|
55
|
+
only the in-memory agent singleton, so it was lost on process exit and `darwin
|
|
56
|
+
run` read the static source default again. A new `DarwinState.evolutionEnabled`
|
|
57
|
+
override map (round-tripped by every backend's existing JSON state blob) is set
|
|
58
|
+
atomically by the evolve command and wins over the static default in the run
|
|
59
|
+
path. Persisting an enable on an agent with no evolution config is a no-op, not
|
|
60
|
+
a crash; the field is read defensively so pre-existing state rows keep their
|
|
61
|
+
prior behaviour. New shared helper `src/evolution/enabled-state.ts`.
|
|
62
|
+
- **Robust critic-score parsing** via a shared `parseCriticScore` helper —
|
|
63
|
+
handles `===SCORE===`, `N/10`, "N out of 10", "rating: N", "I'd rate this N", …
|
|
64
|
+
(clamped 1–10). Previously only `===SCORE===` and a bare `N/10` were read,
|
|
65
|
+
silently dropping every other phrasing from evolution.
|
|
66
|
+
|
|
5
67
|
## [0.7.1] — 2026-06-20
|
|
6
68
|
|
|
7
69
|
**Documentation honesty + a reproducible evolution benchmark.** No library code
|
package/README.md
CHANGED
|
@@ -195,6 +195,33 @@ const loop = new DarwinLoop({
|
|
|
195
195
|
- **Style-bias-free judging** (`normalizeForJudging`) — strip markdown before the
|
|
196
196
|
critic scores, so it measures content not formatting.
|
|
197
197
|
|
|
198
|
+
### Drift detection — validate-by-reproduce canary (v0.9)
|
|
199
|
+
|
|
200
|
+
The A/B gate guards prompt *quality*. The canary guards *behaviour*: a model
|
|
201
|
+
update or a broken tool can change *how* an agent reaches its answer (different
|
|
202
|
+
tools, more turns, more errors) while the quality score stays flat. `darwin
|
|
203
|
+
canary` re-checks recent runs against a frozen baseline and flags that drift.
|
|
204
|
+
|
|
205
|
+
```bash
|
|
206
|
+
darwin canary writer # Stable / drift / insufficient-data report
|
|
207
|
+
darwin canary writer --json # Machine-readable, for dashboards
|
|
208
|
+
darwin canary writer --exit-on-drift # Non-zero exit on drift, for CI
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
It compares execution *trajectories* (captured opt-in since v0.5) with
|
|
212
|
+
tolerance-based metrics — unordered tool-set Jaccard, ordered sequence
|
|
213
|
+
similarity, turn-count ratio, error-rate delta — never an exact hash (LLM runs
|
|
214
|
+
are non-deterministic). Drift has to be a *pattern* (≥2 of N runs), and the
|
|
215
|
+
baseline is pinned to the active prompt version, so an intentional evolution
|
|
216
|
+
reports `insufficient-data` (re-baseline), not a false alarm. The metrics and
|
|
217
|
+
the `runCanaryOverExperiments` orchestrator are exported for your own pipelines.
|
|
218
|
+
|
|
219
|
+
**Cross-family judging:** with more than one provider key present, Darwin
|
|
220
|
+
already spreads the three critics across model families to cut LLM-as-judge
|
|
221
|
+
bias. With only one key they collapse onto a single family (note: `claude-cli`
|
|
222
|
+
and `anthropic-api` are the *same* family) — Darwin now warns, and hard-fails
|
|
223
|
+
under `DARWIN_REQUIRE_CROSS_FAMILY=1` for strict / CI setups.
|
|
224
|
+
|
|
198
225
|
## Built-in Agents
|
|
199
226
|
|
|
200
227
|
| Agent | What it does | Needs |
|
|
@@ -407,6 +434,8 @@ darwin run analyst --path ./src # Analyze a codebase
|
|
|
407
434
|
darwin status # Overview of all agents
|
|
408
435
|
darwin status writer # Detailed agent stats + evolution history
|
|
409
436
|
|
|
437
|
+
darwin canary writer # Behavioural drift vs a frozen baseline (--json, --exit-on-drift)
|
|
438
|
+
|
|
410
439
|
darwin evolve writer --enable # Enable self-evolution (persisted)
|
|
411
440
|
darwin evolve writer --disable # Disable self-evolution (persisted)
|
|
412
441
|
darwin evolve writer --reset # Reset to v1
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* darwin canary <agent> [--json] [--exit-on-drift]
|
|
3
|
+
*
|
|
4
|
+
* Validate-by-reproduce drift check (Phase 2 A5). Loads the agent's recent
|
|
5
|
+
* experiments, baselines within the active prompt version, and reports whether
|
|
6
|
+
* the recent trajectories have drifted from that baseline (different tools,
|
|
7
|
+
* more turns, more errors) — behavioural drift the A/B *quality* gate can miss.
|
|
8
|
+
*
|
|
9
|
+
* Read-only. Exits 0 by default even on drift (the signal is the printed report
|
|
10
|
+
* / JSON, mirroring the staleness monitor); pass `--exit-on-drift` for CI.
|
|
11
|
+
*/
|
|
12
|
+
export declare function canaryCommand(args: string[]): Promise<void>;
|
|
13
|
+
//# sourceMappingURL=canary.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canary.d.ts","sourceRoot":"","sources":["../../../src/cli/canary.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAUH,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA+BjE"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* darwin canary <agent> [--json] [--exit-on-drift]
|
|
3
|
+
*
|
|
4
|
+
* Validate-by-reproduce drift check (Phase 2 A5). Loads the agent's recent
|
|
5
|
+
* experiments, baselines within the active prompt version, and reports whether
|
|
6
|
+
* the recent trajectories have drifted from that baseline (different tools,
|
|
7
|
+
* more turns, more errors) — behavioural drift the A/B *quality* gate can miss.
|
|
8
|
+
*
|
|
9
|
+
* Read-only. Exits 0 by default even on drift (the signal is the printed report
|
|
10
|
+
* / JSON, mirroring the staleness monitor); pass `--exit-on-drift` for CI.
|
|
11
|
+
*/
|
|
12
|
+
import { createMemory } from '../memory/index.js';
|
|
13
|
+
import { loadConfig } from '../core/agent.js';
|
|
14
|
+
import { runCanaryOverExperiments } from '../evolution/canary.js';
|
|
15
|
+
/** How many recent experiments to pull for the drift window — wide enough that
|
|
16
|
+
* several same-version runs land in it after an evolution. */
|
|
17
|
+
const CANARY_WINDOW = 100;
|
|
18
|
+
export async function canaryCommand(args) {
|
|
19
|
+
const agentName = args.find((a) => !a.startsWith('--'));
|
|
20
|
+
if (!agentName) {
|
|
21
|
+
throw new Error('Usage: darwin canary <agent> [--json] [--exit-on-drift]');
|
|
22
|
+
}
|
|
23
|
+
const asJson = args.includes('--json');
|
|
24
|
+
const exitOnDrift = args.includes('--exit-on-drift');
|
|
25
|
+
const config = await loadConfig();
|
|
26
|
+
const memory = createMemory(config);
|
|
27
|
+
await memory.init();
|
|
28
|
+
try {
|
|
29
|
+
const state = await memory.getState();
|
|
30
|
+
const activeVersion = state.activeVersions[agentName] ?? null;
|
|
31
|
+
const experiments = await memory.loadExperiments(agentName, CANARY_WINDOW);
|
|
32
|
+
const report = runCanaryOverExperiments(agentName, experiments, activeVersion);
|
|
33
|
+
if (asJson) {
|
|
34
|
+
console.log(JSON.stringify(report, null, 2));
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
printReport(report);
|
|
38
|
+
}
|
|
39
|
+
if (exitOnDrift && report.status === 'drift') {
|
|
40
|
+
process.exitCode = 1;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
finally {
|
|
44
|
+
await memory.close();
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
function printReport(report) {
|
|
48
|
+
const icon = report.status === 'drift' ? '⚠' : report.status === 'ok' ? '✓' : '·';
|
|
49
|
+
console.log('');
|
|
50
|
+
console.log(`[darwin] Canary: ${report.agentName}${report.promptVersion ? ` / ${report.promptVersion}` : ''}`);
|
|
51
|
+
if (report.baselineId)
|
|
52
|
+
console.log(` Baseline: ${report.baselineId}`);
|
|
53
|
+
console.log(` Evaluated: ${report.evaluated} candidate run(s)`);
|
|
54
|
+
console.log(` Status: ${icon} ${report.status.toUpperCase()}`);
|
|
55
|
+
if (report.result) {
|
|
56
|
+
const r = report.result;
|
|
57
|
+
console.log(` Drifted: ${r.driftedCount}/${r.total} runs`);
|
|
58
|
+
console.log(` Medians: tool-Jaccard ${r.medianToolJaccard.toFixed(2)} | turn-ratio ${r.medianTurnRatio.toFixed(2)}`);
|
|
59
|
+
if (r.reasons.length > 0) {
|
|
60
|
+
console.log(` Reasons: ${r.reasons.join('; ')}`);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
console.log(` ${report.message}`);
|
|
64
|
+
console.log('');
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=canary.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canary.js","sourceRoot":"","sources":["../../../src/cli/canary.ts"],"names":[],"mappings":"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"}
|
package/dist/src/cli/index.js
CHANGED
|
@@ -14,12 +14,14 @@ import { statusCommand } from './status.js';
|
|
|
14
14
|
import { evolveCommand } from './evolve.js';
|
|
15
15
|
import { initCommand } from './init.js';
|
|
16
16
|
import { createCommand } from './create.js';
|
|
17
|
+
import { canaryCommand } from './canary.js';
|
|
17
18
|
const HELP = `
|
|
18
19
|
darwin — AI agents that improve themselves.
|
|
19
20
|
|
|
20
21
|
Usage:
|
|
21
22
|
darwin run <agent> "task" Run an agent on a task
|
|
22
23
|
darwin status [agent] Show evolution status & metrics
|
|
24
|
+
darwin canary <agent> Check for behavioural drift vs a frozen baseline
|
|
23
25
|
darwin evolve <agent> Manage evolution settings
|
|
24
26
|
darwin create <name> Scaffold a new agent
|
|
25
27
|
darwin init Initialize darwin in current project
|
|
@@ -73,6 +75,9 @@ async function main() {
|
|
|
73
75
|
case 'status':
|
|
74
76
|
await statusCommand(args.slice(1));
|
|
75
77
|
break;
|
|
78
|
+
case 'canary':
|
|
79
|
+
await canaryCommand(args.slice(1));
|
|
80
|
+
break;
|
|
76
81
|
case 'evolve':
|
|
77
82
|
await evolveCommand(args.slice(1));
|
|
78
83
|
break;
|
|
@@ -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;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,IAAI,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4CZ,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,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;AAmKH,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAoB9D"}
|
package/dist/src/cli/run.js
CHANGED
|
@@ -11,6 +11,7 @@ import { runMultiCritic, getCriticPrompts } from '../evolution/multi-critic.js';
|
|
|
11
11
|
import { createProvider } from '../providers/index.js';
|
|
12
12
|
import { resolveEvolutionEnabled } from '../evolution/enabled-state.js';
|
|
13
13
|
import { parseCriticScore } from '../evolution/parse-score.js';
|
|
14
|
+
import { checkCriticFamilies, crossFamilyRequired, singleFamilyHint } from '../evolution/critic-families.js';
|
|
14
15
|
import { resolveEvolutionConfig } from '../evolution/enabled-state.js';
|
|
15
16
|
import { buildEvolutionLoop } from '../evolution/build-loop.js';
|
|
16
17
|
import { isEvolutionConfigFlag, applyEvolutionFlag } from './evolution-flags.js';
|
|
@@ -29,7 +30,7 @@ function resolveCriticProviders(agentName) {
|
|
|
29
30
|
const defaults = {};
|
|
30
31
|
// Initialize all critics with CLI default
|
|
31
32
|
for (const { name } of prompts) {
|
|
32
|
-
defaults[name] = { model: 'claude-sonnet-4-6', label: 'claude-cli' };
|
|
33
|
+
defaults[name] = { model: 'claude-sonnet-4-6', label: 'claude-cli', family: 'anthropic' };
|
|
33
34
|
}
|
|
34
35
|
const criticNames = prompts.map(p => p.name);
|
|
35
36
|
// GPT-5.4 for first critic (model diversity — different training, different biases)
|
|
@@ -40,6 +41,7 @@ function resolveCriticProviders(agentName) {
|
|
|
40
41
|
provider: openaiProvider,
|
|
41
42
|
model: 'gpt-5.4',
|
|
42
43
|
label: 'openai/gpt-5.4',
|
|
44
|
+
family: 'openai',
|
|
43
45
|
};
|
|
44
46
|
}
|
|
45
47
|
catch {
|
|
@@ -54,6 +56,7 @@ function resolveCriticProviders(agentName) {
|
|
|
54
56
|
provider: anthropicProvider,
|
|
55
57
|
model: 'claude-sonnet-4-6',
|
|
56
58
|
label: 'anthropic-api',
|
|
59
|
+
family: 'anthropic',
|
|
57
60
|
};
|
|
58
61
|
}
|
|
59
62
|
catch {
|
|
@@ -253,6 +256,18 @@ async function runCommandInner(flags, agent, config, memory) {
|
|
|
253
256
|
if (evaluatorName === 'multi-critic') {
|
|
254
257
|
// ── Multi-Critic Mode — Multi-Model ───────────
|
|
255
258
|
const criticProviders = resolveCriticProviders(agent.name);
|
|
259
|
+
// Cross-family bias check: if every critic collapsed onto a single model
|
|
260
|
+
// family (e.g. only a Claude key present, so claude-cli + anthropic-api),
|
|
261
|
+
// the LLM-as-judge diversity guarantee is gone. Warn by default; hard-fail
|
|
262
|
+
// when DARWIN_REQUIRE_CROSS_FAMILY is set (CI / strict setups).
|
|
263
|
+
const familyCheck = checkCriticFamilies(criticProviders);
|
|
264
|
+
if (familyCheck.singleFamily) {
|
|
265
|
+
const hint = singleFamilyHint(familyCheck);
|
|
266
|
+
if (crossFamilyRequired()) {
|
|
267
|
+
throw new Error(`[darwin] DARWIN_REQUIRE_CROSS_FAMILY is set. ${hint}`);
|
|
268
|
+
}
|
|
269
|
+
console.warn(`[darwin] ⚠ ${hint}`);
|
|
270
|
+
}
|
|
256
271
|
const providerLabels = Object.entries(criticProviders)
|
|
257
272
|
.map(([name, info]) => `${name}→${info.label}`)
|
|
258
273
|
.join(', ');
|
package/dist/src/cli/run.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../../src/cli/run.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../../src/cli/run.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Validate-by-Reproduce drift-detection canary (Phase 2 A5).
|
|
3
|
+
*
|
|
4
|
+
* The A/B safety gate guards prompt *quality* — it catches a new prompt version
|
|
5
|
+
* that scores worse. But an agent can drift WITHOUT its quality score moving: a
|
|
6
|
+
* model update, an MCP tool breaking, or a prompt evolution's side-effect can
|
|
7
|
+
* change *how* the agent gets to the answer (different tools, more turns, more
|
|
8
|
+
* errors) while the final score stays flat. Vadim Nicolai's production write-up
|
|
9
|
+
* captures it: "the agent still sounds fluent, but the trajectory is longer and
|
|
10
|
+
* the tool-calls more repetitive."
|
|
11
|
+
*
|
|
12
|
+
* This module compares an agent's recent execution *trajectories* against a
|
|
13
|
+
* frozen baseline and flags behavioural drift. It is the read side of the
|
|
14
|
+
* trajectory capture shipped in A1 (`ExecutionTrace`).
|
|
15
|
+
*
|
|
16
|
+
* ── Method (grounded in 2026 agent-eval practice) ──
|
|
17
|
+
* Exact-hash equivalence is the wrong tool — LLM runs are non-deterministic, so
|
|
18
|
+
* an exact trajectory hash drifts every single run. Instead we use the same
|
|
19
|
+
* deterministic, tolerance-based metrics the field settled on (LangChain's
|
|
20
|
+
* `agentevals`, Vertex AI trajectory metrics, Galileo):
|
|
21
|
+
*
|
|
22
|
+
* 1. **Unordered tool-set Jaccard** — `|A∩B| / |A∪B|` over tool *names*.
|
|
23
|
+
* Catches new/missing tools regardless of order. Primary signal.
|
|
24
|
+
* 2. **Ordered tool-sequence similarity** — normalised Levenshtein over the
|
|
25
|
+
* tool-name sequence. Catches re-ordering / repetition.
|
|
26
|
+
* 3. **Turn-count ratio** — `candidate.turns / baseline.turns`. A ratio > 1.5
|
|
27
|
+
* is the canonical "agent is grinding" symptom.
|
|
28
|
+
* 4. **Error-rate delta** — error spikes are the most reliable tool-break tell.
|
|
29
|
+
*
|
|
30
|
+
* We deliberately do NOT compare tool *arguments* (LLM-variable → noise) or
|
|
31
|
+
* output length (verbosity swings without drift). We keep zero hard deps: these
|
|
32
|
+
* metrics are ~a dozen lines each, so `agentevals` stays an inspiration, not a
|
|
33
|
+
* dependency — Darwin's whole point is a pure, injectable core.
|
|
34
|
+
*
|
|
35
|
+
* ── Sampling ──
|
|
36
|
+
* A single failing run is noise, not drift. The canary needs a *pattern*:
|
|
37
|
+
* evaluate several same-version runs and alert only when ≥ N of them drift
|
|
38
|
+
* (default 2). Three candidate runs per week is the field's rule of thumb.
|
|
39
|
+
*
|
|
40
|
+
* ── Baseline staleness (the load-bearing footgun) ──
|
|
41
|
+
* A baseline is only meaningful against runs of the SAME prompt version. When a
|
|
42
|
+
* prompt evolves, the new version *should* behave differently — comparing it to
|
|
43
|
+
* the old baseline would fire a false alarm on every intentional improvement.
|
|
44
|
+
* `runCanaryOverExperiments` therefore baselines strictly within the active
|
|
45
|
+
* prompt version: after an evolution the canary reports `insufficient-data`
|
|
46
|
+
* (re-baseline in progress) rather than screaming drift.
|
|
47
|
+
*
|
|
48
|
+
* Everything here is pure and deterministic. Side-effects (loading experiments,
|
|
49
|
+
* printing, alerting) live in the CLI command and in private cron wiring.
|
|
50
|
+
*/
|
|
51
|
+
import type { DarwinExperiment, ExecutionTrace } from '../types.js';
|
|
52
|
+
/** The ordered sequence of tool names exactly as they fired. */
|
|
53
|
+
export declare function toolSequence(trace: ExecutionTrace): string[];
|
|
54
|
+
/** The set of distinct tool names used (order-independent). */
|
|
55
|
+
export declare function toolSet(trace: ExecutionTrace): Set<string>;
|
|
56
|
+
/**
|
|
57
|
+
* Error rate of a run: (tool-call errors + turn-level errors) normalised by the
|
|
58
|
+
* turn count. Uses `max(1, turnCount)` so a zero-turn trace can't divide by zero.
|
|
59
|
+
*/
|
|
60
|
+
export declare function errorRate(trace: ExecutionTrace): number;
|
|
61
|
+
/**
|
|
62
|
+
* Jaccard similarity of two string sets: `|A∩B| / |A∪B|`.
|
|
63
|
+
* 1 = identical, 0 = disjoint. Two empty sets are defined as 1 (both used no
|
|
64
|
+
* tools → identical behaviour, not drift).
|
|
65
|
+
*/
|
|
66
|
+
export declare function jaccard(a: Set<string>, b: Set<string>): number;
|
|
67
|
+
/**
|
|
68
|
+
* Normalised Levenshtein similarity over two token sequences:
|
|
69
|
+
* `1 - editDistance / max(len)`. 1 = identical order, 0 = fully different.
|
|
70
|
+
* Two empty sequences are defined as 1.
|
|
71
|
+
*/
|
|
72
|
+
export declare function sequenceSimilarity(a: string[], b: string[]): number;
|
|
73
|
+
export interface CanaryThresholds {
|
|
74
|
+
/** Min unordered tool-set Jaccard before flagging drift. Default 0.7. */
|
|
75
|
+
minToolJaccard?: number;
|
|
76
|
+
/** Min ordered tool-sequence similarity before flagging drift. Default 0.6. */
|
|
77
|
+
minSequenceSimilarity?: number;
|
|
78
|
+
/** Max turn-count ratio (candidate/baseline) before flagging drift. Default 1.5. */
|
|
79
|
+
maxTurnRatio?: number;
|
|
80
|
+
/** Max absolute increase in error rate before flagging drift. Default 0.2. */
|
|
81
|
+
maxErrorRateIncrease?: number;
|
|
82
|
+
}
|
|
83
|
+
export interface TrajectoryComparison {
|
|
84
|
+
/** Unordered tool-set Jaccard [0..1]. */
|
|
85
|
+
toolJaccard: number;
|
|
86
|
+
/** Ordered tool-sequence similarity [0..1]. */
|
|
87
|
+
sequenceSimilarity: number;
|
|
88
|
+
/** candidate.turnCount / max(1, baseline.turnCount). */
|
|
89
|
+
turnRatio: number;
|
|
90
|
+
/** candidate error-rate minus baseline error-rate. */
|
|
91
|
+
errorRateDelta: number;
|
|
92
|
+
/** True if any threshold tripped. */
|
|
93
|
+
drifted: boolean;
|
|
94
|
+
/** Human-readable list of the dimensions that tripped (empty when stable). */
|
|
95
|
+
reasons: string[];
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Compare one candidate trajectory against a baseline across all four
|
|
99
|
+
* dimensions. Pure. Missing thresholds fall back to {@link DEFAULT_THRESHOLDS}.
|
|
100
|
+
*/
|
|
101
|
+
export declare function compareTrajectory(candidate: ExecutionTrace, baseline: ExecutionTrace, thresholds?: CanaryThresholds): TrajectoryComparison;
|
|
102
|
+
export interface CanaryOptions {
|
|
103
|
+
thresholds?: CanaryThresholds;
|
|
104
|
+
/**
|
|
105
|
+
* How many drifted runs in the candidate set trigger an alert. Default 2 —
|
|
106
|
+
* a single failing run is noise; drift is a pattern.
|
|
107
|
+
*/
|
|
108
|
+
minDriftedToAlert?: number;
|
|
109
|
+
}
|
|
110
|
+
export interface CanaryResult {
|
|
111
|
+
/** Number of candidate runs evaluated against the baseline. */
|
|
112
|
+
total: number;
|
|
113
|
+
/** How many candidates drifted on at least one dimension. */
|
|
114
|
+
driftedCount: number;
|
|
115
|
+
/** True when driftedCount >= minDriftedToAlert. */
|
|
116
|
+
alert: boolean;
|
|
117
|
+
/** Median tool-set Jaccard across candidates. */
|
|
118
|
+
medianToolJaccard: number;
|
|
119
|
+
/** Median turn ratio across candidates. */
|
|
120
|
+
medianTurnRatio: number;
|
|
121
|
+
/** Per-candidate comparisons, input order preserved. */
|
|
122
|
+
comparisons: TrajectoryComparison[];
|
|
123
|
+
/** De-duplicated union of every trip reason across drifted candidates. */
|
|
124
|
+
reasons: string[];
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Evaluate a set of candidate trajectories against one baseline. Pure.
|
|
128
|
+
* An empty candidate set yields `total: 0`, `alert: false`.
|
|
129
|
+
*/
|
|
130
|
+
export declare function evaluateCanary(candidates: ExecutionTrace[], baseline: ExecutionTrace, opts?: CanaryOptions): CanaryResult;
|
|
131
|
+
export type CanaryStatus = 'ok' | 'drift' | 'insufficient-data' | 'no-trajectory';
|
|
132
|
+
export interface CanaryReport {
|
|
133
|
+
agentName: string;
|
|
134
|
+
/** The prompt version the canary baselined against (the active one), or null. */
|
|
135
|
+
promptVersion: string | null;
|
|
136
|
+
/** Experiment id used as the frozen baseline, or null. */
|
|
137
|
+
baselineId: string | null;
|
|
138
|
+
/** Candidate runs evaluated (excludes the baseline). */
|
|
139
|
+
evaluated: number;
|
|
140
|
+
/** Detailed result, or null when there wasn't enough data to run. */
|
|
141
|
+
result: CanaryResult | null;
|
|
142
|
+
status: CanaryStatus;
|
|
143
|
+
/** One-line operator-facing summary. */
|
|
144
|
+
message: string;
|
|
145
|
+
}
|
|
146
|
+
export interface RunCanaryOptions extends CanaryOptions {
|
|
147
|
+
/**
|
|
148
|
+
* Minimum candidate runs (excluding the baseline) required before the canary
|
|
149
|
+
* produces a verdict. Below this it reports `insufficient-data`. Default 3.
|
|
150
|
+
*/
|
|
151
|
+
minCandidates?: number;
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Run a canary over an agent's stored experiments. Pure: takes the experiments
|
|
155
|
+
* and the active prompt version, returns a report. The caller supplies the data
|
|
156
|
+
* (e.g. `memory.loadExperiments` + `memory.getActivePrompt`).
|
|
157
|
+
*
|
|
158
|
+
* Baseline policy: among experiments carrying a trajectory for the ACTIVE prompt
|
|
159
|
+
* version, the earliest (by `startedAt`) is the frozen reference; every later
|
|
160
|
+
* same-version run is a candidate. Restricting to the active version is what
|
|
161
|
+
* prevents false alarms right after an intentional prompt evolution.
|
|
162
|
+
*/
|
|
163
|
+
export declare function runCanaryOverExperiments(agentName: string, experiments: DarwinExperiment[], activeVersion: string | null, opts?: RunCanaryOptions): CanaryReport;
|
|
164
|
+
//# sourceMappingURL=canary.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canary.d.ts","sourceRoot":"","sources":["../../../src/evolution/canary.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Validate-by-Reproduce drift-detection canary (Phase 2 A5).
|
|
3
|
+
*
|
|
4
|
+
* The A/B safety gate guards prompt *quality* — it catches a new prompt version
|
|
5
|
+
* that scores worse. But an agent can drift WITHOUT its quality score moving: a
|
|
6
|
+
* model update, an MCP tool breaking, or a prompt evolution's side-effect can
|
|
7
|
+
* change *how* the agent gets to the answer (different tools, more turns, more
|
|
8
|
+
* errors) while the final score stays flat. Vadim Nicolai's production write-up
|
|
9
|
+
* captures it: "the agent still sounds fluent, but the trajectory is longer and
|
|
10
|
+
* the tool-calls more repetitive."
|
|
11
|
+
*
|
|
12
|
+
* This module compares an agent's recent execution *trajectories* against a
|
|
13
|
+
* frozen baseline and flags behavioural drift. It is the read side of the
|
|
14
|
+
* trajectory capture shipped in A1 (`ExecutionTrace`).
|
|
15
|
+
*
|
|
16
|
+
* ── Method (grounded in 2026 agent-eval practice) ──
|
|
17
|
+
* Exact-hash equivalence is the wrong tool — LLM runs are non-deterministic, so
|
|
18
|
+
* an exact trajectory hash drifts every single run. Instead we use the same
|
|
19
|
+
* deterministic, tolerance-based metrics the field settled on (LangChain's
|
|
20
|
+
* `agentevals`, Vertex AI trajectory metrics, Galileo):
|
|
21
|
+
*
|
|
22
|
+
* 1. **Unordered tool-set Jaccard** — `|A∩B| / |A∪B|` over tool *names*.
|
|
23
|
+
* Catches new/missing tools regardless of order. Primary signal.
|
|
24
|
+
* 2. **Ordered tool-sequence similarity** — normalised Levenshtein over the
|
|
25
|
+
* tool-name sequence. Catches re-ordering / repetition.
|
|
26
|
+
* 3. **Turn-count ratio** — `candidate.turns / baseline.turns`. A ratio > 1.5
|
|
27
|
+
* is the canonical "agent is grinding" symptom.
|
|
28
|
+
* 4. **Error-rate delta** — error spikes are the most reliable tool-break tell.
|
|
29
|
+
*
|
|
30
|
+
* We deliberately do NOT compare tool *arguments* (LLM-variable → noise) or
|
|
31
|
+
* output length (verbosity swings without drift). We keep zero hard deps: these
|
|
32
|
+
* metrics are ~a dozen lines each, so `agentevals` stays an inspiration, not a
|
|
33
|
+
* dependency — Darwin's whole point is a pure, injectable core.
|
|
34
|
+
*
|
|
35
|
+
* ── Sampling ──
|
|
36
|
+
* A single failing run is noise, not drift. The canary needs a *pattern*:
|
|
37
|
+
* evaluate several same-version runs and alert only when ≥ N of them drift
|
|
38
|
+
* (default 2). Three candidate runs per week is the field's rule of thumb.
|
|
39
|
+
*
|
|
40
|
+
* ── Baseline staleness (the load-bearing footgun) ──
|
|
41
|
+
* A baseline is only meaningful against runs of the SAME prompt version. When a
|
|
42
|
+
* prompt evolves, the new version *should* behave differently — comparing it to
|
|
43
|
+
* the old baseline would fire a false alarm on every intentional improvement.
|
|
44
|
+
* `runCanaryOverExperiments` therefore baselines strictly within the active
|
|
45
|
+
* prompt version: after an evolution the canary reports `insufficient-data`
|
|
46
|
+
* (re-baseline in progress) rather than screaming drift.
|
|
47
|
+
*
|
|
48
|
+
* Everything here is pure and deterministic. Side-effects (loading experiments,
|
|
49
|
+
* printing, alerting) live in the CLI command and in private cron wiring.
|
|
50
|
+
*/
|
|
51
|
+
// ─── Trajectory signature extraction ───────────────────────
|
|
52
|
+
/** The ordered sequence of tool names exactly as they fired. */
|
|
53
|
+
export function toolSequence(trace) {
|
|
54
|
+
// `?? []` is defensive against trajectories deserialised from older DB rows:
|
|
55
|
+
// a NULL JSONB/TEXT column can yield null at runtime despite the non-optional
|
|
56
|
+
// type, and a drift check must degrade gracefully rather than throw.
|
|
57
|
+
return (trace.toolCalls ?? []).map((c) => c.tool);
|
|
58
|
+
}
|
|
59
|
+
/** The set of distinct tool names used (order-independent). */
|
|
60
|
+
export function toolSet(trace) {
|
|
61
|
+
return new Set(toolSequence(trace));
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Error rate of a run: (tool-call errors + turn-level errors) normalised by the
|
|
65
|
+
* turn count. Uses `max(1, turnCount)` so a zero-turn trace can't divide by zero.
|
|
66
|
+
*/
|
|
67
|
+
export function errorRate(trace) {
|
|
68
|
+
const toolErrors = (trace.toolCalls ?? []).filter((c) => c.outcome === 'error').length;
|
|
69
|
+
const turnErrors = (trace.errors ?? []).length;
|
|
70
|
+
return (toolErrors + turnErrors) / Math.max(1, trace.turnCount ?? 0);
|
|
71
|
+
}
|
|
72
|
+
// ─── Pure similarity metrics ────────────────────────────────
|
|
73
|
+
/**
|
|
74
|
+
* Jaccard similarity of two string sets: `|A∩B| / |A∪B|`.
|
|
75
|
+
* 1 = identical, 0 = disjoint. Two empty sets are defined as 1 (both used no
|
|
76
|
+
* tools → identical behaviour, not drift).
|
|
77
|
+
*/
|
|
78
|
+
export function jaccard(a, b) {
|
|
79
|
+
if (a.size === 0 && b.size === 0)
|
|
80
|
+
return 1;
|
|
81
|
+
let intersection = 0;
|
|
82
|
+
for (const x of a)
|
|
83
|
+
if (b.has(x))
|
|
84
|
+
intersection++;
|
|
85
|
+
const union = a.size + b.size - intersection;
|
|
86
|
+
return union === 0 ? 1 : intersection / union;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Normalised Levenshtein similarity over two token sequences:
|
|
90
|
+
* `1 - editDistance / max(len)`. 1 = identical order, 0 = fully different.
|
|
91
|
+
* Two empty sequences are defined as 1.
|
|
92
|
+
*/
|
|
93
|
+
export function sequenceSimilarity(a, b) {
|
|
94
|
+
const maxLen = Math.max(a.length, b.length);
|
|
95
|
+
if (maxLen === 0)
|
|
96
|
+
return 1;
|
|
97
|
+
return 1 - levenshtein(a, b) / maxLen;
|
|
98
|
+
}
|
|
99
|
+
/** Iterative Levenshtein edit distance over token arrays. O(n·m) time, O(min) space. */
|
|
100
|
+
function levenshtein(a, b) {
|
|
101
|
+
const m = a.length;
|
|
102
|
+
const n = b.length;
|
|
103
|
+
if (m === 0)
|
|
104
|
+
return n;
|
|
105
|
+
if (n === 0)
|
|
106
|
+
return m;
|
|
107
|
+
let prev = Array.from({ length: n + 1 }, (_, i) => i);
|
|
108
|
+
let curr = new Array(n + 1).fill(0);
|
|
109
|
+
for (let i = 1; i <= m; i++) {
|
|
110
|
+
curr[0] = i;
|
|
111
|
+
for (let j = 1; j <= n; j++) {
|
|
112
|
+
const cost = a[i - 1] === b[j - 1] ? 0 : 1;
|
|
113
|
+
curr[j] = Math.min(prev[j] + 1, // deletion
|
|
114
|
+
curr[j - 1] + 1, // insertion
|
|
115
|
+
prev[j - 1] + cost);
|
|
116
|
+
}
|
|
117
|
+
[prev, curr] = [curr, prev];
|
|
118
|
+
}
|
|
119
|
+
return prev[n];
|
|
120
|
+
}
|
|
121
|
+
const DEFAULT_THRESHOLDS = {
|
|
122
|
+
minToolJaccard: 0.7,
|
|
123
|
+
minSequenceSimilarity: 0.6,
|
|
124
|
+
maxTurnRatio: 1.5,
|
|
125
|
+
maxErrorRateIncrease: 0.2,
|
|
126
|
+
};
|
|
127
|
+
/**
|
|
128
|
+
* Compare one candidate trajectory against a baseline across all four
|
|
129
|
+
* dimensions. Pure. Missing thresholds fall back to {@link DEFAULT_THRESHOLDS}.
|
|
130
|
+
*/
|
|
131
|
+
export function compareTrajectory(candidate, baseline, thresholds = {}) {
|
|
132
|
+
const t = { ...DEFAULT_THRESHOLDS, ...thresholds };
|
|
133
|
+
const toolJaccard = jaccard(toolSet(candidate), toolSet(baseline));
|
|
134
|
+
const seqSim = sequenceSimilarity(toolSequence(candidate), toolSequence(baseline));
|
|
135
|
+
const baseTurns = Math.max(1, baseline.turnCount ?? 0);
|
|
136
|
+
const turnRatio = (candidate.turnCount ?? 0) / baseTurns;
|
|
137
|
+
const errorRateDelta = errorRate(candidate) - errorRate(baseline);
|
|
138
|
+
const reasons = [];
|
|
139
|
+
if (toolJaccard < t.minToolJaccard) {
|
|
140
|
+
reasons.push(`tool-set drift (Jaccard ${fmt(toolJaccard)} < ${t.minToolJaccard})`);
|
|
141
|
+
}
|
|
142
|
+
if (seqSim < t.minSequenceSimilarity) {
|
|
143
|
+
reasons.push(`tool-order drift (similarity ${fmt(seqSim)} < ${t.minSequenceSimilarity})`);
|
|
144
|
+
}
|
|
145
|
+
if (turnRatio > t.maxTurnRatio) {
|
|
146
|
+
reasons.push(`turn inflation (ratio ${fmt(turnRatio)} > ${t.maxTurnRatio})`);
|
|
147
|
+
}
|
|
148
|
+
if (errorRateDelta > t.maxErrorRateIncrease) {
|
|
149
|
+
reasons.push(`error-rate spike (+${fmt(errorRateDelta)} > ${t.maxErrorRateIncrease})`);
|
|
150
|
+
}
|
|
151
|
+
return {
|
|
152
|
+
toolJaccard,
|
|
153
|
+
sequenceSimilarity: seqSim,
|
|
154
|
+
turnRatio,
|
|
155
|
+
errorRateDelta,
|
|
156
|
+
drifted: reasons.length > 0,
|
|
157
|
+
reasons,
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Evaluate a set of candidate trajectories against one baseline. Pure.
|
|
162
|
+
* An empty candidate set yields `total: 0`, `alert: false`.
|
|
163
|
+
*/
|
|
164
|
+
export function evaluateCanary(candidates, baseline, opts = {}) {
|
|
165
|
+
const minDriftedToAlert = clampPositiveInt(opts.minDriftedToAlert, 2);
|
|
166
|
+
const comparisons = candidates.map((c) => compareTrajectory(c, baseline, opts.thresholds));
|
|
167
|
+
const driftedCount = comparisons.filter((c) => c.drifted).length;
|
|
168
|
+
const reasons = Array.from(new Set(comparisons.filter((c) => c.drifted).flatMap((c) => c.reasons)));
|
|
169
|
+
return {
|
|
170
|
+
total: comparisons.length,
|
|
171
|
+
driftedCount,
|
|
172
|
+
alert: driftedCount >= minDriftedToAlert,
|
|
173
|
+
medianToolJaccard: median(comparisons.map((c) => c.toolJaccard)),
|
|
174
|
+
medianTurnRatio: median(comparisons.map((c) => c.turnRatio)),
|
|
175
|
+
comparisons,
|
|
176
|
+
reasons,
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Run a canary over an agent's stored experiments. Pure: takes the experiments
|
|
181
|
+
* and the active prompt version, returns a report. The caller supplies the data
|
|
182
|
+
* (e.g. `memory.loadExperiments` + `memory.getActivePrompt`).
|
|
183
|
+
*
|
|
184
|
+
* Baseline policy: among experiments carrying a trajectory for the ACTIVE prompt
|
|
185
|
+
* version, the earliest (by `startedAt`) is the frozen reference; every later
|
|
186
|
+
* same-version run is a candidate. Restricting to the active version is what
|
|
187
|
+
* prevents false alarms right after an intentional prompt evolution.
|
|
188
|
+
*/
|
|
189
|
+
export function runCanaryOverExperiments(agentName, experiments, activeVersion, opts = {}) {
|
|
190
|
+
const minCandidates = clampPositiveInt(opts.minCandidates, 3);
|
|
191
|
+
// Only v1 trajectories are comparable. The ExecutionTrace forward-compat
|
|
192
|
+
// contract (types.ts) requires consumers to skip unknown schema versions
|
|
193
|
+
// rather than mis-score them, so a future v2 trace is treated as not-capturable.
|
|
194
|
+
const withTrace = experiments.filter((e) => e.trajectory != null && e.trajectory.version === 1);
|
|
195
|
+
if (withTrace.length === 0) {
|
|
196
|
+
return report(agentName, activeVersion, null, 0, null, 'no-trajectory', 'No comparable (v1) trajectories captured yet — enable trace capture to run the canary.');
|
|
197
|
+
}
|
|
198
|
+
if (!activeVersion) {
|
|
199
|
+
return report(agentName, activeVersion, null, 0, null, 'insufficient-data', 'No active prompt version resolved for this agent.');
|
|
200
|
+
}
|
|
201
|
+
// Baseline strictly within the active version (staleness guard).
|
|
202
|
+
const sameVersion = withTrace
|
|
203
|
+
.filter((e) => e.promptVersion === activeVersion)
|
|
204
|
+
// Lexicographic order on ISO-8601 strings == chronological, without
|
|
205
|
+
// locale-dependent collation surprises (assumes consistent UTC timestamps).
|
|
206
|
+
.sort((a, b) => (a.startedAt < b.startedAt ? -1 : a.startedAt > b.startedAt ? 1 : 0));
|
|
207
|
+
if (sameVersion.length === 0) {
|
|
208
|
+
return report(agentName, activeVersion, null, 0, null, 'insufficient-data', `Active version ${activeVersion} has no trajectories yet (${withTrace.length} on older versions) — re-baseline in progress.`);
|
|
209
|
+
}
|
|
210
|
+
const [baseline, ...candidates] = sameVersion;
|
|
211
|
+
if (candidates.length < minCandidates) {
|
|
212
|
+
return report(agentName, activeVersion, baseline.id, candidates.length, null, 'insufficient-data', `Only ${candidates.length} candidate run(s) on ${activeVersion}; need ${minCandidates} for a verdict.`);
|
|
213
|
+
}
|
|
214
|
+
const result = evaluateCanary(candidates.map((c) => c.trajectory), baseline.trajectory, opts);
|
|
215
|
+
const status = result.alert ? 'drift' : 'ok';
|
|
216
|
+
const message = result.alert
|
|
217
|
+
? `Behavioural drift on ${agentName}/${activeVersion}: ${result.driftedCount}/${result.total} runs drifted — ${result.reasons.join('; ')}`
|
|
218
|
+
: `Stable: ${result.total} runs on ${activeVersion}, ${result.driftedCount} drifted (median tool-Jaccard ${fmt(result.medianToolJaccard)}).`;
|
|
219
|
+
return report(agentName, activeVersion, baseline.id, candidates.length, result, status, message);
|
|
220
|
+
}
|
|
221
|
+
// ─── Small pure helpers ─────────────────────────────────────
|
|
222
|
+
function report(agentName, promptVersion, baselineId, evaluated, result, status, message) {
|
|
223
|
+
return { agentName, promptVersion, baselineId, evaluated, result, status, message };
|
|
224
|
+
}
|
|
225
|
+
/** Median of a numeric array. Empty array → 0. Does not mutate the input. */
|
|
226
|
+
function median(values) {
|
|
227
|
+
if (values.length === 0)
|
|
228
|
+
return 0;
|
|
229
|
+
const sorted = [...values].sort((a, b) => a - b);
|
|
230
|
+
const mid = Math.floor(sorted.length / 2);
|
|
231
|
+
return sorted.length % 2 === 0 ? (sorted[mid - 1] + sorted[mid]) / 2 : sorted[mid];
|
|
232
|
+
}
|
|
233
|
+
/** Coerce to a positive integer, falling back to `fallback` for NaN/≤0/non-finite. */
|
|
234
|
+
function clampPositiveInt(value, fallback) {
|
|
235
|
+
if (typeof value !== 'number' || !Number.isFinite(value))
|
|
236
|
+
return fallback;
|
|
237
|
+
const n = Math.floor(value);
|
|
238
|
+
return n > 0 ? n : fallback;
|
|
239
|
+
}
|
|
240
|
+
/** Format a ratio/score to 2 dp for messages. */
|
|
241
|
+
function fmt(n) {
|
|
242
|
+
return n.toFixed(2);
|
|
243
|
+
}
|
|
244
|
+
//# sourceMappingURL=canary.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canary.js","sourceRoot":"","sources":["../../../src/evolution/canary.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cross-family critic diversity check.
|
|
3
|
+
*
|
|
4
|
+
* LLM-as-judge bias is materially reduced when the critics that score an
|
|
5
|
+
* agent's output come from more than one model *family* (e.g. GPT + Claude):
|
|
6
|
+
* different training pipelines carry different blind spots, so a disagreement
|
|
7
|
+
* between families is a stronger quality signal than agreement within one.
|
|
8
|
+
*
|
|
9
|
+
* Darwin's `resolveCriticProviders` already spreads critics across families
|
|
10
|
+
* WHEN the provider keys are present — but when only one provider is
|
|
11
|
+
* configured, all three critics silently collapse onto a single family and the
|
|
12
|
+
* diversity guarantee is gone with no signal to the operator. This module makes
|
|
13
|
+
* that observable (warn by default) and enforceable (opt-in, env-gated).
|
|
14
|
+
*
|
|
15
|
+
* Important nuance: `claude-cli` and `anthropic-api` are the SAME family (both
|
|
16
|
+
* Anthropic); they differ only in latency. Real family diversity needs a
|
|
17
|
+
* non-Anthropic provider key (OpenAI, Ollama, …). The check therefore keys on
|
|
18
|
+
* the model *family*, never on the provider label.
|
|
19
|
+
*/
|
|
20
|
+
/** Minimal shape needed from a resolved critic provider entry. */
|
|
21
|
+
export interface CriticFamilyInfo {
|
|
22
|
+
/** Model family — e.g. 'anthropic', 'openai', 'ollama'. */
|
|
23
|
+
family: string;
|
|
24
|
+
}
|
|
25
|
+
export interface CrossFamilyCheck {
|
|
26
|
+
/** Distinct, non-empty families across all critics, sorted alphabetically. */
|
|
27
|
+
families: string[];
|
|
28
|
+
/** Number of distinct families. */
|
|
29
|
+
count: number;
|
|
30
|
+
/**
|
|
31
|
+
* True when every critic shares a single family (judge bias unmitigated).
|
|
32
|
+
* A degenerate empty critic map is also reported as single-family — it is
|
|
33
|
+
* not a diversity win.
|
|
34
|
+
*/
|
|
35
|
+
singleFamily: boolean;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Count the distinct model families across a resolved critic-provider map.
|
|
39
|
+
* Pure and deterministic. Blank / non-string families are ignored so a
|
|
40
|
+
* mis-populated entry can never inflate the diversity count.
|
|
41
|
+
*/
|
|
42
|
+
export declare function checkCriticFamilies(providers: Record<string, CriticFamilyInfo>): CrossFamilyCheck;
|
|
43
|
+
/**
|
|
44
|
+
* Whether cross-family critics are *required* (hard fail) rather than merely
|
|
45
|
+
* recommended (warn). Gated by `DARWIN_REQUIRE_CROSS_FAMILY` so CI can enforce
|
|
46
|
+
* it without changing the default developer experience.
|
|
47
|
+
*/
|
|
48
|
+
export declare function crossFamilyRequired(env?: NodeJS.ProcessEnv): boolean;
|
|
49
|
+
/** Operator-facing message when the critics collapse onto one family. */
|
|
50
|
+
export declare function singleFamilyHint(check: CrossFamilyCheck): string;
|
|
51
|
+
//# sourceMappingURL=critic-families.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"critic-families.d.ts","sourceRoot":"","sources":["../../../src/evolution/critic-families.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,kEAAkE;AAClE,MAAM,WAAW,gBAAgB;IAC/B,2DAA2D;IAC3D,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,gBAAgB;IAC/B,8EAA8E;IAC9E,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,mCAAmC;IACnC,KAAK,EAAE,MAAM,CAAC;IACd;;;;OAIG;IACH,YAAY,EAAE,OAAO,CAAC;CACvB;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CACjC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,GAC1C,gBAAgB,CAclB;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,OAAO,CAGjF;AAED,yEAAyE;AACzE,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,gBAAgB,GAAG,MAAM,CAOhE"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cross-family critic diversity check.
|
|
3
|
+
*
|
|
4
|
+
* LLM-as-judge bias is materially reduced when the critics that score an
|
|
5
|
+
* agent's output come from more than one model *family* (e.g. GPT + Claude):
|
|
6
|
+
* different training pipelines carry different blind spots, so a disagreement
|
|
7
|
+
* between families is a stronger quality signal than agreement within one.
|
|
8
|
+
*
|
|
9
|
+
* Darwin's `resolveCriticProviders` already spreads critics across families
|
|
10
|
+
* WHEN the provider keys are present — but when only one provider is
|
|
11
|
+
* configured, all three critics silently collapse onto a single family and the
|
|
12
|
+
* diversity guarantee is gone with no signal to the operator. This module makes
|
|
13
|
+
* that observable (warn by default) and enforceable (opt-in, env-gated).
|
|
14
|
+
*
|
|
15
|
+
* Important nuance: `claude-cli` and `anthropic-api` are the SAME family (both
|
|
16
|
+
* Anthropic); they differ only in latency. Real family diversity needs a
|
|
17
|
+
* non-Anthropic provider key (OpenAI, Ollama, …). The check therefore keys on
|
|
18
|
+
* the model *family*, never on the provider label.
|
|
19
|
+
*/
|
|
20
|
+
/**
|
|
21
|
+
* Count the distinct model families across a resolved critic-provider map.
|
|
22
|
+
* Pure and deterministic. Blank / non-string families are ignored so a
|
|
23
|
+
* mis-populated entry can never inflate the diversity count.
|
|
24
|
+
*/
|
|
25
|
+
export function checkCriticFamilies(providers) {
|
|
26
|
+
const families = Array.from(new Set(Object.values(providers)
|
|
27
|
+
.map((p) => (typeof p?.family === 'string' ? p.family.trim().toLowerCase() : ''))
|
|
28
|
+
.filter((f) => f.length > 0))).sort();
|
|
29
|
+
return {
|
|
30
|
+
families,
|
|
31
|
+
count: families.length,
|
|
32
|
+
singleFamily: families.length < 2,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Whether cross-family critics are *required* (hard fail) rather than merely
|
|
37
|
+
* recommended (warn). Gated by `DARWIN_REQUIRE_CROSS_FAMILY` so CI can enforce
|
|
38
|
+
* it without changing the default developer experience.
|
|
39
|
+
*/
|
|
40
|
+
export function crossFamilyRequired(env = process.env) {
|
|
41
|
+
const v = env.DARWIN_REQUIRE_CROSS_FAMILY;
|
|
42
|
+
return v === '1' || v === 'true' || v === 'yes';
|
|
43
|
+
}
|
|
44
|
+
/** Operator-facing message when the critics collapse onto one family. */
|
|
45
|
+
export function singleFamilyHint(check) {
|
|
46
|
+
const fam = check.families[0] ?? 'unknown';
|
|
47
|
+
return (`All critics run on one model family (${fam}). ` +
|
|
48
|
+
`Cross-family critique reduces LLM-as-judge bias — set OPENAI_API_KEY ` +
|
|
49
|
+
`(or another non-Anthropic provider key) so a second family scores in parallel.`);
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=critic-families.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"critic-families.js","sourceRoot":"","sources":["../../../src/evolution/critic-families.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAqBH;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CACjC,SAA2C;IAE3C,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CACzB,IAAI,GAAG,CACL,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC;SACrB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;SAChF,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAC/B,CACF,CAAC,IAAI,EAAE,CAAC;IAET,OAAO;QACL,QAAQ;QACR,KAAK,EAAE,QAAQ,CAAC,MAAM;QACtB,YAAY,EAAE,QAAQ,CAAC,MAAM,GAAG,CAAC;KAClC,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CAAC,MAAyB,OAAO,CAAC,GAAG;IACtE,MAAM,CAAC,GAAG,GAAG,CAAC,2BAA2B,CAAC;IAC1C,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,MAAM,IAAI,CAAC,KAAK,KAAK,CAAC;AAClD,CAAC;AAED,yEAAyE;AACzE,MAAM,UAAU,gBAAgB,CAAC,KAAuB;IACtD,MAAM,GAAG,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC;IAC3C,OAAO,CACL,wCAAwC,GAAG,KAAK;QAChD,uEAAuE;QACvE,gFAAgF,CACjF,CAAC;AACJ,CAAC"}
|
package/dist/src/index.d.ts
CHANGED
|
@@ -39,4 +39,5 @@ export { checkAlignmentPreservation, checkAlignmentPreservationSemantic, SAFETY_
|
|
|
39
39
|
export { parseCriticScore, type ParsedCriticScore } from './evolution/parse-score.js';
|
|
40
40
|
export { runMultiCritic, stripMarkdownForJudging, getCriticPrompts, type RunCriticFn, type RunMultiCriticOptions, type CriticPromptDef, type CriticScore, type MultiCriticResult, } from './evolution/multi-critic.js';
|
|
41
41
|
export { meanVar, msprtTwoSample, hoeffdingTwoSample, type ConfidenceMethod, type SequentialVerdict, type MeanVar, type MsprtOptions, type HoeffdingOptions, } from './evolution/sequential.js';
|
|
42
|
+
export { toolSequence, toolSet, jaccard, sequenceSimilarity, errorRate, compareTrajectory, evaluateCanary, runCanaryOverExperiments, type CanaryThresholds, type TrajectoryComparison, type CanaryOptions, type CanaryResult, type CanaryStatus, type CanaryReport, type RunCanaryOptions, } from './evolution/canary.js';
|
|
42
43
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/src/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/src/index.js
CHANGED
|
@@ -55,4 +55,10 @@ export { runMultiCritic, stripMarkdownForJudging, getCriticPrompts, } from './ev
|
|
|
55
55
|
// exported so consumers can run the same statistically-rigorous comparison
|
|
56
56
|
// on their own score arrays.
|
|
57
57
|
export { meanVar, msprtTwoSample, hoeffdingTwoSample, } from './evolution/sequential.js';
|
|
58
|
+
// V0.9.0 — Validate-by-Reproduce drift-detection canary (S1376 Phase 2 A5).
|
|
59
|
+
// Pure, tolerance-based trajectory comparison (unordered tool-set Jaccard +
|
|
60
|
+
// ordered sequence similarity + turn-ratio + error-rate). Catches behavioural
|
|
61
|
+
// drift the A/B quality gate misses. Exported so consumers can run the same
|
|
62
|
+
// drift check on their own captured trajectories.
|
|
63
|
+
export { toolSequence, toolSet, jaccard, sequenceSimilarity, errorRate, compareTrajectory, evaluateCanary, runCanaryOverExperiments, } from './evolution/canary.js';
|
|
58
64
|
//# sourceMappingURL=index.js.map
|
package/dist/src/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,WAAW;AACX,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACxF,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAE5C,8DAA8D;AAC9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AA4B7D,YAAY;AACZ,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAE7D,kBAAkB;AAClB,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEvF,YAAY;AACZ,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAE9D,SAAS;AACT,OAAO,EAAE,YAAY,EAAE,oBAAoB,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAE/F,gBAAgB;AAChB,OAAO,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AAGtE,sEAAsE;AACtE,mGAAmG;AACnG,OAAO,EACL,SAAS,EACT,gBAAgB,EAChB,iBAAiB,EACjB,YAAY,EACZ,SAAS,EACT,gBAAgB,EAChB,gBAAgB,EAChB,eAAe,EACf,gBAAgB,EAChB,gBAAgB,EAChB,yBAAyB,GAK1B,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,SAAS,GAGV,MAAM,0BAA0B,CAAC;AAElC,OAAO,EACL,aAAa,EACb,sBAAsB,GAMvB,MAAM,+BAA+B,CAAC;AAEvC,uEAAuE;AACvE,2EAA2E;AAC3E,4EAA4E;AAC5E,mBAAmB;AACnB,OAAO,EACL,0BAA0B,EAC1B,kCAAkC,EAClC,eAAe,GAGhB,MAAM,0BAA0B,CAAC;AAElC,yEAAyE;AACzE,yEAAyE;AACzE,8EAA8E;AAC9E,OAAO,EAAE,gBAAgB,EAA0B,MAAM,4BAA4B,CAAC;AAEtF,gFAAgF;AAChF,OAAO,EACL,cAAc,EACd,uBAAuB,EACvB,gBAAgB,GAMjB,MAAM,6BAA6B,CAAC;AAErC,yEAAyE;AACzE,yEAAyE;AACzE,2EAA2E;AAC3E,6BAA6B;AAC7B,OAAO,EACL,OAAO,EACP,cAAc,EACd,kBAAkB,GAMnB,MAAM,2BAA2B,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,WAAW;AACX,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACxF,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAE5C,8DAA8D;AAC9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AA4B7D,YAAY;AACZ,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAE7D,kBAAkB;AAClB,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEvF,YAAY;AACZ,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAE9D,SAAS;AACT,OAAO,EAAE,YAAY,EAAE,oBAAoB,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAE/F,gBAAgB;AAChB,OAAO,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AAGtE,sEAAsE;AACtE,mGAAmG;AACnG,OAAO,EACL,SAAS,EACT,gBAAgB,EAChB,iBAAiB,EACjB,YAAY,EACZ,SAAS,EACT,gBAAgB,EAChB,gBAAgB,EAChB,eAAe,EACf,gBAAgB,EAChB,gBAAgB,EAChB,yBAAyB,GAK1B,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,SAAS,GAGV,MAAM,0BAA0B,CAAC;AAElC,OAAO,EACL,aAAa,EACb,sBAAsB,GAMvB,MAAM,+BAA+B,CAAC;AAEvC,uEAAuE;AACvE,2EAA2E;AAC3E,4EAA4E;AAC5E,mBAAmB;AACnB,OAAO,EACL,0BAA0B,EAC1B,kCAAkC,EAClC,eAAe,GAGhB,MAAM,0BAA0B,CAAC;AAElC,yEAAyE;AACzE,yEAAyE;AACzE,8EAA8E;AAC9E,OAAO,EAAE,gBAAgB,EAA0B,MAAM,4BAA4B,CAAC;AAEtF,gFAAgF;AAChF,OAAO,EACL,cAAc,EACd,uBAAuB,EACvB,gBAAgB,GAMjB,MAAM,6BAA6B,CAAC;AAErC,yEAAyE;AACzE,yEAAyE;AACzE,2EAA2E;AAC3E,6BAA6B;AAC7B,OAAO,EACL,OAAO,EACP,cAAc,EACd,kBAAkB,GAMnB,MAAM,2BAA2B,CAAC;AAEnC,4EAA4E;AAC5E,4EAA4E;AAC5E,8EAA8E;AAC9E,4EAA4E;AAC5E,kDAAkD;AAClD,OAAO,EACL,YAAY,EACZ,OAAO,EACP,OAAO,EACP,kBAAkB,EAClB,SAAS,EACT,iBAAiB,EACjB,cAAc,EACd,wBAAwB,GAQzB,MAAM,uBAAuB,CAAC"}
|
package/package.json
CHANGED