@aether-agent/evals 0.5.3 → 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/README.md +23 -15
- package/dist/FakeAgent.d.ts.map +1 -1
- package/dist/FakeAgent.js +1 -0
- package/dist/FakeAgent.js.map +1 -1
- package/dist/containers/container.d.ts +21 -3
- package/dist/containers/container.d.ts.map +1 -1
- package/dist/containers/container.js +147 -120
- package/dist/containers/container.js.map +1 -1
- package/dist/containers/index.d.ts +1 -1
- package/dist/containers/index.d.ts.map +1 -1
- package/dist/containers/index.js.map +1 -1
- package/dist/diff.d.ts +1 -0
- package/dist/diff.d.ts.map +1 -1
- package/dist/diff.js +3 -0
- package/dist/diff.js.map +1 -1
- package/dist/env.d.ts +3 -0
- package/dist/env.d.ts.map +1 -0
- package/dist/env.js +46 -0
- package/dist/env.js.map +1 -0
- package/dist/fs.d.ts +5 -0
- package/dist/fs.d.ts.map +1 -0
- package/dist/fs.js +28 -0
- package/dist/fs.js.map +1 -0
- package/dist/git.d.ts.map +1 -1
- package/dist/git.js +15 -21
- package/dist/git.js.map +1 -1
- package/dist/gitFixture.d.ts +15 -0
- package/dist/gitFixture.d.ts.map +1 -0
- package/dist/gitFixture.js +72 -0
- package/dist/gitFixture.js.map +1 -0
- package/dist/index.d.ts +6 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/workspace.d.ts +4 -33
- package/dist/workspace.d.ts.map +1 -1
- package/dist/workspace.js +27 -123
- package/dist/workspace.js.map +1 -1
- package/package.json +2 -2
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 @@
|
|
|
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
|
package/dist/env.js.map
ADDED
|
@@ -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
|
package/dist/fs.d.ts.map
ADDED
|
@@ -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;
|
|
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
|
|
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
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
"
|
|
47
|
-
|
|
48
|
-
"
|
|
49
|
-
|
|
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
|
|
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":"AAAA,OAAO,EAAE,QAAQ,EAAE,
|
|
1
|
+
{"version":3,"file":"git.js","sourceRoot":"","sources":["../src/git.ts"],"names":[],"mappings":"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"}
|
|
@@ -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 {
|
|
18
|
-
export type {
|
|
19
|
-
export
|
|
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
|
package/dist/index.d.ts.map
CHANGED
|
@@ -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,
|
|
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 {
|
|
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;
|
|
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"}
|
package/dist/workspace.d.ts
CHANGED
|
@@ -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
|
package/dist/workspace.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workspace.d.ts","sourceRoot":"","sources":["../src/workspace.ts"],"names":[],"mappings":"
|
|
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 {
|
|
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 {
|
|
5
|
-
import {
|
|
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
|
|
27
|
-
const rootPath = await
|
|
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
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
await
|
|
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
|
|
30
|
+
await removeDir(rootPath);
|
|
55
31
|
throw err;
|
|
56
32
|
}
|
|
57
33
|
}
|
|
58
|
-
static
|
|
59
|
-
return Workspace.
|
|
34
|
+
static empty() {
|
|
35
|
+
return Workspace.create(async () => { });
|
|
60
36
|
}
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
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
|
|
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
|
|
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
|
|
82
|
+
throw new AetherEvalError("configuration_error", `workspace subdirectory does not exist: ${path}`);
|
|
179
83
|
}
|
|
180
84
|
return path;
|
|
181
85
|
}
|