@workbench-ai/workbench 0.0.54 → 0.0.56

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.
@@ -140,7 +140,7 @@ const commandHelp = Object.fromEntries(Object.entries({
140
140
  " workbench improve [SOURCE] [--dir DIR] [--from CANDIDATE_ID] [--runs RUN] [--budget N] [--samples N] [--rerun] [--json]",
141
141
  " workbench improve --hosted [SOURCE] [--dir DIR] [--benchmark OWNER/BENCHMARK] [--base CANDIDATE_ID] [--runs RUN] [--budget N] [--samples N] [--rerun] [--watch] [--dry-run] [--json]",
142
142
  "",
143
- "Ensure a candidate improvement exists for the selected base, run, budget, and samples. Without --hosted, execution writes local records. With --hosted, Workbench starts or reuses hosted work against the configured remote or --benchmark target. Completed work is reused only when base, run configuration, source, adapters, benchmark, budget, and samples match; use --rerun to intentionally spend again.",
143
+ "Ensure a candidate improvement exists for the selected base, run, budget, and samples. Improve defaults to the evaluated active candidate when it belongs to the current benchmark fingerprint; otherwise it evaluates and uses the authored current candidate. Without --hosted, execution writes local records. With --hosted, Workbench starts or reuses hosted work against the configured remote or --benchmark target. Completed work is reused only when base, run configuration, source, adapters, benchmark, budget, and samples match; use --rerun to intentionally spend again.",
144
144
  "",
145
145
  "Examples:",
146
146
  " workbench improve --budget 1 --samples 1",
package/dist/index.js CHANGED
@@ -993,35 +993,30 @@ async function localRun(argv, io, runtimeOptions) {
993
993
  async function ensureLocalImproveBaseCandidate(args) {
994
994
  let snapshot = await loadLocalArchive(args.workspace);
995
995
  const explicitBase = asOptionalString(args.parsed.flags.from);
996
- const benchmarkFingerprint = await readLocalBenchmarkFingerprint(args.workspace);
996
+ const benchmarkFingerprint = localBenchmarkFingerprint(args.projectSource);
997
+ const baseCandidateArgs = {
998
+ workspace: args.workspace,
999
+ benchmarkFingerprint,
1000
+ projectSource: args.projectSource,
1001
+ samples: args.samples,
1002
+ rerun: args.parsed.flags.rerun === true,
1003
+ io: args.io,
1004
+ runtimeOptions: args.runtimeOptions,
1005
+ };
997
1006
  if (explicitBase) {
998
- let candidate = readLocalCandidate(snapshot, explicitBase);
999
- if (candidate.benchmarkFingerprint !== benchmarkFingerprint) {
1000
- throw new UsageError(`Base candidate ${explicitBase} belongs to benchmark ${candidate.benchmarkFingerprint}, not ${benchmarkFingerprint}.`);
1001
- }
1002
- if (!candidate.candidateFingerprint) {
1003
- throw new UsageError(`Base candidate ${explicitBase} is missing a candidate fingerprint.`);
1004
- }
1005
- if (candidate.status !== "evaluated" && !candidate.eval) {
1006
- const code = await localEvaluateCandidate([
1007
- "--dir",
1008
- args.workspace,
1009
- "--candidate",
1010
- explicitBase,
1011
- "--runs",
1012
- args.projectSource.spec.candidate.selectedRunId,
1013
- "--samples",
1014
- String(args.samples),
1015
- ...(args.parsed.flags.rerun === true ? ["--rerun"] : []),
1016
- "--json",
1017
- ], createSilentIo(args.io), args.runtimeOptions);
1018
- if (code !== 0) {
1019
- throw new UsageError(`Base candidate ${explicitBase} eval failed; improve was not started.`);
1020
- }
1021
- snapshot = await loadLocalArchive(args.workspace);
1022
- candidate = readLocalCandidate(snapshot, explicitBase);
1007
+ return await ensureEvaluatedLocalImproveBaseCandidate({
1008
+ ...baseCandidateArgs,
1009
+ candidateId: explicitBase,
1010
+ });
1011
+ }
1012
+ if (snapshot.activeId) {
1013
+ const activeCandidate = readLocalCandidate(snapshot, snapshot.activeId);
1014
+ if (activeCandidate.benchmarkFingerprint === benchmarkFingerprint) {
1015
+ return await ensureEvaluatedLocalImproveBaseCandidate({
1016
+ ...baseCandidateArgs,
1017
+ candidateId: activeCandidate.id,
1018
+ });
1023
1019
  }
1024
- return candidate;
1025
1020
  }
1026
1021
  const candidateFingerprint = localCandidateFingerprint(args.projectSource);
1027
1022
  const existing = snapshot.candidates.find((candidate) => candidate.benchmarkFingerprint === benchmarkFingerprint &&
@@ -1063,6 +1058,36 @@ async function ensureLocalImproveBaseCandidate(args) {
1063
1058
  }
1064
1059
  return evaluated;
1065
1060
  }
1061
+ async function ensureEvaluatedLocalImproveBaseCandidate(args) {
1062
+ let snapshot = await loadLocalArchive(args.workspace);
1063
+ let candidate = readLocalCandidate(snapshot, args.candidateId);
1064
+ if (candidate.benchmarkFingerprint !== args.benchmarkFingerprint) {
1065
+ throw new UsageError(`Base candidate ${args.candidateId} belongs to benchmark ${candidate.benchmarkFingerprint}, not ${args.benchmarkFingerprint}.`);
1066
+ }
1067
+ if (!candidate.candidateFingerprint) {
1068
+ throw new UsageError(`Base candidate ${args.candidateId} is missing a candidate fingerprint.`);
1069
+ }
1070
+ if (candidate.status === "evaluated" || candidate.eval) {
1071
+ return candidate;
1072
+ }
1073
+ const code = await localEvaluateCandidate([
1074
+ "--dir",
1075
+ args.workspace,
1076
+ "--candidate",
1077
+ args.candidateId,
1078
+ "--runs",
1079
+ args.projectSource.spec.candidate.selectedRunId,
1080
+ "--samples",
1081
+ String(args.samples),
1082
+ ...(args.rerun ? ["--rerun"] : []),
1083
+ "--json",
1084
+ ], createSilentIo(args.io), args.runtimeOptions);
1085
+ if (code !== 0) {
1086
+ throw new UsageError(`Base candidate ${args.candidateId} eval failed; improve was not started.`);
1087
+ }
1088
+ snapshot = await loadLocalArchive(args.workspace);
1089
+ return readLocalCandidate(snapshot, args.candidateId);
1090
+ }
1066
1091
  function createSilentIo(io) {
1067
1092
  const sink = new class extends Writable {
1068
1093
  _write(_chunk, _encoding, callback) {
@@ -2922,6 +2947,7 @@ async function pushBenchmark(argv, io) {
2922
2947
  const runtime = await exportLocalRuntimeBundle(dir, {
2923
2948
  currentBenchmarkFingerprint: localBenchmarkFingerprint(source),
2924
2949
  });
2950
+ const localRuntimeFingerprint = workbenchRuntimeBundleFingerprint(runtime);
2925
2951
  const state = localProjectState({
2926
2952
  source,
2927
2953
  runtime,
@@ -2941,7 +2967,7 @@ async function pushBenchmark(argv, io) {
2941
2967
  sourceFileCount: sourceFileCount(source),
2942
2968
  runtime: runtimeBundleStats(runtime),
2943
2969
  sourceFingerprint: state.source.fingerprint,
2944
- runtimeFingerprint: state.base.runtimeFingerprint,
2970
+ runtimeFingerprint: localRuntimeFingerprint,
2945
2971
  }, parsed, io, () => `Would push benchmark ${source.spec.name}.`);
2946
2972
  return 0;
2947
2973
  }
@@ -2977,6 +3003,11 @@ async function pushBenchmark(argv, io) {
2977
3003
  throw new UsageError("Missing hosted benchmark. Run workbench push from a source directory.");
2978
3004
  }
2979
3005
  if (dryRun) {
3006
+ const remoteProject = await verifyLinkedPushDryRunTarget({
3007
+ baseUrl,
3008
+ origin,
3009
+ projectId,
3010
+ });
2980
3011
  writeOutput({
2981
3012
  ok: true,
2982
3013
  dryRun: true,
@@ -2985,12 +3016,13 @@ async function pushBenchmark(argv, io) {
2985
3016
  baseUrl,
2986
3017
  benchmarkId: projectId,
2987
3018
  remote: origin.remote,
3019
+ benchmark: remoteProject,
2988
3020
  benchmarkName: source.spec.name,
2989
3021
  visibility: visibility ?? "unchanged",
2990
3022
  sourceFileCount: sourceFileCount(source),
2991
3023
  runtime: runtimeBundleStats(runtime),
2992
3024
  sourceFingerprint: state.source.fingerprint,
2993
- runtimeFingerprint: state.base.runtimeFingerprint,
3025
+ runtimeFingerprint: localRuntimeFingerprint,
2994
3026
  }, parsed, io, () => `Would push ${sourceFileCount(source)} source file(s) and runtime history to ${origin.remote}.`);
2995
3027
  return 0;
2996
3028
  }
@@ -3033,6 +3065,19 @@ async function pushBenchmark(argv, io) {
3033
3065
  });
3034
3066
  return 0;
3035
3067
  }
3068
+ async function verifyLinkedPushDryRunTarget(args) {
3069
+ const response = await apiRequest(projectApiPath(args.projectId), {}, args.baseUrl);
3070
+ const expected = parseOriginRemote(args.origin);
3071
+ const actualOwner = response.benchmark.ownerUsername;
3072
+ const actualProject = response.benchmark.name;
3073
+ if (actualOwner !== expected.owner || actualProject !== expected.project) {
3074
+ const actualRemote = actualOwner && actualProject
3075
+ ? `${actualOwner}/${actualProject}`
3076
+ : "unknown";
3077
+ throw new UsageError(`Workbench origin points to ${args.origin.remote}, but ${args.projectId} resolved to ${actualRemote}.`);
3078
+ }
3079
+ return response.benchmark;
3080
+ }
3036
3081
  async function createHostedBenchmarkFromState(args) {
3037
3082
  const result = await apiRequest("/api/workbench/benchmarks/state", {
3038
3083
  method: "POST",
@@ -1 +1 @@
1
- {"version":3,"file":"local-archive.d.ts","sourceRoot":"","sources":["../src/local-archive.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"local-archive.d.ts","sourceRoot":"","sources":["../src/local-archive.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { promises as fs } from "node:fs";
2
2
  import path from "node:path";
3
- import { buildWorkbenchTraceSessionsFromFiles, candidateRecordWithoutDerivedFields, sanitizeWorkbenchRuntimeCandidateForExchange, sanitizeWorkbenchRuntimeJobForExchange, selectExecutionOutputFilesForInspection, workbenchRuntimeExplicitActiveId, workbenchRuntimeBundleStats, workbenchSurfaceFilesEqualForExchange, } from "@workbench-ai/workbench-core";
3
+ import { buildWorkbenchTraceSessionsFromFiles, candidateRecordWithoutDerivedFields, mergeWorkbenchRuntimeCandidateForExchange, sanitizeWorkbenchRuntimeCandidateForExchange, sanitizeWorkbenchRuntimeJobForExchange, selectExecutionOutputFilesForInspection, workbenchRuntimeExplicitActiveId, workbenchRuntimeBundleStats, workbenchRuntimeCandidateIdentityForExchange, workbenchSurfaceFilesEqualForExchange, } from "@workbench-ai/workbench-core";
4
4
  const RUNTIME_DIR = ".workbench/runtime";
5
5
  const CANDIDATE_RECORDS_DIR = "candidates";
6
6
  export function localRuntimeDir(workspace) {
@@ -113,7 +113,7 @@ export async function importLocalRuntimeBundle(workspace, bundle, currentBenchma
113
113
  const incomingCandidates = bundle.candidates.map(sanitizeWorkbenchRuntimeCandidateForExchange);
114
114
  const candidates = mergeRecordsById(existingCandidates, incomingCandidates, (candidate) => candidate.id, (didChange) => {
115
115
  changed ||= didChange;
116
- }, runtimeCandidatesCompatibleForExchange, mergeRuntimeCandidateForExchange).sort(compareLocalCandidateRecords);
116
+ }, runtimeCandidatesCompatibleForExchange, mergeWorkbenchRuntimeCandidateForExchange).sort(compareLocalCandidateRecords);
117
117
  const candidateFiles = { ...snapshot.candidateFiles };
118
118
  for (const group of bundle.candidateFiles) {
119
119
  const candidateId = localRecordName(group.candidateId);
@@ -394,22 +394,7 @@ function runtimeComparableJob(job) {
394
394
  };
395
395
  }
396
396
  function runtimeCandidatesCompatibleForExchange(left, right) {
397
- return runtimeRecordsEqual(runtimeCandidateIdentityForExchange(left), runtimeCandidateIdentityForExchange(right));
398
- }
399
- function runtimeCandidateIdentityForExchange(candidate) {
400
- const { eval: _eval, prompt: _prompt, meta: _meta, status: _status, usage: _usage, visibility: _visibility, ownerUserId: _ownerUserId, ownerUsername: _ownerUsername, metrics: _metrics, candidateRunId: _candidateRunId, candidateRunName: _candidateRunName, ...identity } = candidate;
401
- return identity;
402
- }
403
- function mergeRuntimeCandidateForExchange(left, right) {
404
- return {
405
- ...left,
406
- ...right,
407
- ...(right.eval ? { eval: right.eval } : left.eval ? { eval: left.eval } : {}),
408
- ...(right.prompt ? { prompt: right.prompt } : left.prompt ? { prompt: left.prompt } : {}),
409
- ...(right.meta !== undefined ? { meta: right.meta } : left.meta !== undefined ? { meta: left.meta } : {}),
410
- ...(right.usage ? { usage: right.usage } : left.usage ? { usage: left.usage } : {}),
411
- visibility: right.visibility ?? left.visibility,
412
- };
397
+ return runtimeRecordsEqual(workbenchRuntimeCandidateIdentityForExchange(left), workbenchRuntimeCandidateIdentityForExchange(right));
413
398
  }
414
399
  function runtimeEvaluationsCompatibleForExchange(left, right) {
415
400
  if (runtimeRecordsEqual(left, right)) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@workbench-ai/workbench",
3
- "version": "0.0.54",
3
+ "version": "0.0.56",
4
4
  "type": "module",
5
5
  "repository": {
6
6
  "type": "git",
@@ -21,9 +21,9 @@
21
21
  ],
22
22
  "dependencies": {
23
23
  "yaml": "^2.8.2",
24
- "@workbench-ai/workbench-built-in-adapters": "0.0.54",
25
- "@workbench-ai/workbench-core": "0.0.54",
26
- "@workbench-ai/workbench-protocol": "0.0.54"
24
+ "@workbench-ai/workbench-built-in-adapters": "0.0.56",
25
+ "@workbench-ai/workbench-core": "0.0.56",
26
+ "@workbench-ai/workbench-protocol": "0.0.56"
27
27
  },
28
28
  "devDependencies": {
29
29
  "@tailwindcss/postcss": "^4.2.2",