@tangle-network/agent-eval 1.0.3 → 1.0.5
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 +20 -0
- package/dist/analyst/index.js +5 -5
- package/dist/{benchmark-command-BeDZB3BQ.js → benchmark-command-C3mZhNh7.js} +5 -5
- package/dist/{benchmark-command-BeDZB3BQ.js.map → benchmark-command-C3mZhNh7.js.map} +1 -1
- package/dist/benchmarks/index.js +3 -3
- package/dist/builder-eval/index.d.ts +1 -1
- package/dist/builder-eval/index.js +1 -1
- package/dist/campaign/index.d.ts +2 -2
- package/dist/campaign/index.js +5 -5
- package/dist/{campaign-DKZiYHUq.js → campaign-VKtf8HRr.js} +5 -5
- package/dist/{campaign-DKZiYHUq.js.map → campaign-VKtf8HRr.js.map} +1 -1
- package/dist/cli.js +1 -1
- package/dist/contract/index.js +4 -4
- package/dist/{define-agent-eval-BVhGn7VV.js → define-agent-eval-gXgVUX1h.js} +3 -3
- package/dist/{define-agent-eval-BVhGn7VV.js.map → define-agent-eval-gXgVUX1h.js.map} +1 -1
- package/dist/{dspy-rlm-engine-C0zR2xiM.js → dspy-rlm-engine-Xt3znknf.js} +2 -2
- package/dist/{dspy-rlm-engine-C0zR2xiM.js.map → dspy-rlm-engine-Xt3znknf.js.map} +1 -1
- package/dist/{external-optimizer-process-DKgrrX0J.js → external-optimizer-process-BgitfZ-Q.js} +2 -2
- package/dist/{external-optimizer-process-DKgrrX0J.js.map → external-optimizer-process-BgitfZ-Q.js.map} +1 -1
- package/dist/{external-optimizer-subprocess-wzMaA0oN.js → external-optimizer-subprocess-CeHuAaMJ.js} +8 -17
- package/dist/{external-optimizer-subprocess-wzMaA0oN.js.map → external-optimizer-subprocess-CeHuAaMJ.js.map} +1 -1
- package/dist/{findings-store-DNSvmy8U.js → findings-store-Bp-0Guuv.js} +2 -2
- package/dist/{findings-store-DNSvmy8U.js.map → findings-store-Bp-0Guuv.js.map} +1 -1
- package/dist/index.d.ts +2 -14
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -4
- package/dist/{llm-judge-BYBLxREr.js → llm-judge-CyDyqb6V.js} +5 -6
- package/dist/{llm-judge-BYBLxREr.js.map → llm-judge-CyDyqb6V.js.map} +1 -1
- package/dist/openapi.json +1 -1
- package/dist/{proposal-findings-duV5flPv.js → proposal-findings-BclX0PFh.js} +2 -2
- package/dist/{proposal-findings-duV5flPv.js.map → proposal-findings-BclX0PFh.js.map} +1 -1
- package/dist/{sandbox-harness--VUvMji7.d.ts → sandbox-harness-BS6c6UZV.d.ts} +20 -9
- package/dist/sandbox-harness-BS6c6UZV.d.ts.map +1 -0
- package/dist/{sandbox-harness-BuacGaVn.js → sandbox-harness-BzAUasgY.js} +37 -20
- package/dist/sandbox-harness-BzAUasgY.js.map +1 -0
- package/dist/{skillopt-optimization-method-DmfZz-2d.js → skillopt-optimization-method-O35aMdxU.js} +4 -4
- package/dist/{skillopt-optimization-method-DmfZz-2d.js.map → skillopt-optimization-method-O35aMdxU.js.map} +1 -1
- package/dist/wire/index.d.ts +4 -4
- package/docs/concepts.md +8 -0
- package/package.json +1 -1
- package/dist/sandbox-harness--VUvMji7.d.ts.map +0 -1
- package/dist/sandbox-harness-BuacGaVn.js.map +0 -1
package/dist/openapi.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"openapi": "3.1.0",
|
|
3
3
|
"info": {
|
|
4
4
|
"title": "@tangle-network/agent-eval — wire protocol",
|
|
5
|
-
"version": "1.0.
|
|
5
|
+
"version": "1.0.5",
|
|
6
6
|
"description": "HTTP and stdio RPC interface to agent-eval. The TypeScript runtime is the source of truth; this spec is the contract that cross-language clients (Python, Rust, Go) generate from.\n\nWire-protocol version: 1.1.0. Bumps on breaking changes to request/response schemas.",
|
|
7
7
|
"contact": {
|
|
8
8
|
"name": "Tangle Network",
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { S as ProposalFindingSchema } from "./external-optimizer-subprocess-
|
|
1
|
+
import { S as ProposalFindingSchema } from "./external-optimizer-subprocess-CeHuAaMJ.js";
|
|
2
2
|
// src/analyst/proposal-findings.ts
|
|
3
3
|
/** True when a finding names a source candidate generation may learn from. */
|
|
4
4
|
function isProposalFinding(finding) {
|
|
@@ -22,4 +22,4 @@ function findingLabel(finding, index) {
|
|
|
22
22
|
}
|
|
23
23
|
export { assertProposalFindings as t };
|
|
24
24
|
|
|
25
|
-
//# sourceMappingURL=proposal-findings-
|
|
25
|
+
//# sourceMappingURL=proposal-findings-BclX0PFh.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"proposal-findings-
|
|
1
|
+
{"version":3,"file":"proposal-findings-BclX0PFh.js","names":[],"sources":["../src/analyst/proposal-findings.ts"],"sourcesContent":["import { ProposalFindingSchema } from './finding-scope'\nimport type { ProposalFinding } from './types'\n\n/** True when a finding names a source candidate generation may learn from. */\nfunction isProposalFinding(finding: unknown): finding is ProposalFinding {\n return ProposalFindingSchema.safeParse(finding).success\n}\n\n/**\n * Reject findings whose source has not been explicitly admitted for candidate\n * generation. Search feedback and observed production behavior are allowed;\n * final evaluation data has no allowed origin.\n */\nexport function assertProposalFindings(\n findings: unknown,\n context = 'proposal findings',\n): ReadonlyArray<ProposalFinding> {\n if (!Array.isArray(findings)) {\n throw new TypeError(`${context}: expected an array`)\n }\n const rejected = findings.flatMap((finding, index) =>\n isProposalFinding(finding) ? [] : [findingLabel(finding, index)],\n )\n if (rejected.length > 0) {\n throw new Error(\n `${context}: every finding must match AnalystFinding and declare ` +\n `proposal_origin as search or production. ` +\n `Rejected findings: [${rejected.join(', ')}].`,\n )\n }\n return findings as ReadonlyArray<ProposalFinding>\n}\n\nfunction findingLabel(finding: unknown, index: number): string {\n if (typeof finding !== 'object' || finding === null) return `index ${index}`\n const id = (finding as { finding_id?: unknown }).finding_id\n return typeof id === 'string' && id.length > 0 ? id : `index ${index}`\n}\n"],"mappings":";;;AAIA,SAAS,kBAAkB,SAA8C;CACvE,OAAO,sBAAsB,UAAU,OAAO,CAAC,CAAC;AAClD;;;;;;AAOA,SAAgB,uBACd,UACA,UAAU,qBACsB;CAChC,IAAI,CAAC,MAAM,QAAQ,QAAQ,GACzB,MAAM,IAAI,UAAU,GAAG,QAAQ,oBAAoB;CAErD,MAAM,WAAW,SAAS,SAAS,SAAS,UAC1C,kBAAkB,OAAO,IAAI,CAAC,IAAI,CAAC,aAAa,SAAS,KAAK,CAAC,CACjE;CACA,IAAI,SAAS,SAAS,GACpB,MAAM,IAAI,MACR,GAAG,QAAQ,qHAEc,SAAS,KAAK,IAAI,EAAE,GAC/C;CAEF,OAAO;AACT;AAEA,SAAS,aAAa,SAAkB,OAAuB;CAC7D,IAAI,OAAO,YAAY,YAAY,YAAY,MAAM,OAAO,SAAS;CACrE,MAAM,KAAM,QAAqC;CACjD,OAAO,OAAO,OAAO,YAAY,GAAG,SAAS,IAAI,KAAK,SAAS;AACjE"}
|
|
@@ -5,15 +5,12 @@ interface HarnessConfig {
|
|
|
5
5
|
runCommand?: string;
|
|
6
6
|
/** Test command (e.g. "pnpm test --run"). Drives the test count + pass count. */
|
|
7
7
|
testCommand?: string;
|
|
8
|
-
/** Absolute cwd for the subprocess driver. Ignored by docker driver. */
|
|
9
8
|
cwd?: string;
|
|
10
9
|
/** Max wall-clock per phase in ms. Default 10 minutes. */
|
|
11
10
|
timeoutMs?: number;
|
|
12
11
|
/** Captured stdout + stderr cap, default 16 MiB; excess is dropped. */
|
|
13
12
|
maxOutputBytes?: number;
|
|
14
|
-
/** Image for the docker driver. */
|
|
15
13
|
image?: string;
|
|
16
|
-
/** Extra env vars (validated; shell-escaped). */
|
|
17
14
|
env?: Record<string, string>;
|
|
18
15
|
/** Parser for the test output — maps stdout/stderr/exit code → pass count. */
|
|
19
16
|
testParser?: TestOutputParser;
|
|
@@ -60,6 +57,7 @@ interface HarnessAssertion {
|
|
|
60
57
|
message?: string;
|
|
61
58
|
soft?: boolean;
|
|
62
59
|
}
|
|
60
|
+
type HarnessExpectation = HarnessAssertion | readonly [name: string, passed: boolean, details?: Omit<HarnessAssertion, 'name' | 'status'>];
|
|
63
61
|
interface HarnessTiming {
|
|
64
62
|
name: string;
|
|
65
63
|
durationMs: number;
|
|
@@ -73,9 +71,20 @@ interface HarnessReport {
|
|
|
73
71
|
error?: string;
|
|
74
72
|
metadata?: Record<string, unknown>;
|
|
75
73
|
}
|
|
74
|
+
interface HarnessResource<T> {
|
|
75
|
+
name: string;
|
|
76
|
+
create(signal: AbortSignal): Promise<T>;
|
|
77
|
+
retire(resource: T): Promise<unknown>;
|
|
78
|
+
ready?: (resource: T, signal: AbortSignal) => Promise<unknown>;
|
|
79
|
+
onCreate?: (resource: T) => void;
|
|
80
|
+
}
|
|
76
81
|
interface HarnessScope {
|
|
77
82
|
signal: AbortSignal;
|
|
78
|
-
|
|
83
|
+
resource<T>(input: HarnessResource<T>): Promise<{
|
|
84
|
+
resource?: T;
|
|
85
|
+
timing: HarnessTiming;
|
|
86
|
+
}>;
|
|
87
|
+
check(...assertions: HarnessExpectation[]): void;
|
|
79
88
|
measure(name: string, run: () => Promise<unknown>): Promise<HarnessTiming>;
|
|
80
89
|
/** Register retirement immediately after allocation; cleanup ignores workload cancellation. */
|
|
81
90
|
defer(retire: () => Promise<unknown>): void;
|
|
@@ -86,13 +95,15 @@ interface HarnessScope {
|
|
|
86
95
|
}
|
|
87
96
|
interface HarnessScenario<T> {
|
|
88
97
|
setup(scope: HarnessScope): Promise<T>;
|
|
89
|
-
steps
|
|
98
|
+
steps?: ReadonlyArray<{
|
|
90
99
|
name: string;
|
|
100
|
+
/** Diagnostic measurements retain failures without gating the scenario. */
|
|
101
|
+
advisory?: boolean;
|
|
91
102
|
when?: (state: T) => boolean;
|
|
92
103
|
run(state: T, scope: HarnessScope): Promise<unknown>;
|
|
93
|
-
expect?: (state: T, timing: HarnessTiming) =>
|
|
104
|
+
expect?: (state: T, timing: HarnessTiming) => HarnessExpectation[];
|
|
94
105
|
}>;
|
|
95
|
-
expectations?: (state: T) =>
|
|
106
|
+
expectations?: (state: T) => HarnessExpectation[];
|
|
96
107
|
metadata?: (state: T) => Record<string, unknown>;
|
|
97
108
|
/** Includes setup and steps. Transports must honor scope.signal. */
|
|
98
109
|
budgetMs: number;
|
|
@@ -102,5 +113,5 @@ declare function runSandboxScenario<T>(spec: HarnessScenario<T>, options?: {
|
|
|
102
113
|
signal?: AbortSignal;
|
|
103
114
|
measure?: HarnessScope['measure'];
|
|
104
115
|
}): Promise<HarnessReport>;
|
|
105
|
-
export {
|
|
106
|
-
//# sourceMappingURL=sandbox-harness
|
|
116
|
+
export { HarnessScenario as a, SandboxDriver as c, HarnessReport as i, SandboxHarnessResult as l, HarnessConfig as n, HarnessScope as o, HarnessExpectation as r, HarnessTiming as s, HarnessAssertion as t, runSandboxScenario as u };
|
|
117
|
+
//# sourceMappingURL=sandbox-harness-BS6c6UZV.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sandbox-harness-BS6c6UZV.d.ts","names":[],"sources":["../src/sandbox-harness.ts"],"mappings":"A,UAMiB;;EAEf;;EAEA;;EAEA;EACA;;EAEA;;EAEA;EACA;EACA,MAAM;;EAEN,aAAa;;UAGE;EACf;EACA,MACE,gBACA,gBACA;IACG;IAAoB;;;UAGV;EACf;EACA;EACA;EACA;EACA;EACA;EACA;;EAEA;;EAEA;;UAGe;EACf;EACA,KACE,OAAO,wBACP,iBACA,QAAQ,gBACP,QAAQ;;UAiDI;EACf;EACA,QAAQ;EACR,MAAM;EACN,OAAO;EACP;;EAEA;;;UA4De;EACf;EACA;EACA;EACA;EACA;EACA;;KAEU,qBACR,6BACU,cAAc,iBAAiB,UAAU,KAAK;UAC3C;EACf;EACA;EACA;EACA;;UAEe;EACf;EACA,YAAY;EACZ,SAAS;EACT;EACA,WAAW;;UAEI,gBAAgB;EAC/B;EACA,OAAO,QAAQ,cAAc,QAAQ;EACrC,OAAO,UAAU,IAAI;EACrB,SAAS,UAAU,GAAG,QAAQ,gBAAgB;EAC9C,YAAY,UAAU;;UAEP;EACf,QAAQ;EACR,SAAS,GAAG,OAAO,gBAAgB,KAAK;IAAU,WAAW;IAAG,QAAQ;;EACxE,SAAS,YAAY;EACrB,QAAQ,cAAc,WAAW,mBAAmB,QAAQ;;EAE5D,MAAM,cAAc;EACpB,KAAK,GACH,YAAY,QAAQ,IACpB,QAAQ,OAAO,eACf;IAAU;IAAmB;MAC5B,QAAQ;;UAEI,gBAAgB;EAC/B,MAAM,OAAO,eAAe,QAAQ;EACpC,QAAQ;IACN;;IAEA;IACA,QAAQ,OAAO;IACf,IAAI,OAAO,GAAG,OAAO,eAAe;IACpC,UAAU,OAAO,GAAG,QAAQ,kBAAkB;;EAEhD,gBAAgB,OAAO,MAAM;EAC7B,YAAY,OAAO,MAAM;;EAEzB;;;iBAIoB,mBAAmB,GACvC,MAAM,gBAAgB,IACtB;EACE,SAAS;EACT,UAAU;IAEX,QAAQ"}
|
|
@@ -8,16 +8,15 @@ var SubprocessSandboxDriver = class {
|
|
|
8
8
|
this.options = options;
|
|
9
9
|
}
|
|
10
10
|
async exec(phase, command, config) {
|
|
11
|
-
const effectiveEnv = {
|
|
12
|
-
...process.env,
|
|
13
|
-
...this.options.env ?? {},
|
|
14
|
-
...config.env ?? {}
|
|
15
|
-
};
|
|
16
11
|
const result = await runBoundedProcess({
|
|
17
12
|
command,
|
|
18
13
|
shell: true,
|
|
19
14
|
cwd: config.cwd ?? this.options.cwd,
|
|
20
|
-
env:
|
|
15
|
+
env: {
|
|
16
|
+
...process.env,
|
|
17
|
+
...this.options.env,
|
|
18
|
+
...config.env
|
|
19
|
+
},
|
|
21
20
|
envMode: "replace",
|
|
22
21
|
timeoutMs: config.timeoutMs ?? 6e5,
|
|
23
22
|
maxOutputBytes: config.maxOutputBytes ?? 16777216
|
|
@@ -80,12 +79,10 @@ var SandboxHarness = class {
|
|
|
80
79
|
result.passed = !test || !test.killedByTimeout && test.exitCode === 0;
|
|
81
80
|
result.score = test?.testsTotal !== void 0 && test.testsTotal > 0 ? (test.testsPassed ?? 0) / test.testsTotal : result.passed ? 1 : 0;
|
|
82
81
|
await handle.end({
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
status: result.passed ? "ok" : "error"
|
|
88
|
-
} : {},
|
|
82
|
+
exitCode: test?.exitCode,
|
|
83
|
+
testsTotal: test?.testsTotal,
|
|
84
|
+
testsPassed: test?.testsPassed,
|
|
85
|
+
status: result.passed ? "ok" : "error",
|
|
89
86
|
wallMs: result.totalWallMs
|
|
90
87
|
});
|
|
91
88
|
} catch (err) {
|
|
@@ -104,15 +101,18 @@ async function runSandboxScenario(spec, options = {}) {
|
|
|
104
101
|
assertions: [],
|
|
105
102
|
timings: []
|
|
106
103
|
};
|
|
104
|
+
let measurementFailures = 0;
|
|
107
105
|
const retirements = [];
|
|
108
106
|
const scope = {
|
|
109
107
|
signal,
|
|
110
|
-
check
|
|
111
|
-
report.assertions.push(
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
108
|
+
check(...assertions) {
|
|
109
|
+
for (const value of assertions) report.assertions.push("status" in value ? value : {
|
|
110
|
+
...value[2],
|
|
111
|
+
name: value[0],
|
|
112
|
+
status: value[1] ? "pass" : "fail"
|
|
113
|
+
});
|
|
115
114
|
},
|
|
115
|
+
defer: (retire) => retirements.push(retire),
|
|
116
116
|
async measure(name, run) {
|
|
117
117
|
const start = performance.now();
|
|
118
118
|
let measured = {
|
|
@@ -135,9 +135,24 @@ async function runSandboxScenario(spec, options = {}) {
|
|
|
135
135
|
error: error instanceof Error ? error.message : String(error)
|
|
136
136
|
};
|
|
137
137
|
}
|
|
138
|
+
if (!measured.success) measurementFailures++;
|
|
138
139
|
report.timings.push(measured);
|
|
139
140
|
return measured;
|
|
140
141
|
},
|
|
142
|
+
async resource(input) {
|
|
143
|
+
let resource;
|
|
144
|
+
const timing = await scope.measure(input.name, async () => {
|
|
145
|
+
const owned = await input.create(signal);
|
|
146
|
+
resource = owned;
|
|
147
|
+
scope.defer(() => input.retire(owned));
|
|
148
|
+
input.onCreate?.(owned);
|
|
149
|
+
await input.ready?.(owned, signal);
|
|
150
|
+
});
|
|
151
|
+
return {
|
|
152
|
+
resource,
|
|
153
|
+
timing
|
|
154
|
+
};
|
|
155
|
+
},
|
|
141
156
|
async poll(read, ready, budget) {
|
|
142
157
|
if (!(budget.timeoutMs > 0 && budget.intervalMs > 0)) throw new Error("Polling timeout and interval must be positive");
|
|
143
158
|
const deadline = performance.now() + budget.timeoutMs;
|
|
@@ -152,10 +167,12 @@ async function runSandboxScenario(spec, options = {}) {
|
|
|
152
167
|
try {
|
|
153
168
|
signal.throwIfAborted();
|
|
154
169
|
const state = await spec.setup(scope);
|
|
155
|
-
for (const step of spec.steps) {
|
|
170
|
+
for (const step of spec.steps ?? []) {
|
|
156
171
|
signal.throwIfAborted();
|
|
157
172
|
if (step.when && !step.when(state)) continue;
|
|
173
|
+
const failuresBefore = measurementFailures;
|
|
158
174
|
const timing = await scope.measure(step.name, () => step.run(state, scope));
|
|
175
|
+
if (step.advisory) measurementFailures = failuresBefore;
|
|
159
176
|
scope.check(...step.expect?.(state, timing) ?? []);
|
|
160
177
|
}
|
|
161
178
|
signal.throwIfAborted();
|
|
@@ -173,9 +190,9 @@ async function runSandboxScenario(spec, options = {}) {
|
|
|
173
190
|
});
|
|
174
191
|
}
|
|
175
192
|
}
|
|
176
|
-
report.pass = !report.error &&
|
|
193
|
+
report.pass = !report.error && measurementFailures === 0 && report.assertions.every((a) => a.soft || a.status === "pass");
|
|
177
194
|
return report;
|
|
178
195
|
}
|
|
179
196
|
export { runSandboxScenario as n, SandboxHarness as t };
|
|
180
197
|
|
|
181
|
-
//# sourceMappingURL=sandbox-harness-
|
|
198
|
+
//# sourceMappingURL=sandbox-harness-BzAUasgY.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sandbox-harness-BzAUasgY.js","names":["delay"],"sources":["../src/sandbox-harness.ts"],"sourcesContent":["import { setTimeout as delay } from 'node:timers/promises'\nimport { runBoundedProcess } from './bounded-process'\n\nimport type { TraceEmitter } from './trace/emitter'\nimport type { SandboxSpan } from './trace/schema'\n\nexport interface HarnessConfig {\n /** Setup command (e.g. \"pnpm install\"). Non-zero exit fails the run. */\n setupCommand?: string\n /** Run command (e.g. \"pnpm build\"). */\n runCommand?: string\n /** Test command (e.g. \"pnpm test --run\"). Drives the test count + pass count. */\n testCommand?: string\n cwd?: string\n /** Max wall-clock per phase in ms. Default 10 minutes. */\n timeoutMs?: number\n /** Captured stdout + stderr cap, default 16 MiB; excess is dropped. */\n maxOutputBytes?: number\n image?: string\n env?: Record<string, string>\n /** Parser for the test output — maps stdout/stderr/exit code → pass count. */\n testParser?: TestOutputParser\n}\n\nexport interface TestOutputParser {\n id: string\n parse(\n stdout: string,\n stderr: string,\n exitCode: number,\n ): { testsTotal: number; testsPassed: number } | undefined\n}\n\nexport interface SandboxResult {\n phase: 'setup' | 'run' | 'test'\n exitCode: number\n stdout: string\n stderr: string\n wallMs: number\n testsTotal?: number\n testsPassed?: number\n /** A timed-out phase always fails, even with exitCode 0. Absent/false means natural exit. */\n killedByTimeout?: boolean\n /** Captured output exceeded maxOutputBytes. */\n outputTruncated?: boolean\n}\n\nexport interface SandboxDriver {\n id: string\n exec(\n phase: SandboxResult['phase'],\n command: string,\n config: HarnessConfig,\n ): Promise<SandboxResult>\n}\n\ninterface SubprocessSandboxDriverOptions {\n cwd?: string\n env?: Record<string, string>\n}\n\nexport class SubprocessSandboxDriver implements SandboxDriver {\n id = 'subprocess'\n constructor(private options: SubprocessSandboxDriverOptions = {}) {}\n\n async exec(\n phase: SandboxResult['phase'],\n command: string,\n config: HarnessConfig,\n ): Promise<SandboxResult> {\n const result = await runBoundedProcess({\n command,\n shell: true,\n cwd: config.cwd ?? this.options.cwd,\n env: { ...process.env, ...this.options.env, ...config.env },\n envMode: 'replace',\n timeoutMs: config.timeoutMs ?? 10 * 60_000,\n maxOutputBytes: config.maxOutputBytes ?? 16 * 1024 * 1024,\n })\n // A timed-out phase never reaches the parser: the output of a killed\n // process is a fragment, and a fragment that happens to parse would\n // report a pass for a run that never finished.\n const parsed =\n !result.killedByTimeout && phase === 'test' && config.testParser\n ? config.testParser.parse(result.stdout, result.stderr, result.exitCode)\n : undefined\n return {\n phase,\n exitCode: result.exitCode,\n stdout: result.stdout,\n stderr: result.runnerError ? result.stderr + result.runnerError : result.stderr,\n wallMs: result.wallMs,\n testsTotal: parsed?.testsTotal,\n testsPassed: parsed?.testsPassed,\n killedByTimeout: result.killedByTimeout || undefined,\n outputTruncated: result.outputTruncated || undefined,\n }\n }\n}\n\n// ── Harness orchestration ────────────────────────────────────────────\n\nexport interface SandboxHarnessResult {\n passed: boolean\n setup?: SandboxResult\n run?: SandboxResult\n test?: SandboxResult\n totalWallMs: number\n /** Final score — 0 when no tests; otherwise testsPassed/testsTotal. */\n score: number\n}\n\nexport class SandboxHarness {\n constructor(private driver: SandboxDriver = new SubprocessSandboxDriver()) {}\n\n async run(config: HarnessConfig, emitter: TraceEmitter): Promise<SandboxHarnessResult> {\n const handle = await emitter.sandbox({\n name: `sandbox(${this.driver.id})`,\n image: config.image,\n command: [config.setupCommand, config.runCommand, config.testCommand]\n .filter(Boolean)\n .join(' && '),\n })\n const result: SandboxHarnessResult = { passed: false, totalWallMs: 0, score: 0 }\n try {\n for (const phase of ['setup', 'run', 'test'] as const) {\n const command = config[`${phase}Command`]\n if (!command) continue\n const measured = await this.driver.exec(phase, command, config)\n result[phase] = measured\n result.totalWallMs += measured.wallMs\n const passed = !measured.killedByTimeout && measured.exitCode === 0\n if (phase !== 'test' && !passed) {\n await handle.fail(\n measured.killedByTimeout\n ? `${phase} timed out after ${measured.wallMs}ms`\n : `${phase} failed (exit ${measured.exitCode})`,\n {\n exitCode: measured.exitCode,\n wallMs: result.totalWallMs,\n } as Partial<SandboxSpan>,\n )\n return result\n }\n }\n const test = result.test\n result.passed = !test || (!test.killedByTimeout && test.exitCode === 0)\n result.score =\n test?.testsTotal !== undefined && test.testsTotal > 0\n ? (test.testsPassed ?? 0) / test.testsTotal\n : result.passed\n ? 1\n : 0\n await handle.end({\n exitCode: test?.exitCode,\n testsTotal: test?.testsTotal,\n testsPassed: test?.testsPassed,\n status: result.passed ? 'ok' : 'error',\n wallMs: result.totalWallMs,\n } as Partial<SandboxSpan>)\n } catch (err) {\n await handle.fail(err instanceof Error ? err : String(err))\n throw err\n }\n return result\n }\n}\n\n/** Portable integration report; products may retain extra timing and assertion fields. */\nexport interface HarnessAssertion {\n name: string\n status: 'pass' | 'fail' | 'skip'\n expected?: string\n actual?: string\n message?: string\n soft?: boolean\n}\nexport type HarnessExpectation =\n | HarnessAssertion\n | readonly [name: string, passed: boolean, details?: Omit<HarnessAssertion, 'name' | 'status'>]\nexport interface HarnessTiming {\n name: string\n durationMs: number\n success: boolean\n error?: string\n}\nexport interface HarnessReport {\n pass: boolean\n assertions: HarnessAssertion[]\n timings: HarnessTiming[]\n error?: string\n metadata?: Record<string, unknown>\n}\nexport interface HarnessResource<T> {\n name: string\n create(signal: AbortSignal): Promise<T>\n retire(resource: T): Promise<unknown>\n ready?: (resource: T, signal: AbortSignal) => Promise<unknown>\n onCreate?: (resource: T) => void\n}\nexport interface HarnessScope {\n signal: AbortSignal\n resource<T>(input: HarnessResource<T>): Promise<{ resource?: T; timing: HarnessTiming }>\n check(...assertions: HarnessExpectation[]): void\n measure(name: string, run: () => Promise<unknown>): Promise<HarnessTiming>\n /** Register retirement immediately after allocation; cleanup ignores workload cancellation. */\n defer(retire: () => Promise<unknown>): void\n poll<T>(\n read: () => Promise<T>,\n ready: (value: T) => boolean,\n budget: { timeoutMs: number; intervalMs: number },\n ): Promise<T | undefined>\n}\nexport interface HarnessScenario<T> {\n setup(scope: HarnessScope): Promise<T>\n steps?: ReadonlyArray<{\n name: string\n /** Diagnostic measurements retain failures without gating the scenario. */\n advisory?: boolean\n when?: (state: T) => boolean\n run(state: T, scope: HarnessScope): Promise<unknown>\n expect?: (state: T, timing: HarnessTiming) => HarnessExpectation[]\n }>\n expectations?: (state: T) => HarnessExpectation[]\n metadata?: (state: T) => Record<string, unknown>\n /** Includes setup and steps. Transports must honor scope.signal. */\n budgetMs: number\n}\n\n/** Campaigns own whole-scenario retries; polling only repeats the declared read. */\nexport async function runSandboxScenario<T>(\n spec: HarnessScenario<T>,\n options: {\n signal?: AbortSignal\n measure?: HarnessScope['measure']\n } = {},\n): Promise<HarnessReport> {\n if (!(spec.budgetMs > 0 && Number.isSafeInteger(spec.budgetMs)))\n throw new Error('Scenario budgetMs must be positive and finite')\n const signal = AbortSignal.any([\n AbortSignal.timeout(spec.budgetMs),\n ...(options.signal ? [options.signal] : []),\n ])\n const report: HarnessReport = { pass: false, assertions: [], timings: [] }\n let measurementFailures = 0\n const retirements: Array<() => Promise<unknown>> = []\n const scope: HarnessScope = {\n signal,\n check(...assertions) {\n for (const value of assertions)\n report.assertions.push(\n 'status' in value\n ? value\n : {\n ...value[2],\n name: value[0],\n status: value[1] ? 'pass' : 'fail',\n },\n )\n },\n defer: (retire) => retirements.push(retire),\n async measure(name, run) {\n const start = performance.now()\n let measured: HarnessTiming = { name, durationMs: 0, success: true }\n try {\n if (options.measure) measured = await options.measure(name, run)\n else {\n const result = (await run()) as { success?: boolean; error?: string } | undefined\n if (result?.success === false)\n throw new Error(result.error ?? 'measured operation returned success=false')\n measured.durationMs = Math.round(performance.now() - start)\n }\n } catch (error) {\n measured = {\n name,\n durationMs: Math.round(performance.now() - start),\n success: false,\n error: error instanceof Error ? error.message : String(error),\n }\n }\n if (!measured.success) measurementFailures++\n report.timings.push(measured)\n return measured\n },\n async resource<T>(input: HarnessResource<T>) {\n let resource: T | undefined\n const timing = await scope.measure(input.name, async () => {\n const owned = await input.create(signal)\n resource = owned\n scope.defer(() => input.retire(owned))\n input.onCreate?.(owned)\n await input.ready?.(owned, signal)\n })\n return { resource, timing }\n },\n async poll(read, ready, budget) {\n if (!(budget.timeoutMs > 0 && budget.intervalMs > 0))\n throw new Error('Polling timeout and interval must be positive')\n const deadline = performance.now() + budget.timeoutMs\n while (performance.now() < deadline) {\n signal.throwIfAborted()\n const value = await read()\n if (ready(value)) return value\n await delay(\n Math.min(budget.intervalMs, Math.max(0, deadline - performance.now())),\n undefined,\n { signal },\n )\n }\n return undefined\n },\n }\n try {\n signal.throwIfAborted()\n const state = await spec.setup(scope)\n for (const step of spec.steps ?? []) {\n signal.throwIfAborted()\n if (step.when && !step.when(state)) continue\n const failuresBefore = measurementFailures\n const timing = await scope.measure(step.name, () => step.run(state, scope))\n if (step.advisory) measurementFailures = failuresBefore\n scope.check(...(step.expect?.(state, timing) ?? []))\n }\n signal.throwIfAborted()\n scope.check(...(spec.expectations?.(state) ?? []))\n report.metadata = spec.metadata?.(state)\n } catch (error) {\n report.error = error instanceof Error ? error.message : String(error)\n } finally {\n for (const retire of retirements.reverse()) {\n const measured = await scope.measure('cleanup', retire)\n if (!measured.success)\n scope.check({ name: 'cleanup', status: 'fail', message: measured.error })\n }\n }\n report.pass =\n !report.error &&\n measurementFailures === 0 &&\n report.assertions.every((a) => a.soft || a.status === 'pass')\n return report\n}\n"],"mappings":"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"}
|
package/dist/{skillopt-optimization-method-DmfZz-2d.js → skillopt-optimization-method-O35aMdxU.js}
RENAMED
|
@@ -4,17 +4,17 @@ import { t as decidePairedPromotion } from "./paired-promotion-decision-5Pl_qJLX
|
|
|
4
4
|
import { a as heldoutSignificance, o as pairHoldout } from "./statistical-heldout-DYF5f10K.js";
|
|
5
5
|
import { d as mapConcurrent } from "./journal-C1uLJi0w.js";
|
|
6
6
|
import { n as contentHash, t as canonicalJson } from "./verdict-cache-BVH-fl18.js";
|
|
7
|
-
import { $ as resolveRunDir, C as surfaceDiff, G as assertIndependentEvaluationSplit, J as exposeFinalEvidence, K as captureFinalEvidencePolicy, R as captureJudge, T as assertSearchHistoryAdmissionOptions, Y as reserveFinalEvidence, Z as runCampaign, b as SearchRecorder, c as readGepaCandidatePopulationArtifact, d as optimizationTokenUsageFromSummary, l as combineComparisonCosts, o as executeOptimizationMethod, q as evaluationUnitMap, s as assertGepaCandidatePopulationSummary, u as costFromLedgerSummary, w as surfaceNode, x as developmentClaim } from "./llm-judge-
|
|
7
|
+
import { $ as resolveRunDir, C as surfaceDiff, G as assertIndependentEvaluationSplit, J as exposeFinalEvidence, K as captureFinalEvidencePolicy, R as captureJudge, T as assertSearchHistoryAdmissionOptions, Y as reserveFinalEvidence, Z as runCampaign, b as SearchRecorder, c as readGepaCandidatePopulationArtifact, d as optimizationTokenUsageFromSummary, l as combineComparisonCosts, o as executeOptimizationMethod, q as evaluationUnitMap, s as assertGepaCandidatePopulationSummary, u as costFromLedgerSummary, w as surfaceNode, x as developmentClaim } from "./llm-judge-CyDyqb6V.js";
|
|
8
8
|
import { D as assertCompleteCampaign, T as assertCampaignDesign, f as campaignBreakdown, t as createCampaignEvidenceReceipt } from "./campaign-evidence-BICB3a9Z.js";
|
|
9
9
|
import { t as deepFreezeCanonicalJson } from "./deep-freeze-CK8-2W7p.js";
|
|
10
|
-
import { M as fsCampaignStorage, _ as resolveExternalOptimizerCallbackLimits, d as assertExternalOptimizerModelBudget, f as assertJsonValue, g as removeCredentialEnvironment, h as isExternalTextCandidate, i as startExternalOptimizerModelProxy, j as createRunCostLedger, m as isCandidateText, n as closeExternalOptimizerResources, p as assertNoCredentialValues, r as runWithCleanup, t as runExternalOptimizerProcess, v as resolveExternalOptimizerProcessLimits, y as safePathComponent } from "./external-optimizer-subprocess-
|
|
10
|
+
import { M as fsCampaignStorage, _ as resolveExternalOptimizerCallbackLimits, d as assertExternalOptimizerModelBudget, f as assertJsonValue, g as removeCredentialEnvironment, h as isExternalTextCandidate, i as startExternalOptimizerModelProxy, j as createRunCostLedger, m as isCandidateText, n as closeExternalOptimizerResources, p as assertNoCredentialValues, r as runWithCleanup, t as runExternalOptimizerProcess, v as resolveExternalOptimizerProcessLimits, y as safePathComponent } from "./external-optimizer-subprocess-CeHuAaMJ.js";
|
|
11
11
|
import { s as surfaceContentHash } from "./json-recovery-DK4MDm5r.js";
|
|
12
12
|
import { r as summarizeEvaluationUnits, t as defineEvaluationClaim } from "./claim-Dod_mjk3.js";
|
|
13
13
|
import { n as openSearchLedger } from "./search-ledger-BsVi-Ngv.js";
|
|
14
14
|
import { t as acquireSingleRunLock } from "./single-run-lock-BGlW3OSk.js";
|
|
15
15
|
import { n as isRecord } from "./json-DtvZNAU9.js";
|
|
16
16
|
import { c as combineAbortSignals, f as assertServedModelPolicy } from "./llm-client-BdSiZ4qz.js";
|
|
17
|
-
import { t as startExternalOptimizerCallback } from "./external-optimizer-process-
|
|
17
|
+
import { t as startExternalOptimizerCallback } from "./external-optimizer-process-BgitfZ-Q.js";
|
|
18
18
|
import { createHash, randomBytes } from "node:crypto";
|
|
19
19
|
import { mkdir } from "node:fs/promises";
|
|
20
20
|
import { isDeepStrictEqual } from "node:util";
|
|
@@ -3223,4 +3223,4 @@ async function finishSkillOptRun(context, result, outputDir, modelProxy) {
|
|
|
3223
3223
|
}
|
|
3224
3224
|
export { importExternalEvaluations as a, composeGate as c, readExternalOptimizerObservationArtifact as d, externalSurface as i, externalTextOptimizationMethod as l, compareOptimizationMethods as n, importGepaPopulation as o, gepaOptimizationMethod as r, heldOutGate as s, skillOptOptimizationMethod as t, decodeExternalTextCandidate as u };
|
|
3225
3225
|
|
|
3226
|
-
//# sourceMappingURL=skillopt-optimization-method-
|
|
3226
|
+
//# sourceMappingURL=skillopt-optimization-method-O35aMdxU.js.map
|