@aether-agent/evals 0.1.0

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 (63) hide show
  1. package/LICENSE +7 -0
  2. package/README.md +137 -0
  3. package/dist/Agent.d.ts +6 -0
  4. package/dist/Agent.d.ts.map +1 -0
  5. package/dist/Agent.js +2 -0
  6. package/dist/Agent.js.map +1 -0
  7. package/dist/DockerAgent.d.ts +24 -0
  8. package/dist/DockerAgent.d.ts.map +1 -0
  9. package/dist/DockerAgent.js +101 -0
  10. package/dist/DockerAgent.js.map +1 -0
  11. package/dist/FakeAgent.d.ts +21 -0
  12. package/dist/FakeAgent.d.ts.map +1 -0
  13. package/dist/FakeAgent.js +69 -0
  14. package/dist/FakeAgent.js.map +1 -0
  15. package/dist/containers/container.d.ts +51 -0
  16. package/dist/containers/container.d.ts.map +1 -0
  17. package/dist/containers/container.js +237 -0
  18. package/dist/containers/container.js.map +1 -0
  19. package/dist/containers/image.d.ts +20 -0
  20. package/dist/containers/image.d.ts.map +1 -0
  21. package/dist/containers/image.js +43 -0
  22. package/dist/containers/image.js.map +1 -0
  23. package/dist/containers/index.d.ts +5 -0
  24. package/dist/containers/index.d.ts.map +1 -0
  25. package/dist/containers/index.js +3 -0
  26. package/dist/containers/index.js.map +1 -0
  27. package/dist/diff.d.ts +11 -0
  28. package/dist/diff.d.ts.map +1 -0
  29. package/dist/diff.js +18 -0
  30. package/dist/diff.js.map +1 -0
  31. package/dist/errors.d.ts +7 -0
  32. package/dist/errors.d.ts.map +1 -0
  33. package/dist/errors.js +11 -0
  34. package/dist/errors.js.map +1 -0
  35. package/dist/generate.d.ts +54 -0
  36. package/dist/generate.d.ts.map +1 -0
  37. package/dist/generate.js +100 -0
  38. package/dist/generate.js.map +1 -0
  39. package/dist/git.d.ts +10 -0
  40. package/dist/git.d.ts.map +1 -0
  41. package/dist/git.js +37 -0
  42. package/dist/git.js.map +1 -0
  43. package/dist/index.d.ts +20 -0
  44. package/dist/index.d.ts.map +1 -0
  45. package/dist/index.js +11 -0
  46. package/dist/index.js.map +1 -0
  47. package/dist/judge.d.ts +47 -0
  48. package/dist/judge.d.ts.map +1 -0
  49. package/dist/judge.js +177 -0
  50. package/dist/judge.js.map +1 -0
  51. package/dist/task.d.ts +5 -0
  52. package/dist/task.d.ts.map +1 -0
  53. package/dist/task.js +7 -0
  54. package/dist/task.js.map +1 -0
  55. package/dist/transcript.d.ts +24 -0
  56. package/dist/transcript.d.ts.map +1 -0
  57. package/dist/transcript.js +96 -0
  58. package/dist/transcript.js.map +1 -0
  59. package/dist/workspace.d.ts +45 -0
  60. package/dist/workspace.d.ts.map +1 -0
  61. package/dist/workspace.js +135 -0
  62. package/dist/workspace.js.map +1 -0
  63. package/package.json +41 -0
@@ -0,0 +1,237 @@
1
+ var __addDisposableResource = (this && this.__addDisposableResource) || function (env, value, async) {
2
+ if (value !== null && value !== void 0) {
3
+ if (typeof value !== "object" && typeof value !== "function") throw new TypeError("Object expected.");
4
+ var dispose, inner;
5
+ if (async) {
6
+ if (!Symbol.asyncDispose) throw new TypeError("Symbol.asyncDispose is not defined.");
7
+ dispose = value[Symbol.asyncDispose];
8
+ }
9
+ if (dispose === void 0) {
10
+ if (!Symbol.dispose) throw new TypeError("Symbol.dispose is not defined.");
11
+ dispose = value[Symbol.dispose];
12
+ if (async) inner = dispose;
13
+ }
14
+ if (typeof dispose !== "function") throw new TypeError("Object not disposable.");
15
+ if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };
16
+ env.stack.push({ value: value, dispose: dispose, async: async });
17
+ }
18
+ else if (async) {
19
+ env.stack.push({ async: true });
20
+ }
21
+ return value;
22
+ };
23
+ var __disposeResources = (this && this.__disposeResources) || (function (SuppressedError) {
24
+ return function (env) {
25
+ function fail(e) {
26
+ env.error = env.hasError ? new SuppressedError(e, env.error, "An error was suppressed during disposal.") : e;
27
+ env.hasError = true;
28
+ }
29
+ var r, s = 0;
30
+ function next() {
31
+ while (r = env.stack.pop()) {
32
+ try {
33
+ if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);
34
+ if (r.dispose) {
35
+ var result = r.dispose.call(r.value);
36
+ if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });
37
+ }
38
+ else s |= 1;
39
+ }
40
+ catch (e) {
41
+ fail(e);
42
+ }
43
+ }
44
+ if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();
45
+ if (env.hasError) throw env.error;
46
+ }
47
+ return next();
48
+ };
49
+ })(typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
50
+ var e = new Error(message);
51
+ return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
52
+ });
53
+ import { addAbortListener } from "node:events";
54
+ import { mkdtemp, rm } from "node:fs/promises";
55
+ import { tmpdir } from "node:os";
56
+ import { join, posix } from "node:path";
57
+ import { createInterface } from "node:readline";
58
+ import { PassThrough } from "node:stream";
59
+ import { GenericContainer, getContainerRuntimeClient, Wait, } from "testcontainers";
60
+ import { AetherSdkError } from "@aether-agent/sdk";
61
+ const STARTUP_TIMEOUT_MS = 60_000;
62
+ export class Container {
63
+ container;
64
+ ephemeralTempdirs;
65
+ workspaceRoot = "/workspace";
66
+ cwd;
67
+ constructor(container, ephemeralTempdirs, cwd) {
68
+ this.container = container;
69
+ this.ephemeralTempdirs = ephemeralTempdirs;
70
+ this.cwd = cwd;
71
+ }
72
+ static builder(image) {
73
+ return new ContainerBuilder(image);
74
+ }
75
+ async exec(options) {
76
+ const result = await this.container.exec(options.command, {
77
+ workingDir: options.cwd ?? this.cwd,
78
+ env: options.env,
79
+ });
80
+ return {
81
+ exitCode: result.exitCode,
82
+ stdout: result.stdout,
83
+ stderr: result.stderr,
84
+ };
85
+ }
86
+ async execShell(script) {
87
+ return this.exec({
88
+ command: ["/bin/sh", "-lc", script],
89
+ });
90
+ }
91
+ async *execStreaming(options) {
92
+ const env_1 = { stack: [], error: void 0, hasError: false };
93
+ try {
94
+ const client = await getContainerRuntimeClient();
95
+ const dockerode = client.container.dockerode;
96
+ const dockerodeContainer = dockerode.getContainer(this.container.getId());
97
+ const env = Object.entries(options.env ?? {}).map(([key, value]) => `${key}=${value}`);
98
+ const exec = await dockerodeContainer.exec({
99
+ Cmd: options.command,
100
+ AttachStdout: true,
101
+ AttachStderr: true,
102
+ WorkingDir: options.cwd ?? this.cwd,
103
+ Env: env.length > 0 ? env : undefined,
104
+ });
105
+ const stream = await exec.start({ hijack: true, stdin: false });
106
+ const stdoutPipe = new PassThrough();
107
+ const stderrPipe = new PassThrough();
108
+ dockerodeContainer.modem.demuxStream(stream, stdoutPipe, stderrPipe);
109
+ stderrPipe.setEncoding("utf8");
110
+ stderrPipe.on("data", (chunk) => {
111
+ options.onStderr?.(chunk);
112
+ });
113
+ const abortCleanup = __addDisposableResource(env_1, options.signal
114
+ ? addAbortListener(options.signal, () => {
115
+ stream.destroy(new AetherSdkError("aborted", "Aborted by caller"));
116
+ })
117
+ : undefined, false);
118
+ void abortCleanup;
119
+ try {
120
+ const lines = createInterface({ input: stdoutPipe, crlfDelay: Infinity });
121
+ try {
122
+ for await (const line of lines) {
123
+ yield line;
124
+ }
125
+ }
126
+ finally {
127
+ lines.close();
128
+ }
129
+ }
130
+ finally {
131
+ stream.destroy();
132
+ }
133
+ }
134
+ catch (e_1) {
135
+ env_1.error = e_1;
136
+ env_1.hasError = true;
137
+ }
138
+ finally {
139
+ __disposeResources(env_1);
140
+ }
141
+ }
142
+ async [Symbol.asyncDispose]() {
143
+ await this.container.stop().catch(() => { });
144
+ await removeTempdirs(this.ephemeralTempdirs);
145
+ }
146
+ }
147
+ export class ContainerBuilder {
148
+ image;
149
+ envVars = {};
150
+ mounts = [];
151
+ ephemeralMounts = [];
152
+ constructor(image) {
153
+ this.image = image;
154
+ }
155
+ withEnvVar(key, value) {
156
+ this.envVars[key] = value;
157
+ return this;
158
+ }
159
+ withEnvVars(envVars) {
160
+ this.envVars = { ...this.envVars, ...envVars };
161
+ return this;
162
+ }
163
+ withMount(mount) {
164
+ this.mounts.push(mount);
165
+ return this;
166
+ }
167
+ withEphemeralMount(target) {
168
+ this.ephemeralMounts.push(target);
169
+ return this;
170
+ }
171
+ async start(workspace) {
172
+ const ephemeralTempdirs = [];
173
+ try {
174
+ const ephemeralBindMounts = [];
175
+ for (const target of this.ephemeralMounts) {
176
+ const source = await mkdtemp(join(tmpdir(), "aether-eval-mount-"));
177
+ ephemeralTempdirs.push(source);
178
+ ephemeralBindMounts.push({ source, target, mode: "rw" });
179
+ }
180
+ const cwd = workspace.relativeCwd
181
+ ? posix.join("/workspace", workspace.relativeCwd)
182
+ : "/workspace";
183
+ const workspaceMount = {
184
+ source: workspace.rootPath,
185
+ target: "/workspace",
186
+ mode: "rw",
187
+ };
188
+ const container = await createGenericContainer(this.image);
189
+ const started = await container
190
+ .withEntrypoint(["/bin/sh"])
191
+ .withCommand(["-c", "sleep infinity"])
192
+ .withWorkingDir(cwd)
193
+ .withEnvironment(this.envVars)
194
+ .withBindMounts([
195
+ workspaceMount,
196
+ ...this.mounts,
197
+ ...ephemeralBindMounts,
198
+ ])
199
+ .withWaitStrategy(Wait.forSuccessfulCommand("true"))
200
+ .withStartupTimeout(STARTUP_TIMEOUT_MS)
201
+ .start();
202
+ return new Container(started, ephemeralTempdirs, cwd);
203
+ }
204
+ catch (err) {
205
+ await removeTempdirs(ephemeralTempdirs);
206
+ throw err;
207
+ }
208
+ }
209
+ }
210
+ async function createGenericContainer(image) {
211
+ if (!image.build) {
212
+ return new GenericContainer(image.toString());
213
+ }
214
+ let builder = GenericContainer.fromDockerfile(image.build.context, image.build.dockerfile);
215
+ if (image.build.buildArgs) {
216
+ builder = builder.withBuildArgs(image.build.buildArgs);
217
+ }
218
+ if (image.build.cache !== undefined) {
219
+ builder = builder.withCache(image.build.cache);
220
+ }
221
+ if (image.build.buildkit) {
222
+ builder = builder.withBuildkit();
223
+ }
224
+ if (image.build.platform) {
225
+ builder = builder.withPlatform(image.build.platform);
226
+ }
227
+ if (image.build.target) {
228
+ builder = builder.withTarget(image.build.target);
229
+ }
230
+ return await builder.build(image.toString(), {
231
+ deleteOnExit: image.build.deleteOnExit ?? false,
232
+ });
233
+ }
234
+ async function removeTempdirs(tempdirs) {
235
+ await Promise.all(tempdirs.map((path) => rm(path, { recursive: true, force: true })));
236
+ }
237
+ //# sourceMappingURL=container.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"container.js","sourceRoot":"","sources":["../../src/containers/container.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ export interface ImageBuildOptions {
2
+ context: string;
3
+ dockerfile?: string;
4
+ buildArgs?: Record<string, string>;
5
+ cache?: boolean;
6
+ buildkit?: boolean;
7
+ platform?: string;
8
+ target?: string;
9
+ deleteOnExit?: boolean;
10
+ }
11
+ export declare class Image {
12
+ readonly name: string;
13
+ readonly tag: string;
14
+ readonly build: ImageBuildOptions | undefined;
15
+ constructor(name: string, tag?: string, build?: ImageBuildOptions);
16
+ static parse(image: string): Image;
17
+ static fromDockerfile(image: string, build: ImageBuildOptions): Image;
18
+ toString(): string;
19
+ }
20
+ //# sourceMappingURL=image.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image.d.ts","sourceRoot":"","sources":["../../src/containers/image.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,qBAAa,KAAK;IAChB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,KAAK,EAAE,iBAAiB,GAAG,SAAS,CAAC;gBAElC,IAAI,EAAE,MAAM,EAAE,GAAG,SAAW,EAAE,KAAK,CAAC,EAAE,iBAAiB;IAOnE,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK;IAKlC,MAAM,CAAC,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,iBAAiB,GAAG,KAAK;IAKrE,QAAQ,IAAI,MAAM;CAGnB"}
@@ -0,0 +1,43 @@
1
+ import { AetherEvalError } from "../errors.js";
2
+ export class Image {
3
+ name;
4
+ tag;
5
+ build;
6
+ constructor(name, tag = "latest", build) {
7
+ validateImageReference(`${name}:${tag}`);
8
+ this.name = name;
9
+ this.tag = tag;
10
+ this.build = build ? { ...build } : undefined;
11
+ }
12
+ static parse(image) {
13
+ const { name, tag } = parseImageReference(image);
14
+ return new Image(name, tag);
15
+ }
16
+ static fromDockerfile(image, build) {
17
+ const { name, tag } = parseImageReference(image);
18
+ return new Image(name, tag, build);
19
+ }
20
+ toString() {
21
+ return `${this.name}:${this.tag}`;
22
+ }
23
+ }
24
+ function parseImageReference(image) {
25
+ validateImageReference(image);
26
+ const lastSlash = image.lastIndexOf("/");
27
+ const lastColon = image.lastIndexOf(":");
28
+ if (lastColon !== -1 && (lastSlash === -1 || lastColon > lastSlash)) {
29
+ return {
30
+ name: image.slice(0, lastColon),
31
+ tag: image.slice(lastColon + 1),
32
+ };
33
+ }
34
+ return { name: image, tag: "latest" };
35
+ }
36
+ function validateImageReference(reference) {
37
+ if (reference === "" ||
38
+ reference.startsWith(":") ||
39
+ reference.endsWith(":")) {
40
+ throw new AetherEvalError("invalid_image_reference", `invalid container image reference '${reference}'`);
41
+ }
42
+ }
43
+ //# sourceMappingURL=image.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image.js","sourceRoot":"","sources":["../../src/containers/image.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAa/C,MAAM,OAAO,KAAK;IACP,IAAI,CAAS;IACb,GAAG,CAAS;IACZ,KAAK,CAAgC;IAE9C,YAAY,IAAY,EAAE,GAAG,GAAG,QAAQ,EAAE,KAAyB;QACjE,sBAAsB,CAAC,GAAG,IAAI,IAAI,GAAG,EAAE,CAAC,CAAC;QACzC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QACf,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;IAChD,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,KAAa;QACxB,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC;QACjD,OAAO,IAAI,KAAK,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAC9B,CAAC;IAED,MAAM,CAAC,cAAc,CAAC,KAAa,EAAE,KAAwB;QAC3D,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC;QACjD,OAAO,IAAI,KAAK,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;IACrC,CAAC;IAED,QAAQ;QACN,OAAO,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;IACpC,CAAC;CACF;AAED,SAAS,mBAAmB,CAAC,KAAa;IACxC,sBAAsB,CAAC,KAAK,CAAC,CAAC;IAC9B,MAAM,SAAS,GAAG,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IACzC,MAAM,SAAS,GAAG,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IACzC,IAAI,SAAS,KAAK,CAAC,CAAC,IAAI,CAAC,SAAS,KAAK,CAAC,CAAC,IAAI,SAAS,GAAG,SAAS,CAAC,EAAE,CAAC;QACpE,OAAO;YACL,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC;YAC/B,GAAG,EAAE,KAAK,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC;SAChC,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC;AACxC,CAAC;AAED,SAAS,sBAAsB,CAAC,SAAiB;IAC/C,IACE,SAAS,KAAK,EAAE;QAChB,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC;QACzB,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,EACvB,CAAC;QACD,MAAM,IAAI,eAAe,CACvB,yBAAyB,EACzB,sCAAsC,SAAS,GAAG,CACnD,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -0,0 +1,5 @@
1
+ export { Container, ContainerBuilder } from "./container.js";
2
+ export type { BindMount, ContainerExecOptions, ContainerStreamingOptions, ExecOutput, } from "./container.js";
3
+ export { Image } from "./image.js";
4
+ export type { ImageBuildOptions } from "./image.js";
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/containers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAC7D,YAAY,EACV,SAAS,EACT,oBAAoB,EACpB,yBAAyB,EACzB,UAAU,GACX,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,YAAY,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { Container, ContainerBuilder } from "./container.js";
2
+ export { Image } from "./image.js";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/containers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAO7D,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC"}
package/dist/diff.d.ts ADDED
@@ -0,0 +1,11 @@
1
+ export interface GitDiff {
2
+ diff: string;
3
+ stats: DiffStats;
4
+ }
5
+ export interface DiffStats {
6
+ filesChanged: number;
7
+ linesAdded: number;
8
+ linesRemoved: number;
9
+ }
10
+ export declare function diffStatsFromDiff(diff: string): DiffStats;
11
+ //# sourceMappingURL=diff.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../src/diff.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,SAAS,CAAC;CAClB;AAED,MAAM,WAAW,SAAS;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAgBzD"}
package/dist/diff.js ADDED
@@ -0,0 +1,18 @@
1
+ export function diffStatsFromDiff(diff) {
2
+ let filesChanged = 0;
3
+ let linesAdded = 0;
4
+ let linesRemoved = 0;
5
+ for (const line of diff.split("\n")) {
6
+ if (line.startsWith("diff --git")) {
7
+ filesChanged += 1;
8
+ }
9
+ else if (line.startsWith("+") && !line.startsWith("+++")) {
10
+ linesAdded += 1;
11
+ }
12
+ else if (line.startsWith("-") && !line.startsWith("---")) {
13
+ linesRemoved += 1;
14
+ }
15
+ }
16
+ return { filesChanged, linesAdded, linesRemoved };
17
+ }
18
+ //# sourceMappingURL=diff.js.map
@@ -0,0 +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"}
@@ -0,0 +1,7 @@
1
+ export type AetherEvalErrorCode = "configuration_error" | "command_exit_without_terminal" | "agent_message_json_line" | "invalid_image_reference";
2
+ export declare class AetherEvalError extends Error {
3
+ readonly code: AetherEvalErrorCode;
4
+ readonly cause?: unknown;
5
+ constructor(code: AetherEvalErrorCode, message: string, cause?: unknown);
6
+ }
7
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,mBAAmB,GAC3B,qBAAqB,GACrB,+BAA+B,GAC/B,yBAAyB,GACzB,yBAAyB,CAAC;AAE9B,qBAAa,eAAgB,SAAQ,KAAK;IACxC,QAAQ,CAAC,IAAI,EAAE,mBAAmB,CAAC;IACnC,SAAkB,KAAK,CAAC,EAAE,OAAO,CAAC;gBAEtB,IAAI,EAAE,mBAAmB,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO;CAMxE"}
package/dist/errors.js ADDED
@@ -0,0 +1,11 @@
1
+ export class AetherEvalError extends Error {
2
+ code;
3
+ cause;
4
+ constructor(code, message, cause) {
5
+ super(message);
6
+ this.name = "AetherEvalError";
7
+ this.code = code;
8
+ this.cause = cause;
9
+ }
10
+ }
11
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAMA,MAAM,OAAO,eAAgB,SAAQ,KAAK;IAC/B,IAAI,CAAsB;IACjB,KAAK,CAAW;IAElC,YAAY,IAAyB,EAAE,OAAe,EAAE,KAAe;QACrE,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;QAC9B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;CACF"}
@@ -0,0 +1,54 @@
1
+ import { z } from "zod";
2
+ import type { ReasoningEffort } from "@aether-agent/sdk";
3
+ export type { ReasoningEffort } from "@aether-agent/sdk";
4
+ export interface GenerateOptions {
5
+ /**
6
+ * Model to call, as `provider:model` (e.g. `anthropic:claude-sonnet-4-5`). Defaults to the
7
+ * `AETHER_LLM_MODEL` environment variable.
8
+ */
9
+ model?: string;
10
+ /** Optional system prompt. */
11
+ system?: string;
12
+ /** Sampling temperature. Lower is more deterministic (e.g. `0` for grading). */
13
+ temperature?: number;
14
+ /** Nucleus sampling: the probability mass to sample from. */
15
+ topP?: number;
16
+ /** Upper bound on the number of tokens generated in the response. */
17
+ maxTokens?: number;
18
+ /** Reasoning effort for models that support extended thinking. */
19
+ reasoningEffort?: ReasoningEffort;
20
+ /** Path to the `aether` binary. Defaults to the bundled `@aether-agent/cli`. */
21
+ binaryPath?: string;
22
+ /** Environment for the spawned process. Defaults to the current process environment. */
23
+ env?: Record<string, string | undefined>;
24
+ /** Abort the call. */
25
+ signal?: AbortSignal;
26
+ }
27
+ export type GenerateJsonOptions<T extends z.ZodType> = GenerateOptions & {
28
+ /** Validate the model's response as JSON with this schema and return the parsed value. */
29
+ schema: T;
30
+ };
31
+ export interface GenerateResult {
32
+ /** The model's response text. */
33
+ text: string;
34
+ }
35
+ /**
36
+ * Call a model with a single prompt and return its response, via the `aether generate` CLI.
37
+ * When a Zod schema is provided, the model response is parsed as JSON, validated, and returned
38
+ * as the inferred schema type.
39
+ *
40
+ * @example
41
+ * ```ts
42
+ * const { text } = await generate("Summarize this diff in one sentence:\n" + diff, {
43
+ * model: "anthropic:claude-sonnet-4-5",
44
+ * });
45
+ *
46
+ * const verdict = await generate("Grade this run as JSON", {
47
+ * model: "anthropic:claude-sonnet-4-5",
48
+ * schema: z.object({ passed: z.boolean(), reason: z.string() }),
49
+ * });
50
+ * ```
51
+ */
52
+ export declare function generate(prompt: string, options?: GenerateOptions): Promise<GenerateResult>;
53
+ export declare function generate<T extends z.ZodType>(prompt: string, options: GenerateJsonOptions<T>): Promise<z.infer<T>>;
54
+ //# sourceMappingURL=generate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../src/generate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAQxB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACzD,YAAY,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEzD,MAAM,WAAW,eAAe;IAC9B;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,8BAA8B;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB,gFAAgF;IAChF,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,6DAA6D;IAC7D,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd,qEAAqE;IACrE,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,kEAAkE;IAClE,eAAe,CAAC,EAAE,eAAe,CAAC;IAElC,gFAAgF;IAChF,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,wFAAwF;IACxF,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;IAEzC,sBAAsB;IACtB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED,MAAM,MAAM,mBAAmB,CAAC,CAAC,SAAS,CAAC,CAAC,OAAO,IAAI,eAAe,GAAG;IACvE,0FAA0F;IAC1F,MAAM,EAAE,CAAC,CAAC;CACX,CAAC;AAEF,MAAM,WAAW,cAAc;IAC7B,iCAAiC;IACjC,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,QAAQ,CACtB,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,eAAe,GACxB,OAAO,CAAC,cAAc,CAAC,CAAC;AAC3B,wBAAgB,QAAQ,CAAC,CAAC,SAAS,CAAC,CAAC,OAAO,EAC1C,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,mBAAmB,CAAC,CAAC,CAAC,GAC9B,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC"}
@@ -0,0 +1,100 @@
1
+ import { z } from "zod";
2
+ import { AetherSdkError, resolveAetherCommand, resolveEnv, runCommand, } from "@aether-agent/sdk";
3
+ export async function generate(prompt, options = {}) {
4
+ const model = options.model ?? process.env.AETHER_LLM_MODEL;
5
+ if (!model) {
6
+ throw new AetherSdkError("invalid_options", "No model provided to `generate`. Pass `options.model` or set the AETHER_LLM_MODEL environment variable.");
7
+ }
8
+ const { command, prefixArgs } = resolveAetherCommand(options.binaryPath);
9
+ const args = [
10
+ ...prefixArgs,
11
+ "generate",
12
+ "--model",
13
+ model,
14
+ "--prompt-file",
15
+ "-",
16
+ "--output",
17
+ "json",
18
+ ];
19
+ if (options.system !== undefined) {
20
+ args.push("--system", options.system);
21
+ }
22
+ if (options.temperature !== undefined) {
23
+ args.push("--temperature", String(options.temperature));
24
+ }
25
+ if (options.topP !== undefined) {
26
+ args.push("--top-p", String(options.topP));
27
+ }
28
+ if (options.maxTokens !== undefined) {
29
+ args.push("--max-tokens", String(options.maxTokens));
30
+ }
31
+ if (options.reasoningEffort !== undefined) {
32
+ args.push("--reasoning-effort", options.reasoningEffort);
33
+ }
34
+ const promptWithInstructions = "schema" in options
35
+ ? `${prompt}\n\nRespond with ONLY valid JSON. Do not include markdown fences or explanatory prose.`
36
+ : prompt;
37
+ const { stdout } = await runCommand(command, args, {
38
+ cwd: process.cwd(),
39
+ env: resolveEnv(options.env),
40
+ stdin: promptWithInstructions,
41
+ abortSignal: options.signal,
42
+ spawnFailedMessage: `Failed to run aether generate at ${command}`,
43
+ exitedErrorCode: "generate_command_failed",
44
+ exitedMessage: ({ exitCode, stderr }) => `aether generate exited with code ${exitCode}.\n${stderr}`,
45
+ });
46
+ const text = parseResponseText(stdout);
47
+ if ("schema" in options)
48
+ return parseJsonResponse(text, options.schema);
49
+ return { text };
50
+ }
51
+ function parseResponseText(stdout) {
52
+ let parsed;
53
+ try {
54
+ parsed = JSON.parse(stdout);
55
+ }
56
+ catch (err) {
57
+ throw new AetherSdkError("generate_command_failed", `Failed to parse aether generate output as JSON: ${stdout}`, err);
58
+ }
59
+ if (typeof parsed !== "object" ||
60
+ parsed === null ||
61
+ typeof parsed.text !== "string") {
62
+ throw new AetherSdkError("generate_command_failed", `aether generate output did not contain a string "text" field: ${stdout}`);
63
+ }
64
+ return parsed.text;
65
+ }
66
+ function parseJsonResponse(response, schema) {
67
+ let parsed;
68
+ try {
69
+ parsed = JSON.parse(extractJson(response));
70
+ }
71
+ catch (err) {
72
+ throw new AetherSdkError("generate_command_failed", `Model returned invalid JSON.\nRaw response: ${response}`, err);
73
+ }
74
+ const result = schema.safeParse(parsed);
75
+ if (!result.success) {
76
+ throw new AetherSdkError("generate_command_failed", `Model response did not match schema.\n${z.prettifyError(result.error)}\nRaw response: ${response}`, result.error);
77
+ }
78
+ return result.data;
79
+ }
80
+ function extractJson(response) {
81
+ const trimmed = response.trim();
82
+ try {
83
+ JSON.parse(trimmed);
84
+ return trimmed;
85
+ }
86
+ catch {
87
+ const objectStart = trimmed.indexOf("{");
88
+ const objectEnd = trimmed.lastIndexOf("}");
89
+ if (objectStart !== -1 && objectEnd !== -1 && objectStart <= objectEnd) {
90
+ return trimmed.slice(objectStart, objectEnd + 1);
91
+ }
92
+ const arrayStart = trimmed.indexOf("[");
93
+ const arrayEnd = trimmed.lastIndexOf("]");
94
+ if (arrayStart !== -1 && arrayEnd !== -1 && arrayStart <= arrayEnd) {
95
+ return trimmed.slice(arrayStart, arrayEnd + 1);
96
+ }
97
+ return trimmed;
98
+ }
99
+ }
100
+ //# sourceMappingURL=generate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate.js","sourceRoot":"","sources":["../src/generate.ts"],"names":[],"mappings":"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"}
package/dist/git.d.ts ADDED
@@ -0,0 +1,10 @@
1
+ export declare class GitRepo {
2
+ readonly path: string;
3
+ private constructor();
4
+ static fromPath(path: string): GitRepo;
5
+ static clone(url: string, dest: string, signal?: AbortSignal): Promise<GitRepo>;
6
+ checkout(reference: string, signal?: AbortSignal): Promise<void>;
7
+ diff(fromCommit: string, toCommit?: string, signal?: AbortSignal): Promise<string>;
8
+ diffUnstaged(signal?: AbortSignal): Promise<string>;
9
+ }
10
+ //# sourceMappingURL=git.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../src/git.ts"],"names":[],"mappings":"AAIA,qBAAa,OAAO;IACE,QAAQ,CAAC,IAAI,EAAE,MAAM;IAAzC,OAAO;IAEP,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;WAIzB,KAAK,CAChB,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EACZ,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,OAAO,CAAC;IAQb,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAIhE,IAAI,CACR,UAAU,EAAE,MAAM,EAClB,QAAQ,CAAC,EAAE,MAAM,EACjB,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,MAAM,CAAC;IAMZ,YAAY,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC;CAG1D"}
package/dist/git.js ADDED
@@ -0,0 +1,37 @@
1
+ import { env as processEnv } from "node:process";
2
+ import { runCommand } from "@aether-agent/sdk";
3
+ export class GitRepo {
4
+ path;
5
+ constructor(path) {
6
+ this.path = path;
7
+ }
8
+ static fromPath(path) {
9
+ return new GitRepo(path);
10
+ }
11
+ static async clone(url, dest, signal) {
12
+ await git(["clone", "--no-checkout", "--filter=blob:none", url, dest], signal);
13
+ return new GitRepo(dest);
14
+ }
15
+ async checkout(reference, signal) {
16
+ await git(["-C", this.path, "checkout", reference], signal);
17
+ }
18
+ async diff(fromCommit, toCommit, signal) {
19
+ const range = toCommit ? `${fromCommit}..${toCommit}` : fromCommit;
20
+ const result = await git(["-C", this.path, "diff", range], signal);
21
+ return result.stdout;
22
+ }
23
+ async diffUnstaged(signal) {
24
+ return this.diff("HEAD", undefined, signal);
25
+ }
26
+ }
27
+ async function git(args, signal) {
28
+ return await runCommand("git", args, {
29
+ cwd: process.cwd(),
30
+ env: processEnv,
31
+ abortSignal: signal,
32
+ spawnFailedMessage: "Failed to run git for the eval workspace (is git installed and on PATH?)",
33
+ exitedErrorCode: "execution_failed",
34
+ exitedMessage: ({ exitCode, stderr }) => `git ${args.join(" ")} exited with code ${exitCode}.\n${stderr}`,
35
+ });
36
+ }
37
+ //# sourceMappingURL=git.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git.js","sourceRoot":"","sources":["../src/git.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,IAAI,UAAU,EAAE,MAAM,cAAc,CAAC;AAEjD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE/C,MAAM,OAAO,OAAO;IACW;IAA7B,YAA6B,IAAY;QAAZ,SAAI,GAAJ,IAAI,CAAQ;IAAG,CAAC;IAE7C,MAAM,CAAC,QAAQ,CAAC,IAAY;QAC1B,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,KAAK,CAChB,GAAW,EACX,IAAY,EACZ,MAAoB;QAEpB,MAAM,GAAG,CACP,CAAC,OAAO,EAAE,eAAe,EAAE,oBAAoB,EAAE,GAAG,EAAE,IAAI,CAAC,EAC3D,MAAM,CACP,CAAC;QACF,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,SAAiB,EAAE,MAAoB;QACpD,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,UAAU,EAAE,SAAS,CAAC,EAAE,MAAM,CAAC,CAAC;IAC9D,CAAC;IAED,KAAK,CAAC,IAAI,CACR,UAAkB,EAClB,QAAiB,EACjB,MAAoB;QAEpB,MAAM,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,UAAU,KAAK,QAAQ,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC;QACnE,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,CAAC;QACnE,OAAO,MAAM,CAAC,MAAM,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,MAAoB;QACrC,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;IAC9C,CAAC;CACF;AAED,KAAK,UAAU,GAAG,CAAC,IAAc,EAAE,MAAoB;IACrD,OAAO,MAAM,UAAU,CAAC,KAAK,EAAE,IAAI,EAAE;QACnC,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;QAClB,GAAG,EAAE,UAAU;QACf,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"}