@workbench-ai/workbench 0.0.51 → 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),
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AA2IA,UAAU,KAAK;IACb,KAAK,EAAE,MAAM,CAAC,cAAc,CAAC;IAC7B,MAAM,EAAE,MAAM,CAAC,cAAc,CAAC;IAC9B,MAAM,EAAE,MAAM,CAAC,cAAc,CAAC;CAC/B;AA4BD,UAAU,iBAAiB;CAAG;AAuK9B,wBAAsB,MAAM,CAC1B,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,EAAE,GAAE,KAIH,EACD,cAAc,GAAE,iBAAsB,GACrC,OAAO,CAAC,MAAM,CAAC,CAmHjB"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AA0IA,UAAU,KAAK;IACb,KAAK,EAAE,MAAM,CAAC,cAAc,CAAC;IAC7B,MAAM,EAAE,MAAM,CAAC,cAAc,CAAC;IAC9B,MAAM,EAAE,MAAM,CAAC,cAAc,CAAC;CAC/B;AA4BD,UAAU,iBAAiB;CAAG;AA4K9B,wBAAsB,MAAM,CAC1B,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,EAAE,GAAE,KAIH,EACD,cAAc,GAAE,iBAAsB,GACrC,OAAO,CAAC,MAAM,CAAC,CAmHjB"}
package/dist/index.js CHANGED
@@ -6,7 +6,7 @@ import os from "node:os";
6
6
  import path from "node:path";
7
7
  import { Writable } from "node:stream";
8
8
  import { createCandidateFilePreview, createBaselineCandidateJob as createRuntimeBaselineCandidateJob, evaluationScorecardId, evaluationMeanMetrics, executeWorkbenchExecutionJob, engineResolveBindingForSpec, filterOptimizerTraceJobsForCaseIds, filterCandidateSourceFiles, formatWorkbenchCaseSelector, formatWorkbenchSelectionPolicy, workbenchCaseSelectorUsesAllCases, workbenchExecutionPurpose, workbenchRunExecutionFingerprint, createWorkbenchAdapterAuthBundle, createOptimizerTraceInputFiles, DOCKER_SANDBOX_BACKEND, localWorkbenchAdapterAuthStore, materializeWorkbenchRunResult, normalizeSurfaceFiles, planWorkbenchExecutionJobsForPurpose, runWorkbenchExecutionDag, resolveEngineCaseExecutionConfig, resolveWorkbenchResolvedSourceYaml, summarizeCandidateFiles, validateWorkbenchRunEnvelope, parseWorkbenchAdapterAuthTarget, workbenchEngineCaseIdsForImproveEvaluation, workbenchEngineCaseIdsForSelector, workbenchImproveOptimizeSelector, workbenchImproveSelectionPolicy, workbenchProjectSourceFingerprint, workbenchRuntimeBundleFingerprint, } from "@workbench-ai/workbench-core";
9
- import { assertWorkbenchAdapterOperationResultOk, collectWorkbenchAdapterAuthRequirements, WORKBENCH_ADAPTER_RESULT_FILE, WORKBENCH_ADAPTER_RESULT_PROTOCOL, normalizeWorkbenchAdapterOperationRequest, readWorkbenchAdapterOperationResult, workbenchAdapterOperationCommand, workbenchAdapterOperationResultPath, withDefaultWorkbenchAdapterAuthProfiles as applyDefaultWorkbenchAdapterAuthProfiles, } from "@workbench-ai/workbench-protocol";
9
+ import { assertWorkbenchAdapterOperationResultOk, collectWorkbenchAdapterAuthRequirements, normalizeWorkbenchAdapterOperationRequest, readWorkbenchAdapterOperationResult, workbenchAdapterOperationCommand, workbenchAdapterOperationResultPath, withDefaultWorkbenchAdapterAuthProfiles as applyDefaultWorkbenchAdapterAuthProfiles, } from "@workbench-ai/workbench-protocol";
10
10
  import { builtinLocalTraceAdapter, builtinLocalTraceAdapters, sortLocalTraceRefs, } from "@workbench-ai/workbench-built-in-adapters/local-traces";
11
11
  import { commandUsage, HOSTED_WATCH_LIFECYCLE_NOTE, LOCAL_DEV_OPEN_LIFECYCLE_NOTE, rootUsage, } from "./command-model.js";
12
12
  import { startLocalWorkbenchDevServer } from "./dev-open-server.js";
@@ -15,7 +15,7 @@ import { defaultAdapterManifests, composeRuntimeDockerfileWithAdapters, resolveD
15
15
  import { createAdapterCommandEnv } from "./adapter-command-env.js";
16
16
  import { loadLocalArchive, loadLocalArchiveIndex, exportLocalRuntimeBundle, importLocalRuntimeBundle, runtimeBundleStats, materializeCandidateRoot, readLocalCandidate, readLocalCandidateFiles, readLocalJobs, saveLocalArchive, saveLocalJobs, setLocalActive, upsertLocalRun, upsertLocalCandidate, upsertLocalEvaluation, } from "./local-archive.js";
17
17
  import { WorkspaceSnapshotError, } from "./workspace-snapshot.js";
18
- import { readLocalProjectSource, WORKBENCH_BENCHMARK_FILE, } from "./project-source.js";
18
+ import { hostedEngineResolveFiles, readLocalProjectSource, WORKBENCH_BENCHMARK_FILE, } from "./project-source.js";
19
19
  import { localBenchmarkFingerprint, localCandidateFingerprint, } from "./benchmark-fingerprint.js";
20
20
  const require = createRequire(import.meta.url);
21
21
  function getCliVersion() {
@@ -869,14 +869,15 @@ async function localRun(argv, io, runtimeOptions) {
869
869
  },
870
870
  });
871
871
  for (const candidate of materialized.candidates) {
872
- outputCandidateId = candidate.id;
873
- snapshot = upsertLocalCandidate(snapshot, candidate, materialized.candidateFiles[candidate.id] ?? []);
874
- events.push(createLocalEvent("candidate_created", candidate.createdAt, {
872
+ const localCandidate = localCandidateRecord(candidate);
873
+ outputCandidateId = localCandidate.id;
874
+ snapshot = upsertLocalCandidate(snapshot, localCandidate, materialized.candidateFiles[localCandidate.id] ?? []);
875
+ events.push(createLocalEvent("candidate_created", localCandidate.createdAt, {
875
876
  runId,
876
- candidateId: candidate.id,
877
- baseId: candidate.baseId,
878
- status: candidate.status,
879
- metrics: evaluationMeanMetrics(candidate.eval),
877
+ candidateId: localCandidate.id,
878
+ baseId: localCandidate.baseId,
879
+ status: localCandidate.status,
880
+ metrics: evaluationMeanMetrics(localCandidate.eval),
880
881
  }));
881
882
  }
882
883
  for (const evaluation of materialized.evaluations) {
@@ -1280,7 +1281,7 @@ async function localEvaluateCandidate(argv, io, runtimeOptions) {
1280
1281
  previousCandidate: existingCandidate ?? null,
1281
1282
  existingCandidateCount: snapshot.candidates.length,
1282
1283
  });
1283
- for (const candidateRecord of materialized.candidates) {
1284
+ for (const candidateRecord of materialized.candidates.map(localCandidateRecord)) {
1284
1285
  snapshot = upsertLocalCandidate(snapshot, candidateRecord, materialized.candidateFiles[candidateRecord.id] ?? []);
1285
1286
  }
1286
1287
  if (materialized.activeCandidateId) {
@@ -2918,7 +2919,9 @@ async function pushBenchmark(argv, io) {
2918
2919
  const visibility = readOptionalBenchmarkVisibility(parsed.flags.visibility);
2919
2920
  const createVisibility = visibility ?? "public";
2920
2921
  const dryRun = parsed.flags["dry-run"] === true;
2921
- const runtime = await exportLocalRuntimeBundle(dir);
2922
+ const runtime = await exportLocalRuntimeBundle(dir, {
2923
+ currentBenchmarkFingerprint: localBenchmarkFingerprint(source),
2924
+ });
2922
2925
  const state = localProjectState({
2923
2926
  source,
2924
2927
  runtime,
@@ -3002,11 +3005,10 @@ async function pushBenchmark(argv, io) {
3002
3005
  responseProject,
3003
3006
  visibility,
3004
3007
  });
3005
- const nextOrigin = await writeWorkbenchOriginFromState(dir, {
3008
+ const applied = await acceptPushedProjectStateToLocal({
3009
+ dir,
3006
3010
  baseUrl,
3007
3011
  state: response.state,
3008
- project: publishedProject,
3009
- sourceFingerprint: state.source.fingerprint,
3010
3012
  });
3011
3013
  writeOutput({
3012
3014
  ok: true,
@@ -3014,13 +3016,13 @@ async function pushBenchmark(argv, io) {
3014
3016
  changed: response.changed === true,
3015
3017
  benchmark: publishedProject,
3016
3018
  visibility: visibility ?? "unchanged",
3017
- origin: nextOrigin,
3019
+ origin: applied.origin,
3018
3020
  source: response.source,
3019
3021
  runtime: response.runtime.stats,
3020
3022
  urls: buildWorkbenchResourceUrls({
3021
3023
  baseUrl,
3022
3024
  projectId: publishedProject.id ?? responseProject.id,
3023
- ...originRemoteUrlParts(nextOrigin),
3025
+ ...originRemoteUrlParts(applied.origin),
3024
3026
  }),
3025
3027
  }, parsed, io, (record) => {
3026
3028
  const value = record;
@@ -3037,13 +3039,12 @@ async function createHostedBenchmarkFromState(args) {
3037
3039
  body: args.state,
3038
3040
  }, args.baseUrl);
3039
3041
  const project = hostedProjectSummaryFromState(result.state);
3040
- const origin = await writeWorkbenchOriginFromState(args.dir, {
3042
+ const applied = await acceptPushedProjectStateToLocal({
3043
+ dir: args.dir,
3041
3044
  baseUrl: args.baseUrl,
3042
3045
  state: result.state,
3043
- project,
3044
- sourceFingerprint: args.state.source.fingerprint,
3045
3046
  });
3046
- return { project, origin, result };
3047
+ return { project, origin: applied.origin, result };
3047
3048
  }
3048
3049
  async function applyRequestedProjectVisibility(args) {
3049
3050
  if (args.visibility === "public") {
@@ -3150,11 +3151,11 @@ async function applyProjectStateToLocal(args) {
3150
3151
  await assertLocalSourceMatchesOrigin(args.dir, args.origin);
3151
3152
  }
3152
3153
  await syncSourceFiles(args.dir, args.state.source.files);
3153
- const runtimeImport = await importLocalRuntimeBundle(args.dir, args.state.runtime);
3154
+ const benchmarkFingerprint = localBenchmarkFingerprint(await readLocalProjectSource(args.dir));
3155
+ const runtimeImport = await importLocalRuntimeBundle(args.dir, args.state.runtime, benchmarkFingerprint);
3154
3156
  const origin = await writeWorkbenchOriginFromState(args.dir, {
3155
3157
  baseUrl: args.baseUrl,
3156
3158
  state: args.state,
3157
- sourceFingerprint: await localSourceFingerprint(args.dir),
3158
3159
  });
3159
3160
  return {
3160
3161
  origin,
@@ -3162,6 +3163,15 @@ async function applyProjectStateToLocal(args) {
3162
3163
  runtime: runtimeImport.stats,
3163
3164
  };
3164
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
+ }
3165
3175
  async function retryHostedWorkflow(argv, io) {
3166
3176
  const parsed = parseArgs(argv);
3167
3177
  rejectUnknownFlags(parsed, new Set([
@@ -3193,20 +3203,21 @@ async function retryHostedWorkflow(argv, io) {
3193
3203
  method: "POST",
3194
3204
  body: retryTarget.request,
3195
3205
  }, target.baseUrl);
3196
- const startedRun = withRunUrls(target, response.run);
3206
+ const runTarget = hostedTargetForRunStartResponse(target, response);
3207
+ const startedRun = withRunUrls(runTarget, response.run);
3197
3208
  if (parsed.flags.watch === true) {
3198
3209
  if (parsed.flags.json !== true) {
3199
3210
  io.stdout.write(`${formatHostedRunStarted(startedRun, retryTarget.workflow).trimEnd()}\n${HOSTED_WATCH_LIFECYCLE_NOTE}\n`);
3200
3211
  }
3201
3212
  const watched = await watchHostedRun({
3202
3213
  parsed,
3203
- target,
3214
+ target: runTarget,
3204
3215
  runId: response.run.id,
3205
3216
  intervalMs: watchIntervalMs ?? 1000,
3206
3217
  timeoutMs: watchTimeoutMs,
3207
3218
  });
3208
- const outputRun = withRunUrls(target, await withHostedRunFailureSummary(target, watched));
3209
- await tryImportTerminalHostedProjectState({ target, io });
3219
+ const outputRun = withRunUrls(runTarget, await withHostedRunFailureSummary(runTarget, watched));
3220
+ await tryImportTerminalHostedProjectState({ target: runTarget, io });
3210
3221
  const result = {
3211
3222
  ok: hostedRunSucceeded(watched),
3212
3223
  retried: {
@@ -3377,12 +3388,10 @@ function hostedRunRecordFailed(run) {
3377
3388
  }
3378
3389
  async function startHostedWorkflow(workflow, argv, io) {
3379
3390
  const parsed = parseArgs(argv);
3380
- rejectUnknownFlags(parsed, new Set([
3391
+ const allowedFlags = new Set([
3381
3392
  "dir",
3382
3393
  "benchmark",
3383
- "base",
3384
3394
  "runs",
3385
- "budget",
3386
3395
  "samples",
3387
3396
  "rerun",
3388
3397
  "watch",
@@ -3390,7 +3399,15 @@ async function startHostedWorkflow(workflow, argv, io) {
3390
3399
  "interval-ms",
3391
3400
  "timeout-ms",
3392
3401
  "json",
3393
- ]));
3402
+ ]);
3403
+ if (workflow === "eval") {
3404
+ allowedFlags.add("candidate");
3405
+ }
3406
+ else {
3407
+ allowedFlags.add("base");
3408
+ allowedFlags.add("budget");
3409
+ }
3410
+ rejectUnknownFlags(parsed, allowedFlags);
3394
3411
  if (parsed.positionals.length > 1) {
3395
3412
  throw new UsageError(`workbench ${workflow} --hosted accepts at most one source file or directory argument.`);
3396
3413
  }
@@ -3431,25 +3448,27 @@ async function startHostedWorkflow(workflow, argv, io) {
3431
3448
  }, parsed, io, () => `Processed ${selectedRunIds.length} hosted candidate run(s); ${failed} failed.`);
3432
3449
  return failed === 0 ? 0 : 1;
3433
3450
  }
3434
- const baseCandidateId = asOptionalString(parsed.flags.base);
3451
+ const selectedCandidateId = workflow === "eval"
3452
+ ? asOptionalString(parsed.flags.candidate)
3453
+ : asOptionalString(parsed.flags.base);
3435
3454
  const request = workflow === "improve"
3436
3455
  ? {
3437
3456
  workflow,
3438
3457
  budget,
3439
3458
  samples,
3440
- ...(baseCandidateId ? { candidateId: baseCandidateId } : {}),
3459
+ ...(selectedCandidateId ? { candidateId: selectedCandidateId } : {}),
3441
3460
  }
3442
3461
  : {
3443
3462
  workflow,
3444
3463
  samples,
3445
- ...(baseCandidateId ? { candidateId: baseCandidateId } : {}),
3464
+ ...(selectedCandidateId ? { candidateId: selectedCandidateId } : {}),
3446
3465
  };
3447
3466
  const projectSource = selectedRunIds[0] === defaultProjectSource.candidateRunId
3448
3467
  ? defaultProjectSource
3449
3468
  : await readLocalProjectSource(path.resolve(sourceArg), { runId: selectedRunIds[0] });
3450
3469
  request.sourceYaml = projectSource.specSource;
3451
3470
  request.adapterFiles = projectSource.adapterFiles;
3452
- if (workflow === "eval" && !baseCandidateId) {
3471
+ if (workflow === "eval" && !selectedCandidateId) {
3453
3472
  request.candidateFiles = projectSource.candidateFiles;
3454
3473
  }
3455
3474
  if (parsed.flags.rerun === true) {
@@ -3484,7 +3503,7 @@ async function startHostedWorkflow(workflow, argv, io) {
3484
3503
  parsed,
3485
3504
  target,
3486
3505
  samples: request.samples,
3487
- candidateId: baseCandidateId,
3506
+ candidateId: selectedCandidateId,
3488
3507
  sourceYaml: projectSource.specSource,
3489
3508
  adapterFiles: projectSource.adapterFiles,
3490
3509
  intervalMs: watchIntervalMs ?? 1000,
@@ -3496,12 +3515,13 @@ async function startHostedWorkflow(workflow, argv, io) {
3496
3515
  method: "POST",
3497
3516
  body: request,
3498
3517
  }, target.baseUrl);
3499
- const startedRun = withRunUrls(target, response.run);
3518
+ const runTarget = hostedTargetForRunStartResponse(target, response);
3519
+ const startedRun = withRunUrls(runTarget, response.run);
3500
3520
  const startedRunOutput = response.reused === true
3501
3521
  ? { ...startedRun, reused: true }
3502
3522
  : startedRun;
3503
3523
  if (response.reused === true && response.run.status === "finished") {
3504
- await tryImportTerminalHostedProjectState({ target, io });
3524
+ await tryImportTerminalHostedProjectState({ target: runTarget, io });
3505
3525
  writeOutput({
3506
3526
  ok: hostedRunSucceeded(response.run),
3507
3527
  reused: true,
@@ -3517,14 +3537,14 @@ async function startHostedWorkflow(workflow, argv, io) {
3517
3537
  }
3518
3538
  const watched = await watchHostedRun({
3519
3539
  parsed,
3520
- target,
3540
+ target: runTarget,
3521
3541
  runId: response.run.id,
3522
3542
  intervalMs: watchIntervalMs ?? 1000,
3523
3543
  timeoutMs: watchTimeoutMs,
3524
3544
  });
3525
- const outputRun = await withHostedRunFailureSummary(target, watched);
3526
- await tryImportTerminalHostedProjectState({ target, io });
3527
- writeOutput(withRunUrls(target, outputRun), parsed, io, formatHostedRunResult);
3545
+ const outputRun = await withHostedRunFailureSummary(runTarget, watched);
3546
+ await tryImportTerminalHostedProjectState({ target: runTarget, io });
3547
+ writeOutput(withRunUrls(runTarget, outputRun), parsed, io, formatHostedRunResult);
3528
3548
  return hostedRunSucceeded(watched) ? 0 : 1;
3529
3549
  }
3530
3550
  writeOutput(startedRunOutput, parsed, io, (run) => formatHostedRunStarted(run, workflow).trimEnd());
@@ -3556,9 +3576,10 @@ async function ensureHostedImproveBaseCandidate(args) {
3556
3576
  ...(args.adapterFiles.length > 0 ? { adapterFiles: args.adapterFiles } : {}),
3557
3577
  },
3558
3578
  }, args.target.baseUrl);
3579
+ const runTarget = hostedTargetForRunStartResponse(args.target, response);
3559
3580
  const watched = await watchHostedRun({
3560
3581
  parsed: args.parsed,
3561
- target: args.target,
3582
+ target: runTarget,
3562
3583
  runId: response.run.id,
3563
3584
  intervalMs: args.intervalMs,
3564
3585
  timeoutMs: args.timeoutMs,
@@ -3569,15 +3590,14 @@ async function ensureHostedImproveBaseCandidate(args) {
3569
3590
  if (!watched.candidateId) {
3570
3591
  throw new UsageError(`Parent candidate eval ${watched.id} did not produce a candidate.`);
3571
3592
  }
3572
- await tryImportTerminalHostedProjectState({ target: args.target, io: args.io });
3593
+ await tryImportTerminalHostedProjectState({ target: runTarget, io: args.io });
3573
3594
  return watched.candidateId;
3574
3595
  }
3575
3596
  function hostedWorkflowArgsForRun(args) {
3576
3597
  const next = ["--dir", args.sourceDir, "--runs", args.runId, "--json"];
3577
3598
  appendStringFlag(next, "benchmark", asOptionalString(args.parsed.flags.benchmark));
3578
- appendStringFlag(next, "base", asOptionalString(args.parsed.flags.base));
3599
+ appendStringFlag(next, "candidate", asOptionalString(args.parsed.flags.candidate));
3579
3600
  appendStringFlag(next, "samples", asOptionalString(args.parsed.flags.samples));
3580
- appendStringFlag(next, "budget", asOptionalString(args.parsed.flags.budget));
3581
3601
  appendStringFlag(next, "interval-ms", asOptionalString(args.parsed.flags["interval-ms"]));
3582
3602
  appendStringFlag(next, "timeout-ms", asOptionalString(args.parsed.flags["timeout-ms"]));
3583
3603
  if (args.parsed.flags.watch === true) {
@@ -3814,6 +3834,9 @@ async function resolveRemoteProject(projectRef, baseUrl) {
3814
3834
  return response.benchmark;
3815
3835
  }
3816
3836
  function withRunUrls(target, run) {
3837
+ if (!target.owner || !target.projectName) {
3838
+ return { ...run };
3839
+ }
3817
3840
  return {
3818
3841
  ...run,
3819
3842
  urls: buildWorkbenchResourceUrls(target, {
@@ -3822,6 +3845,31 @@ function withRunUrls(target, run) {
3822
3845
  }),
3823
3846
  };
3824
3847
  }
3848
+ function hostedTargetForRunStartResponse(target, response) {
3849
+ const projectId = response.benchmark?.id ?? response.run.projectId ?? target.projectId;
3850
+ if (projectId === target.projectId && !response.benchmark) {
3851
+ return target;
3852
+ }
3853
+ const origin = target.origin?.projectId === projectId ? target.origin : null;
3854
+ const next = {
3855
+ ...target,
3856
+ projectId,
3857
+ origin,
3858
+ };
3859
+ if (response.benchmark?.ownerUsername) {
3860
+ next.owner = response.benchmark.ownerUsername;
3861
+ }
3862
+ else {
3863
+ delete next.owner;
3864
+ }
3865
+ if (response.benchmark?.name) {
3866
+ next.projectName = response.benchmark.name;
3867
+ }
3868
+ else {
3869
+ delete next.projectName;
3870
+ }
3871
+ return next;
3872
+ }
3825
3873
  function hostedRunEvaluationCandidateId(run, jobs = []) {
3826
3874
  if (run.outputCandidateId) {
3827
3875
  return run.outputCandidateId;
@@ -3834,7 +3882,8 @@ function hostedRunEvaluationCandidateId(run, jobs = []) {
3834
3882
  }
3835
3883
  function localProjectState(args) {
3836
3884
  const stateSource = localProjectStateSource(args.source);
3837
- const runtimeFingerprint = workbenchRuntimeBundleFingerprint(args.runtime);
3885
+ const runtime = runtimeBundleForProjectVisibility(args.runtime, args.visibility);
3886
+ const runtimeFingerprint = workbenchRuntimeBundleFingerprint(runtime);
3838
3887
  return {
3839
3888
  schema: "workbench.project.state.v1",
3840
3889
  project: {
@@ -3850,7 +3899,22 @@ function localProjectState(args) {
3850
3899
  runtimeFingerprint: args.origin?.runtimeFingerprint ?? runtimeFingerprint,
3851
3900
  },
3852
3901
  source: stateSource,
3853
- runtime: args.runtime,
3902
+ runtime,
3903
+ };
3904
+ }
3905
+ function localCandidateRecord(candidate) {
3906
+ return {
3907
+ ...candidate,
3908
+ visibility: "private",
3909
+ };
3910
+ }
3911
+ function runtimeBundleForProjectVisibility(runtime, visibility) {
3912
+ return {
3913
+ ...runtime,
3914
+ candidates: runtime.candidates.map((candidate) => ({
3915
+ ...candidate,
3916
+ visibility,
3917
+ })),
3854
3918
  };
3855
3919
  }
3856
3920
  function localProjectStateSource(source) {
@@ -3888,8 +3952,6 @@ function hostedProjectSummaryFromState(state) {
3888
3952
  ownerUsername: state.project.ownerUsername,
3889
3953
  name: state.project.name,
3890
3954
  visibility: state.project.visibility,
3891
- currentSpecVersionId: state.source.revisionId ?? state.base.sourceRevisionId,
3892
- sourceFingerprint: state.source.fingerprint ?? state.base.sourceFingerprint,
3893
3955
  };
3894
3956
  }
3895
3957
  function sourceFileCount(source) {
@@ -3910,28 +3972,6 @@ function hostedProjectSourceRequest(source) {
3910
3972
  resources,
3911
3973
  };
3912
3974
  }
3913
- function hostedEngineResolveFiles(source) {
3914
- return [
3915
- ...source.engineResolveFiles,
3916
- {
3917
- path: WORKBENCH_ADAPTER_RESULT_FILE,
3918
- content: `${JSON.stringify({
3919
- protocol: WORKBENCH_ADAPTER_RESULT_PROTOCOL,
3920
- operation: "engine.resolve",
3921
- ok: true,
3922
- value: {
3923
- cases: source.engineCases,
3924
- ...(source.engineResolveEnvironment
3925
- ? { environment: source.engineResolveEnvironment }
3926
- : {}),
3927
- },
3928
- feedback: {
3929
- path: source.engineResolveFingerprintPath,
3930
- },
3931
- }, null, 2)}\n`,
3932
- },
3933
- ];
3934
- }
3935
3975
  function isRemoteProjectId(value) {
3936
3976
  return /^wb_[a-f0-9]{12}$/u.test(value);
3937
3977
  }
@@ -4147,14 +4187,11 @@ async function writeWorkbenchOrigin(dir, input) {
4147
4187
  return origin;
4148
4188
  }
4149
4189
  async function writeWorkbenchOriginFromState(dir, args) {
4150
- const owner = args.project?.ownerUsername ?? args.state.project.ownerUsername;
4151
- const name = args.project?.name ?? args.state.project.name;
4152
- const sourceRevisionId = args.project?.currentSpecVersionId ??
4153
- args.state.source.revisionId ??
4190
+ const owner = args.state.project.ownerUsername;
4191
+ const name = args.state.project.name;
4192
+ const sourceRevisionId = args.state.source.revisionId ??
4154
4193
  args.state.base.sourceRevisionId;
4155
- const sourceFingerprint = args.sourceFingerprint ??
4156
- args.project?.sourceFingerprint ??
4157
- args.state.source.fingerprint ??
4194
+ const sourceFingerprint = args.state.source.fingerprint ??
4158
4195
  args.state.base.sourceFingerprint;
4159
4196
  const runtimeFingerprint = args.state.base.runtimeFingerprint ??
4160
4197
  workbenchRuntimeBundleFingerprint(args.state.runtime);
@@ -4164,16 +4201,12 @@ async function writeWorkbenchOriginFromState(dir, args) {
4164
4201
  return await writeWorkbenchOrigin(dir, {
4165
4202
  baseUrl: args.baseUrl,
4166
4203
  remote: `${owner}/${name}`,
4167
- projectId: args.project?.id ?? args.state.project.id,
4204
+ projectId: args.state.project.id,
4168
4205
  sourceRevisionId,
4169
4206
  sourceFingerprint,
4170
4207
  runtimeFingerprint,
4171
4208
  });
4172
4209
  }
4173
- async function localSourceFingerprint(dir) {
4174
- const source = localProjectStateSource(await readLocalProjectSource(dir));
4175
- return source.fingerprint ?? workbenchProjectSourceFingerprint(source);
4176
- }
4177
4210
  function parseOriginRemote(origin) {
4178
4211
  return parseRemoteName(origin.remote);
4179
4212
  }
@@ -23,8 +23,10 @@ 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>;
27
- export declare function importLocalRuntimeBundle(workspace: string, bundle: WorkbenchRuntimeBundle): Promise<WorkbenchRuntimeImportResult>;
26
+ export declare function exportLocalRuntimeBundle(workspace: string, options?: {
27
+ currentBenchmarkFingerprint?: string;
28
+ }): Promise<WorkbenchRuntimeBundle>;
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;
30
32
  export declare function readLocalExecutionFiles(workspace: string, jobId: string): Promise<SurfaceSnapshotFile[]>;
@@ -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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"}