@tangle-network/agent-eval 0.14.0 → 0.14.2

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/dist/index.d.ts CHANGED
@@ -6568,6 +6568,13 @@ interface LineageNode {
6568
6568
  /** Filled when scoring lands. */
6569
6569
  meanScore?: number;
6570
6570
  promotedToFrontier?: boolean;
6571
+ /**
6572
+ * The variant payload (e.g. evolved persona text, code mutation diff).
6573
+ * Persisted so a winning variant can be reproduced after a run completes
6574
+ * without re-running the optimizer. Optional — pass `omitPayload: true` to
6575
+ * `upsertVariant` for cases where the payload is too large to log.
6576
+ */
6577
+ payload?: unknown;
6571
6578
  }
6572
6579
  /**
6573
6580
  * `kindOf` decides whether a variant is a seed (no parent), code mutation,
@@ -6600,7 +6607,9 @@ declare class LineageRecorder<P = unknown> {
6600
6607
  private readonly kindOf;
6601
6608
  constructor(path: string, kindOf?: LineageKindResolver<P>);
6602
6609
  upsert(node: LineageNode): Promise<void>;
6603
- upsertVariant(variant: PromptVariant<P>): Promise<void>;
6610
+ upsertVariant(variant: PromptVariant<P>, opts?: {
6611
+ omitPayload?: boolean;
6612
+ }): Promise<void>;
6604
6613
  snapshot(): LineageNode[];
6605
6614
  /**
6606
6615
  * Write the current consolidated state to `<path>.snapshot` so external
package/dist/index.js CHANGED
@@ -10252,13 +10252,14 @@ function aggregateTrials(population, scenarioIds, trials) {
10252
10252
  const scenarios = scenarioIds.map((sid) => {
10253
10253
  const scenarioTrials = variantTrials.filter((t) => t.scenarioId === sid);
10254
10254
  const okTrials = scenarioTrials.filter((t) => t.ok);
10255
- const metrics = aggregateMetrics(okTrials.map((t) => t.metrics ?? {}));
10255
+ const gradedTrials = scenarioTrials.filter((t) => !t.error);
10256
+ const metrics = aggregateMetrics(gradedTrials.map((t) => t.metrics ?? {}));
10256
10257
  return {
10257
10258
  variantId: variant.id,
10258
10259
  scenarioId: sid,
10259
- meanScore: mean5(okTrials.map((t) => t.score)),
10260
- meanCost: mean5(okTrials.map((t) => t.cost ?? 0)),
10261
- meanDurationMs: mean5(okTrials.map((t) => t.durationMs ?? 0)),
10260
+ meanScore: mean5(gradedTrials.map((t) => t.score)),
10261
+ meanCost: mean5(gradedTrials.map((t) => t.cost ?? 0)),
10262
+ meanDurationMs: mean5(gradedTrials.map((t) => t.durationMs ?? 0)),
10262
10263
  okRate: scenarioTrials.length === 0 ? 0 : okTrials.length / scenarioTrials.length,
10263
10264
  trials: scenarioTrials.length,
10264
10265
  metrics
@@ -10493,13 +10494,14 @@ var LineageRecorder = class {
10493
10494
  `);
10494
10495
  });
10495
10496
  }
10496
- async upsertVariant(variant) {
10497
+ async upsertVariant(variant, opts = {}) {
10497
10498
  await this.upsert({
10498
10499
  id: variant.id,
10499
10500
  parentId: variant.parentId ?? null,
10500
10501
  generation: variant.generation,
10501
10502
  kind: this.kindOf(variant),
10502
- ...variant.rationale ? { rationale: variant.rationale } : {}
10503
+ ...variant.rationale ? { rationale: variant.rationale } : {},
10504
+ ...opts.omitPayload || variant.payload === void 0 ? {} : { payload: variant.payload }
10503
10505
  });
10504
10506
  }
10505
10507
  snapshot() {
@@ -11212,17 +11214,34 @@ function quote(s) {
11212
11214
  function parseReflectionResponse(raw, maxProposals) {
11213
11215
  let text = raw.trim();
11214
11216
  if (text.startsWith("```")) text = text.replace(/^```(?:json)?\n?/, "").replace(/\n?```$/, "");
11215
- const start = text.indexOf("{");
11216
- const end = text.lastIndexOf("}");
11217
- if (start < 0 || end <= start) return [];
11218
- let parsed;
11219
- try {
11220
- parsed = JSON.parse(text.slice(start, end + 1));
11221
- } catch {
11222
- return [];
11217
+ let parsed = null;
11218
+ const objectStart = text.indexOf("{");
11219
+ const objectEnd = text.lastIndexOf("}");
11220
+ const arrayStart = text.indexOf("[");
11221
+ const arrayEnd = text.lastIndexOf("]");
11222
+ const tryObjectFirst = objectStart >= 0 && (arrayStart < 0 || objectStart < arrayStart);
11223
+ const candidates = [];
11224
+ if (tryObjectFirst) {
11225
+ if (objectStart >= 0 && objectEnd > objectStart) candidates.push(text.slice(objectStart, objectEnd + 1));
11226
+ if (arrayStart >= 0 && arrayEnd > arrayStart) candidates.push(text.slice(arrayStart, arrayEnd + 1));
11227
+ } else {
11228
+ if (arrayStart >= 0 && arrayEnd > arrayStart) candidates.push(text.slice(arrayStart, arrayEnd + 1));
11229
+ if (objectStart >= 0 && objectEnd > objectStart) candidates.push(text.slice(objectStart, objectEnd + 1));
11230
+ }
11231
+ for (const slice of candidates) {
11232
+ try {
11233
+ parsed = JSON.parse(slice);
11234
+ break;
11235
+ } catch {
11236
+ }
11237
+ }
11238
+ if (parsed == null) return [];
11239
+ let proposalsRaw;
11240
+ if (Array.isArray(parsed)) {
11241
+ proposalsRaw = parsed;
11242
+ } else if (parsed && typeof parsed === "object") {
11243
+ proposalsRaw = parsed.proposals;
11223
11244
  }
11224
- if (!parsed || typeof parsed !== "object") return [];
11225
- const proposalsRaw = parsed.proposals;
11226
11245
  if (!Array.isArray(proposalsRaw)) return [];
11227
11246
  const out = [];
11228
11247
  for (const p of proposalsRaw) {