@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.
- package/LICENSE +7 -0
- package/README.md +137 -0
- package/dist/Agent.d.ts +6 -0
- package/dist/Agent.d.ts.map +1 -0
- package/dist/Agent.js +2 -0
- package/dist/Agent.js.map +1 -0
- package/dist/DockerAgent.d.ts +24 -0
- package/dist/DockerAgent.d.ts.map +1 -0
- package/dist/DockerAgent.js +101 -0
- package/dist/DockerAgent.js.map +1 -0
- package/dist/FakeAgent.d.ts +21 -0
- package/dist/FakeAgent.d.ts.map +1 -0
- package/dist/FakeAgent.js +69 -0
- package/dist/FakeAgent.js.map +1 -0
- package/dist/containers/container.d.ts +51 -0
- package/dist/containers/container.d.ts.map +1 -0
- package/dist/containers/container.js +237 -0
- package/dist/containers/container.js.map +1 -0
- package/dist/containers/image.d.ts +20 -0
- package/dist/containers/image.d.ts.map +1 -0
- package/dist/containers/image.js +43 -0
- package/dist/containers/image.js.map +1 -0
- package/dist/containers/index.d.ts +5 -0
- package/dist/containers/index.d.ts.map +1 -0
- package/dist/containers/index.js +3 -0
- package/dist/containers/index.js.map +1 -0
- package/dist/diff.d.ts +11 -0
- package/dist/diff.d.ts.map +1 -0
- package/dist/diff.js +18 -0
- package/dist/diff.js.map +1 -0
- package/dist/errors.d.ts +7 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +11 -0
- package/dist/errors.js.map +1 -0
- package/dist/generate.d.ts +54 -0
- package/dist/generate.d.ts.map +1 -0
- package/dist/generate.js +100 -0
- package/dist/generate.js.map +1 -0
- package/dist/git.d.ts +10 -0
- package/dist/git.d.ts.map +1 -0
- package/dist/git.js +37 -0
- package/dist/git.js.map +1 -0
- package/dist/index.d.ts +20 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -0
- package/dist/judge.d.ts +47 -0
- package/dist/judge.d.ts.map +1 -0
- package/dist/judge.js +177 -0
- package/dist/judge.js.map +1 -0
- package/dist/task.d.ts +5 -0
- package/dist/task.d.ts.map +1 -0
- package/dist/task.js +7 -0
- package/dist/task.js.map +1 -0
- package/dist/transcript.d.ts +24 -0
- package/dist/transcript.d.ts.map +1 -0
- package/dist/transcript.js +96 -0
- package/dist/transcript.js.map +1 -0
- package/dist/workspace.d.ts +45 -0
- package/dist/workspace.d.ts.map +1 -0
- package/dist/workspace.js +135 -0
- package/dist/workspace.js.map +1 -0
- package/package.json +41 -0
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export { DockerAgent } from "./DockerAgent.js";
|
|
2
|
+
export type { DockerAgentOptions } from "./DockerAgent.js";
|
|
3
|
+
export { AetherEvalError } from "./errors.js";
|
|
4
|
+
export type { AetherEvalErrorCode } from "./errors.js";
|
|
5
|
+
export { Container, ContainerBuilder, Image } from "./containers/index.js";
|
|
6
|
+
export type { BindMount, ContainerExecOptions, ContainerStreamingOptions, ExecOutput, ImageBuildOptions, } from "./containers/index.js";
|
|
7
|
+
export type { Agent } from "./Agent.js";
|
|
8
|
+
export { FakeAgent } from "./FakeAgent.js";
|
|
9
|
+
export { Task } from "./task.js";
|
|
10
|
+
export { diffStatsFromDiff } from "./diff.js";
|
|
11
|
+
export type { DiffStats, GitDiff } from "./diff.js";
|
|
12
|
+
export { generate } from "./generate.js";
|
|
13
|
+
export type { GenerateJsonOptions, GenerateOptions, GenerateResult, ReasoningEffort, } from "./generate.js";
|
|
14
|
+
export { judge, JudgeCriterionResponseSchema, JudgeResponseSchema, } from "./judge.js";
|
|
15
|
+
export type { Judge, JudgeContext, JudgeCriterionResponse, JudgeCriterionSpec, JudgeCriterionSummary, JudgeInput, JudgeRubricResponse, JudgeSummary, } from "./judge.js";
|
|
16
|
+
export { Transcript, TranscriptError, ToolCall } from "./transcript.js";
|
|
17
|
+
export { Workspace } from "./workspace.js";
|
|
18
|
+
export type { GitRepoSpec, RetainedWorkspaceInfo, WorkspaceSource, } from "./workspace.js";
|
|
19
|
+
export type { AgentMessage, ContextUsage, FileDiff, PlanMeta, PlanMetaEntry, PlanMetaStatus, ToolCallError, ToolCallRequest, ToolCallResult, ToolDisplayMeta, ToolResultMeta, } from "@aether-agent/sdk";
|
|
20
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +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,MAAM,aAAa,CAAC;AAC9C,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,MAAM,YAAY,CAAC;AACxC,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,EAAE,UAAU,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AACxE,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,YAAY,EACV,WAAW,EACX,qBAAqB,EACrB,eAAe,GAChB,MAAM,gBAAgB,CAAC;AACxB,YAAY,EACV,YAAY,EACZ,YAAY,EACZ,QAAQ,EACR,QAAQ,EACR,aAAa,EACb,cAAc,EACd,aAAa,EACb,eAAe,EACf,cAAc,EACd,eAAe,EACf,cAAc,GACf,MAAM,mBAAmB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export { DockerAgent } from "./DockerAgent.js";
|
|
2
|
+
export { AetherEvalError } from "./errors.js";
|
|
3
|
+
export { Container, ContainerBuilder, Image } from "./containers/index.js";
|
|
4
|
+
export { FakeAgent } from "./FakeAgent.js";
|
|
5
|
+
export { Task } from "./task.js";
|
|
6
|
+
export { diffStatsFromDiff } from "./diff.js";
|
|
7
|
+
export { generate } from "./generate.js";
|
|
8
|
+
export { judge, JudgeCriterionResponseSchema, JudgeResponseSchema, } from "./judge.js";
|
|
9
|
+
export { Transcript, TranscriptError, ToolCall } from "./transcript.js";
|
|
10
|
+
export { Workspace } from "./workspace.js";
|
|
11
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +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,MAAM,aAAa,CAAC;AAE9C,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,EAAE,UAAU,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AACxE,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC"}
|
package/dist/judge.d.ts
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import type { AgentMessage, JudgeCriterionResponse, JudgeCriterionSpec, JudgeCriterionSummary, JudgeRubricResponse, JudgeSummary } from "@aether-agent/sdk";
|
|
3
|
+
export type { JudgeCriterionResponse, JudgeCriterionSpec, JudgeCriterionSummary, JudgeRubricResponse, JudgeSummary, };
|
|
4
|
+
export interface JudgeInput {
|
|
5
|
+
/** High-level grading instructions. */
|
|
6
|
+
instructions: string;
|
|
7
|
+
/** The task the agent was given. */
|
|
8
|
+
task: string;
|
|
9
|
+
/** Evidence the judge should use when grading the run. */
|
|
10
|
+
context?: JudgeContext;
|
|
11
|
+
/** Ordered rubric criteria to score on a normalized 0.0..=1.0 scale. */
|
|
12
|
+
criteria: JudgeCriterionSpec[];
|
|
13
|
+
}
|
|
14
|
+
export interface JudgeContext {
|
|
15
|
+
/** The agent transcript, e.g. messages collected from `Agent.run` with `Transcript.fromStream`. */
|
|
16
|
+
transcript?: AgentMessage[];
|
|
17
|
+
/** A workspace diff to grade against. */
|
|
18
|
+
diff?: string;
|
|
19
|
+
/** Final file contents to include, keyed by path. */
|
|
20
|
+
files?: Record<string, string>;
|
|
21
|
+
}
|
|
22
|
+
export interface Judge {
|
|
23
|
+
prompt: string;
|
|
24
|
+
schema: typeof JudgeResponseSchema;
|
|
25
|
+
criteria: Required<JudgeCriterionSpec>[];
|
|
26
|
+
summarize(response: JudgeRubricResponse): JudgeSummary;
|
|
27
|
+
}
|
|
28
|
+
export declare const JudgeCriterionResponseSchema: z.ZodObject<{
|
|
29
|
+
id: z.ZodString;
|
|
30
|
+
score: z.ZodNumber;
|
|
31
|
+
reason: z.ZodString;
|
|
32
|
+
}, z.core.$strip>;
|
|
33
|
+
export declare const JudgeResponseSchema: z.ZodObject<{
|
|
34
|
+
criteria: z.ZodArray<z.ZodObject<{
|
|
35
|
+
id: z.ZodString;
|
|
36
|
+
score: z.ZodNumber;
|
|
37
|
+
reason: z.ZodString;
|
|
38
|
+
}, z.core.$strip>>;
|
|
39
|
+
overall_reason: z.ZodString;
|
|
40
|
+
}, z.core.$strip>;
|
|
41
|
+
/** Compose a judge prompt and deterministic rubric summarizer from structured context. */
|
|
42
|
+
export declare function judge(input: JudgeInput): Judge;
|
|
43
|
+
/** Render a transcript of streamed `AgentMessage`s as readable lines for a judge prompt. */
|
|
44
|
+
export declare function formatTranscript(messages: AgentMessage[]): string;
|
|
45
|
+
/** Format a single agent message into a readable line for a judge prompt. */
|
|
46
|
+
export declare function messageToString(message: AgentMessage): string;
|
|
47
|
+
//# sourceMappingURL=judge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"judge.d.ts","sourceRoot":"","sources":["../src/judge.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,KAAK,EACV,YAAY,EACZ,sBAAsB,EACtB,kBAAkB,EAClB,qBAAqB,EACrB,mBAAmB,EACnB,YAAY,EACb,MAAM,mBAAmB,CAAC;AAE3B,YAAY,EACV,sBAAsB,EACtB,kBAAkB,EAClB,qBAAqB,EACrB,mBAAmB,EACnB,YAAY,GACb,CAAC;AAEF,MAAM,WAAW,UAAU;IACzB,uCAAuC;IACvC,YAAY,EAAE,MAAM,CAAC;IACrB,oCAAoC;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,0DAA0D;IAC1D,OAAO,CAAC,EAAE,YAAY,CAAC;IACvB,wEAAwE;IACxE,QAAQ,EAAE,kBAAkB,EAAE,CAAC;CAChC;AAED,MAAM,WAAW,YAAY;IAC3B,mGAAmG;IACnG,UAAU,CAAC,EAAE,YAAY,EAAE,CAAC;IAC5B,yCAAyC;IACzC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,qDAAqD;IACrD,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAChC;AAED,MAAM,WAAW,KAAK;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,OAAO,mBAAmB,CAAC;IACnC,QAAQ,EAAE,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC;IACzC,SAAS,CAAC,QAAQ,EAAE,mBAAmB,GAAG,YAAY,CAAC;CACxD;AAED,eAAO,MAAM,4BAA4B;;;;iBAIvC,CAAC;AAEH,eAAO,MAAM,mBAAmB;;;;;;;iBAG9B,CAAC;AAEH,0FAA0F;AAC1F,wBAAgB,KAAK,CAAC,KAAK,EAAE,UAAU,GAAG,KAAK,CA4D9C;AAED,4FAA4F;AAC5F,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,YAAY,EAAE,GAAG,MAAM,CA6BjE;AAED,6EAA6E;AAC7E,wBAAgB,eAAe,CAAC,OAAO,EAAE,YAAY,GAAG,MAAM,CAa7D"}
|
package/dist/judge.js
ADDED
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { AetherSdkError } from "@aether-agent/sdk";
|
|
3
|
+
export const JudgeCriterionResponseSchema = z.object({
|
|
4
|
+
id: z.string(),
|
|
5
|
+
score: z.number().min(0).max(1),
|
|
6
|
+
reason: z.string(),
|
|
7
|
+
});
|
|
8
|
+
export const JudgeResponseSchema = z.object({
|
|
9
|
+
criteria: z.array(JudgeCriterionResponseSchema),
|
|
10
|
+
overall_reason: z.string(),
|
|
11
|
+
});
|
|
12
|
+
/** Compose a judge prompt and deterministic rubric summarizer from structured context. */
|
|
13
|
+
export function judge(input) {
|
|
14
|
+
const criteria = normalizeCriteria(input.criteria);
|
|
15
|
+
const sections = [
|
|
16
|
+
`## Instructions`,
|
|
17
|
+
`${input.instructions}`,
|
|
18
|
+
`## Task`,
|
|
19
|
+
`The agent you're evaluating was given this task: <task>${input.task}</task>`,
|
|
20
|
+
];
|
|
21
|
+
if (input.context?.transcript?.length) {
|
|
22
|
+
sections.push(`## Agent Transcript`, `Transcript of the agent you're evaluating: <transcript>${formatTranscript(input.context.transcript)}</transcript>`);
|
|
23
|
+
}
|
|
24
|
+
if (input.context?.diff) {
|
|
25
|
+
sections.push(`## Git diff`, `Git diff produced by the agent you're evaluating: <diff>${input.context.diff}</diff>`);
|
|
26
|
+
}
|
|
27
|
+
if (input.context?.files && Object.keys(input.context.files).length > 0) {
|
|
28
|
+
const blocks = Object.entries(input.context.files).map(([path, content]) => [
|
|
29
|
+
`<file>`,
|
|
30
|
+
`<path>${path}</path>`,
|
|
31
|
+
`<contents>${content}</contents>`,
|
|
32
|
+
`</file>`,
|
|
33
|
+
].join(""));
|
|
34
|
+
sections.push(`## File Contents`, `Files under evaluation: <files>${blocks.join("\n")}</files>`);
|
|
35
|
+
}
|
|
36
|
+
const rubric = criteria.map((criterion) => `- id: ${criterion.id}\n blocking: ${criterion.blocking}\n weight: ${criterion.weight}\n threshold: ${criterion.threshold}\n description: ${criterion.description}`);
|
|
37
|
+
sections.push([`## Rubric criteria`, `${rubric.join("\n")}`].join("\n"));
|
|
38
|
+
sections.push([
|
|
39
|
+
"Return exactly one result for every criterion ID above and no extra criteria.",
|
|
40
|
+
"Scores must be normalized numbers from 0.0 to 1.0.",
|
|
41
|
+
"Respond with ONLY a JSON object matching this schema:",
|
|
42
|
+
JSON.stringify(z.toJSONSchema(JudgeResponseSchema), null, 2),
|
|
43
|
+
].join("\n"));
|
|
44
|
+
return {
|
|
45
|
+
prompt: sections.join("\n\n"),
|
|
46
|
+
schema: JudgeResponseSchema,
|
|
47
|
+
criteria,
|
|
48
|
+
summarize: (response) => summarizeJudgeResponse(criteria, response),
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
/** Render a transcript of streamed `AgentMessage`s as readable lines for a judge prompt. */
|
|
52
|
+
export function formatTranscript(messages) {
|
|
53
|
+
const lines = [];
|
|
54
|
+
const buffers = new Map();
|
|
55
|
+
const flush = (id) => {
|
|
56
|
+
const buffer = buffers.get(id);
|
|
57
|
+
if (buffer && buffer.text.trim())
|
|
58
|
+
lines.push(`[${buffer.kind}] ${buffer.text}`);
|
|
59
|
+
buffers.delete(id);
|
|
60
|
+
};
|
|
61
|
+
for (const message of messages) {
|
|
62
|
+
if (message.type === "text" || message.type === "thought") {
|
|
63
|
+
const kind = message.type === "text" ? "agent" : "thinking";
|
|
64
|
+
const buffer = buffers.get(message.message_id) ?? { kind, text: "" };
|
|
65
|
+
buffer.text += message.chunk;
|
|
66
|
+
buffers.set(message.message_id, buffer);
|
|
67
|
+
if (message.is_complete)
|
|
68
|
+
flush(message.message_id);
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
const formatted = messageToString(message);
|
|
72
|
+
if (formatted)
|
|
73
|
+
lines.push(formatted);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
for (const id of [...buffers.keys()])
|
|
77
|
+
flush(id);
|
|
78
|
+
return lines.join("\n");
|
|
79
|
+
}
|
|
80
|
+
/** Format a single agent message into a readable line for a judge prompt. */
|
|
81
|
+
export function messageToString(message) {
|
|
82
|
+
switch (message.type) {
|
|
83
|
+
case "tool_call":
|
|
84
|
+
return `[tool-call] ${message.request.name} ${message.request.arguments}`.trimEnd();
|
|
85
|
+
case "tool_result":
|
|
86
|
+
return `[tool-result] ${message.result.name}: ${message.result.result}`;
|
|
87
|
+
case "tool_error":
|
|
88
|
+
return `[tool-error] ${message.error.name}: ${message.error.error}`;
|
|
89
|
+
case "error":
|
|
90
|
+
return `[error] ${message.message}`;
|
|
91
|
+
default:
|
|
92
|
+
return "";
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
function normalizeCriteria(criteria) {
|
|
96
|
+
if (criteria.length === 0) {
|
|
97
|
+
throw invalidJudgeInput("judge criteria must not be empty");
|
|
98
|
+
}
|
|
99
|
+
const ids = new Set();
|
|
100
|
+
return criteria.map((criterion) => {
|
|
101
|
+
const id = criterion.id.trim();
|
|
102
|
+
if (!id)
|
|
103
|
+
throw invalidJudgeInput("judge criterion id must not be empty");
|
|
104
|
+
if (ids.has(id))
|
|
105
|
+
throw invalidJudgeInput(`duplicate judge criterion id \`${id}\``);
|
|
106
|
+
ids.add(id);
|
|
107
|
+
const normalized = {
|
|
108
|
+
id,
|
|
109
|
+
description: criterion.description,
|
|
110
|
+
blocking: criterion.blocking ?? true,
|
|
111
|
+
weight: criterion.weight ?? 1,
|
|
112
|
+
threshold: criterion.threshold ?? 1,
|
|
113
|
+
};
|
|
114
|
+
if (!normalized.description.trim()) {
|
|
115
|
+
throw invalidJudgeInput(`judge criterion \`${id}\` description must not be empty`);
|
|
116
|
+
}
|
|
117
|
+
if (!Number.isFinite(normalized.weight) || normalized.weight <= 0) {
|
|
118
|
+
throw invalidJudgeInput(`judge criterion \`${id}\` weight must be greater than 0`);
|
|
119
|
+
}
|
|
120
|
+
if (!Number.isFinite(normalized.threshold) ||
|
|
121
|
+
normalized.threshold < 0 ||
|
|
122
|
+
normalized.threshold > 1) {
|
|
123
|
+
throw invalidJudgeInput(`judge criterion \`${id}\` threshold must be between 0.0 and 1.0`);
|
|
124
|
+
}
|
|
125
|
+
return normalized;
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
function summarizeJudgeResponse(criteria, response) {
|
|
129
|
+
const responses = new Map();
|
|
130
|
+
for (const criterion of response.criteria) {
|
|
131
|
+
if (responses.has(criterion.id)) {
|
|
132
|
+
throw invalidJudgment(`duplicate response criterion id \`${criterion.id}\``);
|
|
133
|
+
}
|
|
134
|
+
responses.set(criterion.id, criterion);
|
|
135
|
+
}
|
|
136
|
+
const summaries = [];
|
|
137
|
+
let weightedScore = 0;
|
|
138
|
+
let totalWeight = 0;
|
|
139
|
+
let blockingFailed = false;
|
|
140
|
+
for (const criterion of criteria) {
|
|
141
|
+
const responseCriterion = responses.get(criterion.id);
|
|
142
|
+
if (!responseCriterion) {
|
|
143
|
+
throw invalidJudgment(`missing response criterion \`${criterion.id}\``);
|
|
144
|
+
}
|
|
145
|
+
responses.delete(criterion.id);
|
|
146
|
+
const passed = responseCriterion.score >= criterion.threshold;
|
|
147
|
+
blockingFailed ||= criterion.blocking && !passed;
|
|
148
|
+
weightedScore += responseCriterion.score * criterion.weight;
|
|
149
|
+
totalWeight += criterion.weight;
|
|
150
|
+
summaries.push({
|
|
151
|
+
id: criterion.id,
|
|
152
|
+
description: criterion.description,
|
|
153
|
+
blocking: criterion.blocking,
|
|
154
|
+
weight: criterion.weight,
|
|
155
|
+
threshold: criterion.threshold,
|
|
156
|
+
score: responseCriterion.score,
|
|
157
|
+
passed,
|
|
158
|
+
reason: responseCriterion.reason,
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
const unknownId = responses.keys().next().value;
|
|
162
|
+
if (unknownId)
|
|
163
|
+
throw invalidJudgment(`unknown response criterion \`${unknownId}\``);
|
|
164
|
+
weightedScore /= totalWeight;
|
|
165
|
+
const score = blockingFailed ? 0 : weightedScore;
|
|
166
|
+
const reason = blockingFailed
|
|
167
|
+
? `weighted score ${weightedScore.toFixed(2)}; one or more blockers failed; ${response.overall_reason}`
|
|
168
|
+
: `weighted score ${weightedScore.toFixed(2)}; all blockers met; ${response.overall_reason}`;
|
|
169
|
+
return { passed: !blockingFailed, score, reason, criteria: summaries };
|
|
170
|
+
}
|
|
171
|
+
function invalidJudgeInput(message) {
|
|
172
|
+
return new AetherSdkError("invalid_options", message);
|
|
173
|
+
}
|
|
174
|
+
function invalidJudgment(message) {
|
|
175
|
+
return new AetherSdkError("generate_command_failed", message);
|
|
176
|
+
}
|
|
177
|
+
//# sourceMappingURL=judge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"judge.js","sourceRoot":"","sources":["../src/judge.ts"],"names":[],"mappings":"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"}
|
package/dist/task.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task.d.ts","sourceRoot":"","sources":["../src/task.ts"],"names":[],"mappings":"AAAA,qBAAa,IAAI;IACf,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;gBAEZ,MAAM,EAAE,MAAM;CAG3B"}
|
package/dist/task.js
ADDED
package/dist/task.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task.js","sourceRoot":"","sources":["../src/task.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,IAAI;IACN,MAAM,CAAS;IAExB,YAAY,MAAc;QACxB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;CACF"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { AgentMessage, ContextUsage } from "@aether-agent/sdk";
|
|
2
|
+
export declare class ToolCall {
|
|
3
|
+
readonly name: string;
|
|
4
|
+
readonly arguments: string;
|
|
5
|
+
constructor(name: string, argumentsValue: string);
|
|
6
|
+
argumentsJson(): unknown;
|
|
7
|
+
}
|
|
8
|
+
export declare class TranscriptError extends Error {
|
|
9
|
+
readonly transcript: Transcript;
|
|
10
|
+
constructor(transcript: Transcript, cause: unknown);
|
|
11
|
+
}
|
|
12
|
+
export declare class Transcript {
|
|
13
|
+
readonly messages: AgentMessage[];
|
|
14
|
+
constructor(messages?: AgentMessage[]);
|
|
15
|
+
static fromStream(stream: AsyncIterable<AgentMessage>): Promise<Transcript>;
|
|
16
|
+
add(message: AgentMessage): void;
|
|
17
|
+
allToolCalls(): ToolCall[];
|
|
18
|
+
toolCalls(name: string): ToolCall[];
|
|
19
|
+
toolCalled(name: string): boolean;
|
|
20
|
+
toolCallCount(name: string): number;
|
|
21
|
+
usage(): ContextUsage;
|
|
22
|
+
}
|
|
23
|
+
export declare function isTerminalMessage(message: AgentMessage): boolean;
|
|
24
|
+
//# sourceMappingURL=transcript.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transcript.d.ts","sourceRoot":"","sources":["../src/transcript.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEpE,qBAAa,QAAQ;IAIjB,QAAQ,CAAC,IAAI,EAAE,MAAM;IAHvB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;gBAGhB,IAAI,EAAE,MAAM,EACrB,cAAc,EAAE,MAAM;IAKxB,aAAa,IAAI,OAAO;CAGzB;AAED,qBAAa,eAAgB,SAAQ,KAAK;IACxC,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;gBAEpB,UAAU,EAAE,UAAU,EAAE,KAAK,EAAE,OAAO;CAKnD;AAED,qBAAa,UAAU;IACrB,QAAQ,CAAC,QAAQ,EAAE,YAAY,EAAE,CAAC;gBAEtB,QAAQ,GAAE,YAAY,EAAO;WAI5B,UAAU,CACrB,MAAM,EAAE,aAAa,CAAC,YAAY,CAAC,GAClC,OAAO,CAAC,UAAU,CAAC;IAYtB,GAAG,CAAC,OAAO,EAAE,YAAY,GAAG,IAAI;IAIhC,YAAY,IAAI,QAAQ,EAAE;IAI1B,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,EAAE;IAInC,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAIjC,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAInC,KAAK,IAAI,YAAY;CAGtB;AAkBD,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAMhE"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
export class ToolCall {
|
|
2
|
+
name;
|
|
3
|
+
arguments;
|
|
4
|
+
constructor(name, argumentsValue) {
|
|
5
|
+
this.name = name;
|
|
6
|
+
this.arguments = argumentsValue;
|
|
7
|
+
}
|
|
8
|
+
argumentsJson() {
|
|
9
|
+
return JSON.parse(this.arguments);
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
export class TranscriptError extends Error {
|
|
13
|
+
transcript;
|
|
14
|
+
constructor(transcript, cause) {
|
|
15
|
+
super("transcript stream failed", { cause });
|
|
16
|
+
this.name = "TranscriptError";
|
|
17
|
+
this.transcript = transcript;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
export class Transcript {
|
|
21
|
+
messages;
|
|
22
|
+
constructor(messages = []) {
|
|
23
|
+
this.messages = [...messages];
|
|
24
|
+
}
|
|
25
|
+
static async fromStream(stream) {
|
|
26
|
+
const transcript = new Transcript();
|
|
27
|
+
try {
|
|
28
|
+
for await (const message of stream) {
|
|
29
|
+
transcript.add(message);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
catch (err) {
|
|
33
|
+
throw new TranscriptError(transcript, err);
|
|
34
|
+
}
|
|
35
|
+
return transcript;
|
|
36
|
+
}
|
|
37
|
+
add(message) {
|
|
38
|
+
this.messages.push(message);
|
|
39
|
+
}
|
|
40
|
+
allToolCalls() {
|
|
41
|
+
return extractToolCalls(this.messages);
|
|
42
|
+
}
|
|
43
|
+
toolCalls(name) {
|
|
44
|
+
return this.allToolCalls().filter((call) => call.name === name);
|
|
45
|
+
}
|
|
46
|
+
toolCalled(name) {
|
|
47
|
+
return this.toolCalls(name).length > 0;
|
|
48
|
+
}
|
|
49
|
+
toolCallCount(name) {
|
|
50
|
+
return this.toolCalls(name).length;
|
|
51
|
+
}
|
|
52
|
+
usage() {
|
|
53
|
+
return summarizeUsage(this.messages);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
const ZERO_USAGE = {
|
|
57
|
+
type: "context_usage",
|
|
58
|
+
input_tokens: 0,
|
|
59
|
+
output_tokens: 0,
|
|
60
|
+
cache_read_tokens: null,
|
|
61
|
+
cache_creation_tokens: null,
|
|
62
|
+
reasoning_tokens: null,
|
|
63
|
+
usage_ratio: null,
|
|
64
|
+
context_limit: null,
|
|
65
|
+
total_input_tokens: 0,
|
|
66
|
+
total_output_tokens: 0,
|
|
67
|
+
total_cache_read_tokens: 0,
|
|
68
|
+
total_cache_creation_tokens: 0,
|
|
69
|
+
total_reasoning_tokens: 0,
|
|
70
|
+
};
|
|
71
|
+
export function isTerminalMessage(message) {
|
|
72
|
+
return (message.type === "done" ||
|
|
73
|
+
message.type === "error" ||
|
|
74
|
+
message.type === "cancelled");
|
|
75
|
+
}
|
|
76
|
+
function extractToolCalls(messages) {
|
|
77
|
+
const calls = [];
|
|
78
|
+
for (const message of messages) {
|
|
79
|
+
if (message.type === "tool_result") {
|
|
80
|
+
calls.push(new ToolCall(message.result.name, message.result.arguments));
|
|
81
|
+
}
|
|
82
|
+
else if (message.type === "tool_error") {
|
|
83
|
+
calls.push(new ToolCall(message.error.name, message.error.arguments ?? ""));
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
return calls;
|
|
87
|
+
}
|
|
88
|
+
function summarizeUsage(messages) {
|
|
89
|
+
for (let i = messages.length - 1; i >= 0; i--) {
|
|
90
|
+
const message = messages[i];
|
|
91
|
+
if (message && message.type === "context_usage")
|
|
92
|
+
return message;
|
|
93
|
+
}
|
|
94
|
+
return { ...ZERO_USAGE };
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=transcript.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transcript.js","sourceRoot":"","sources":["../src/transcript.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { type GitDiff } from "./diff.js";
|
|
2
|
+
export interface GitRepoSpec {
|
|
3
|
+
url: string;
|
|
4
|
+
startCommit: string;
|
|
5
|
+
goldCommit: string;
|
|
6
|
+
subdir?: string;
|
|
7
|
+
}
|
|
8
|
+
export interface RetainedWorkspaceInfo {
|
|
9
|
+
rootPath: string;
|
|
10
|
+
path: string;
|
|
11
|
+
}
|
|
12
|
+
/** Where an eval workspace came from. Git workspaces carry the commits for diffing. */
|
|
13
|
+
export type WorkspaceSource = "local" | {
|
|
14
|
+
git: {
|
|
15
|
+
url: string;
|
|
16
|
+
startCommit: string;
|
|
17
|
+
goldCommit: string;
|
|
18
|
+
};
|
|
19
|
+
};
|
|
20
|
+
/** A workspace created on the host for an eval run. */
|
|
21
|
+
export declare class Workspace implements AsyncDisposable {
|
|
22
|
+
#private;
|
|
23
|
+
/** Retained repository/temp root. Cleanup removes this directory; bind-mounted to `/workspace`. */
|
|
24
|
+
readonly rootPath: string;
|
|
25
|
+
/** Effective cwd where eval assertions run (`rootPath` or `rootPath/<subdir>`). */
|
|
26
|
+
readonly path: string;
|
|
27
|
+
/** Subdirectory (relative to `rootPath`) used as the working dir, if any. */
|
|
28
|
+
readonly relativeCwd?: string;
|
|
29
|
+
readonly source: WorkspaceSource;
|
|
30
|
+
private constructor();
|
|
31
|
+
static empty(): Promise<Workspace>;
|
|
32
|
+
static fromFiles(files: Record<string, string>): Promise<Workspace>;
|
|
33
|
+
static fromDir(srcDir: string, baseDir?: string): Promise<Workspace>;
|
|
34
|
+
static fromGitRepo(spec: GitRepoSpec, signal?: AbortSignal): Promise<Workspace>;
|
|
35
|
+
join(relativePath: string): string;
|
|
36
|
+
persist(): RetainedWorkspaceInfo;
|
|
37
|
+
captureGitDiffs(): Promise<{
|
|
38
|
+
agentDiff?: GitDiff;
|
|
39
|
+
referenceDiff?: GitDiff;
|
|
40
|
+
}>;
|
|
41
|
+
/** Remove the workspace directory. Idempotent. */
|
|
42
|
+
cleanup(): Promise<void>;
|
|
43
|
+
[Symbol.asyncDispose](): Promise<void>;
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=workspace.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace.d.ts","sourceRoot":"","sources":["../src/workspace.ts"],"names":[],"mappings":"AAKA,OAAO,EAAqB,KAAK,OAAO,EAAE,MAAM,WAAW,CAAC;AAG5D,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,uFAAuF;AACvF,MAAM,MAAM,eAAe,GACvB,OAAO,GACP;IAAE,GAAG,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,CAAC;AAEtE,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;IAE9B,QAAQ,CAAC,MAAM,EAAE,eAAe,CAAC;IAIjC,OAAO;WAYM,KAAK,IAAI,OAAO,CAAC,SAAS,CAAC;WAK3B,SAAS,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,SAAS,CAAC;WAe5D,OAAO,CAClB,MAAM,EAAE,MAAM,EACd,OAAO,SAAgB,GACtB,OAAO,CAAC,SAAS,CAAC;WAaR,WAAW,CACtB,IAAI,EAAE,WAAW,EACjB,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,SAAS,CAAC;IAyBrB,IAAI,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM;IAIlC,OAAO,IAAI,qBAAqB;IAK1B,eAAe,IAAI,OAAO,CAAC;QAC/B,SAAS,CAAC,EAAE,OAAO,CAAC;QACpB,aAAa,CAAC,EAAE,OAAO,CAAC;KACzB,CAAC;IAYF,kDAAkD;IAC5C,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAM9B,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC;CAGvC"}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import { access, cp, mkdir, mkdtemp, rm, writeFile } from "node:fs/promises";
|
|
2
|
+
import { tmpdir } from "node:os";
|
|
3
|
+
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
|
+
/** A workspace created on the host for an eval run. */
|
|
8
|
+
export class Workspace {
|
|
9
|
+
/** Retained repository/temp root. Cleanup removes this directory; bind-mounted to `/workspace`. */
|
|
10
|
+
rootPath;
|
|
11
|
+
/** Effective cwd where eval assertions run (`rootPath` or `rootPath/<subdir>`). */
|
|
12
|
+
path;
|
|
13
|
+
/** Subdirectory (relative to `rootPath`) used as the working dir, if any. */
|
|
14
|
+
relativeCwd;
|
|
15
|
+
source;
|
|
16
|
+
#cleaned = false;
|
|
17
|
+
constructor(options) {
|
|
18
|
+
this.rootPath = options.rootPath;
|
|
19
|
+
this.path = options.path;
|
|
20
|
+
this.relativeCwd = options.relativeCwd;
|
|
21
|
+
this.source = options.source;
|
|
22
|
+
}
|
|
23
|
+
static async empty() {
|
|
24
|
+
const rootPath = await createWorkspaceDir();
|
|
25
|
+
return new Workspace({ rootPath, path: rootPath, source: "local" });
|
|
26
|
+
}
|
|
27
|
+
static async fromFiles(files) {
|
|
28
|
+
const workspace = await Workspace.empty();
|
|
29
|
+
try {
|
|
30
|
+
for (const [relativePath, content] of Object.entries(files)) {
|
|
31
|
+
const target = resolvePath(workspace.rootPath, relativePath);
|
|
32
|
+
await mkdir(dirname(target), { recursive: true });
|
|
33
|
+
await writeFile(target, content);
|
|
34
|
+
}
|
|
35
|
+
return workspace;
|
|
36
|
+
}
|
|
37
|
+
catch (err) {
|
|
38
|
+
await workspace.cleanup();
|
|
39
|
+
throw err;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
static async fromDir(srcDir, baseDir = process.cwd()) {
|
|
43
|
+
const workspace = await Workspace.empty();
|
|
44
|
+
try {
|
|
45
|
+
await cp(resolve(baseDir, srcDir), workspace.rootPath, {
|
|
46
|
+
recursive: true,
|
|
47
|
+
});
|
|
48
|
+
return workspace;
|
|
49
|
+
}
|
|
50
|
+
catch (err) {
|
|
51
|
+
await workspace.cleanup();
|
|
52
|
+
throw err;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
static async fromGitRepo(spec, signal) {
|
|
56
|
+
const rootPath = await createWorkspaceDir();
|
|
57
|
+
try {
|
|
58
|
+
const { url, startCommit, goldCommit, subdir } = spec;
|
|
59
|
+
const repo = await GitRepo.clone(url, rootPath, signal);
|
|
60
|
+
await repo.checkout(startCommit, signal);
|
|
61
|
+
const path = subdir ? join(rootPath, subdir) : rootPath;
|
|
62
|
+
if (subdir && !(await pathExists(path))) {
|
|
63
|
+
throw new AetherSdkError("invalid_options", `git workspace subdirectory does not exist: ${path}`);
|
|
64
|
+
}
|
|
65
|
+
return new Workspace({
|
|
66
|
+
rootPath,
|
|
67
|
+
path,
|
|
68
|
+
relativeCwd: subdir ?? undefined,
|
|
69
|
+
source: { git: { url, startCommit, goldCommit } },
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
catch (err) {
|
|
73
|
+
await rm(rootPath, { recursive: true, force: true });
|
|
74
|
+
throw err;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
join(relativePath) {
|
|
78
|
+
return join(this.path, relativePath);
|
|
79
|
+
}
|
|
80
|
+
persist() {
|
|
81
|
+
this.#cleaned = true;
|
|
82
|
+
return { rootPath: this.rootPath, path: this.path };
|
|
83
|
+
}
|
|
84
|
+
async captureGitDiffs() {
|
|
85
|
+
if (this.source === "local")
|
|
86
|
+
return {};
|
|
87
|
+
const repo = GitRepo.fromPath(this.path);
|
|
88
|
+
const { startCommit, goldCommit } = this.source.git;
|
|
89
|
+
const [agentDiff, referenceDiff] = await Promise.all([
|
|
90
|
+
captureDiff(() => repo.diffUnstaged()),
|
|
91
|
+
captureDiff(() => repo.diff(startCommit, goldCommit)),
|
|
92
|
+
]);
|
|
93
|
+
return { agentDiff, referenceDiff };
|
|
94
|
+
}
|
|
95
|
+
/** Remove the workspace directory. Idempotent. */
|
|
96
|
+
async cleanup() {
|
|
97
|
+
if (this.#cleaned)
|
|
98
|
+
return;
|
|
99
|
+
this.#cleaned = true;
|
|
100
|
+
await rm(this.rootPath, { recursive: true, force: true });
|
|
101
|
+
}
|
|
102
|
+
[Symbol.asyncDispose]() {
|
|
103
|
+
return this.cleanup();
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
async function captureDiff(getDiff) {
|
|
107
|
+
try {
|
|
108
|
+
const diff = await getDiff();
|
|
109
|
+
return { diff, stats: diffStatsFromDiff(diff) };
|
|
110
|
+
}
|
|
111
|
+
catch {
|
|
112
|
+
return undefined;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
async function createWorkspaceDir() {
|
|
116
|
+
return mkdtemp(join(tmpdir(), "aether-eval-workspace-"));
|
|
117
|
+
}
|
|
118
|
+
function resolvePath(root, relativePath) {
|
|
119
|
+
const target = resolve(root, relativePath);
|
|
120
|
+
const rel = relative(root, target);
|
|
121
|
+
if (rel === "" || rel.startsWith("..")) {
|
|
122
|
+
throw new AetherSdkError("invalid_options", `workspace file path escapes the workspace root: ${relativePath}`);
|
|
123
|
+
}
|
|
124
|
+
return target;
|
|
125
|
+
}
|
|
126
|
+
async function pathExists(path) {
|
|
127
|
+
try {
|
|
128
|
+
await access(path);
|
|
129
|
+
return true;
|
|
130
|
+
}
|
|
131
|
+
catch {
|
|
132
|
+
return false;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
//# sourceMappingURL=workspace.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace.js","sourceRoot":"","sources":["../src/workspace.ts"],"names":[],"mappings":"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"}
|