@aether-agent/evals 0.5.2 → 0.5.4

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.
package/dist/diff.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"diff.js","sourceRoot":"","sources":["../src/diff.ts"],"names":[],"mappings":"AAWA,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC5C,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,IAAI,YAAY,GAAG,CAAC,CAAC;IAErB,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACpC,IAAI,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;YAClC,YAAY,IAAI,CAAC,CAAC;QACpB,CAAC;aAAM,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;YAC3D,UAAU,IAAI,CAAC,CAAC;QAClB,CAAC;aAAM,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;YAC3D,YAAY,IAAI,CAAC,CAAC;QACpB,CAAC;IACH,CAAC;IAED,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,CAAC;AACpD,CAAC"}
1
+ {"version":3,"file":"diff.js","sourceRoot":"","sources":["../src/diff.ts"],"names":[],"mappings":"AAWA,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC5C,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,IAAI,YAAY,GAAG,CAAC,CAAC;IAErB,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACpC,IAAI,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;YAClC,YAAY,IAAI,CAAC,CAAC;QACpB,CAAC;aAAM,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;YAC3D,UAAU,IAAI,CAAC,CAAC;QAClB,CAAC;aAAM,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;YAC3D,YAAY,IAAI,CAAC,CAAC;QACpB,CAAC;IACH,CAAC;IAED,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,CAAC;AACpD,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,IAAY;IACpC,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,iBAAiB,CAAC,IAAI,CAAC,EAAE,CAAC;AAClD,CAAC"}
package/dist/env.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ export declare const CONTAINER_AETHER_HOME = "/root/.aether";
2
+ export declare function evalEnvVars(model: string, hostEnv?: Record<string, string | undefined>): Record<string, string>;
3
+ //# sourceMappingURL=env.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../src/env.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,qBAAqB,kBAAkB,CAAC;AAErD,wBAAgB,WAAW,CACzB,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAe,GACxD,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAQxB"}
package/dist/env.js ADDED
@@ -0,0 +1,46 @@
1
+ import { AetherEvalError } from "./errors.js";
2
+ export const CONTAINER_AETHER_HOME = "/root/.aether";
3
+ export function evalEnvVars(model, hostEnv = process.env) {
4
+ const env = {};
5
+ for (const key of new Set(model.split(",").flatMap(providerEnvVars))) {
6
+ const value = hostEnv[key];
7
+ if (value !== undefined)
8
+ env[key] = value;
9
+ }
10
+ env.AETHER_HOME = CONTAINER_AETHER_HOME;
11
+ return env;
12
+ }
13
+ const AWS_ENV_VARS = [
14
+ "AWS_ACCESS_KEY_ID",
15
+ "AWS_BEARER_TOKEN_BEDROCK",
16
+ "AWS_DEFAULT_REGION",
17
+ "AWS_PROFILE",
18
+ "AWS_REGION",
19
+ "AWS_SECRET_ACCESS_KEY",
20
+ "AWS_SESSION_TOKEN",
21
+ ];
22
+ const PROVIDER_ENV_VARS = {
23
+ anthropic: ["ANTHROPIC_API_KEY"],
24
+ "azure-foundry": ["AZURE_OPENAI_API_KEY"],
25
+ bedrock: AWS_ENV_VARS,
26
+ codex: [],
27
+ deepseek: ["DEEPSEEK_API_KEY"],
28
+ fireworks: ["FIREWORKS_API_KEY"],
29
+ gemini: ["GEMINI_API_KEY"],
30
+ llamacpp: ["LLAMA_CPP_HOST"],
31
+ moonshot: ["MOONSHOT_API_KEY"],
32
+ ollama: ["OLLAMA_HOST"],
33
+ openai: ["OPENAI_API_KEY"],
34
+ openrouter: ["OPENROUTER_API_KEY"],
35
+ xiaomi: ["XIAOMI_API_KEY"],
36
+ zai: ["ZAI_API_KEY"],
37
+ };
38
+ function providerEnvVars(model) {
39
+ const provider = model.trim().split(":")[0] ?? "";
40
+ const envVars = PROVIDER_ENV_VARS[provider];
41
+ if (!envVars) {
42
+ throw new AetherEvalError("configuration_error", `unknown provider in model spec: ${model}`);
43
+ }
44
+ return envVars;
45
+ }
46
+ //# sourceMappingURL=env.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.js","sourceRoot":"","sources":["../src/env.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE9C,MAAM,CAAC,MAAM,qBAAqB,GAAG,eAAe,CAAC;AAErD,MAAM,UAAU,WAAW,CACzB,KAAa,EACb,OAAO,GAAuC,OAAO,CAAC,GAAG;IAEzD,MAAM,GAAG,GAA2B,EAAE,CAAC;IACvC,KAAK,MAAM,GAAG,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,EAAE,CAAC;QACrE,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;QAC3B,IAAI,KAAK,KAAK,SAAS;YAAE,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IAC5C,CAAC;IACD,GAAG,CAAC,WAAW,GAAG,qBAAqB,CAAC;IACxC,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,YAAY,GAAG;IACnB,mBAAmB;IACnB,0BAA0B;IAC1B,oBAAoB;IACpB,aAAa;IACb,YAAY;IACZ,uBAAuB;IACvB,mBAAmB;CACpB,CAAC;AAEF,MAAM,iBAAiB,GAA6B;IAClD,SAAS,EAAE,CAAC,mBAAmB,CAAC;IAChC,eAAe,EAAE,CAAC,sBAAsB,CAAC;IACzC,OAAO,EAAE,YAAY;IACrB,KAAK,EAAE,EAAE;IACT,QAAQ,EAAE,CAAC,kBAAkB,CAAC;IAC9B,SAAS,EAAE,CAAC,mBAAmB,CAAC;IAChC,MAAM,EAAE,CAAC,gBAAgB,CAAC;IAC1B,QAAQ,EAAE,CAAC,gBAAgB,CAAC;IAC5B,QAAQ,EAAE,CAAC,kBAAkB,CAAC;IAC9B,MAAM,EAAE,CAAC,aAAa,CAAC;IACvB,MAAM,EAAE,CAAC,gBAAgB,CAAC;IAC1B,UAAU,EAAE,CAAC,oBAAoB,CAAC;IAClC,MAAM,EAAE,CAAC,gBAAgB,CAAC;IAC1B,GAAG,EAAE,CAAC,aAAa,CAAC;CACrB,CAAC;AAEF,SAAS,eAAe,CAAC,KAAa;IACpC,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAClD,MAAM,OAAO,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IAC5C,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,eAAe,CACvB,qBAAqB,EACrB,mCAAmC,KAAK,EAAE,CAC3C,CAAC;IACJ,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC"}
package/dist/fs.d.ts ADDED
@@ -0,0 +1,5 @@
1
+ export declare function createTempDir(prefix: string): Promise<string>;
2
+ export declare function withTempDir<T>(prefix: string, fn: (path: string) => Promise<T>): Promise<T>;
3
+ export declare function removeDir(path: string): Promise<void>;
4
+ export declare function pathExists(path: string): Promise<boolean>;
5
+ //# sourceMappingURL=fs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fs.d.ts","sourceRoot":"","sources":["../src/fs.ts"],"names":[],"mappings":"AAIA,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAE7D;AAED,wBAAsB,WAAW,CAAC,CAAC,EACjC,MAAM,EAAE,MAAM,EACd,EAAE,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,GAC/B,OAAO,CAAC,CAAC,CAAC,CAOZ;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAErD;AAED,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAO/D"}
package/dist/fs.js ADDED
@@ -0,0 +1,28 @@
1
+ import { access, mkdtemp, rm } from "node:fs/promises";
2
+ import { tmpdir } from "node:os";
3
+ import { join } from "node:path";
4
+ export function createTempDir(prefix) {
5
+ return mkdtemp(join(tmpdir(), prefix));
6
+ }
7
+ export async function withTempDir(prefix, fn) {
8
+ const path = await createTempDir(prefix);
9
+ try {
10
+ return await fn(path);
11
+ }
12
+ finally {
13
+ await removeDir(path);
14
+ }
15
+ }
16
+ export function removeDir(path) {
17
+ return rm(path, { recursive: true, force: true });
18
+ }
19
+ export async function pathExists(path) {
20
+ try {
21
+ await access(path);
22
+ return true;
23
+ }
24
+ catch {
25
+ return false;
26
+ }
27
+ }
28
+ //# sourceMappingURL=fs.js.map
package/dist/fs.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fs.js","sourceRoot":"","sources":["../src/fs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,MAAM,UAAU,aAAa,CAAC,MAAc;IAC1C,OAAO,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,MAAc,EACd,EAAgC;IAEhC,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC,MAAM,CAAC,CAAC;IACzC,IAAI,CAAC;QACH,OAAO,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC;IACxB,CAAC;YAAS,CAAC;QACT,MAAM,SAAS,CAAC,IAAI,CAAC,CAAC;IACxB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,IAAY;IACpC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AACpD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAAY;IAC3C,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;QACnB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
package/dist/git.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../src/git.ts"],"names":[],"mappings":"AAOA,qBAAa,OAAO;IACE,QAAQ,CAAC,IAAI,EAAE,MAAM;IAAzC,OAAO,eAAsC;IAE7C,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAErC;IAED,gDAAgD;IAChD,OAAa,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,CAGtE;IAEK,cAAc,CAClB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,IAAI,CAAC,CAEf;IAED,iFAAiF;IAC3E,KAAK,CACT,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EAAE,EACd,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,IAAI,CAAC,CAEf;IAEK,SAAS,CACb,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,IAAI,CAAC,CAEf;IAED;;;OAGG;IACG,MAAM,CACV,IAAI,EAAE,MAAM,EAAE,EACd,GAAG,EAAE,MAAM,EACX,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,IAAI,CAAC,CAEf;IAEK,IAAI,CACR,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EAAE,EACjB,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,MAAM,CAAC,CAKjB;IAEK,eAAe,CACnB,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,EAAE,EACjB,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,MAAM,CAAC,CAiCjB;CACF"}
1
+ {"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../src/git.ts"],"names":[],"mappings":"AAOA,qBAAa,OAAO;IACE,QAAQ,CAAC,IAAI,EAAE,MAAM;IAAzC,OAAO,eAAsC;IAE7C,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAErC;IAED,gDAAgD;IAChD,OAAa,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,CAGtE;IAEK,cAAc,CAClB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,IAAI,CAAC,CAEf;IAED,iFAAiF;IAC3E,KAAK,CACT,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EAAE,EACd,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,IAAI,CAAC,CAEf;IAEK,SAAS,CACb,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,IAAI,CAAC,CAEf;IAED;;;OAGG;IACG,MAAM,CACV,IAAI,EAAE,MAAM,EAAE,EACd,GAAG,EAAE,MAAM,EACX,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,IAAI,CAAC,CAEf;IAEK,IAAI,CACR,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EAAE,EACjB,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,MAAM,CAAC,CAKjB;IAED,eAAe,CACb,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,EAAE,EACjB,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,MAAM,CAAC,CAuBjB;CACF"}
package/dist/git.js CHANGED
@@ -1,8 +1,8 @@
1
- import { copyFile, mkdtemp, rm } from "node:fs/promises";
2
- import { tmpdir } from "node:os";
1
+ import { copyFile } from "node:fs/promises";
3
2
  import { join } from "node:path";
4
3
  import { env as processEnv } from "node:process";
5
4
  import { runCommand } from "@aether-agent/sdk";
5
+ import { withTempDir } from "./fs.js";
6
6
  export class GitRepo {
7
7
  path;
8
8
  constructor(path) {
@@ -36,22 +36,19 @@ export class GitRepo {
36
36
  async diff(fromCommit, toCommit, exclude, signal) {
37
37
  return git(["-C", this.path, "diff", fromCommit, toCommit, ...pathspecs(exclude)], signal);
38
38
  }
39
- async diffWorkingTree(fromCommit, exclude, signal) {
40
- const scratch = await mkdtemp(join(tmpdir(), "aether-eval-index-"));
41
- try {
42
- const index = join(scratch, "index");
43
- const realIndex = await git([
44
- "-C",
45
- this.path,
46
- "rev-parse",
47
- "--path-format=absolute",
48
- "--git-path",
49
- "index",
50
- ], signal);
51
- await copyFile(realIndex.trim(), index).catch(() => { });
52
- const env = { GIT_INDEX_FILE: index };
39
+ diffWorkingTree(fromCommit, exclude, signal) {
40
+ return withTempDir("aether-eval-index-", async (scratch) => {
41
+ const env = { GIT_INDEX_FILE: join(scratch, "index") };
42
+ try {
43
+ await copyFile(join(this.path, ".git", "index"), env.GIT_INDEX_FILE);
44
+ }
45
+ catch (err) {
46
+ if (err.code !== "ENOENT")
47
+ throw err;
48
+ await git(["-C", this.path, "read-tree", "HEAD"], signal, env);
49
+ }
53
50
  await git(["-C", this.path, "add", "--all"], signal, env);
54
- return await git([
51
+ return git([
55
52
  "-C",
56
53
  this.path,
57
54
  "diff",
@@ -59,10 +56,7 @@ export class GitRepo {
59
56
  fromCommit,
60
57
  ...pathspecs(exclude),
61
58
  ], signal, env);
62
- }
63
- finally {
64
- await rm(scratch, { recursive: true, force: true });
65
- }
59
+ });
66
60
  }
67
61
  }
68
62
  function pathspecs(exclude) {
package/dist/git.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"git.js","sourceRoot":"","sources":["../src/git.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"git.js","sourceRoot":"","sources":["../src/git.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,GAAG,IAAI,UAAU,EAAE,MAAM,cAAc,CAAC;AAEjD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAEtC,MAAM,OAAO,OAAO;IACW,IAAI;IAAjC,YAA6B,IAAY;oBAAZ,IAAI;IAAW,CAAC;IAE7C,MAAM,CAAC,QAAQ,CAAC,IAAY;QAC1B,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC;IAED,gDAAgD;IAChD,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAY,EAAE,MAAoB;QAClD,MAAM,GAAG,CAAC,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC;QAClC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,cAAc,CAClB,MAAc,EACd,MAAc,EACd,MAAoB;QAEpB,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC;IACzE,CAAC;IAED,iFAAiF;IACjF,KAAK,CAAC,KAAK,CACT,MAAc,EACd,IAAc,EACd,MAAoB;QAEpB,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC;IAC9E,CAAC;IAED,KAAK,CAAC,SAAS,CACb,IAAY,EACZ,MAAc,EACd,MAAoB;QAEpB,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC;IACnE,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,MAAM,CACV,IAAc,EACd,GAAW,EACX,MAAoB;QAEpB,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC;IACzE,CAAC;IAED,KAAK,CAAC,IAAI,CACR,UAAkB,EAClB,QAAgB,EAChB,OAAiB,EACjB,MAAoB;QAEpB,OAAO,GAAG,CACR,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC,EACtE,MAAM,CACP,CAAC;IACJ,CAAC;IAED,eAAe,CACb,UAAkB,EAClB,OAAiB,EACjB,MAAoB;QAEpB,OAAO,WAAW,CAAC,oBAAoB,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;YACzD,MAAM,GAAG,GAAG,EAAE,cAAc,EAAE,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,CAAC;YACvD,IAAI,CAAC;gBACH,MAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,CAAC,cAAc,CAAC,CAAC;YACvE,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAK,GAA6B,CAAC,IAAI,KAAK,QAAQ;oBAAE,MAAM,GAAG,CAAC;gBAChE,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,WAAW,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;YACjE,CAAC;YACD,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;YAC1D,OAAO,GAAG,CACR;gBACE,IAAI;gBACJ,IAAI,CAAC,IAAI;gBACT,MAAM;gBACN,UAAU;gBACV,UAAU;gBACV,GAAG,SAAS,CAAC,OAAO,CAAC;aACtB,EACD,MAAM,EACN,GAAG,CACJ,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;CACF;AAED,SAAS,SAAS,CAAC,OAAiB;IAClC,OAAO,OAAO,CAAC,MAAM,GAAG,CAAC;QACvB,CAAC,CAAC,CAAC,IAAI,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,aAAa,QAAQ,EAAE,CAAC,CAAC;QAC/D,CAAC,CAAC,EAAE,CAAC;AACT,CAAC;AAED,SAAS,GAAG,CACV,IAAc,EACd,MAAoB,EACpB,GAAG,GAA2B,EAAE;IAEhC,OAAO,UAAU,CAAC,KAAK,EAAE,IAAI,EAAE;QAC7B,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;QAClB,GAAG,EAAE,EAAE,GAAG,UAAU,EAAE,GAAG,GAAG,EAAE;QAC9B,WAAW,EAAE,MAAM;QACnB,kBAAkB,EAChB,0EAA0E;QAC5E,eAAe,EAAE,kBAAkB;QACnC,aAAa,EAAE,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,CACtC,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,qBAAqB,QAAQ,MAAM,MAAM,EAAE;KACnE,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,15 @@
1
+ import type { GitSpec } from "@aether-agent/sdk";
2
+ import { type GitDiff } from "./diff.js";
3
+ import { Workspace } from "./workspace.js";
4
+ export declare class GitFixture implements AsyncDisposable {
5
+ #private;
6
+ readonly referenceDiff: GitDiff;
7
+ private constructor();
8
+ static fetch(spec: GitSpec, signal?: AbortSignal): Promise<GitFixture>;
9
+ workspace(signal?: AbortSignal): Promise<Workspace>;
10
+ agentDiff(workspace: Workspace, signal?: AbortSignal): Promise<GitDiff>;
11
+ bundle(outPath: string, signal?: AbortSignal): Promise<void>;
12
+ cleanup(): Promise<void>;
13
+ [Symbol.asyncDispose](): Promise<void>;
14
+ }
15
+ //# sourceMappingURL=gitFixture.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gitFixture.d.ts","sourceRoot":"","sources":["../src/gitFixture.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAa,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAa,KAAK,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpD,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAM3C,qBAAa,UAAW,YAAW,eAAe;;IAChD,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC;IAKhC,OAAO,eAIN;IAED,OAAa,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,CAkB3E;IAED,SAAS,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,SAAS,CAAC,CAUlD;IAEK,SAAS,CACb,SAAS,EAAE,SAAS,EACpB,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,OAAO,CAAC,CAMlB;IAEK,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAMjE;IAEK,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAI7B;IAED,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAErC;CACF"}
@@ -0,0 +1,72 @@
1
+ import { resolve } from "node:path";
2
+ import { toGitDiff } from "./diff.js";
3
+ import { AetherEvalError } from "./errors.js";
4
+ import { createTempDir, pathExists, removeDir } from "./fs.js";
5
+ import { GitRepo } from "./git.js";
6
+ import { Workspace } from "./workspace.js";
7
+ const EVAL_START_REF = "eval-start";
8
+ const EVAL_GOLD_REF = "eval-gold";
9
+ const DEFAULT_BRANCH = "main";
10
+ export class GitFixture {
11
+ referenceDiff;
12
+ #repo;
13
+ #spec;
14
+ #cleaned = false;
15
+ constructor(repo, spec, referenceDiff) {
16
+ this.#repo = repo;
17
+ this.#spec = spec;
18
+ this.referenceDiff = referenceDiff;
19
+ }
20
+ static async fetch(spec, signal) {
21
+ const { source, startCommit, goldCommit, diffExclude = [] } = spec;
22
+ const from = await remote(source);
23
+ const repoPath = await createTempDir("aether-eval-git-");
24
+ try {
25
+ const repo = await GitRepo.init(repoPath, signal);
26
+ await repo.fetch(from, [startCommit, goldCommit], signal);
27
+ await repo.updateRef(`refs/heads/${EVAL_START_REF}`, startCommit, signal);
28
+ await repo.updateRef(`refs/heads/${EVAL_GOLD_REF}`, goldCommit, signal);
29
+ const referenceDiff = toGitDiff(await repo.diff(startCommit, goldCommit, diffExclude, signal));
30
+ return new GitFixture(repo, spec, referenceDiff);
31
+ }
32
+ catch (err) {
33
+ await removeDir(repoPath);
34
+ throw err;
35
+ }
36
+ }
37
+ workspace(signal) {
38
+ const { startCommit, branch = DEFAULT_BRANCH, subdir } = this.#spec;
39
+ return Workspace.create(async (rootPath) => {
40
+ const repo = await GitRepo.init(rootPath, signal);
41
+ await repo.fetch(this.#repo.path, [startCommit], signal);
42
+ await repo.checkoutBranch(branch, startCommit, signal);
43
+ }, { subdir: subdir ?? undefined });
44
+ }
45
+ async agentDiff(workspace, signal) {
46
+ const { startCommit, diffExclude = [] } = this.#spec;
47
+ const repo = GitRepo.fromPath(workspace.rootPath);
48
+ return toGitDiff(await repo.diffWorkingTree(startCommit, diffExclude, signal));
49
+ }
50
+ async bundle(outPath, signal) {
51
+ await this.#repo.bundle([EVAL_START_REF, EVAL_GOLD_REF], resolve(outPath), signal);
52
+ }
53
+ async cleanup() {
54
+ if (this.#cleaned)
55
+ return;
56
+ this.#cleaned = true;
57
+ await removeDir(this.#repo.path);
58
+ }
59
+ [Symbol.asyncDispose]() {
60
+ return this.cleanup();
61
+ }
62
+ }
63
+ async function remote(source) {
64
+ if ("url" in source)
65
+ return source.url;
66
+ const bundle = resolve(source.bundle);
67
+ if (!(await pathExists(bundle))) {
68
+ throw new AetherEvalError("configuration_error", `git bundle file does not exist: ${bundle}`);
69
+ }
70
+ return bundle;
71
+ }
72
+ //# sourceMappingURL=gitFixture.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gitFixture.js","sourceRoot":"","sources":["../src/gitFixture.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,9 +1,10 @@
1
1
  export { DockerAgent } from "./DockerAgent.js";
2
2
  export type { DockerAgentOptions } from "./DockerAgent.js";
3
+ export { CONTAINER_AETHER_HOME, evalEnvVars } from "./env.js";
3
4
  export { AetherEvalError, AetherCommandExitError } from "./errors.js";
4
5
  export type { AetherEvalErrorCode } from "./errors.js";
5
6
  export { Container, ContainerBuilder, Image } from "./containers/index.js";
6
- export type { BindMount, ContainerExecOptions, ContainerStreamingOptions, ExecOutput, ImageBuildOptions, } from "./containers/index.js";
7
+ export type { BindMount, ContainerExecOptions, ContainerRuntime, ContainerStreamingOptions, ExecOutput, ImageBuildOptions, RuntimeExec, RuntimeExecOptions, } from "./containers/index.js";
7
8
  export type { Agent, AgentRunOptions } from "./Agent.js";
8
9
  export { FakeAgent } from "./FakeAgent.js";
9
10
  export { Task } from "./task.js";
@@ -14,7 +15,8 @@ export type { GenerateJsonOptions, GenerateOptions, GenerateResult, ReasoningEff
14
15
  export { judge, JudgeCriterionResponseSchema, JudgeResponseSchema, } from "./judge.js";
15
16
  export type { Judge, JudgeContext, JudgeCriterionResponse, JudgeCriterionSpec, JudgeCriterionSummary, JudgeInput, JudgeRubricResponse, JudgeSummary, } from "./judge.js";
16
17
  export { isTerminalEvent, Transcript, TranscriptError, ToolCall, turnEnded, } from "./transcript.js";
17
- export { createGitBundle, Workspace } from "./workspace.js";
18
- export type { GitBundleSpec, GitCheckoutSpec, GitRepoSpec, RetainedWorkspaceInfo, } from "./workspace.js";
19
- export type { AgentEvent, ContextEvent, ContextUsage, FileDiff, LlmCallOutcome, LlmCallPurpose, MessageEvent, ModelEvent, PlanMeta, PlanMetaEntry, PlanMetaStatus, SessionUsageEvent, SessionUsageTotals, StopReason, TokenUsage, ToolCallError, ToolCallRequest, ToolCallResult, ToolDisplayMeta, ToolEvent, ToolResultMeta, TurnEvent, TurnOutcome, UsageCost, UsageSource, } from "@aether-agent/sdk";
18
+ export { Workspace } from "./workspace.js";
19
+ export type { RetainedWorkspaceInfo, WorkspaceOptions } from "./workspace.js";
20
+ export { GitFixture } from "./gitFixture.js";
21
+ export type { AgentEvent, ContextEvent, ContextUsage, FileDiff, GitSource, GitSpec, LlmCallOutcome, LlmCallPurpose, MessageEvent, ModelEvent, PlanMeta, PlanMetaEntry, PlanMetaStatus, SessionUsageEvent, SessionUsageTotals, StopReason, TokenUsage, ToolCallError, ToolCallRequest, ToolCallResult, ToolDisplayMeta, ToolEvent, ToolResultMeta, TurnEvent, TurnOutcome, UsageCost, UsageSource, } from "@aether-agent/sdk";
20
22
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,YAAY,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AACtE,YAAY,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAC3E,YAAY,EACV,SAAS,EACT,oBAAoB,EACpB,yBAAyB,EACzB,UAAU,EACV,iBAAiB,GAClB,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EAAE,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AACzD,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC9C,YAAY,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpD,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,YAAY,EACV,mBAAmB,EACnB,eAAe,EACf,cAAc,EACd,eAAe,GAChB,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,KAAK,EACL,4BAA4B,EAC5B,mBAAmB,GACpB,MAAM,YAAY,CAAC;AACpB,YAAY,EACV,KAAK,EACL,YAAY,EACZ,sBAAsB,EACtB,kBAAkB,EAClB,qBAAqB,EACrB,UAAU,EACV,mBAAmB,EACnB,YAAY,GACb,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,eAAe,EACf,UAAU,EACV,eAAe,EACf,QAAQ,EACR,SAAS,GACV,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC5D,YAAY,EACV,aAAa,EACb,eAAe,EACf,WAAW,EACX,qBAAqB,GACtB,MAAM,gBAAgB,CAAC;AACxB,YAAY,EACV,UAAU,EACV,YAAY,EACZ,YAAY,EACZ,QAAQ,EACR,cAAc,EACd,cAAc,EACd,YAAY,EACZ,UAAU,EACV,QAAQ,EACR,aAAa,EACb,cAAc,EACd,iBAAiB,EACjB,kBAAkB,EAClB,UAAU,EACV,UAAU,EACV,aAAa,EACb,eAAe,EACf,cAAc,EACd,eAAe,EACf,SAAS,EACT,cAAc,EACd,SAAS,EACT,WAAW,EACX,SAAS,EACT,WAAW,GACZ,MAAM,mBAAmB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,YAAY,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,qBAAqB,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AACtE,YAAY,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAC3E,YAAY,EACV,SAAS,EACT,oBAAoB,EACpB,gBAAgB,EAChB,yBAAyB,EACzB,UAAU,EACV,iBAAiB,EACjB,WAAW,EACX,kBAAkB,GACnB,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EAAE,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AACzD,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC9C,YAAY,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpD,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,YAAY,EACV,mBAAmB,EACnB,eAAe,EACf,cAAc,EACd,eAAe,GAChB,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,KAAK,EACL,4BAA4B,EAC5B,mBAAmB,GACpB,MAAM,YAAY,CAAC;AACpB,YAAY,EACV,KAAK,EACL,YAAY,EACZ,sBAAsB,EACtB,kBAAkB,EAClB,qBAAqB,EACrB,UAAU,EACV,mBAAmB,EACnB,YAAY,GACb,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,eAAe,EACf,UAAU,EACV,eAAe,EACf,QAAQ,EACR,SAAS,GACV,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,YAAY,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAC9E,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,YAAY,EACV,UAAU,EACV,YAAY,EACZ,YAAY,EACZ,QAAQ,EACR,SAAS,EACT,OAAO,EACP,cAAc,EACd,cAAc,EACd,YAAY,EACZ,UAAU,EACV,QAAQ,EACR,aAAa,EACb,cAAc,EACd,iBAAiB,EACjB,kBAAkB,EAClB,UAAU,EACV,UAAU,EACV,aAAa,EACb,eAAe,EACf,cAAc,EACd,eAAe,EACf,SAAS,EACT,cAAc,EACd,SAAS,EACT,WAAW,EACX,SAAS,EACT,WAAW,GACZ,MAAM,mBAAmB,CAAC"}
package/dist/index.js CHANGED
@@ -1,4 +1,5 @@
1
1
  export { DockerAgent } from "./DockerAgent.js";
2
+ export { CONTAINER_AETHER_HOME, evalEnvVars } from "./env.js";
2
3
  export { AetherEvalError, AetherCommandExitError } from "./errors.js";
3
4
  export { Container, ContainerBuilder, Image } from "./containers/index.js";
4
5
  export { FakeAgent } from "./FakeAgent.js";
@@ -7,5 +8,6 @@ export { diffStatsFromDiff } from "./diff.js";
7
8
  export { generate } from "./generate.js";
8
9
  export { judge, JudgeCriterionResponseSchema, JudgeResponseSchema, } from "./judge.js";
9
10
  export { isTerminalEvent, Transcript, TranscriptError, ToolCall, turnEnded, } from "./transcript.js";
10
- export { createGitBundle, Workspace } from "./workspace.js";
11
+ export { Workspace } from "./workspace.js";
12
+ export { GitFixture } from "./gitFixture.js";
11
13
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,OAAO,EAAE,eAAe,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAEtE,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAS3E,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAE9C,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAOzC,OAAO,EACL,KAAK,EACL,4BAA4B,EAC5B,mBAAmB,GACpB,MAAM,YAAY,CAAC;AAWpB,OAAO,EACL,eAAe,EACf,UAAU,EACV,eAAe,EACf,QAAQ,EACR,SAAS,GACV,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,OAAO,EAAE,qBAAqB,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAEtE,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAY3E,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAE9C,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAOzC,OAAO,EACL,KAAK,EACL,4BAA4B,EAC5B,mBAAmB,GACpB,MAAM,YAAY,CAAC;AAWpB,OAAO,EACL,eAAe,EACf,UAAU,EACV,eAAe,EACf,QAAQ,EACR,SAAS,GACV,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC"}
@@ -1,21 +1,10 @@
1
- import { type GitDiff } from "./diff.js";
2
- export interface GitCheckoutSpec {
3
- startCommit: string;
4
- goldCommit: string;
5
- subdir?: string;
6
- branch?: string;
7
- diffExclude?: string[];
8
- }
9
- export interface GitRepoSpec extends GitCheckoutSpec {
10
- url: string;
11
- }
12
- export interface GitBundleSpec extends GitCheckoutSpec {
13
- bundlePath: string;
14
- }
15
1
  export interface RetainedWorkspaceInfo {
16
2
  rootPath: string;
17
3
  path: string;
18
4
  }
5
+ export interface WorkspaceOptions {
6
+ subdir?: string;
7
+ }
19
8
  /** A workspace created on the host for an eval run. */
20
9
  export declare class Workspace implements AsyncDisposable {
21
10
  #private;
@@ -26,32 +15,14 @@ export declare class Workspace implements AsyncDisposable {
26
15
  /** Subdirectory (relative to `rootPath`) used as the working dir, if any. */
27
16
  readonly relativeCwd?: string;
28
17
  private constructor();
18
+ static create(populate: (rootPath: string) => Promise<void>, { subdir }?: WorkspaceOptions): Promise<Workspace>;
29
19
  static empty(): Promise<Workspace>;
30
20
  static fromFiles(files: Record<string, string>): Promise<Workspace>;
31
21
  static fromDir(srcDir: string, baseDir?: string): Promise<Workspace>;
32
- static fromGitRepo(spec: GitRepoSpec, signal?: AbortSignal): Promise<Workspace>;
33
- /**
34
- * Instantiate a workspace from a local git bundle file (see {@link createGitBundle}).
35
- *
36
- * The bundle must contain both `startCommit` and `goldCommit` so that checkout and
37
- * reference diffing work without the originating remote.
38
- */
39
- static fromGitBundle(spec: GitBundleSpec, signal?: AbortSignal): Promise<Workspace>;
40
- private static fromGit;
41
22
  join(relativePath: string): string;
42
23
  persist(): RetainedWorkspaceInfo;
43
- get referenceDiff(): GitDiff | undefined;
44
- captureAgentDiff(signal?: AbortSignal): Promise<GitDiff | undefined>;
45
24
  /** Remove the workspace directory. Idempotent. */
46
25
  cleanup(): Promise<void>;
47
26
  [Symbol.asyncDispose](): Promise<void>;
48
27
  }
49
- /**
50
- * Create a self-contained git bundle at `outPath` containing `spec`'s start and gold
51
- * commits.
52
- *
53
- * Fetches only the start and gold commits (and their reachable objects) into a fresh repo,
54
- * then writes a bundle that {@link Workspace.fromGitBundle} can later instantiate offline.
55
- */
56
- export declare function createGitBundle(spec: GitRepoSpec, outPath: string, signal?: AbortSignal): Promise<void>;
57
28
  //# sourceMappingURL=workspace.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"workspace.d.ts","sourceRoot":"","sources":["../src/workspace.ts"],"names":[],"mappings":"AAKA,OAAO,EAAqB,KAAK,OAAO,EAAE,MAAM,WAAW,CAAC;AAO5D,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,WAAY,SAAQ,eAAe;IAClD,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,aAAc,SAAQ,eAAe;IACpD,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,uDAAuD;AACvD,qBAAa,SAAU,YAAW,eAAe;;IAC/C,mGAAmG;IACnG,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAE1B,mFAAmF;IACnF,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB,6EAA6E;IAC7E,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAK9B,OAAO,eAUN;IAED,OAAa,KAAK,IAAI,OAAO,CAAC,SAAS,CAAC,CAGvC;IAED,OAAa,SAAS,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,SAAS,CAAC,CAaxE;IAED,OAAa,OAAO,CAClB,MAAM,EAAE,MAAM,EACd,OAAO,SAAgB,GACtB,OAAO,CAAC,SAAS,CAAC,CAWpB;IAED,OAAa,WAAW,CACtB,IAAI,EAAE,WAAW,EACjB,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,SAAS,CAAC,CAEpB;IAED;;;;;OAKG;IACH,OAAa,aAAa,CACxB,IAAI,EAAE,aAAa,EACnB,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,SAAS,CAAC,CAQpB;mBAEoB,OAAO;IAqC5B,IAAI,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAEjC;IAED,OAAO,IAAI,qBAAqB,CAG/B;IAED,IAAI,aAAa,IAAI,OAAO,GAAG,SAAS,CAEvC;IAEK,gBAAgB,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC,CASzE;IAED,kDAAkD;IAC5C,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAI7B;IAED,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAErC;CACF;AAED;;;;;;GAMG;AACH,wBAAsB,eAAe,CACnC,IAAI,EAAE,WAAW,EACjB,OAAO,EAAE,MAAM,EACf,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,IAAI,CAAC,CAgBf"}
1
+ {"version":3,"file":"workspace.d.ts","sourceRoot":"","sources":["../src/workspace.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,uDAAuD;AACvD,qBAAa,SAAU,YAAW,eAAe;;IAC/C,mGAAmG;IACnG,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAE1B,mFAAmF;IACnF,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB,6EAA6E;IAC7E,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAI9B,OAAO,eAQN;IAED,OAAa,MAAM,CACjB,QAAQ,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,EAC7C,EAAE,MAAM,EAAE,GAAE,gBAAqB,GAChC,OAAO,CAAC,SAAS,CAAC,CAapB;IAED,MAAM,CAAC,KAAK,IAAI,OAAO,CAAC,SAAS,CAAC,CAEjC;IAED,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,SAAS,CAAC,CAQlE;IAED,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,SAAgB,GAAG,OAAO,CAAC,SAAS,CAAC,CAI1E;IAED,IAAI,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAEjC;IAED,OAAO,IAAI,qBAAqB,CAG/B;IAED,kDAAkD;IAC5C,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAI7B;IAED,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAErC;CACF"}
package/dist/workspace.js CHANGED
@@ -1,12 +1,7 @@
1
- import { access, cp, mkdir, mkdtemp, rm, writeFile } from "node:fs/promises";
2
- import { tmpdir } from "node:os";
1
+ import { cp, mkdir, writeFile } from "node:fs/promises";
3
2
  import { dirname, join, relative, resolve } from "node:path";
4
- import { AetherSdkError } from "@aether-agent/sdk";
5
- import { diffStatsFromDiff } from "./diff.js";
6
- import { GitRepo } from "./git.js";
7
- const EVAL_START_REF = "eval-start";
8
- const EVAL_GOLD_REF = "eval-gold";
9
- const DEFAULT_BRANCH = "main";
3
+ import { AetherEvalError } from "./errors.js";
4
+ import { createTempDir, pathExists, removeDir } from "./fs.js";
10
5
  /** A workspace created on the host for an eval run. */
11
6
  export class Workspace {
12
7
  /** Retained repository/temp root. Cleanup removes this directory; bind-mounted to `/workspace`. */
@@ -15,85 +10,44 @@ export class Workspace {
15
10
  path;
16
11
  /** Subdirectory (relative to `rootPath`) used as the working dir, if any. */
17
12
  relativeCwd;
18
- #git;
19
13
  #cleaned = false;
20
14
  constructor(options) {
21
15
  this.rootPath = options.rootPath;
22
16
  this.path = options.path;
23
17
  this.relativeCwd = options.relativeCwd;
24
- this.#git = options.git;
25
18
  }
26
- static async empty() {
27
- const rootPath = await createWorkspaceDir();
28
- return new Workspace({ rootPath, path: rootPath });
29
- }
30
- static async fromFiles(files) {
31
- const workspace = await Workspace.empty();
19
+ static async create(populate, { subdir } = {}) {
20
+ const rootPath = await createTempDir("aether-eval-workspace-");
32
21
  try {
33
- for (const [relativePath, content] of Object.entries(files)) {
34
- const target = resolvePath(workspace.rootPath, relativePath);
35
- await mkdir(dirname(target), { recursive: true });
36
- await writeFile(target, content);
37
- }
38
- return workspace;
39
- }
40
- catch (err) {
41
- await workspace.cleanup();
42
- throw err;
43
- }
44
- }
45
- static async fromDir(srcDir, baseDir = process.cwd()) {
46
- const workspace = await Workspace.empty();
47
- try {
48
- await cp(resolve(baseDir, srcDir), workspace.rootPath, {
49
- recursive: true,
22
+ await populate(rootPath);
23
+ return new Workspace({
24
+ rootPath,
25
+ path: await resolveSubdir(rootPath, subdir),
26
+ relativeCwd: subdir,
50
27
  });
51
- return workspace;
52
28
  }
53
29
  catch (err) {
54
- await workspace.cleanup();
30
+ await removeDir(rootPath);
55
31
  throw err;
56
32
  }
57
33
  }
58
- static async fromGitRepo(spec, signal) {
59
- return Workspace.fromGit(spec.url, spec, signal);
34
+ static empty() {
35
+ return Workspace.create(async () => { });
60
36
  }
61
- /**
62
- * Instantiate a workspace from a local git bundle file (see {@link createGitBundle}).
63
- *
64
- * The bundle must contain both `startCommit` and `goldCommit` so that checkout and
65
- * reference diffing work without the originating remote.
66
- */
67
- static async fromGitBundle(spec, signal) {
68
- if (!(await pathExists(spec.bundlePath))) {
69
- throw new AetherSdkError("invalid_options", `git bundle file does not exist: ${spec.bundlePath}`);
70
- }
71
- return Workspace.fromGit(spec.bundlePath, spec, signal);
72
- }
73
- static async fromGit(remote, spec, signal) {
74
- const { startCommit, goldCommit, subdir, branch = DEFAULT_BRANCH, diffExclude = [], } = spec;
75
- return withTempDir(async (scratchPath) => {
76
- const scratch = await GitRepo.init(scratchPath, signal);
77
- await scratch.fetch(remote, [startCommit, goldCommit], signal);
78
- const referenceDiff = toGitDiff(await scratch.diff(startCommit, goldCommit, diffExclude, signal));
79
- const rootPath = await createWorkspaceDir();
80
- try {
81
- const repo = await GitRepo.init(rootPath, signal);
82
- await repo.fetch(scratchPath, [startCommit], signal);
83
- await repo.checkoutBranch(branch, startCommit, signal);
84
- return new Workspace({
85
- rootPath,
86
- path: await resolveSubdir(rootPath, subdir),
87
- relativeCwd: subdir,
88
- git: { startCommit, referenceDiff, diffExclude },
89
- });
90
- }
91
- catch (err) {
92
- await rm(rootPath, { recursive: true, force: true });
93
- throw err;
37
+ static fromFiles(files) {
38
+ return Workspace.create(async (rootPath) => {
39
+ for (const [relativePath, content] of Object.entries(files)) {
40
+ const target = resolvePath(rootPath, relativePath);
41
+ await mkdir(dirname(target), { recursive: true });
42
+ await writeFile(target, content);
94
43
  }
95
44
  });
96
45
  }
46
+ static fromDir(srcDir, baseDir = process.cwd()) {
47
+ return Workspace.create(async (rootPath) => {
48
+ await cp(resolve(baseDir, srcDir), rootPath, { recursive: true });
49
+ });
50
+ }
97
51
  join(relativePath) {
98
52
  return join(this.path, relativePath);
99
53
  }
@@ -101,81 +55,31 @@ export class Workspace {
101
55
  this.#cleaned = true;
102
56
  return { rootPath: this.rootPath, path: this.path };
103
57
  }
104
- get referenceDiff() {
105
- return this.#git?.referenceDiff;
106
- }
107
- async captureAgentDiff(signal) {
108
- if (!this.#git)
109
- return undefined;
110
- const { startCommit, diffExclude } = this.#git;
111
- const diff = await GitRepo.fromPath(this.rootPath).diffWorkingTree(startCommit, diffExclude, signal);
112
- return toGitDiff(diff);
113
- }
114
58
  /** Remove the workspace directory. Idempotent. */
115
59
  async cleanup() {
116
60
  if (this.#cleaned)
117
61
  return;
118
62
  this.#cleaned = true;
119
- await rm(this.rootPath, { recursive: true, force: true });
63
+ await removeDir(this.rootPath);
120
64
  }
121
65
  [Symbol.asyncDispose]() {
122
66
  return this.cleanup();
123
67
  }
124
68
  }
125
- /**
126
- * Create a self-contained git bundle at `outPath` containing `spec`'s start and gold
127
- * commits.
128
- *
129
- * Fetches only the start and gold commits (and their reachable objects) into a fresh repo,
130
- * then writes a bundle that {@link Workspace.fromGitBundle} can later instantiate offline.
131
- */
132
- export async function createGitBundle(spec, outPath, signal) {
133
- await withTempDir(async (tempDir) => {
134
- const repo = await GitRepo.init(tempDir, signal);
135
- await repo.fetch(spec.url, [spec.startCommit, spec.goldCommit], signal);
136
- await repo.updateRef(`refs/heads/${EVAL_START_REF}`, spec.startCommit, signal);
137
- await repo.updateRef(`refs/heads/${EVAL_GOLD_REF}`, spec.goldCommit, signal);
138
- await repo.bundle([EVAL_START_REF, EVAL_GOLD_REF], outPath, signal);
139
- });
140
- }
141
- function toGitDiff(diff) {
142
- return { diff, stats: diffStatsFromDiff(diff) };
143
- }
144
- async function createWorkspaceDir() {
145
- return mkdtemp(join(tmpdir(), "aether-eval-workspace-"));
146
- }
147
- async function withTempDir(fn) {
148
- const path = await createWorkspaceDir();
149
- try {
150
- return await fn(path);
151
- }
152
- finally {
153
- await rm(path, { recursive: true, force: true });
154
- }
155
- }
156
69
  function resolvePath(root, relativePath) {
157
70
  const target = resolve(root, relativePath);
158
71
  const rel = relative(root, target);
159
72
  if (rel === "" || rel.startsWith("..")) {
160
- throw new AetherSdkError("invalid_options", `workspace file path escapes the workspace root: ${relativePath}`);
73
+ throw new AetherEvalError("configuration_error", `workspace file path escapes the workspace root: ${relativePath}`);
161
74
  }
162
75
  return target;
163
76
  }
164
- async function pathExists(path) {
165
- try {
166
- await access(path);
167
- return true;
168
- }
169
- catch {
170
- return false;
171
- }
172
- }
173
77
  async function resolveSubdir(rootPath, subdir) {
174
78
  if (!subdir)
175
79
  return rootPath;
176
80
  const path = join(rootPath, subdir);
177
81
  if (!(await pathExists(path))) {
178
- throw new AetherSdkError("invalid_options", `git workspace subdirectory does not exist: ${path}`);
82
+ throw new AetherEvalError("configuration_error", `workspace subdirectory does not exist: ${path}`);
179
83
  }
180
84
  return path;
181
85
  }