@workbench-ai/workbench 0.0.52 → 0.0.53

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.
@@ -235,7 +235,7 @@ export async function localBenchmarkSnapshot(context) {
235
235
  const summaries = candidates.map(candidateSummary);
236
236
  const activeId = snapshot.activeId && candidates.some((candidate) => candidate.id === snapshot.activeId)
237
237
  ? snapshot.activeId
238
- : candidates.at(-1)?.id ?? null;
238
+ : null;
239
239
  const currentBenchmarkFingerprint = await readCurrentBenchmarkFingerprint(context);
240
240
  return {
241
241
  workspaceRoot: path.resolve(workspace),
package/dist/index.js CHANGED
@@ -2919,7 +2919,9 @@ async function pushBenchmark(argv, io) {
2919
2919
  const visibility = readOptionalBenchmarkVisibility(parsed.flags.visibility);
2920
2920
  const createVisibility = visibility ?? "public";
2921
2921
  const dryRun = parsed.flags["dry-run"] === true;
2922
- const runtime = await exportLocalRuntimeBundle(dir);
2922
+ const runtime = await exportLocalRuntimeBundle(dir, {
2923
+ currentBenchmarkFingerprint: localBenchmarkFingerprint(source),
2924
+ });
2923
2925
  const state = localProjectState({
2924
2926
  source,
2925
2927
  runtime,
@@ -3003,7 +3005,8 @@ async function pushBenchmark(argv, io) {
3003
3005
  responseProject,
3004
3006
  visibility,
3005
3007
  });
3006
- const nextOrigin = await writeWorkbenchOriginFromState(dir, {
3008
+ const applied = await acceptPushedProjectStateToLocal({
3009
+ dir,
3007
3010
  baseUrl,
3008
3011
  state: response.state,
3009
3012
  });
@@ -3013,13 +3016,13 @@ async function pushBenchmark(argv, io) {
3013
3016
  changed: response.changed === true,
3014
3017
  benchmark: publishedProject,
3015
3018
  visibility: visibility ?? "unchanged",
3016
- origin: nextOrigin,
3019
+ origin: applied.origin,
3017
3020
  source: response.source,
3018
3021
  runtime: response.runtime.stats,
3019
3022
  urls: buildWorkbenchResourceUrls({
3020
3023
  baseUrl,
3021
3024
  projectId: publishedProject.id ?? responseProject.id,
3022
- ...originRemoteUrlParts(nextOrigin),
3025
+ ...originRemoteUrlParts(applied.origin),
3023
3026
  }),
3024
3027
  }, parsed, io, (record) => {
3025
3028
  const value = record;
@@ -3036,11 +3039,12 @@ async function createHostedBenchmarkFromState(args) {
3036
3039
  body: args.state,
3037
3040
  }, args.baseUrl);
3038
3041
  const project = hostedProjectSummaryFromState(result.state);
3039
- const origin = await writeWorkbenchOriginFromState(args.dir, {
3042
+ const applied = await acceptPushedProjectStateToLocal({
3043
+ dir: args.dir,
3040
3044
  baseUrl: args.baseUrl,
3041
3045
  state: result.state,
3042
3046
  });
3043
- return { project, origin, result };
3047
+ return { project, origin: applied.origin, result };
3044
3048
  }
3045
3049
  async function applyRequestedProjectVisibility(args) {
3046
3050
  if (args.visibility === "public") {
@@ -3159,6 +3163,15 @@ async function applyProjectStateToLocal(args) {
3159
3163
  runtime: runtimeImport.stats,
3160
3164
  };
3161
3165
  }
3166
+ async function acceptPushedProjectStateToLocal(args) {
3167
+ const benchmarkFingerprint = localBenchmarkFingerprint(await readLocalProjectSource(args.dir));
3168
+ const runtime = await importLocalRuntimeBundle(args.dir, args.state.runtime, benchmarkFingerprint);
3169
+ const origin = await writeWorkbenchOriginFromState(args.dir, {
3170
+ baseUrl: args.baseUrl,
3171
+ state: args.state,
3172
+ });
3173
+ return { origin, runtime: runtime.stats };
3174
+ }
3162
3175
  async function retryHostedWorkflow(argv, io) {
3163
3176
  const parsed = parseArgs(argv);
3164
3177
  rejectUnknownFlags(parsed, new Set([
@@ -23,7 +23,9 @@ export declare function loadLocalArchive(workspace: string): Promise<LocalArchiv
23
23
  export declare function loadLocalArchiveIndex(workspace: string): Promise<LocalArchiveIndex>;
24
24
  export declare function saveLocalArchive(workspace: string, snapshot: LocalArchiveSnapshot): Promise<void>;
25
25
  export declare function saveLocalJobs(workspace: string, jobs: readonly HostedWorkbenchJob[]): Promise<void>;
26
- export declare function exportLocalRuntimeBundle(workspace: string): Promise<WorkbenchRuntimeBundle>;
26
+ export declare function exportLocalRuntimeBundle(workspace: string, options?: {
27
+ currentBenchmarkFingerprint?: string;
28
+ }): Promise<WorkbenchRuntimeBundle>;
27
29
  export declare function importLocalRuntimeBundle(workspace: string, bundle: WorkbenchRuntimeBundle, currentBenchmarkFingerprint: string): Promise<WorkbenchRuntimeImportResult>;
28
30
  export declare function runtimeBundleStats(bundle: WorkbenchRuntimeBundle): WorkbenchRuntimeBundleStats;
29
31
  export declare function sanitizeRuntimeJobForExchange(job: HostedWorkbenchJob): HostedWorkbenchJob;
@@ -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, workbenchRuntimeBundleStats, workbenchSurfaceFilesEqualForExchange, } from "@workbench-ai/workbench-core";
3
+ import { buildWorkbenchTraceSessionsFromFiles, candidateRecordWithoutDerivedFields, sanitizeWorkbenchRuntimeCandidateForExchange, sanitizeWorkbenchRuntimeJobForExchange, selectExecutionOutputFilesForInspection, workbenchRuntimeExplicitActiveId, workbenchRuntimeBundleStats, 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) {
@@ -71,16 +71,24 @@ export async function saveLocalJobs(workspace, jobs) {
71
71
  }
72
72
  await writeArchivedLocalJobs(workspace, jobs, new Map());
73
73
  }
74
- export async function exportLocalRuntimeBundle(workspace) {
74
+ export async function exportLocalRuntimeBundle(workspace, options = {}) {
75
75
  const snapshot = await loadLocalArchive(workspace);
76
76
  const jobs = (await readLocalJobs(workspace)).map(sanitizeRuntimeJobForExchange);
77
77
  const executionFiles = await Promise.all(jobs.map(async (job) => ({
78
78
  jobId: job.id,
79
79
  files: await readLocalExecutionFiles(workspace, job.id),
80
80
  })));
81
+ const activeId = options.currentBenchmarkFingerprint
82
+ ? workbenchRuntimeExplicitActiveId({
83
+ candidates: snapshot.candidates,
84
+ runs: snapshot.runs,
85
+ preferredActiveId: snapshot.activeId,
86
+ benchmarkFingerprint: options.currentBenchmarkFingerprint,
87
+ })
88
+ : snapshot.activeId;
81
89
  return {
82
90
  schema: "workbench.runtime.bundle.v1",
83
- activeId: snapshot.activeId,
91
+ activeId,
84
92
  candidates: snapshot.candidates.map(sanitizeWorkbenchRuntimeCandidateForExchange),
85
93
  candidateFiles: Object.entries(snapshot.candidateFiles).map(([candidateId, files]) => ({
86
94
  candidateId,
@@ -121,12 +129,6 @@ export async function importLocalRuntimeBundle(workspace, bundle, currentBenchma
121
129
  }
122
130
  candidateFiles[candidateId] = files;
123
131
  }
124
- const activeId = compatibleRuntimeActiveCandidateId(candidates, bundle.activeId ?? null, currentBenchmarkFingerprint) ??
125
- compatibleRuntimeActiveCandidateId(candidates, snapshot.activeId, currentBenchmarkFingerprint) ??
126
- latestCompatibleRuntimeCandidateId(candidates, currentBenchmarkFingerprint);
127
- if (activeId !== snapshot.activeId) {
128
- changed = true;
129
- }
130
132
  const evaluations = mergeRecordsById(snapshot.evaluations, bundle.evaluations, (evaluation) => evaluation.id, (didChange) => {
131
133
  changed ||= didChange;
132
134
  }, runtimeEvaluationsCompatibleForExchange).sort((left, right) => left.createdAt.localeCompare(right.createdAt) || left.id.localeCompare(right.id));
@@ -165,6 +167,15 @@ export async function importLocalRuntimeBundle(workspace, bundle, currentBenchma
165
167
  changed ||= didChange;
166
168
  }, runtimeJobsEqualForExchange).sort((left, right) => (left.startedAt ?? left.createdAt).localeCompare(right.startedAt ?? right.createdAt) ||
167
169
  left.id.localeCompare(right.id));
170
+ const activeId = workbenchRuntimeExplicitActiveId({
171
+ candidates,
172
+ runs,
173
+ preferredActiveId: bundle.activeId ?? null,
174
+ benchmarkFingerprint: currentBenchmarkFingerprint,
175
+ });
176
+ if (activeId !== snapshot.activeId) {
177
+ changed = true;
178
+ }
168
179
  await saveLocalArchive(workspace, {
169
180
  activeId,
170
181
  candidates,
@@ -446,19 +457,6 @@ function runtimeJobIdentityForExchange(job) {
446
457
  attempt: job.attempt,
447
458
  };
448
459
  }
449
- function compatibleRuntimeActiveCandidateId(candidates, candidateId, benchmarkFingerprint) {
450
- if (!candidateId) {
451
- return null;
452
- }
453
- const candidate = candidates.find((entry) => entry.id === candidateId) ?? null;
454
- return candidate?.benchmarkFingerprint === benchmarkFingerprint ? candidate.id : null;
455
- }
456
- function latestCompatibleRuntimeCandidateId(candidates, benchmarkFingerprint) {
457
- return candidates
458
- .filter((candidate) => candidate.benchmarkFingerprint === benchmarkFingerprint &&
459
- candidate.status === "evaluated")
460
- .at(-1)?.id ?? null;
461
- }
462
460
  function canonicalRuntimeJson(value) {
463
461
  if (Array.isArray(value)) {
464
462
  return value.map(canonicalRuntimeJson);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@workbench-ai/workbench",
3
- "version": "0.0.52",
3
+ "version": "0.0.53",
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.52",
25
- "@workbench-ai/workbench-core": "0.0.52",
26
- "@workbench-ai/workbench-protocol": "0.0.52"
24
+ "@workbench-ai/workbench-built-in-adapters": "0.0.53",
25
+ "@workbench-ai/workbench-core": "0.0.53",
26
+ "@workbench-ai/workbench-protocol": "0.0.53"
27
27
  },
28
28
  "devDependencies": {
29
29
  "@tailwindcss/postcss": "^4.2.2",