anpord 0.1.21 → 0.1.22

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 (43) 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-B8a93t2t.d.cts} +8 -8
  4. package/dist/{api-mocks-BenVx0e8.d.mts → api-mocks-B8a93t2t.d.mts} +8 -8
  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 +45 -35
  10. package/dist/bin.mjs +45 -35
  11. package/dist/{client-CsGxLUZq.d.cts → client-CE9VurDH.d.cts} +1190 -894
  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-EdYxRHX0.d.mts} +1190 -894
  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-turns-CTCoSuB6.d.cts → eval-turns-Uwe0G7PS.d.cts} +1 -1
  22. package/dist/{eval-turns-CTCoSuB6.d.mts → eval-turns-Uwe0G7PS.d.mts} +1 -1
  23. package/dist/eval.cjs +1 -1
  24. package/dist/eval.d.cts +1 -1
  25. package/dist/eval.d.mts +1 -1
  26. package/dist/eval.mjs +1 -1
  27. package/dist/{evals-Dw2Ek-mx.d.cts → evals-M2G4zvnS.d.cts} +36 -36
  28. package/dist/{evals-Dw2Ek-mx.d.mts → evals-M2G4zvnS.d.mts} +36 -36
  29. package/dist/{evals-api-CNoLlXL5.cjs → evals-api-DUiZWsyC.cjs} +54 -1
  30. package/dist/{evals-api-CK3F1KoI.mjs → evals-api-NLUUV9tM.mjs} +54 -1
  31. package/dist/index.cjs +3 -2
  32. package/dist/index.d.cts +5 -4
  33. package/dist/index.d.mts +5 -4
  34. package/dist/index.mjs +3 -3
  35. package/dist/source.d.cts +1 -1
  36. package/dist/source.d.mts +1 -1
  37. package/dist/{types-D-h67MVJ.d.mts → types-B1rRGWeL.d.mts} +27 -18
  38. package/dist/{types-Dvd_z5ge.d.cts → types-C1Np-yYM.d.cts} +27 -18
  39. package/dist/validator-runtime.d.cts +1 -1
  40. package/dist/validator-runtime.d.mts +1 -1
  41. package/dist/validators.d.cts +1 -1
  42. package/dist/validators.d.mts +1 -1
  43. 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-B8a93t2t.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-B8a93t2t.mjs";
2
2
  //#region src/mock-api/context.d.ts
3
3
  declare const apiContext: {
4
4
  url: (name: string) => Promise<string>;
@@ -57,15 +57,7 @@ declare const ApiCall_base: Schema.Class<ApiCall, {
57
57
  truncated: typeof Schema.Boolean;
58
58
  }>>>;
59
59
  }>, never, {
60
- readonly status: number;
61
- } & {
62
- readonly startedAt: number;
63
- } & {
64
60
  readonly api: string;
65
- } & {
66
- readonly path: string;
67
- } & {
68
- readonly index: number;
69
61
  } & {
70
62
  readonly output: {
71
63
  readonly text: string;
@@ -80,6 +72,14 @@ declare const ApiCall_base: Schema.Class<ApiCall, {
80
72
  readonly format: "text" | "json";
81
73
  readonly state: "captured" | "disabled" | "unavailable";
82
74
  };
75
+ } & {
76
+ readonly status: number;
77
+ } & {
78
+ readonly startedAt: number;
79
+ } & {
80
+ readonly path: string;
81
+ } & {
82
+ readonly index: number;
83
83
  } & {
84
84
  readonly error: string | null;
85
85
  } & {
@@ -57,15 +57,7 @@ declare const ApiCall_base: Schema.Class<ApiCall, {
57
57
  truncated: typeof Schema.Boolean;
58
58
  }>>>;
59
59
  }>, never, {
60
- readonly status: number;
61
- } & {
62
- readonly startedAt: number;
63
- } & {
64
60
  readonly api: string;
65
- } & {
66
- readonly path: string;
67
- } & {
68
- readonly index: number;
69
61
  } & {
70
62
  readonly output: {
71
63
  readonly text: string;
@@ -80,6 +72,14 @@ declare const ApiCall_base: Schema.Class<ApiCall, {
80
72
  readonly format: "text" | "json";
81
73
  readonly state: "captured" | "disabled" | "unavailable";
82
74
  };
75
+ } & {
76
+ readonly status: number;
77
+ } & {
78
+ readonly startedAt: number;
79
+ } & {
80
+ readonly path: string;
81
+ } & {
82
+ readonly index: number;
83
83
  } & {
84
84
  readonly error: string | null;
85
85
  } & {
@@ -1,4 +1,4 @@
1
- import { t as ApiCall } from "./api-mocks-BenVx0e8.cjs";
1
+ import { t as ApiCall } from "./api-mocks-B8a93t2t.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-B8a93t2t.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-B8a93t2t.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-B8a93t2t.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.22";
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))));
4489
+ const EvalLocalLive = evalLocalWith(CredentialResolverFromEnv);
4487
4490
  //#endregion
4488
4491
  //#region src/cli/local-env.ts
4489
4492
  const FILES = [".env.local", ".env"];
@@ -4509,7 +4512,7 @@ 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;
4514
4517
  const forwarded = localEnv(process.cwd());
4515
4518
  const task = request.tasks[0];
@@ -4527,7 +4530,7 @@ const runLocally = (request, onTrial) => effect.Effect.gen(function* () {
4527
4530
  user: subject.user ?? null,
4528
4531
  validator: subject.validator ?? null,
4529
4532
  verifyCommand: subject.verify
4530
- }).pipe(effect.Effect.tap((outcome) => onTrial?.({
4533
+ }).pipe(effect.Effect.tap((outcome) => options.onTrial?.({
4531
4534
  caseName: subject.name,
4532
4535
  events: outcome.events,
4533
4536
  ordinal: 0,
@@ -4540,7 +4543,7 @@ const runLocally = (request, onTrial) => effect.Effect.gen(function* () {
4540
4543
  name: subject.name,
4541
4544
  status: outcome.outcome.status
4542
4545
  }))), { 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"]]))))));
4546
+ }).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
4547
  const seconds = (ms) => `${(ms / 1e3).toFixed(1)}s`;
4545
4548
  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
4549
  const localProblems = (cases) => cases.flatMap((one) => one.status === "passed" ? [] : [`${one.name} ${one.status}`]);
@@ -4819,10 +4822,17 @@ const recordedLocally = (file) => effect.Effect.gen(function* () {
4819
4822
  trigger
4820
4823
  } });
4821
4824
  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));
4825
+ const leased = yield* api.evals.credentials({ payload: {
4826
+ harness: payload.tasks[0]?.harness ?? "codex",
4827
+ id: started.id
4828
+ } }).pipe(effect.Effect.map((lease) => lease.values), effect.Effect.catchAll(() => effect.Effect.succeed(void 0)));
4829
+ const cases = yield* runLocally(payload, {
4830
+ credentials: leased,
4831
+ onTrial: (trial) => api.evals.reportTrial({ payload: {
4832
+ id: started.id,
4833
+ trial
4834
+ } }).pipe(effect.Effect.ignore)
4835
+ });
4826
4836
  yield* api.evals.finishRun({ payload: { id: started.id } }).pipe(effect.Effect.ignore);
4827
4837
  return cases;
4828
4838
  }).pipe(effect.Effect.provide(require_config.ClientLayer));
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.22";
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))));
4489
+ const EvalLocalLive = evalLocalWith(CredentialResolverFromEnv);
4487
4490
  //#endregion
4488
4491
  //#region src/cli/local-env.ts
4489
4492
  const FILES = [".env.local", ".env"];
@@ -4509,7 +4512,7 @@ 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;
4514
4517
  const forwarded = localEnv(process.cwd());
4515
4518
  const task = request.tasks[0];
@@ -4527,7 +4530,7 @@ const runLocally = (request, onTrial) => Effect.gen(function* () {
4527
4530
  user: subject.user ?? null,
4528
4531
  validator: subject.validator ?? null,
4529
4532
  verifyCommand: subject.verify
4530
- }).pipe(Effect.tap((outcome) => onTrial?.({
4533
+ }).pipe(Effect.tap((outcome) => options.onTrial?.({
4531
4534
  caseName: subject.name,
4532
4535
  events: outcome.events,
4533
4536
  ordinal: 0,
@@ -4540,7 +4543,7 @@ const runLocally = (request, onTrial) => Effect.gen(function* () {
4540
4543
  name: subject.name,
4541
4544
  status: outcome.outcome.status
4542
4545
  }))), { 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"]]))))));
4546
+ }).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
4547
  const seconds = (ms) => `${(ms / 1e3).toFixed(1)}s`;
4545
4548
  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
4549
  const localProblems = (cases) => cases.flatMap((one) => one.status === "passed" ? [] : [`${one.name} ${one.status}`]);
@@ -4819,10 +4822,17 @@ const recordedLocally = (file) => Effect.gen(function* () {
4819
4822
  trigger
4820
4823
  } });
4821
4824
  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));
4825
+ const leased = yield* api.evals.credentials({ payload: {
4826
+ harness: payload.tasks[0]?.harness ?? "codex",
4827
+ id: started.id
4828
+ } }).pipe(Effect.map((lease) => lease.values), Effect.catchAll(() => Effect.succeed(void 0)));
4829
+ const cases = yield* runLocally(payload, {
4830
+ credentials: leased,
4831
+ onTrial: (trial) => api.evals.reportTrial({ payload: {
4832
+ id: started.id,
4833
+ trial
4834
+ } }).pipe(Effect.ignore)
4835
+ });
4826
4836
  yield* api.evals.finishRun({ payload: { id: started.id } }).pipe(Effect.ignore);
4827
4837
  return cases;
4828
4838
  }).pipe(Effect.provide(ClientLayer));