anpord 0.1.21 → 0.1.23

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.
Files changed (35) hide show
  1. package/dist/api-context.d.cts +1 -1
  2. package/dist/api-context.d.mts +1 -1
  3. package/dist/{api-mocks-BenVx0e8.d.cts → api-mocks-ofqP55P_.d.cts} +2 -2
  4. package/dist/{api-mocks-BenVx0e8.d.mts → api-mocks-ofqP55P_.d.mts} +2 -2
  5. package/dist/api-runtime.d.cts +1 -1
  6. package/dist/api-runtime.d.mts +1 -1
  7. package/dist/api.d.cts +1 -1
  8. package/dist/api.d.mts +1 -1
  9. package/dist/bin.cjs +51 -40
  10. package/dist/bin.mjs +51 -40
  11. package/dist/{client-CsGxLUZq.d.cts → client-B3LQU8cc.d.cts} +576 -280
  12. package/dist/{client-BZDftC1x.cjs → client-CWVAt_wk.cjs} +1 -1
  13. package/dist/{client-D0l3kwWV.mjs → client-CfPf0hIc.mjs} +1 -1
  14. package/dist/{client-C7iEhiDm.d.mts → client-Cg1qFD01.d.mts} +576 -280
  15. package/dist/{compiler-Cy85vNbp.cjs → compiler-B1UrHfCL.cjs} +18 -1
  16. package/dist/{compiler-DSQRHvXS.mjs → compiler-D9jidpZ0.mjs} +13 -2
  17. package/dist/config.cjs +1 -1
  18. package/dist/config.d.cts +1 -1
  19. package/dist/config.d.mts +1 -1
  20. package/dist/config.mjs +1 -1
  21. package/dist/eval.cjs +1 -1
  22. package/dist/eval.d.cts +1 -1
  23. package/dist/eval.d.mts +1 -1
  24. package/dist/eval.mjs +1 -1
  25. package/dist/{evals-api-CNoLlXL5.cjs → evals-api-DUiZWsyC.cjs} +54 -1
  26. package/dist/{evals-api-CK3F1KoI.mjs → evals-api-NLUUV9tM.mjs} +54 -1
  27. package/dist/index.cjs +3 -2
  28. package/dist/index.d.cts +4 -3
  29. package/dist/index.d.mts +4 -3
  30. package/dist/index.mjs +3 -3
  31. package/dist/{types-Dvd_z5ge.d.cts → types-BnCBSiXY.d.cts} +12 -3
  32. package/dist/{types-D-h67MVJ.d.mts → types-DiNkJRDh.d.mts} +12 -3
  33. package/dist/validator-runtime.d.cts +1 -1
  34. package/dist/validator-runtime.d.mts +1 -1
  35. package/package.json +1 -1
@@ -1,4 +1,4 @@
1
- import { t as ApiCall } from "./api-mocks-BenVx0e8.cjs";
1
+ import { t as ApiCall } from "./api-mocks-ofqP55P_.cjs";
2
2
  //#region src/mock-api/context.d.ts
3
3
  declare const apiContext: {
4
4
  url: (name: string) => Promise<string>;
@@ -1,4 +1,4 @@
1
- import { t as ApiCall } from "./api-mocks-BenVx0e8.mjs";
1
+ import { t as ApiCall } from "./api-mocks-ofqP55P_.mjs";
2
2
  //#region src/mock-api/context.d.ts
3
3
  declare const apiContext: {
4
4
  url: (name: string) => Promise<string>;
@@ -57,11 +57,11 @@ declare const ApiCall_base: Schema.Class<ApiCall, {
57
57
  truncated: typeof Schema.Boolean;
58
58
  }>>>;
59
59
  }>, never, {
60
+ readonly api: string;
61
+ } & {
60
62
  readonly status: number;
61
63
  } & {
62
64
  readonly startedAt: number;
63
- } & {
64
- readonly api: string;
65
65
  } & {
66
66
  readonly path: string;
67
67
  } & {
@@ -57,11 +57,11 @@ declare const ApiCall_base: Schema.Class<ApiCall, {
57
57
  truncated: typeof Schema.Boolean;
58
58
  }>>>;
59
59
  }>, never, {
60
+ readonly api: string;
61
+ } & {
60
62
  readonly status: number;
61
63
  } & {
62
64
  readonly startedAt: number;
63
- } & {
64
- readonly api: string;
65
65
  } & {
66
66
  readonly path: string;
67
67
  } & {
@@ -1,4 +1,4 @@
1
- import { t as ApiCall } from "./api-mocks-BenVx0e8.cjs";
1
+ import { t as ApiCall } from "./api-mocks-ofqP55P_.cjs";
2
2
  import { t as ApiDefinition } from "./define-NZvmQuIv.cjs";
3
3
  //#region src/mock-api/runtime.d.ts
4
4
  declare const withApi: <A>({ api, run }: {
@@ -1,4 +1,4 @@
1
- import { t as ApiCall } from "./api-mocks-BenVx0e8.mjs";
1
+ import { t as ApiCall } from "./api-mocks-ofqP55P_.mjs";
2
2
  import { t as ApiDefinition } from "./define-NZvmQuIv.mjs";
3
3
  //#region src/mock-api/runtime.d.ts
4
4
  declare const withApi: <A>({ api, run }: {
package/dist/api.d.cts CHANGED
@@ -1,4 +1,4 @@
1
- import { t as ApiCall } from "./api-mocks-BenVx0e8.cjs";
1
+ import { t as ApiCall } from "./api-mocks-ofqP55P_.cjs";
2
2
  import { a as endpoint, i as api, n as ApiHandlerContext, r as EndpointDefinition, t as ApiDefinition } from "./define-NZvmQuIv.cjs";
3
3
  import { withApi } from "./api-runtime.cjs";
4
4
  export { type ApiCall, type ApiDefinition, type ApiHandlerContext, type EndpointDefinition, api, endpoint, withApi };
package/dist/api.d.mts CHANGED
@@ -1,4 +1,4 @@
1
- import { t as ApiCall } from "./api-mocks-BenVx0e8.mjs";
1
+ import { t as ApiCall } from "./api-mocks-ofqP55P_.mjs";
2
2
  import { a as endpoint, i as api, n as ApiHandlerContext, r as EndpointDefinition, t as ApiDefinition } from "./define-NZvmQuIv.mjs";
3
3
  import { withApi } from "./api-runtime.mjs";
4
4
  export { type ApiCall, type ApiDefinition, type ApiHandlerContext, type EndpointDefinition, api, endpoint, withApi };
package/dist/bin.cjs CHANGED
@@ -1,12 +1,12 @@
1
1
  #!/usr/bin/env node
2
2
  const require_eval_validations = require("./eval-validations-CZm7vVtQ.cjs");
3
3
  const require_api_mocks = require("./api-mocks-CgiC7T9U.cjs");
4
- const require_client = require("./client-BZDftC1x.cjs");
5
- const require_evals_api = require("./evals-api-CNoLlXL5.cjs");
4
+ const require_client = require("./client-CWVAt_wk.cjs");
5
+ const require_evals_api = require("./evals-api-DUiZWsyC.cjs");
6
6
  const require_eval_turns = require("./eval-turns-DcJ8_1qr.cjs");
7
7
  const require_errors = require("./errors-BX1wry8K.cjs");
8
8
  const require_config = require("./config.cjs");
9
- const require_compiler = require("./compiler-Cy85vNbp.cjs");
9
+ const require_compiler = require("./compiler-B1UrHfCL.cjs");
10
10
  let effect = require("effect");
11
11
  let _effect_platform = require("@effect/platform");
12
12
  let node_fs_promises = require("node:fs/promises");
@@ -19,7 +19,7 @@ let yaml = require("yaml");
19
19
  let node_crypto = require("node:crypto");
20
20
  let node_child_process = require("node:child_process");
21
21
  //#region package.json
22
- var version$1 = "0.1.21";
22
+ var version$1 = "0.1.23";
23
23
  //#endregion
24
24
  //#region ../template/src/extract.ts
25
25
  /** Reads escapes too, so text the renderer leaves literal is never reported as
@@ -653,6 +653,31 @@ const importEval = _effect_cli.Command.make("import", {
653
653
  return yield* note(summaryOf(suite.tally));
654
654
  }).pipe(effect.Effect.withSpan("Cli.evalImport"))).pipe(_effect_cli.Command.withDescription("Turn a case file a team already wrote into a suite"));
655
655
  //#endregion
656
+ //#region ../eval/src/credentials/errors.ts
657
+ var CredentialError = class extends effect.Data.TaggedError("CredentialError") {};
658
+ //#endregion
659
+ //#region ../eval/src/credentials/resolver.ts
660
+ var CredentialResolver = class extends effect.Context.Tag("@anpord/eval/CredentialResolver")() {};
661
+ //#endregion
662
+ //#region ../eval/src/credentials/env-resolver.ts
663
+ const environment = () => Object.fromEntries(Object.entries(process.env).flatMap(([name, value]) => value === void 0 ? [] : [[name, value]]));
664
+ const resolved = (integrationId, values) => effect.Redacted.make({
665
+ authMethodId: "env",
666
+ connectionId: "local",
667
+ integrationId,
668
+ revision: 0,
669
+ values
670
+ });
671
+ const credentialResolverFrom = (values) => effect.Layer.succeed(CredentialResolver, CredentialResolver.of({
672
+ persist: () => effect.Effect.void,
673
+ resolve: ({ integrationId }) => effect.Effect.succeed(resolved(integrationId, values)),
674
+ resolveBound: ({ connectionId }) => effect.Effect.fail(new CredentialError({
675
+ code: "not-found",
676
+ message: `a local run has no stored connection, so ${connectionId} cannot be read`
677
+ }))
678
+ }));
679
+ const CredentialResolverFromEnv = effect.Layer.suspend(() => credentialResolverFrom(environment()));
680
+ //#endregion
656
681
  //#region ../eval/src/domain/harness-profile.ts
657
682
  const profileOfRequest = (profile) => profile === void 0 ? null : {
658
683
  env: profile.env ?? null,
@@ -3244,9 +3269,6 @@ const modelAccessFor = (credentials, organizationId) => effect.Effect.gen(functi
3244
3269
  })));
3245
3270
  });
3246
3271
  //#endregion
3247
- //#region ../eval/src/credentials/resolver.ts
3248
- var CredentialResolver = class extends effect.Context.Tag("@anpord/eval/CredentialResolver")() {};
3249
- //#endregion
3250
3272
  //#region ../eval/src/ports/simulated-user.ts
3251
3273
  var SimulatedUser = class extends effect.Context.Tag("@anpord/eval/SimulatedUser")() {};
3252
3274
  effect.Layer.succeed(SimulatedUser, { reply: () => effect.Effect.succeedNone });
@@ -3300,26 +3322,6 @@ const makeLlmUser = effect.Effect.gen(function* () {
3300
3322
  });
3301
3323
  const SimulatedUserLive = effect.Layer.effect(SimulatedUser, makeLlmUser);
3302
3324
  //#endregion
3303
- //#region ../eval/src/credentials/errors.ts
3304
- var CredentialError = class extends effect.Data.TaggedError("CredentialError") {};
3305
- //#endregion
3306
- //#region ../eval/src/credentials/env-resolver.ts
3307
- const resolved = (integrationId) => effect.Redacted.make({
3308
- authMethodId: "env",
3309
- connectionId: "local",
3310
- integrationId,
3311
- revision: 0,
3312
- values: Object.fromEntries(Object.entries(process.env).flatMap(([name, value]) => value === void 0 ? [] : [[name, value]]))
3313
- });
3314
- const CredentialResolverFromEnv = effect.Layer.succeed(CredentialResolver, CredentialResolver.of({
3315
- persist: () => effect.Effect.void,
3316
- resolve: ({ integrationId }) => effect.Effect.succeed(resolved(integrationId)),
3317
- resolveBound: ({ connectionId }) => effect.Effect.fail(new CredentialError({
3318
- code: "not-found",
3319
- message: `a local run has no stored connection, so ${connectionId} cannot be read`
3320
- }))
3321
- }));
3322
- //#endregion
3323
3325
  //#region ../eval/src/ports/sandbox.ts
3324
3326
  var SandboxProvider = class extends effect.Context.Tag("@anpord/eval/SandboxProvider")() {};
3325
3327
  var SandboxAdapters = class extends effect.Context.Tag("@anpord/eval/SandboxAdapters")() {};
@@ -4483,7 +4485,8 @@ const SandboxProviderLive = effect.Layer.effect(SandboxProvider, effect.Effect.g
4483
4485
  //#endregion
4484
4486
  //#region ../eval/src/local-layer.ts
4485
4487
  const LocalAdaptersLive = effect.Layer.effect(SandboxAdapters, effect.Effect.map(effect.Effect.cached(makeLocalAdapter), (local) => SandboxAdapters.of({ resolve: (provider) => provider === "local" ? local : effect.Effect.dieMessage(`a local run cannot open a ${provider} sandbox`) })));
4486
- const EvalLocalLive = LocalTrialsLive.pipe(effect.Layer.provide(AgentTrialJudgedLive.pipe(effect.Layer.provide(AgentTrialLive.pipe(effect.Layer.provide(ScorerChecksLive.pipe(effect.Layer.provide(ScorerGroundTruthLive))), effect.Layer.provide(SuspenderSleeping), effect.Layer.provide(SimulatedUserLive.pipe(effect.Layer.provide(_effect_platform.FetchHttpClient.layer))))), effect.Layer.provide(JudgeModelLive.pipe(effect.Layer.provide(_effect_platform.FetchHttpClient.layer))), effect.Layer.provide(effect.Layer.mergeAll(HarnessesLive, HarnessVersionsLive)))), effect.Layer.provide(CredentialResolverFromEnv), effect.Layer.provide(SandboxProviderLive.pipe(effect.Layer.provide(LocalAdaptersLive))));
4488
+ const evalLocalWith = (credentials) => LocalTrialsLive.pipe(effect.Layer.provide(AgentTrialJudgedLive.pipe(effect.Layer.provide(AgentTrialLive.pipe(effect.Layer.provide(ScorerChecksLive.pipe(effect.Layer.provide(ScorerGroundTruthLive))), effect.Layer.provide(SuspenderSleeping), effect.Layer.provide(SimulatedUserLive.pipe(effect.Layer.provide(_effect_platform.FetchHttpClient.layer))))), effect.Layer.provide(JudgeModelLive.pipe(effect.Layer.provide(_effect_platform.FetchHttpClient.layer))), effect.Layer.provide(effect.Layer.mergeAll(HarnessesLive, HarnessVersionsLive)))), effect.Layer.provide(credentials), effect.Layer.provide(SandboxProviderLive.pipe(effect.Layer.provide(LocalAdaptersLive))), effect.Layer.provideMerge(HarnessVersionsLive));
4489
+ const EvalLocalLive = evalLocalWith(CredentialResolverFromEnv);
4487
4490
  //#endregion
4488
4491
  //#region src/cli/local-env.ts
4489
4492
  const FILES = [".env.local", ".env"];
@@ -4509,25 +4512,27 @@ const read = (directory, file) => {
4509
4512
  const localEnv = (directory) => Object.assign({}, ...FILES.map((file) => read(directory, file)).reverse(), parse(Object.entries(process.env).map(([name, value]) => `${name}=${value ?? ""}`).join("\n")));
4510
4513
  //#endregion
4511
4514
  //#region src/cli/eval-local.ts
4512
- const runLocally = (request, onTrial) => effect.Effect.gen(function* () {
4515
+ const runLocally = (request, options = {}) => effect.Effect.gen(function* () {
4513
4516
  const trials = yield* LocalTrials;
4517
+ const versions = yield* HarnessVersions;
4514
4518
  const forwarded = localEnv(process.cwd());
4515
4519
  const task = request.tasks[0];
4516
4520
  if (task === void 0) return [];
4521
+ const harnessVersion = yield* versions.version(task.harness);
4517
4522
  return yield* effect.Effect.forEach(request.cases, (subject) => trials.run({
4518
4523
  caseName: subject.name,
4519
4524
  forwarded,
4520
4525
  harness: task.harness,
4521
- harnessVersion: "local",
4526
+ harnessVersion,
4522
4527
  model: task.model,
4523
4528
  prepare: subject.prepare ?? null,
4524
4529
  profile: profileOfRequest(task.profile),
4525
4530
  prompt: request.prompt,
4526
- source: { kind: "empty" },
4531
+ source: subject.source ?? { kind: "empty" },
4527
4532
  user: subject.user ?? null,
4528
4533
  validator: subject.validator ?? null,
4529
4534
  verifyCommand: subject.verify
4530
- }).pipe(effect.Effect.tap((outcome) => onTrial?.({
4535
+ }).pipe(effect.Effect.tap((outcome) => options.onTrial?.({
4531
4536
  caseName: subject.name,
4532
4537
  events: outcome.events,
4533
4538
  ordinal: 0,
@@ -4540,7 +4545,7 @@ const runLocally = (request, onTrial) => effect.Effect.gen(function* () {
4540
4545
  name: subject.name,
4541
4546
  status: outcome.outcome.status
4542
4547
  }))), { concurrency: 1 });
4543
- }).pipe(effect.Effect.provide(EvalLocalLive), effect.Effect.scoped, effect.Effect.withConfigProvider(effect.ConfigProvider.fromEnv().pipe(effect.ConfigProvider.orElse(() => effect.ConfigProvider.fromMap(/* @__PURE__ */ new Map([["ANPORD_LOCAL_SANDBOX", "true"]]))))));
4548
+ }).pipe(effect.Effect.provide(options.credentials === void 0 ? EvalLocalLive : evalLocalWith(credentialResolverFrom(options.credentials))), effect.Effect.scoped, effect.Effect.withConfigProvider(effect.ConfigProvider.fromEnv().pipe(effect.ConfigProvider.orElse(() => effect.ConfigProvider.fromMap(/* @__PURE__ */ new Map([["ANPORD_LOCAL_SANDBOX", "true"]]))))));
4544
4549
  const seconds = (ms) => `${(ms / 1e3).toFixed(1)}s`;
4545
4550
  const reportLocal = (file, cases) => effect.Effect.forEach([`${file}: ${cases.length} case(s) on this machine`, ...cases.map((one) => ` ${one.status} ${one.name} ${seconds(one.durationMs)}`)], note);
4546
4551
  const localProblems = (cases) => cases.flatMap((one) => one.status === "passed" ? [] : [`${one.name} ${one.status}`]);
@@ -4819,13 +4824,19 @@ const recordedLocally = (file) => effect.Effect.gen(function* () {
4819
4824
  trigger
4820
4825
  } });
4821
4826
  yield* reportStarted(file, started.id);
4822
- const cases = yield* runLocally(payload, (trial) => api.evals.reportTrial({ payload: {
4823
- id: started.id,
4824
- trial
4825
- } }).pipe(effect.Effect.ignore));
4826
- yield* api.evals.finishRun({ payload: { id: started.id } }).pipe(effect.Effect.ignore);
4827
- return cases;
4828
- }).pipe(effect.Effect.provide(require_config.ClientLayer));
4827
+ yield* effect.Effect.addFinalizer(() => api.evals.finishRun({ payload: { id: started.id } }).pipe(effect.Effect.ignore));
4828
+ const leased = yield* api.evals.credentials({ payload: {
4829
+ harness: payload.tasks[0]?.harness ?? "codex",
4830
+ id: started.id
4831
+ } }).pipe(effect.Effect.map((lease) => lease.values), effect.Effect.catchAll(() => effect.Effect.succeed(void 0)));
4832
+ return yield* runLocally(payload, {
4833
+ credentials: leased,
4834
+ onTrial: (trial) => api.evals.reportTrial({ payload: {
4835
+ id: started.id,
4836
+ trial
4837
+ } }).pipe(effect.Effect.ignore)
4838
+ });
4839
+ }).pipe(effect.Effect.scoped, effect.Effect.provide(require_config.ClientLayer));
4829
4840
  const runOneEvalLocally = (file) => require_config.apiKeyConfig.pipe(effect.Effect.matchEffect({
4830
4841
  onFailure: () => require_compiler.compileEvalEffect(file).pipe(effect.Effect.flatMap((payload) => runLocally(payload))),
4831
4842
  onSuccess: () => recordedLocally(file)
package/dist/bin.mjs CHANGED
@@ -1,12 +1,12 @@
1
1
  #!/usr/bin/env node
2
2
  import { c as validationExecution, i as VALIDATION_TEXT_LIMIT, l as validationSnapshot, r as VALIDATION_FRAME, s as validationCapture, t as EvalValidation } from "./eval-validations-DNO-qwkU.mjs";
3
3
  import { a as ApiCall, i as API_READY, o as ApiManifest, r as API_PROGRAM, s as ApiProgram, t as API_JOURNAL } from "./api-mocks-BYWvJp9v.mjs";
4
- import { a as ChannelName, o as PromptId, s as VersionNumber, t as AnpordApi } from "./client-D0l3kwWV.mjs";
5
- import { a as EvalSandbox, i as EvalRun, p as EvalTrigger, r as HarnessEvent } from "./evals-api-CK3F1KoI.mjs";
4
+ import { a as ChannelName, o as PromptId, s as VersionNumber, t as AnpordApi } from "./client-CfPf0hIc.mjs";
5
+ import { a as EvalSandbox, i as EvalRun, p as EvalTrigger, r as HarnessEvent } from "./evals-api-NLUUV9tM.mjs";
6
6
  import { t as DEFAULT_USER_MODEL } from "./eval-turns-BC-GMHD-.mjs";
7
7
  import { i as tokenMatcher, r as asAnpordError } from "./errors-B0YknR5V.mjs";
8
8
  import { ClientLayer, apiKeyConfig, webUrlConfig } from "./config.mjs";
9
- import { r as compileEvalEffect } from "./compiler-DSQRHvXS.mjs";
9
+ import { r as compileEvalEffect } from "./compiler-D9jidpZ0.mjs";
10
10
  import { Array as Array$1, Cause, Chunk, Clock, Config, ConfigProvider, Console, Context, Data, Deferred, Duration, Effect, Fiber, JSONSchema, Layer, Option, ParseResult, Random, Redacted, Ref, Schedule, Schema, Stream, pipe } from "effect";
11
11
  import { FetchHttpClient, FileSystem, HttpClient, HttpClientError, HttpClientRequest, HttpClientResponse } from "@effect/platform";
12
12
  import { cp, mkdir, mkdtemp, readFile, rm, stat, writeFile } from "node:fs/promises";
@@ -19,7 +19,7 @@ import { parseDocument } from "yaml";
19
19
  import { createHash } from "node:crypto";
20
20
  import { spawn } from "node:child_process";
21
21
  //#region package.json
22
- var version$1 = "0.1.21";
22
+ var version$1 = "0.1.23";
23
23
  //#endregion
24
24
  //#region ../template/src/extract.ts
25
25
  /** Reads escapes too, so text the renderer leaves literal is never reported as
@@ -653,6 +653,31 @@ const importEval = Command.make("import", {
653
653
  return yield* note(summaryOf(suite.tally));
654
654
  }).pipe(Effect.withSpan("Cli.evalImport"))).pipe(Command.withDescription("Turn a case file a team already wrote into a suite"));
655
655
  //#endregion
656
+ //#region ../eval/src/credentials/errors.ts
657
+ var CredentialError = class extends Data.TaggedError("CredentialError") {};
658
+ //#endregion
659
+ //#region ../eval/src/credentials/resolver.ts
660
+ var CredentialResolver = class extends Context.Tag("@anpord/eval/CredentialResolver")() {};
661
+ //#endregion
662
+ //#region ../eval/src/credentials/env-resolver.ts
663
+ const environment = () => Object.fromEntries(Object.entries(process.env).flatMap(([name, value]) => value === void 0 ? [] : [[name, value]]));
664
+ const resolved = (integrationId, values) => Redacted.make({
665
+ authMethodId: "env",
666
+ connectionId: "local",
667
+ integrationId,
668
+ revision: 0,
669
+ values
670
+ });
671
+ const credentialResolverFrom = (values) => Layer.succeed(CredentialResolver, CredentialResolver.of({
672
+ persist: () => Effect.void,
673
+ resolve: ({ integrationId }) => Effect.succeed(resolved(integrationId, values)),
674
+ resolveBound: ({ connectionId }) => Effect.fail(new CredentialError({
675
+ code: "not-found",
676
+ message: `a local run has no stored connection, so ${connectionId} cannot be read`
677
+ }))
678
+ }));
679
+ const CredentialResolverFromEnv = Layer.suspend(() => credentialResolverFrom(environment()));
680
+ //#endregion
656
681
  //#region ../eval/src/domain/harness-profile.ts
657
682
  const profileOfRequest = (profile) => profile === void 0 ? null : {
658
683
  env: profile.env ?? null,
@@ -3244,9 +3269,6 @@ const modelAccessFor = (credentials, organizationId) => Effect.gen(function* ()
3244
3269
  })));
3245
3270
  });
3246
3271
  //#endregion
3247
- //#region ../eval/src/credentials/resolver.ts
3248
- var CredentialResolver = class extends Context.Tag("@anpord/eval/CredentialResolver")() {};
3249
- //#endregion
3250
3272
  //#region ../eval/src/ports/simulated-user.ts
3251
3273
  var SimulatedUser = class extends Context.Tag("@anpord/eval/SimulatedUser")() {};
3252
3274
  Layer.succeed(SimulatedUser, { reply: () => Effect.succeedNone });
@@ -3300,26 +3322,6 @@ const makeLlmUser = Effect.gen(function* () {
3300
3322
  });
3301
3323
  const SimulatedUserLive = Layer.effect(SimulatedUser, makeLlmUser);
3302
3324
  //#endregion
3303
- //#region ../eval/src/credentials/errors.ts
3304
- var CredentialError = class extends Data.TaggedError("CredentialError") {};
3305
- //#endregion
3306
- //#region ../eval/src/credentials/env-resolver.ts
3307
- const resolved = (integrationId) => Redacted.make({
3308
- authMethodId: "env",
3309
- connectionId: "local",
3310
- integrationId,
3311
- revision: 0,
3312
- values: Object.fromEntries(Object.entries(process.env).flatMap(([name, value]) => value === void 0 ? [] : [[name, value]]))
3313
- });
3314
- const CredentialResolverFromEnv = Layer.succeed(CredentialResolver, CredentialResolver.of({
3315
- persist: () => Effect.void,
3316
- resolve: ({ integrationId }) => Effect.succeed(resolved(integrationId)),
3317
- resolveBound: ({ connectionId }) => Effect.fail(new CredentialError({
3318
- code: "not-found",
3319
- message: `a local run has no stored connection, so ${connectionId} cannot be read`
3320
- }))
3321
- }));
3322
- //#endregion
3323
3325
  //#region ../eval/src/ports/sandbox.ts
3324
3326
  var SandboxProvider = class extends Context.Tag("@anpord/eval/SandboxProvider")() {};
3325
3327
  var SandboxAdapters = class extends Context.Tag("@anpord/eval/SandboxAdapters")() {};
@@ -4483,7 +4485,8 @@ const SandboxProviderLive = Layer.effect(SandboxProvider, Effect.gen(function* (
4483
4485
  //#endregion
4484
4486
  //#region ../eval/src/local-layer.ts
4485
4487
  const LocalAdaptersLive = Layer.effect(SandboxAdapters, Effect.map(Effect.cached(makeLocalAdapter), (local) => SandboxAdapters.of({ resolve: (provider) => provider === "local" ? local : Effect.dieMessage(`a local run cannot open a ${provider} sandbox`) })));
4486
- const EvalLocalLive = LocalTrialsLive.pipe(Layer.provide(AgentTrialJudgedLive.pipe(Layer.provide(AgentTrialLive.pipe(Layer.provide(ScorerChecksLive.pipe(Layer.provide(ScorerGroundTruthLive))), Layer.provide(SuspenderSleeping), Layer.provide(SimulatedUserLive.pipe(Layer.provide(FetchHttpClient.layer))))), Layer.provide(JudgeModelLive.pipe(Layer.provide(FetchHttpClient.layer))), Layer.provide(Layer.mergeAll(HarnessesLive, HarnessVersionsLive)))), Layer.provide(CredentialResolverFromEnv), Layer.provide(SandboxProviderLive.pipe(Layer.provide(LocalAdaptersLive))));
4488
+ const evalLocalWith = (credentials) => LocalTrialsLive.pipe(Layer.provide(AgentTrialJudgedLive.pipe(Layer.provide(AgentTrialLive.pipe(Layer.provide(ScorerChecksLive.pipe(Layer.provide(ScorerGroundTruthLive))), Layer.provide(SuspenderSleeping), Layer.provide(SimulatedUserLive.pipe(Layer.provide(FetchHttpClient.layer))))), Layer.provide(JudgeModelLive.pipe(Layer.provide(FetchHttpClient.layer))), Layer.provide(Layer.mergeAll(HarnessesLive, HarnessVersionsLive)))), Layer.provide(credentials), Layer.provide(SandboxProviderLive.pipe(Layer.provide(LocalAdaptersLive))), Layer.provideMerge(HarnessVersionsLive));
4489
+ const EvalLocalLive = evalLocalWith(CredentialResolverFromEnv);
4487
4490
  //#endregion
4488
4491
  //#region src/cli/local-env.ts
4489
4492
  const FILES = [".env.local", ".env"];
@@ -4509,25 +4512,27 @@ const read = (directory, file) => {
4509
4512
  const localEnv = (directory) => Object.assign({}, ...FILES.map((file) => read(directory, file)).reverse(), parse(Object.entries(process.env).map(([name, value]) => `${name}=${value ?? ""}`).join("\n")));
4510
4513
  //#endregion
4511
4514
  //#region src/cli/eval-local.ts
4512
- const runLocally = (request, onTrial) => Effect.gen(function* () {
4515
+ const runLocally = (request, options = {}) => Effect.gen(function* () {
4513
4516
  const trials = yield* LocalTrials;
4517
+ const versions = yield* HarnessVersions;
4514
4518
  const forwarded = localEnv(process.cwd());
4515
4519
  const task = request.tasks[0];
4516
4520
  if (task === void 0) return [];
4521
+ const harnessVersion = yield* versions.version(task.harness);
4517
4522
  return yield* Effect.forEach(request.cases, (subject) => trials.run({
4518
4523
  caseName: subject.name,
4519
4524
  forwarded,
4520
4525
  harness: task.harness,
4521
- harnessVersion: "local",
4526
+ harnessVersion,
4522
4527
  model: task.model,
4523
4528
  prepare: subject.prepare ?? null,
4524
4529
  profile: profileOfRequest(task.profile),
4525
4530
  prompt: request.prompt,
4526
- source: { kind: "empty" },
4531
+ source: subject.source ?? { kind: "empty" },
4527
4532
  user: subject.user ?? null,
4528
4533
  validator: subject.validator ?? null,
4529
4534
  verifyCommand: subject.verify
4530
- }).pipe(Effect.tap((outcome) => onTrial?.({
4535
+ }).pipe(Effect.tap((outcome) => options.onTrial?.({
4531
4536
  caseName: subject.name,
4532
4537
  events: outcome.events,
4533
4538
  ordinal: 0,
@@ -4540,7 +4545,7 @@ const runLocally = (request, onTrial) => Effect.gen(function* () {
4540
4545
  name: subject.name,
4541
4546
  status: outcome.outcome.status
4542
4547
  }))), { concurrency: 1 });
4543
- }).pipe(Effect.provide(EvalLocalLive), Effect.scoped, Effect.withConfigProvider(ConfigProvider.fromEnv().pipe(ConfigProvider.orElse(() => ConfigProvider.fromMap(/* @__PURE__ */ new Map([["ANPORD_LOCAL_SANDBOX", "true"]]))))));
4548
+ }).pipe(Effect.provide(options.credentials === void 0 ? EvalLocalLive : evalLocalWith(credentialResolverFrom(options.credentials))), Effect.scoped, Effect.withConfigProvider(ConfigProvider.fromEnv().pipe(ConfigProvider.orElse(() => ConfigProvider.fromMap(/* @__PURE__ */ new Map([["ANPORD_LOCAL_SANDBOX", "true"]]))))));
4544
4549
  const seconds = (ms) => `${(ms / 1e3).toFixed(1)}s`;
4545
4550
  const reportLocal = (file, cases) => Effect.forEach([`${file}: ${cases.length} case(s) on this machine`, ...cases.map((one) => ` ${one.status} ${one.name} ${seconds(one.durationMs)}`)], note);
4546
4551
  const localProblems = (cases) => cases.flatMap((one) => one.status === "passed" ? [] : [`${one.name} ${one.status}`]);
@@ -4819,13 +4824,19 @@ const recordedLocally = (file) => Effect.gen(function* () {
4819
4824
  trigger
4820
4825
  } });
4821
4826
  yield* reportStarted(file, started.id);
4822
- const cases = yield* runLocally(payload, (trial) => api.evals.reportTrial({ payload: {
4823
- id: started.id,
4824
- trial
4825
- } }).pipe(Effect.ignore));
4826
- yield* api.evals.finishRun({ payload: { id: started.id } }).pipe(Effect.ignore);
4827
- return cases;
4828
- }).pipe(Effect.provide(ClientLayer));
4827
+ yield* Effect.addFinalizer(() => api.evals.finishRun({ payload: { id: started.id } }).pipe(Effect.ignore));
4828
+ const leased = yield* api.evals.credentials({ payload: {
4829
+ harness: payload.tasks[0]?.harness ?? "codex",
4830
+ id: started.id
4831
+ } }).pipe(Effect.map((lease) => lease.values), Effect.catchAll(() => Effect.succeed(void 0)));
4832
+ return yield* runLocally(payload, {
4833
+ credentials: leased,
4834
+ onTrial: (trial) => api.evals.reportTrial({ payload: {
4835
+ id: started.id,
4836
+ trial
4837
+ } }).pipe(Effect.ignore)
4838
+ });
4839
+ }).pipe(Effect.scoped, Effect.provide(ClientLayer));
4829
4840
  const runOneEvalLocally = (file) => apiKeyConfig.pipe(Effect.matchEffect({
4830
4841
  onFailure: () => compileEvalEffect(file).pipe(Effect.flatMap((payload) => runLocally(payload))),
4831
4842
  onSuccess: () => recordedLocally(file)