@eminent337/aery-core 0.67.119 → 0.67.121
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 +14 -0
- package/dist/agent-loop.d.ts.map +1 -1
- package/dist/agent-loop.js +31 -1
- package/dist/agent-loop.js.map +1 -1
- package/dist/agent.d.ts +4 -3
- package/dist/agent.d.ts.map +1 -1
- package/dist/agent.js +7 -3
- package/dist/agent.js.map +1 -1
- package/dist/harness/agent-harness.d.ts +103 -0
- package/dist/harness/agent-harness.d.ts.map +1 -0
- package/dist/harness/agent-harness.js +788 -0
- package/dist/harness/agent-harness.js.map +1 -0
- package/dist/harness/compaction/branch-summarization.d.ts +88 -0
- package/dist/harness/compaction/branch-summarization.d.ts.map +1 -0
- package/dist/harness/compaction/branch-summarization.js +243 -0
- package/dist/harness/compaction/branch-summarization.js.map +1 -0
- package/dist/harness/compaction/compaction.d.ts +122 -0
- package/dist/harness/compaction/compaction.d.ts.map +1 -0
- package/dist/harness/compaction/compaction.js +631 -0
- package/dist/harness/compaction/compaction.js.map +1 -0
- package/dist/harness/compaction/utils.d.ts +38 -0
- package/dist/harness/compaction/utils.d.ts.map +1 -0
- package/dist/harness/compaction/utils.js +153 -0
- package/dist/harness/compaction/utils.js.map +1 -0
- package/dist/harness/env/nodejs.d.ts +50 -0
- package/dist/harness/env/nodejs.d.ts.map +1 -0
- package/dist/harness/env/nodejs.js +487 -0
- package/dist/harness/env/nodejs.js.map +1 -0
- package/dist/harness/execution-env.d.ts +4 -0
- package/dist/harness/execution-env.d.ts.map +1 -0
- package/dist/harness/execution-env.js +3 -0
- package/dist/harness/execution-env.js.map +1 -0
- package/dist/harness/factory.d.ts +6 -0
- package/dist/harness/factory.d.ts.map +1 -0
- package/dist/harness/factory.js +9 -0
- package/dist/harness/factory.js.map +1 -0
- package/dist/harness/messages.d.ts +51 -0
- package/dist/harness/messages.d.ts.map +1 -0
- package/dist/harness/messages.js +102 -0
- package/dist/harness/messages.js.map +1 -0
- package/dist/harness/prompt-templates.d.ts +47 -0
- package/dist/harness/prompt-templates.d.ts.map +1 -0
- package/dist/harness/prompt-templates.js +201 -0
- package/dist/harness/prompt-templates.js.map +1 -0
- package/dist/harness/session/jsonl-repo.d.ts +26 -0
- package/dist/harness/session/jsonl-repo.d.ts.map +1 -0
- package/dist/harness/session/jsonl-repo.js +97 -0
- package/dist/harness/session/jsonl-repo.js.map +1 -0
- package/dist/harness/session/jsonl-storage.d.ts +33 -0
- package/dist/harness/session/jsonl-storage.d.ts.map +1 -0
- package/dist/harness/session/jsonl-storage.js +159 -0
- package/dist/harness/session/jsonl-storage.js.map +1 -0
- package/dist/harness/session/memory-repo.d.ts +18 -0
- package/dist/harness/session/memory-repo.d.ts.map +1 -0
- package/dist/harness/session/memory-repo.js +42 -0
- package/dist/harness/session/memory-repo.js.map +1 -0
- package/dist/harness/session/memory-storage.d.ts +26 -0
- package/dist/harness/session/memory-storage.d.ts.map +1 -0
- package/dist/harness/session/memory-storage.js +89 -0
- package/dist/harness/session/memory-storage.js.map +1 -0
- package/dist/harness/session/repo/jsonl.d.ts +20 -0
- package/dist/harness/session/repo/jsonl.d.ts.map +1 -0
- package/dist/harness/session/repo/jsonl.js +92 -0
- package/dist/harness/session/repo/jsonl.js.map +1 -0
- package/dist/harness/session/repo/memory.d.ts +18 -0
- package/dist/harness/session/repo/memory.d.ts.map +1 -0
- package/dist/harness/session/repo/memory.js +42 -0
- package/dist/harness/session/repo/memory.js.map +1 -0
- package/dist/harness/session/repo/shared.d.ts +10 -0
- package/dist/harness/session/repo/shared.d.ts.map +1 -0
- package/dist/harness/session/repo/shared.js +31 -0
- package/dist/harness/session/repo/shared.js.map +1 -0
- package/dist/harness/session/repo-utils.d.ts +10 -0
- package/dist/harness/session/repo-utils.d.ts.map +1 -0
- package/dist/harness/session/repo-utils.js +31 -0
- package/dist/harness/session/repo-utils.js.map +1 -0
- package/dist/harness/session/session.d.ts +32 -0
- package/dist/harness/session/session.d.ts.map +1 -0
- package/dist/harness/session/session.js +196 -0
- package/dist/harness/session/session.js.map +1 -0
- package/dist/harness/session/storage/jsonl.d.ts +30 -0
- package/dist/harness/session/storage/jsonl.d.ts.map +1 -0
- package/dist/harness/session/storage/jsonl.js +170 -0
- package/dist/harness/session/storage/jsonl.js.map +1 -0
- package/dist/harness/session/storage/memory.d.ts +26 -0
- package/dist/harness/session/storage/memory.d.ts.map +1 -0
- package/dist/harness/session/storage/memory.js +90 -0
- package/dist/harness/session/storage/memory.js.map +1 -0
- package/dist/harness/session/uuid.d.ts +2 -0
- package/dist/harness/session/uuid.d.ts.map +1 -0
- package/dist/harness/session/uuid.js +50 -0
- package/dist/harness/session/uuid.js.map +1 -0
- package/dist/harness/skills.d.ts +43 -0
- package/dist/harness/skills.d.ts.map +1 -0
- package/dist/harness/skills.js +255 -0
- package/dist/harness/skills.js.map +1 -0
- package/dist/harness/system-prompt.d.ts +3 -0
- package/dist/harness/system-prompt.d.ts.map +1 -0
- package/dist/harness/system-prompt.js +30 -0
- package/dist/harness/system-prompt.js.map +1 -0
- package/dist/harness/types.d.ts +578 -0
- package/dist/harness/types.d.ts.map +1 -0
- package/dist/harness/types.js +56 -0
- package/dist/harness/types.js.map +1 -0
- package/dist/harness/utils/shell-output.d.ts +14 -0
- package/dist/harness/utils/shell-output.d.ts.map +1 -0
- package/dist/harness/utils/shell-output.js +125 -0
- package/dist/harness/utils/shell-output.js.map +1 -0
- package/dist/harness/utils/truncate.d.ts +70 -0
- package/dist/harness/utils/truncate.d.ts.map +1 -0
- package/dist/harness/utils/truncate.js +288 -0
- package/dist/harness/utils/truncate.js.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -1
- package/dist/node.d.ts +3 -0
- package/dist/node.d.ts.map +1 -0
- package/dist/node.js +3 -0
- package/dist/node.js.map +1 -0
- package/dist/proxy.d.ts.map +1 -1
- package/dist/proxy.js +5 -2
- package/dist/proxy.js.map +1 -1
- package/dist/types.d.ts +50 -4
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +19 -2
|
@@ -0,0 +1,487 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import { randomUUID } from "node:crypto";
|
|
3
|
+
import { constants } from "node:fs";
|
|
4
|
+
import { access, appendFile, lstat, mkdir, mkdtemp, readdir, readFile, realpath, rm, writeFile, } from "node:fs/promises";
|
|
5
|
+
import { tmpdir } from "node:os";
|
|
6
|
+
import { isAbsolute, join, resolve } from "node:path";
|
|
7
|
+
import { ExecutionError, err, FileError, ok, } from "../types.js";
|
|
8
|
+
function resolvePath(cwd, path) {
|
|
9
|
+
return isAbsolute(path) ? path : resolve(cwd, path);
|
|
10
|
+
}
|
|
11
|
+
function fileKindFromStats(stats) {
|
|
12
|
+
if (stats.isFile())
|
|
13
|
+
return "file";
|
|
14
|
+
if (stats.isDirectory())
|
|
15
|
+
return "directory";
|
|
16
|
+
if (stats.isSymbolicLink())
|
|
17
|
+
return "symlink";
|
|
18
|
+
return undefined;
|
|
19
|
+
}
|
|
20
|
+
function fileInfoFromStats(path, stats) {
|
|
21
|
+
const kind = fileKindFromStats(stats);
|
|
22
|
+
if (!kind)
|
|
23
|
+
return err(new FileError("invalid", "Unsupported file type", path));
|
|
24
|
+
return ok({
|
|
25
|
+
name: path.replace(/\/+$/, "").split("/").pop() ?? path,
|
|
26
|
+
path,
|
|
27
|
+
kind,
|
|
28
|
+
size: stats.size,
|
|
29
|
+
mtimeMs: stats.mtimeMs,
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
function isNodeError(error) {
|
|
33
|
+
return error instanceof Error && "code" in error;
|
|
34
|
+
}
|
|
35
|
+
function toFileError(error, path) {
|
|
36
|
+
if (error instanceof FileError)
|
|
37
|
+
return error;
|
|
38
|
+
if (isNodeError(error)) {
|
|
39
|
+
const message = error.message;
|
|
40
|
+
switch (error.code) {
|
|
41
|
+
case "ABORT_ERR":
|
|
42
|
+
return new FileError("aborted", message, path, error);
|
|
43
|
+
case "ENOENT":
|
|
44
|
+
return new FileError("not_found", message, path, error);
|
|
45
|
+
case "EACCES":
|
|
46
|
+
case "EPERM":
|
|
47
|
+
return new FileError("permission_denied", message, path, error);
|
|
48
|
+
case "ENOTDIR":
|
|
49
|
+
return new FileError("not_directory", message, path, error);
|
|
50
|
+
case "EISDIR":
|
|
51
|
+
return new FileError("is_directory", message, path, error);
|
|
52
|
+
case "EINVAL":
|
|
53
|
+
return new FileError("invalid", message, path, error);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return new FileError("unknown", error instanceof Error ? error.message : String(error), path, error);
|
|
57
|
+
}
|
|
58
|
+
function abortResult(signal, path) {
|
|
59
|
+
return signal?.aborted ? err(new FileError("aborted", "aborted", path)) : undefined;
|
|
60
|
+
}
|
|
61
|
+
async function pathExists(path) {
|
|
62
|
+
try {
|
|
63
|
+
await access(path, constants.F_OK);
|
|
64
|
+
return true;
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
return false;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
async function runCommand(command, args, timeoutMs) {
|
|
71
|
+
return await new Promise((resolve) => {
|
|
72
|
+
let stdout = "";
|
|
73
|
+
let child;
|
|
74
|
+
try {
|
|
75
|
+
child = spawn(command, args, { stdio: ["ignore", "pipe", "ignore"] });
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
resolve({ stdout: "", status: null });
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
const timeout = setTimeout(() => {
|
|
82
|
+
if (child.pid)
|
|
83
|
+
killProcessTree(child.pid);
|
|
84
|
+
}, timeoutMs);
|
|
85
|
+
child.stdout?.setEncoding("utf8");
|
|
86
|
+
child.stdout?.on("data", (chunk) => {
|
|
87
|
+
stdout += chunk;
|
|
88
|
+
});
|
|
89
|
+
child.on("error", () => {
|
|
90
|
+
clearTimeout(timeout);
|
|
91
|
+
resolve({ stdout: "", status: null });
|
|
92
|
+
});
|
|
93
|
+
child.on("close", (status) => {
|
|
94
|
+
clearTimeout(timeout);
|
|
95
|
+
resolve({ stdout, status });
|
|
96
|
+
});
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
async function findBashOnPath() {
|
|
100
|
+
const result = process.platform === "win32"
|
|
101
|
+
? await runCommand("where", ["bash.exe"], 5000)
|
|
102
|
+
: await runCommand("which", ["bash"], 5000);
|
|
103
|
+
if (result.status !== 0 || !result.stdout)
|
|
104
|
+
return null;
|
|
105
|
+
const firstMatch = result.stdout.trim().split(/\r?\n/)[0];
|
|
106
|
+
return firstMatch && (await pathExists(firstMatch)) ? firstMatch : null;
|
|
107
|
+
}
|
|
108
|
+
async function getShellConfig(customShellPath) {
|
|
109
|
+
if (customShellPath) {
|
|
110
|
+
if (await pathExists(customShellPath)) {
|
|
111
|
+
return ok({ shell: customShellPath, args: ["-c"] });
|
|
112
|
+
}
|
|
113
|
+
return err(new ExecutionError("shell_unavailable", `Custom shell path not found: ${customShellPath}`));
|
|
114
|
+
}
|
|
115
|
+
if (process.platform === "win32") {
|
|
116
|
+
const candidates = [];
|
|
117
|
+
const programFiles = process.env.ProgramFiles;
|
|
118
|
+
if (programFiles)
|
|
119
|
+
candidates.push(`${programFiles}\\Git\\bin\\bash.exe`);
|
|
120
|
+
const programFilesX86 = process.env["ProgramFiles(x86)"];
|
|
121
|
+
if (programFilesX86)
|
|
122
|
+
candidates.push(`${programFilesX86}\\Git\\bin\\bash.exe`);
|
|
123
|
+
for (const candidate of candidates) {
|
|
124
|
+
if (await pathExists(candidate)) {
|
|
125
|
+
return ok({ shell: candidate, args: ["-c"] });
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
const bashOnPath = await findBashOnPath();
|
|
129
|
+
if (bashOnPath) {
|
|
130
|
+
return ok({ shell: bashOnPath, args: ["-c"] });
|
|
131
|
+
}
|
|
132
|
+
return err(new ExecutionError("shell_unavailable", "No bash shell found"));
|
|
133
|
+
}
|
|
134
|
+
if (await pathExists("/bin/bash")) {
|
|
135
|
+
return ok({ shell: "/bin/bash", args: ["-c"] });
|
|
136
|
+
}
|
|
137
|
+
const bashOnPath = await findBashOnPath();
|
|
138
|
+
if (bashOnPath) {
|
|
139
|
+
return ok({ shell: bashOnPath, args: ["-c"] });
|
|
140
|
+
}
|
|
141
|
+
return ok({ shell: "sh", args: ["-c"] });
|
|
142
|
+
}
|
|
143
|
+
function getShellEnv(baseEnv, extraEnv) {
|
|
144
|
+
return {
|
|
145
|
+
...process.env,
|
|
146
|
+
...baseEnv,
|
|
147
|
+
...extraEnv,
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
function killProcessTree(pid) {
|
|
151
|
+
if (process.platform === "win32") {
|
|
152
|
+
try {
|
|
153
|
+
spawn("taskkill", ["/F", "/T", "/PID", String(pid)], {
|
|
154
|
+
stdio: "ignore",
|
|
155
|
+
detached: true,
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
catch {
|
|
159
|
+
// Ignore errors.
|
|
160
|
+
}
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
try {
|
|
164
|
+
process.kill(-pid, "SIGKILL");
|
|
165
|
+
}
|
|
166
|
+
catch {
|
|
167
|
+
try {
|
|
168
|
+
process.kill(pid, "SIGKILL");
|
|
169
|
+
}
|
|
170
|
+
catch {
|
|
171
|
+
// Process already dead.
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
export class NodeExecutionEnv {
|
|
176
|
+
cwd;
|
|
177
|
+
shellPath;
|
|
178
|
+
shellEnv;
|
|
179
|
+
constructor(options) {
|
|
180
|
+
this.cwd = options.cwd;
|
|
181
|
+
this.shellPath = options.shellPath;
|
|
182
|
+
this.shellEnv = options.shellEnv;
|
|
183
|
+
}
|
|
184
|
+
async absolutePath(path, abortSignal) {
|
|
185
|
+
const resolved = resolvePath(this.cwd, path);
|
|
186
|
+
const aborted = abortResult(abortSignal, resolved);
|
|
187
|
+
if (aborted)
|
|
188
|
+
return aborted;
|
|
189
|
+
return ok(resolved);
|
|
190
|
+
}
|
|
191
|
+
async joinPath(parts, abortSignal) {
|
|
192
|
+
const joined = join(...parts);
|
|
193
|
+
const aborted = abortResult(abortSignal, joined);
|
|
194
|
+
if (aborted)
|
|
195
|
+
return aborted;
|
|
196
|
+
return ok(joined);
|
|
197
|
+
}
|
|
198
|
+
async exec(command, options) {
|
|
199
|
+
if (options?.abortSignal?.aborted)
|
|
200
|
+
return err(new ExecutionError("aborted", "aborted"));
|
|
201
|
+
const cwd = options?.cwd ? resolvePath(this.cwd, options.cwd) : this.cwd;
|
|
202
|
+
const shellConfig = await getShellConfig(this.shellPath);
|
|
203
|
+
if (!shellConfig.ok)
|
|
204
|
+
return shellConfig;
|
|
205
|
+
return await new Promise((resolvePromise) => {
|
|
206
|
+
let stdout = "";
|
|
207
|
+
let stderr = "";
|
|
208
|
+
let settled = false;
|
|
209
|
+
let timedOut = false;
|
|
210
|
+
let callbackError;
|
|
211
|
+
let child;
|
|
212
|
+
let timeoutId;
|
|
213
|
+
const onAbort = () => {
|
|
214
|
+
if (child?.pid) {
|
|
215
|
+
killProcessTree(child.pid);
|
|
216
|
+
}
|
|
217
|
+
};
|
|
218
|
+
const settle = (result) => {
|
|
219
|
+
if (timeoutId)
|
|
220
|
+
clearTimeout(timeoutId);
|
|
221
|
+
if (options?.abortSignal)
|
|
222
|
+
options.abortSignal.removeEventListener("abort", onAbort);
|
|
223
|
+
if (settled)
|
|
224
|
+
return;
|
|
225
|
+
settled = true;
|
|
226
|
+
resolvePromise(result);
|
|
227
|
+
};
|
|
228
|
+
try {
|
|
229
|
+
child = spawn(shellConfig.value.shell, [...shellConfig.value.args, command], {
|
|
230
|
+
cwd,
|
|
231
|
+
detached: process.platform !== "win32",
|
|
232
|
+
env: getShellEnv(this.shellEnv, options?.env),
|
|
233
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
234
|
+
});
|
|
235
|
+
}
|
|
236
|
+
catch (error) {
|
|
237
|
+
settle(err(new ExecutionError("spawn_error", error instanceof Error ? error.message : String(error), error)));
|
|
238
|
+
return;
|
|
239
|
+
}
|
|
240
|
+
timeoutId =
|
|
241
|
+
typeof options?.timeout === "number"
|
|
242
|
+
? setTimeout(() => {
|
|
243
|
+
timedOut = true;
|
|
244
|
+
if (child?.pid) {
|
|
245
|
+
killProcessTree(child.pid);
|
|
246
|
+
}
|
|
247
|
+
}, options.timeout * 1000)
|
|
248
|
+
: undefined;
|
|
249
|
+
if (options?.abortSignal) {
|
|
250
|
+
if (options.abortSignal.aborted) {
|
|
251
|
+
onAbort();
|
|
252
|
+
}
|
|
253
|
+
else {
|
|
254
|
+
options.abortSignal.addEventListener("abort", onAbort, { once: true });
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
child.stdout?.setEncoding("utf8");
|
|
258
|
+
child.stderr?.setEncoding("utf8");
|
|
259
|
+
child.stdout?.on("data", (chunk) => {
|
|
260
|
+
stdout += chunk;
|
|
261
|
+
try {
|
|
262
|
+
options?.onStdout?.(chunk);
|
|
263
|
+
}
|
|
264
|
+
catch (error) {
|
|
265
|
+
callbackError = new ExecutionError("unknown", error instanceof Error ? error.message : String(error), error);
|
|
266
|
+
onAbort();
|
|
267
|
+
}
|
|
268
|
+
});
|
|
269
|
+
child.stderr?.on("data", (chunk) => {
|
|
270
|
+
stderr += chunk;
|
|
271
|
+
try {
|
|
272
|
+
options?.onStderr?.(chunk);
|
|
273
|
+
}
|
|
274
|
+
catch (error) {
|
|
275
|
+
callbackError = new ExecutionError("unknown", error instanceof Error ? error.message : String(error), error);
|
|
276
|
+
onAbort();
|
|
277
|
+
}
|
|
278
|
+
});
|
|
279
|
+
child.on("error", (error) => {
|
|
280
|
+
settle(err(new ExecutionError("spawn_error", error.message, error)));
|
|
281
|
+
});
|
|
282
|
+
child.on("close", (code) => {
|
|
283
|
+
if (callbackError) {
|
|
284
|
+
settle(err(callbackError));
|
|
285
|
+
return;
|
|
286
|
+
}
|
|
287
|
+
if (options?.abortSignal?.aborted) {
|
|
288
|
+
settle(err(new ExecutionError("aborted", "aborted")));
|
|
289
|
+
return;
|
|
290
|
+
}
|
|
291
|
+
if (timedOut) {
|
|
292
|
+
settle(err(new ExecutionError("timeout", `timeout:${options?.timeout}`)));
|
|
293
|
+
return;
|
|
294
|
+
}
|
|
295
|
+
settle(ok({ stdout, stderr, exitCode: code ?? 0 }));
|
|
296
|
+
});
|
|
297
|
+
});
|
|
298
|
+
}
|
|
299
|
+
async readTextFile(path, abortSignal) {
|
|
300
|
+
const resolved = resolvePath(this.cwd, path);
|
|
301
|
+
const aborted = abortResult(abortSignal, resolved);
|
|
302
|
+
if (aborted)
|
|
303
|
+
return aborted;
|
|
304
|
+
try {
|
|
305
|
+
return ok(await readFile(resolved, { encoding: "utf8", signal: abortSignal }));
|
|
306
|
+
}
|
|
307
|
+
catch (error) {
|
|
308
|
+
return err(toFileError(error, resolved));
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
async readBinaryFile(path, abortSignal) {
|
|
312
|
+
const resolved = resolvePath(this.cwd, path);
|
|
313
|
+
const aborted = abortResult(abortSignal, resolved);
|
|
314
|
+
if (aborted)
|
|
315
|
+
return aborted;
|
|
316
|
+
try {
|
|
317
|
+
return ok(await readFile(resolved, { signal: abortSignal }));
|
|
318
|
+
}
|
|
319
|
+
catch (error) {
|
|
320
|
+
return err(toFileError(error, resolved));
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
async writeFile(path, content, abortSignal) {
|
|
324
|
+
const resolved = resolvePath(this.cwd, path);
|
|
325
|
+
const aborted = abortResult(abortSignal, resolved);
|
|
326
|
+
if (aborted)
|
|
327
|
+
return aborted;
|
|
328
|
+
try {
|
|
329
|
+
await mkdir(resolve(resolved, ".."), { recursive: true });
|
|
330
|
+
const afterMkdirAbort = abortResult(abortSignal, resolved);
|
|
331
|
+
if (afterMkdirAbort)
|
|
332
|
+
return afterMkdirAbort;
|
|
333
|
+
await writeFile(resolved, content, { signal: abortSignal });
|
|
334
|
+
return ok(undefined);
|
|
335
|
+
}
|
|
336
|
+
catch (error) {
|
|
337
|
+
return err(toFileError(error, resolved));
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
async appendFile(path, content, abortSignal) {
|
|
341
|
+
const resolved = resolvePath(this.cwd, path);
|
|
342
|
+
const aborted = abortResult(abortSignal, resolved);
|
|
343
|
+
if (aborted)
|
|
344
|
+
return aborted;
|
|
345
|
+
try {
|
|
346
|
+
await mkdir(resolve(resolved, ".."), { recursive: true });
|
|
347
|
+
const afterMkdirAbort = abortResult(abortSignal, resolved);
|
|
348
|
+
if (afterMkdirAbort)
|
|
349
|
+
return afterMkdirAbort;
|
|
350
|
+
await appendFile(resolved, content);
|
|
351
|
+
const afterAppendAbort = abortResult(abortSignal, resolved);
|
|
352
|
+
if (afterAppendAbort)
|
|
353
|
+
return afterAppendAbort;
|
|
354
|
+
return ok(undefined);
|
|
355
|
+
}
|
|
356
|
+
catch (error) {
|
|
357
|
+
return err(toFileError(error, resolved));
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
async fileInfo(path, abortSignal) {
|
|
361
|
+
const resolved = resolvePath(this.cwd, path);
|
|
362
|
+
const aborted = abortResult(abortSignal, resolved);
|
|
363
|
+
if (aborted)
|
|
364
|
+
return aborted;
|
|
365
|
+
try {
|
|
366
|
+
return fileInfoFromStats(resolved, await lstat(resolved));
|
|
367
|
+
}
|
|
368
|
+
catch (error) {
|
|
369
|
+
return err(toFileError(error, resolved));
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
async listDir(path, abortSignal) {
|
|
373
|
+
const resolved = resolvePath(this.cwd, path);
|
|
374
|
+
const aborted = abortResult(abortSignal, resolved);
|
|
375
|
+
if (aborted)
|
|
376
|
+
return aborted;
|
|
377
|
+
try {
|
|
378
|
+
const entries = await readdir(resolved, { withFileTypes: true });
|
|
379
|
+
const infos = [];
|
|
380
|
+
for (const entry of entries) {
|
|
381
|
+
const loopAbort = abortResult(abortSignal, resolved);
|
|
382
|
+
if (loopAbort)
|
|
383
|
+
return loopAbort;
|
|
384
|
+
const entryPath = resolve(resolved, entry.name);
|
|
385
|
+
try {
|
|
386
|
+
const info = fileInfoFromStats(entryPath, await lstat(entryPath));
|
|
387
|
+
if (info.ok)
|
|
388
|
+
infos.push(info.value);
|
|
389
|
+
}
|
|
390
|
+
catch (error) {
|
|
391
|
+
return err(toFileError(error, entryPath));
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
return ok(infos);
|
|
395
|
+
}
|
|
396
|
+
catch (error) {
|
|
397
|
+
return err(toFileError(error, resolved));
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
async canonicalPath(path, abortSignal) {
|
|
401
|
+
const resolved = resolvePath(this.cwd, path);
|
|
402
|
+
const aborted = abortResult(abortSignal, resolved);
|
|
403
|
+
if (aborted)
|
|
404
|
+
return aborted;
|
|
405
|
+
try {
|
|
406
|
+
return ok(await realpath(resolved));
|
|
407
|
+
}
|
|
408
|
+
catch (error) {
|
|
409
|
+
return err(toFileError(error, resolved));
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
async exists(path, abortSignal) {
|
|
413
|
+
const result = await this.fileInfo(path, abortSignal);
|
|
414
|
+
if (result.ok)
|
|
415
|
+
return ok(true);
|
|
416
|
+
if (result.error.code === "not_found")
|
|
417
|
+
return ok(false);
|
|
418
|
+
return err(result.error);
|
|
419
|
+
}
|
|
420
|
+
async createDir(path, options) {
|
|
421
|
+
const resolved = resolvePath(this.cwd, path);
|
|
422
|
+
const aborted = abortResult(options?.abortSignal, resolved);
|
|
423
|
+
if (aborted)
|
|
424
|
+
return aborted;
|
|
425
|
+
try {
|
|
426
|
+
await mkdir(resolved, { recursive: options?.recursive ?? true });
|
|
427
|
+
const afterMkdirAbort = abortResult(options?.abortSignal, resolved);
|
|
428
|
+
if (afterMkdirAbort)
|
|
429
|
+
return afterMkdirAbort;
|
|
430
|
+
return ok(undefined);
|
|
431
|
+
}
|
|
432
|
+
catch (error) {
|
|
433
|
+
return err(toFileError(error, resolved));
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
async remove(path, options) {
|
|
437
|
+
const resolved = resolvePath(this.cwd, path);
|
|
438
|
+
const aborted = abortResult(options?.abortSignal, resolved);
|
|
439
|
+
if (aborted)
|
|
440
|
+
return aborted;
|
|
441
|
+
try {
|
|
442
|
+
await rm(resolved, { recursive: options?.recursive ?? false, force: options?.force ?? false });
|
|
443
|
+
const afterRemoveAbort = abortResult(options?.abortSignal, resolved);
|
|
444
|
+
if (afterRemoveAbort)
|
|
445
|
+
return afterRemoveAbort;
|
|
446
|
+
return ok(undefined);
|
|
447
|
+
}
|
|
448
|
+
catch (error) {
|
|
449
|
+
return err(toFileError(error, resolved));
|
|
450
|
+
}
|
|
451
|
+
}
|
|
452
|
+
async createTempDir(prefix = "tmp-", abortSignal) {
|
|
453
|
+
const aborted = abortResult(abortSignal);
|
|
454
|
+
if (aborted)
|
|
455
|
+
return aborted;
|
|
456
|
+
try {
|
|
457
|
+
const path = await mkdtemp(join(tmpdir(), prefix));
|
|
458
|
+
const afterMkdtempAbort = abortResult(abortSignal, path);
|
|
459
|
+
if (afterMkdtempAbort)
|
|
460
|
+
return afterMkdtempAbort;
|
|
461
|
+
return ok(path);
|
|
462
|
+
}
|
|
463
|
+
catch (error) {
|
|
464
|
+
return err(toFileError(error));
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
async createTempFile(options) {
|
|
468
|
+
const dir = await this.createTempDir("tmp-", options?.abortSignal);
|
|
469
|
+
if (!dir.ok)
|
|
470
|
+
return dir;
|
|
471
|
+
const filePath = join(dir.value, `${options?.prefix ?? ""}${randomUUID()}${options?.suffix ?? ""}`);
|
|
472
|
+
const aborted = abortResult(options?.abortSignal, filePath);
|
|
473
|
+
if (aborted)
|
|
474
|
+
return aborted;
|
|
475
|
+
try {
|
|
476
|
+
await writeFile(filePath, "", { signal: options?.abortSignal });
|
|
477
|
+
return ok(filePath);
|
|
478
|
+
}
|
|
479
|
+
catch (error) {
|
|
480
|
+
return err(toFileError(error, filePath));
|
|
481
|
+
}
|
|
482
|
+
}
|
|
483
|
+
async cleanup() {
|
|
484
|
+
// nothing to clean up for the local node implementation
|
|
485
|
+
}
|
|
486
|
+
}
|
|
487
|
+
//# sourceMappingURL=nodejs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nodejs.js","sourceRoot":"","sources":["../../../src/harness/env/nodejs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EACN,MAAM,EACN,UAAU,EACV,KAAK,EACL,KAAK,EACL,OAAO,EACP,OAAO,EACP,QAAQ,EACR,QAAQ,EACR,EAAE,EACF,SAAS,GACT,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACtD,OAAO,EAEN,cAAc,EACd,GAAG,EACH,SAAS,EAGT,EAAE,GAEF,MAAM,aAAa,CAAC;AAErB,SAAS,WAAW,CAAC,GAAW,EAAE,IAAY,EAAU;IACvD,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;AAAA,CACpD;AAED,SAAS,iBAAiB,CAAC,KAI1B,EAAwB;IACxB,IAAI,KAAK,CAAC,MAAM,EAAE;QAAE,OAAO,MAAM,CAAC;IAClC,IAAI,KAAK,CAAC,WAAW,EAAE;QAAE,OAAO,WAAW,CAAC;IAC5C,IAAI,KAAK,CAAC,cAAc,EAAE;QAAE,OAAO,SAAS,CAAC;IAC7C,OAAO,SAAS,CAAC;AAAA,CACjB;AAED,SAAS,iBAAiB,CACzB,IAAY,EACZ,KAA8G,EAChF;IAC9B,MAAM,IAAI,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;IACtC,IAAI,CAAC,IAAI;QAAE,OAAO,GAAG,CAAC,IAAI,SAAS,CAAC,SAAS,EAAE,uBAAuB,EAAE,IAAI,CAAC,CAAC,CAAC;IAC/E,OAAO,EAAE,CAAC;QACT,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,IAAI;QACvD,IAAI;QACJ,IAAI;QACJ,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,OAAO,EAAE,KAAK,CAAC,OAAO;KACtB,CAAC,CAAC;AAAA,CACH;AAED,SAAS,WAAW,CAAC,KAAc,EAAkC;IACpE,OAAO,KAAK,YAAY,KAAK,IAAI,MAAM,IAAI,KAAK,CAAC;AAAA,CACjD;AAED,SAAS,WAAW,CAAC,KAAc,EAAE,IAAa,EAAa;IAC9D,IAAI,KAAK,YAAY,SAAS;QAAE,OAAO,KAAK,CAAC;IAC7C,IAAI,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC;QACxB,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;QAC9B,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;YACpB,KAAK,WAAW;gBACf,OAAO,IAAI,SAAS,CAAC,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;YACvD,KAAK,QAAQ;gBACZ,OAAO,IAAI,SAAS,CAAC,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;YACzD,KAAK,QAAQ,CAAC;YACd,KAAK,OAAO;gBACX,OAAO,IAAI,SAAS,CAAC,mBAAmB,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;YACjE,KAAK,SAAS;gBACb,OAAO,IAAI,SAAS,CAAC,eAAe,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;YAC7D,KAAK,QAAQ;gBACZ,OAAO,IAAI,SAAS,CAAC,cAAc,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;YAC5D,KAAK,QAAQ;gBACZ,OAAO,IAAI,SAAS,CAAC,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;QACxD,CAAC;IACF,CAAC;IACD,OAAO,IAAI,SAAS,CAAC,SAAS,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;AAAA,CACrG;AAED,SAAS,WAAW,CAAS,MAA+B,EAAE,IAAa,EAAyC;IACnH,OAAO,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,SAAS,CAAC,SAAS,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAAA,CACpF;AAED,KAAK,UAAU,UAAU,CAAC,IAAY,EAAoB;IACzD,IAAI,CAAC;QACJ,MAAM,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;QACnC,OAAO,IAAI,CAAC;IACb,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,KAAK,CAAC;IACd,CAAC;AAAA,CACD;AAED,KAAK,UAAU,UAAU,CACxB,OAAe,EACf,IAAc,EACd,SAAiB,EACoC;IACrD,OAAO,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC;QACrC,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,KAA+B,CAAC;QACpC,IAAI,CAAC;YACJ,KAAK,GAAG,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC;QACvE,CAAC;QAAC,MAAM,CAAC;YACR,OAAO,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;YACtC,OAAO;QACR,CAAC;QACD,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC;YAChC,IAAI,KAAK,CAAC,GAAG;gBAAE,eAAe,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAAA,CAC1C,EAAE,SAAS,CAAC,CAAC;QACd,KAAK,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;QAClC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC;YAC3C,MAAM,IAAI,KAAK,CAAC;QAAA,CAChB,CAAC,CAAC;QACH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC;YACvB,YAAY,CAAC,OAAO,CAAC,CAAC;YACtB,OAAO,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QAAA,CACtC,CAAC,CAAC;QACH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC;YAC7B,YAAY,CAAC,OAAO,CAAC,CAAC;YACtB,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;QAAA,CAC5B,CAAC,CAAC;IAAA,CACH,CAAC,CAAC;AAAA,CACH;AAED,KAAK,UAAU,cAAc,GAA2B;IACvD,MAAM,MAAM,GACX,OAAO,CAAC,QAAQ,KAAK,OAAO;QAC3B,CAAC,CAAC,MAAM,UAAU,CAAC,OAAO,EAAE,CAAC,UAAU,CAAC,EAAE,IAAI,CAAC;QAC/C,CAAC,CAAC,MAAM,UAAU,CAAC,OAAO,EAAE,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC;IAC9C,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IACvD,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1D,OAAO,UAAU,IAAI,CAAC,MAAM,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC;AAAA,CACxE;AAED,KAAK,UAAU,cAAc,CAC5B,eAAwB,EAC6C;IACrE,IAAI,eAAe,EAAE,CAAC;QACrB,IAAI,MAAM,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;YACvC,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,eAAe,EAAE,IAAI,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACrD,CAAC;QACD,OAAO,GAAG,CAAC,IAAI,cAAc,CAAC,mBAAmB,EAAE,gCAAgC,eAAe,EAAE,CAAC,CAAC,CAAC;IACxG,CAAC;IACD,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QAClC,MAAM,UAAU,GAAa,EAAE,CAAC;QAChC,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;QAC9C,IAAI,YAAY;YAAE,UAAU,CAAC,IAAI,CAAC,GAAG,YAAY,sBAAsB,CAAC,CAAC;QACzE,MAAM,eAAe,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;QACzD,IAAI,eAAe;YAAE,UAAU,CAAC,IAAI,CAAC,GAAG,eAAe,sBAAsB,CAAC,CAAC;QAC/E,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;YACpC,IAAI,MAAM,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;gBACjC,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAC/C,CAAC;QACF,CAAC;QACD,MAAM,UAAU,GAAG,MAAM,cAAc,EAAE,CAAC;QAC1C,IAAI,UAAU,EAAE,CAAC;YAChB,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAChD,CAAC;QACD,OAAO,GAAG,CAAC,IAAI,cAAc,CAAC,mBAAmB,EAAE,qBAAqB,CAAC,CAAC,CAAC;IAC5E,CAAC;IAED,IAAI,MAAM,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QACnC,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjD,CAAC;IACD,MAAM,UAAU,GAAG,MAAM,cAAc,EAAE,CAAC;IAC1C,IAAI,UAAU,EAAE,CAAC;QAChB,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAChD,CAAC;IACD,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAAA,CACzC;AAED,SAAS,WAAW,CAAC,OAA2B,EAAE,QAAiC,EAAqB;IACvG,OAAO;QACN,GAAG,OAAO,CAAC,GAAG;QACd,GAAG,OAAO;QACV,GAAG,QAAQ;KACX,CAAC;AAAA,CACF;AAED,SAAS,eAAe,CAAC,GAAW,EAAQ;IAC3C,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QAClC,IAAI,CAAC;YACJ,KAAK,CAAC,UAAU,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE;gBACpD,KAAK,EAAE,QAAQ;gBACf,QAAQ,EAAE,IAAI;aACd,CAAC,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACR,iBAAiB;QAClB,CAAC;QACD,OAAO;IACR,CAAC;IAED,IAAI,CAAC;QACJ,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACR,IAAI,CAAC;YACJ,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;QAC9B,CAAC;QAAC,MAAM,CAAC;YACR,wBAAwB;QACzB,CAAC;IACF,CAAC;AAAA,CACD;AAED,MAAM,OAAO,gBAAgB;IAC5B,GAAG,CAAS;IACJ,SAAS,CAAU;IACnB,QAAQ,CAAqB;IAErC,YAAY,OAA0E,EAAE;QACvF,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;QACvB,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;QACnC,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;IAAA,CACjC;IAED,KAAK,CAAC,YAAY,CAAC,IAAY,EAAE,WAAyB,EAAsC;QAC/F,MAAM,QAAQ,GAAG,WAAW,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAC7C,MAAM,OAAO,GAAG,WAAW,CAAS,WAAW,EAAE,QAAQ,CAAC,CAAC;QAC3D,IAAI,OAAO;YAAE,OAAO,OAAO,CAAC;QAC5B,OAAO,EAAE,CAAC,QAAQ,CAAC,CAAC;IAAA,CACpB;IAED,KAAK,CAAC,QAAQ,CAAC,KAAe,EAAE,WAAyB,EAAsC;QAC9F,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC;QAC9B,MAAM,OAAO,GAAG,WAAW,CAAS,WAAW,EAAE,MAAM,CAAC,CAAC;QACzD,IAAI,OAAO;YAAE,OAAO,OAAO,CAAC;QAC5B,OAAO,EAAE,CAAC,MAAM,CAAC,CAAC;IAAA,CAClB;IAED,KAAK,CAAC,IAAI,CACT,OAAe,EACf,OAOC,EACuF;QACxF,IAAI,OAAO,EAAE,WAAW,EAAE,OAAO;YAAE,OAAO,GAAG,CAAC,IAAI,cAAc,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC;QAExF,MAAM,GAAG,GAAG,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;QACzE,MAAM,WAAW,GAAG,MAAM,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACzD,IAAI,CAAC,WAAW,CAAC,EAAE;YAAE,OAAO,WAAW,CAAC;QAExC,OAAO,MAAM,IAAI,OAAO,CAAC,CAAC,cAAc,EAAE,EAAE,CAAC;YAC5C,IAAI,MAAM,GAAG,EAAE,CAAC;YAChB,IAAI,MAAM,GAAG,EAAE,CAAC;YAChB,IAAI,OAAO,GAAG,KAAK,CAAC;YACpB,IAAI,QAAQ,GAAG,KAAK,CAAC;YACrB,IAAI,aAAyC,CAAC;YAC9C,IAAI,KAA2C,CAAC;YAChD,IAAI,SAAoD,CAAC;YAEzD,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC;gBACrB,IAAI,KAAK,EAAE,GAAG,EAAE,CAAC;oBAChB,eAAe,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBAC5B,CAAC;YAAA,CACD,CAAC;YAEF,MAAM,MAAM,GAAG,CAAC,MAAoF,EAAE,EAAE,CAAC;gBACxG,IAAI,SAAS;oBAAE,YAAY,CAAC,SAAS,CAAC,CAAC;gBACvC,IAAI,OAAO,EAAE,WAAW;oBAAE,OAAO,CAAC,WAAW,CAAC,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;gBACpF,IAAI,OAAO;oBAAE,OAAO;gBACpB,OAAO,GAAG,IAAI,CAAC;gBACf,cAAc,CAAC,MAAM,CAAC,CAAC;YAAA,CACvB,CAAC;YAEF,IAAI,CAAC;gBACJ,KAAK,GAAG,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE;oBAC5E,GAAG;oBACH,QAAQ,EAAE,OAAO,CAAC,QAAQ,KAAK,OAAO;oBACtC,GAAG,EAAE,WAAW,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,CAAC;oBAC7C,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;iBACjC,CAAC,CAAC;YACJ,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBAChB,MAAM,CACL,GAAG,CAAC,IAAI,cAAc,CAAC,aAAa,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC,CACrG,CAAC;gBACF,OAAO;YACR,CAAC;YAED,SAAS;gBACR,OAAO,OAAO,EAAE,OAAO,KAAK,QAAQ;oBACnC,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC;wBACjB,QAAQ,GAAG,IAAI,CAAC;wBAChB,IAAI,KAAK,EAAE,GAAG,EAAE,CAAC;4BAChB,eAAe,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;wBAC5B,CAAC;oBAAA,CACD,EAAE,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;oBAC3B,CAAC,CAAC,SAAS,CAAC;YAEd,IAAI,OAAO,EAAE,WAAW,EAAE,CAAC;gBAC1B,IAAI,OAAO,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;oBACjC,OAAO,EAAE,CAAC;gBACX,CAAC;qBAAM,CAAC;oBACP,OAAO,CAAC,WAAW,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;gBACxE,CAAC;YACF,CAAC;YAED,KAAK,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;YAClC,KAAK,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;YAClC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC;gBAC3C,MAAM,IAAI,KAAK,CAAC;gBAChB,IAAI,CAAC;oBACJ,OAAO,EAAE,QAAQ,EAAE,CAAC,KAAK,CAAC,CAAC;gBAC5B,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBAChB,aAAa,GAAG,IAAI,cAAc,CACjC,SAAS,EACT,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EACtD,KAAK,CACL,CAAC;oBACF,OAAO,EAAE,CAAC;gBACX,CAAC;YAAA,CACD,CAAC,CAAC;YACH,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC;gBAC3C,MAAM,IAAI,KAAK,CAAC;gBAChB,IAAI,CAAC;oBACJ,OAAO,EAAE,QAAQ,EAAE,CAAC,KAAK,CAAC,CAAC;gBAC5B,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBAChB,aAAa,GAAG,IAAI,cAAc,CACjC,SAAS,EACT,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EACtD,KAAK,CACL,CAAC;oBACF,OAAO,EAAE,CAAC;gBACX,CAAC;YAAA,CACD,CAAC,CAAC;YAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC;gBAC5B,MAAM,CAAC,GAAG,CAAC,IAAI,cAAc,CAAC,aAAa,EAAE,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;YAAA,CACrE,CAAC,CAAC;YAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC;gBAC3B,IAAI,aAAa,EAAE,CAAC;oBACnB,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC;oBAC3B,OAAO;gBACR,CAAC;gBACD,IAAI,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC;oBACnC,MAAM,CAAC,GAAG,CAAC,IAAI,cAAc,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC;oBACtD,OAAO;gBACR,CAAC;gBACD,IAAI,QAAQ,EAAE,CAAC;oBACd,MAAM,CAAC,GAAG,CAAC,IAAI,cAAc,CAAC,SAAS,EAAE,WAAW,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;oBAC1E,OAAO;gBACR,CAAC;gBACD,MAAM,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;YAAA,CACpD,CAAC,CAAC;QAAA,CACH,CAAC,CAAC;IAAA,CACH;IAED,KAAK,CAAC,YAAY,CAAC,IAAY,EAAE,WAAyB,EAAsC;QAC/F,MAAM,QAAQ,GAAG,WAAW,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAC7C,MAAM,OAAO,GAAG,WAAW,CAAS,WAAW,EAAE,QAAQ,CAAC,CAAC;QAC3D,IAAI,OAAO;YAAE,OAAO,OAAO,CAAC;QAC5B,IAAI,CAAC;YACJ,OAAO,EAAE,CAAC,MAAM,QAAQ,CAAC,QAAQ,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC;QAChF,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,OAAO,GAAG,CAAC,WAAW,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC;QAC1C,CAAC;IAAA,CACD;IAED,KAAK,CAAC,cAAc,CAAC,IAAY,EAAE,WAAyB,EAA0C;QACrG,MAAM,QAAQ,GAAG,WAAW,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAC7C,MAAM,OAAO,GAAG,WAAW,CAAa,WAAW,EAAE,QAAQ,CAAC,CAAC;QAC/D,IAAI,OAAO;YAAE,OAAO,OAAO,CAAC;QAC5B,IAAI,CAAC;YACJ,OAAO,EAAE,CAAC,MAAM,QAAQ,CAAC,QAAQ,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC;QAC9D,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,OAAO,GAAG,CAAC,WAAW,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC;QAC1C,CAAC;IAAA,CACD;IAED,KAAK,CAAC,SAAS,CACd,IAAY,EACZ,OAA4B,EAC5B,WAAyB,EACU;QACnC,MAAM,QAAQ,GAAG,WAAW,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAC7C,MAAM,OAAO,GAAG,WAAW,CAAO,WAAW,EAAE,QAAQ,CAAC,CAAC;QACzD,IAAI,OAAO;YAAE,OAAO,OAAO,CAAC;QAC5B,IAAI,CAAC;YACJ,MAAM,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC1D,MAAM,eAAe,GAAG,WAAW,CAAO,WAAW,EAAE,QAAQ,CAAC,CAAC;YACjE,IAAI,eAAe;gBAAE,OAAO,eAAe,CAAC;YAC5C,MAAM,SAAS,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC;YAC5D,OAAO,EAAE,CAAC,SAAS,CAAC,CAAC;QACtB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,OAAO,GAAG,CAAC,WAAW,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC;QAC1C,CAAC;IAAA,CACD;IAED,KAAK,CAAC,UAAU,CACf,IAAY,EACZ,OAA4B,EAC5B,WAAyB,EACU;QACnC,MAAM,QAAQ,GAAG,WAAW,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAC7C,MAAM,OAAO,GAAG,WAAW,CAAO,WAAW,EAAE,QAAQ,CAAC,CAAC;QACzD,IAAI,OAAO;YAAE,OAAO,OAAO,CAAC;QAC5B,IAAI,CAAC;YACJ,MAAM,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC1D,MAAM,eAAe,GAAG,WAAW,CAAO,WAAW,EAAE,QAAQ,CAAC,CAAC;YACjE,IAAI,eAAe;gBAAE,OAAO,eAAe,CAAC;YAC5C,MAAM,UAAU,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YACpC,MAAM,gBAAgB,GAAG,WAAW,CAAO,WAAW,EAAE,QAAQ,CAAC,CAAC;YAClE,IAAI,gBAAgB;gBAAE,OAAO,gBAAgB,CAAC;YAC9C,OAAO,EAAE,CAAC,SAAS,CAAC,CAAC;QACtB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,OAAO,GAAG,CAAC,WAAW,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC;QAC1C,CAAC;IAAA,CACD;IAED,KAAK,CAAC,QAAQ,CAAC,IAAY,EAAE,WAAyB,EAAwC;QAC7F,MAAM,QAAQ,GAAG,WAAW,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAC7C,MAAM,OAAO,GAAG,WAAW,CAAW,WAAW,EAAE,QAAQ,CAAC,CAAC;QAC7D,IAAI,OAAO;YAAE,OAAO,OAAO,CAAC;QAC5B,IAAI,CAAC;YACJ,OAAO,iBAAiB,CAAC,QAAQ,EAAE,MAAM,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC3D,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,OAAO,GAAG,CAAC,WAAW,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC;QAC1C,CAAC;IAAA,CACD;IAED,KAAK,CAAC,OAAO,CAAC,IAAY,EAAE,WAAyB,EAA0C;QAC9F,MAAM,QAAQ,GAAG,WAAW,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAC7C,MAAM,OAAO,GAAG,WAAW,CAAa,WAAW,EAAE,QAAQ,CAAC,CAAC;QAC/D,IAAI,OAAO;YAAE,OAAO,OAAO,CAAC;QAC5B,IAAI,CAAC;YACJ,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,QAAQ,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;YACjE,MAAM,KAAK,GAAe,EAAE,CAAC;YAC7B,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;gBAC7B,MAAM,SAAS,GAAG,WAAW,CAAa,WAAW,EAAE,QAAQ,CAAC,CAAC;gBACjE,IAAI,SAAS;oBAAE,OAAO,SAAS,CAAC;gBAChC,MAAM,SAAS,GAAG,OAAO,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;gBAChD,IAAI,CAAC;oBACJ,MAAM,IAAI,GAAG,iBAAiB,CAAC,SAAS,EAAE,MAAM,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;oBAClE,IAAI,IAAI,CAAC,EAAE;wBAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBACrC,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBAChB,OAAO,GAAG,CAAC,WAAW,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC;gBAC3C,CAAC;YACF,CAAC;YACD,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC;QAClB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,OAAO,GAAG,CAAC,WAAW,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC;QAC1C,CAAC;IAAA,CACD;IAED,KAAK,CAAC,aAAa,CAAC,IAAY,EAAE,WAAyB,EAAsC;QAChG,MAAM,QAAQ,GAAG,WAAW,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAC7C,MAAM,OAAO,GAAG,WAAW,CAAS,WAAW,EAAE,QAAQ,CAAC,CAAC;QAC3D,IAAI,OAAO;YAAE,OAAO,OAAO,CAAC;QAC5B,IAAI,CAAC;YACJ,OAAO,EAAE,CAAC,MAAM,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;QACrC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,OAAO,GAAG,CAAC,WAAW,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC;QAC1C,CAAC;IAAA,CACD;IAED,KAAK,CAAC,MAAM,CAAC,IAAY,EAAE,WAAyB,EAAuC;QAC1F,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;QACtD,IAAI,MAAM,CAAC,EAAE;YAAE,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC;QAC/B,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,KAAK,WAAW;YAAE,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC;QACxD,OAAO,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAAA,CACzB;IAED,KAAK,CAAC,SAAS,CACd,IAAY,EACZ,OAA4D,EACzB;QACnC,MAAM,QAAQ,GAAG,WAAW,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAC7C,MAAM,OAAO,GAAG,WAAW,CAAO,OAAO,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC;QAClE,IAAI,OAAO;YAAE,OAAO,OAAO,CAAC;QAC5B,IAAI,CAAC;YACJ,MAAM,KAAK,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,IAAI,IAAI,EAAE,CAAC,CAAC;YACjE,MAAM,eAAe,GAAG,WAAW,CAAO,OAAO,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC;YAC1E,IAAI,eAAe;gBAAE,OAAO,eAAe,CAAC;YAC5C,OAAO,EAAE,CAAC,SAAS,CAAC,CAAC;QACtB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,OAAO,GAAG,CAAC,WAAW,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC;QAC1C,CAAC;IAAA,CACD;IAED,KAAK,CAAC,MAAM,CACX,IAAY,EACZ,OAA6E,EAC1C;QACnC,MAAM,QAAQ,GAAG,WAAW,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAC7C,MAAM,OAAO,GAAG,WAAW,CAAO,OAAO,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC;QAClE,IAAI,OAAO;YAAE,OAAO,OAAO,CAAC;QAC5B,IAAI,CAAC;YACJ,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,IAAI,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,IAAI,KAAK,EAAE,CAAC,CAAC;YAC/F,MAAM,gBAAgB,GAAG,WAAW,CAAO,OAAO,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC;YAC3E,IAAI,gBAAgB;gBAAE,OAAO,gBAAgB,CAAC;YAC9C,OAAO,EAAE,CAAC,SAAS,CAAC,CAAC;QACtB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,OAAO,GAAG,CAAC,WAAW,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC;QAC1C,CAAC;IAAA,CACD;IAED,KAAK,CAAC,aAAa,CAAC,MAAM,GAAW,MAAM,EAAE,WAAyB,EAAsC;QAC3G,MAAM,OAAO,GAAG,WAAW,CAAS,WAAW,CAAC,CAAC;QACjD,IAAI,OAAO;YAAE,OAAO,OAAO,CAAC;QAC5B,IAAI,CAAC;YACJ,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC;YACnD,MAAM,iBAAiB,GAAG,WAAW,CAAS,WAAW,EAAE,IAAI,CAAC,CAAC;YACjE,IAAI,iBAAiB;gBAAE,OAAO,iBAAiB,CAAC;YAChD,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC;QACjB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,OAAO,GAAG,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC;QAChC,CAAC;IAAA,CACD;IAED,KAAK,CAAC,cAAc,CAAC,OAIpB,EAAsC;QACtC,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;QACnE,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,OAAO,GAAG,CAAC;QACxB,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,OAAO,EAAE,MAAM,IAAI,EAAE,GAAG,UAAU,EAAE,GAAG,OAAO,EAAE,MAAM,IAAI,EAAE,EAAE,CAAC,CAAC;QACpG,MAAM,OAAO,GAAG,WAAW,CAAS,OAAO,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC;QACpE,IAAI,OAAO;YAAE,OAAO,OAAO,CAAC;QAC5B,IAAI,CAAC;YACJ,MAAM,SAAS,CAAC,QAAQ,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,CAAC;YAChE,OAAO,EAAE,CAAC,QAAQ,CAAC,CAAC;QACrB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,OAAO,GAAG,CAAC,WAAW,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC;QAC1C,CAAC;IAAA,CACD;IAED,KAAK,CAAC,OAAO,GAAkB;QAC9B,wDAAwD;IADzB,CAE/B;CACD","sourcesContent":["import { spawn } from \"node:child_process\";\nimport { randomUUID } from \"node:crypto\";\nimport { constants } from \"node:fs\";\nimport {\n\taccess,\n\tappendFile,\n\tlstat,\n\tmkdir,\n\tmkdtemp,\n\treaddir,\n\treadFile,\n\trealpath,\n\trm,\n\twriteFile,\n} from \"node:fs/promises\";\nimport { tmpdir } from \"node:os\";\nimport { isAbsolute, join, resolve } from \"node:path\";\nimport {\n\ttype ExecutionEnv,\n\tExecutionError,\n\terr,\n\tFileError,\n\ttype FileInfo,\n\ttype FileKind,\n\tok,\n\ttype Result,\n} from \"../types.js\";\n\nfunction resolvePath(cwd: string, path: string): string {\n\treturn isAbsolute(path) ? path : resolve(cwd, path);\n}\n\nfunction fileKindFromStats(stats: {\n\tisFile(): boolean;\n\tisDirectory(): boolean;\n\tisSymbolicLink(): boolean;\n}): FileKind | undefined {\n\tif (stats.isFile()) return \"file\";\n\tif (stats.isDirectory()) return \"directory\";\n\tif (stats.isSymbolicLink()) return \"symlink\";\n\treturn undefined;\n}\n\nfunction fileInfoFromStats(\n\tpath: string,\n\tstats: { isFile(): boolean; isDirectory(): boolean; isSymbolicLink(): boolean; size: number; mtimeMs: number },\n): Result<FileInfo, FileError> {\n\tconst kind = fileKindFromStats(stats);\n\tif (!kind) return err(new FileError(\"invalid\", \"Unsupported file type\", path));\n\treturn ok({\n\t\tname: path.replace(/\\/+$/, \"\").split(\"/\").pop() ?? path,\n\t\tpath,\n\t\tkind,\n\t\tsize: stats.size,\n\t\tmtimeMs: stats.mtimeMs,\n\t});\n}\n\nfunction isNodeError(error: unknown): error is NodeJS.ErrnoException {\n\treturn error instanceof Error && \"code\" in error;\n}\n\nfunction toFileError(error: unknown, path?: string): FileError {\n\tif (error instanceof FileError) return error;\n\tif (isNodeError(error)) {\n\t\tconst message = error.message;\n\t\tswitch (error.code) {\n\t\t\tcase \"ABORT_ERR\":\n\t\t\t\treturn new FileError(\"aborted\", message, path, error);\n\t\t\tcase \"ENOENT\":\n\t\t\t\treturn new FileError(\"not_found\", message, path, error);\n\t\t\tcase \"EACCES\":\n\t\t\tcase \"EPERM\":\n\t\t\t\treturn new FileError(\"permission_denied\", message, path, error);\n\t\t\tcase \"ENOTDIR\":\n\t\t\t\treturn new FileError(\"not_directory\", message, path, error);\n\t\t\tcase \"EISDIR\":\n\t\t\t\treturn new FileError(\"is_directory\", message, path, error);\n\t\t\tcase \"EINVAL\":\n\t\t\t\treturn new FileError(\"invalid\", message, path, error);\n\t\t}\n\t}\n\treturn new FileError(\"unknown\", error instanceof Error ? error.message : String(error), path, error);\n}\n\nfunction abortResult<TValue>(signal: AbortSignal | undefined, path?: string): Result<TValue, FileError> | undefined {\n\treturn signal?.aborted ? err(new FileError(\"aborted\", \"aborted\", path)) : undefined;\n}\n\nasync function pathExists(path: string): Promise<boolean> {\n\ttry {\n\t\tawait access(path, constants.F_OK);\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nasync function runCommand(\n\tcommand: string,\n\targs: string[],\n\ttimeoutMs: number,\n): Promise<{ stdout: string; status: number | null }> {\n\treturn await new Promise((resolve) => {\n\t\tlet stdout = \"\";\n\t\tlet child: ReturnType<typeof spawn>;\n\t\ttry {\n\t\t\tchild = spawn(command, args, { stdio: [\"ignore\", \"pipe\", \"ignore\"] });\n\t\t} catch {\n\t\t\tresolve({ stdout: \"\", status: null });\n\t\t\treturn;\n\t\t}\n\t\tconst timeout = setTimeout(() => {\n\t\t\tif (child.pid) killProcessTree(child.pid);\n\t\t}, timeoutMs);\n\t\tchild.stdout?.setEncoding(\"utf8\");\n\t\tchild.stdout?.on(\"data\", (chunk: string) => {\n\t\t\tstdout += chunk;\n\t\t});\n\t\tchild.on(\"error\", () => {\n\t\t\tclearTimeout(timeout);\n\t\t\tresolve({ stdout: \"\", status: null });\n\t\t});\n\t\tchild.on(\"close\", (status) => {\n\t\t\tclearTimeout(timeout);\n\t\t\tresolve({ stdout, status });\n\t\t});\n\t});\n}\n\nasync function findBashOnPath(): Promise<string | null> {\n\tconst result =\n\t\tprocess.platform === \"win32\"\n\t\t\t? await runCommand(\"where\", [\"bash.exe\"], 5000)\n\t\t\t: await runCommand(\"which\", [\"bash\"], 5000);\n\tif (result.status !== 0 || !result.stdout) return null;\n\tconst firstMatch = result.stdout.trim().split(/\\r?\\n/)[0];\n\treturn firstMatch && (await pathExists(firstMatch)) ? firstMatch : null;\n}\n\nasync function getShellConfig(\n\tcustomShellPath?: string,\n): Promise<Result<{ shell: string; args: string[] }, ExecutionError>> {\n\tif (customShellPath) {\n\t\tif (await pathExists(customShellPath)) {\n\t\t\treturn ok({ shell: customShellPath, args: [\"-c\"] });\n\t\t}\n\t\treturn err(new ExecutionError(\"shell_unavailable\", `Custom shell path not found: ${customShellPath}`));\n\t}\n\tif (process.platform === \"win32\") {\n\t\tconst candidates: string[] = [];\n\t\tconst programFiles = process.env.ProgramFiles;\n\t\tif (programFiles) candidates.push(`${programFiles}\\\\Git\\\\bin\\\\bash.exe`);\n\t\tconst programFilesX86 = process.env[\"ProgramFiles(x86)\"];\n\t\tif (programFilesX86) candidates.push(`${programFilesX86}\\\\Git\\\\bin\\\\bash.exe`);\n\t\tfor (const candidate of candidates) {\n\t\t\tif (await pathExists(candidate)) {\n\t\t\t\treturn ok({ shell: candidate, args: [\"-c\"] });\n\t\t\t}\n\t\t}\n\t\tconst bashOnPath = await findBashOnPath();\n\t\tif (bashOnPath) {\n\t\t\treturn ok({ shell: bashOnPath, args: [\"-c\"] });\n\t\t}\n\t\treturn err(new ExecutionError(\"shell_unavailable\", \"No bash shell found\"));\n\t}\n\n\tif (await pathExists(\"/bin/bash\")) {\n\t\treturn ok({ shell: \"/bin/bash\", args: [\"-c\"] });\n\t}\n\tconst bashOnPath = await findBashOnPath();\n\tif (bashOnPath) {\n\t\treturn ok({ shell: bashOnPath, args: [\"-c\"] });\n\t}\n\treturn ok({ shell: \"sh\", args: [\"-c\"] });\n}\n\nfunction getShellEnv(baseEnv?: NodeJS.ProcessEnv, extraEnv?: Record<string, string>): NodeJS.ProcessEnv {\n\treturn {\n\t\t...process.env,\n\t\t...baseEnv,\n\t\t...extraEnv,\n\t};\n}\n\nfunction killProcessTree(pid: number): void {\n\tif (process.platform === \"win32\") {\n\t\ttry {\n\t\t\tspawn(\"taskkill\", [\"/F\", \"/T\", \"/PID\", String(pid)], {\n\t\t\t\tstdio: \"ignore\",\n\t\t\t\tdetached: true,\n\t\t\t});\n\t\t} catch {\n\t\t\t// Ignore errors.\n\t\t}\n\t\treturn;\n\t}\n\n\ttry {\n\t\tprocess.kill(-pid, \"SIGKILL\");\n\t} catch {\n\t\ttry {\n\t\t\tprocess.kill(pid, \"SIGKILL\");\n\t\t} catch {\n\t\t\t// Process already dead.\n\t\t}\n\t}\n}\n\nexport class NodeExecutionEnv implements ExecutionEnv {\n\tcwd: string;\n\tprivate shellPath?: string;\n\tprivate shellEnv?: NodeJS.ProcessEnv;\n\n\tconstructor(options: { cwd: string; shellPath?: string; shellEnv?: NodeJS.ProcessEnv }) {\n\t\tthis.cwd = options.cwd;\n\t\tthis.shellPath = options.shellPath;\n\t\tthis.shellEnv = options.shellEnv;\n\t}\n\n\tasync absolutePath(path: string, abortSignal?: AbortSignal): Promise<Result<string, FileError>> {\n\t\tconst resolved = resolvePath(this.cwd, path);\n\t\tconst aborted = abortResult<string>(abortSignal, resolved);\n\t\tif (aborted) return aborted;\n\t\treturn ok(resolved);\n\t}\n\n\tasync joinPath(parts: string[], abortSignal?: AbortSignal): Promise<Result<string, FileError>> {\n\t\tconst joined = join(...parts);\n\t\tconst aborted = abortResult<string>(abortSignal, joined);\n\t\tif (aborted) return aborted;\n\t\treturn ok(joined);\n\t}\n\n\tasync exec(\n\t\tcommand: string,\n\t\toptions?: {\n\t\t\tcwd?: string;\n\t\t\tenv?: Record<string, string>;\n\t\t\ttimeout?: number;\n\t\t\tabortSignal?: AbortSignal;\n\t\t\tonStdout?: (chunk: string) => void;\n\t\t\tonStderr?: (chunk: string) => void;\n\t\t},\n\t): Promise<Result<{ stdout: string; stderr: string; exitCode: number }, ExecutionError>> {\n\t\tif (options?.abortSignal?.aborted) return err(new ExecutionError(\"aborted\", \"aborted\"));\n\n\t\tconst cwd = options?.cwd ? resolvePath(this.cwd, options.cwd) : this.cwd;\n\t\tconst shellConfig = await getShellConfig(this.shellPath);\n\t\tif (!shellConfig.ok) return shellConfig;\n\n\t\treturn await new Promise((resolvePromise) => {\n\t\t\tlet stdout = \"\";\n\t\t\tlet stderr = \"\";\n\t\t\tlet settled = false;\n\t\t\tlet timedOut = false;\n\t\t\tlet callbackError: ExecutionError | undefined;\n\t\t\tlet child: ReturnType<typeof spawn> | undefined;\n\t\t\tlet timeoutId: ReturnType<typeof setTimeout> | undefined;\n\n\t\t\tconst onAbort = () => {\n\t\t\t\tif (child?.pid) {\n\t\t\t\t\tkillProcessTree(child.pid);\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tconst settle = (result: Result<{ stdout: string; stderr: string; exitCode: number }, ExecutionError>) => {\n\t\t\t\tif (timeoutId) clearTimeout(timeoutId);\n\t\t\t\tif (options?.abortSignal) options.abortSignal.removeEventListener(\"abort\", onAbort);\n\t\t\t\tif (settled) return;\n\t\t\t\tsettled = true;\n\t\t\t\tresolvePromise(result);\n\t\t\t};\n\n\t\t\ttry {\n\t\t\t\tchild = spawn(shellConfig.value.shell, [...shellConfig.value.args, command], {\n\t\t\t\t\tcwd,\n\t\t\t\t\tdetached: process.platform !== \"win32\",\n\t\t\t\t\tenv: getShellEnv(this.shellEnv, options?.env),\n\t\t\t\t\tstdio: [\"ignore\", \"pipe\", \"pipe\"],\n\t\t\t\t});\n\t\t\t} catch (error) {\n\t\t\t\tsettle(\n\t\t\t\t\terr(new ExecutionError(\"spawn_error\", error instanceof Error ? error.message : String(error), error)),\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\ttimeoutId =\n\t\t\t\ttypeof options?.timeout === \"number\"\n\t\t\t\t\t? setTimeout(() => {\n\t\t\t\t\t\t\ttimedOut = true;\n\t\t\t\t\t\t\tif (child?.pid) {\n\t\t\t\t\t\t\t\tkillProcessTree(child.pid);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}, options.timeout * 1000)\n\t\t\t\t\t: undefined;\n\n\t\t\tif (options?.abortSignal) {\n\t\t\t\tif (options.abortSignal.aborted) {\n\t\t\t\t\tonAbort();\n\t\t\t\t} else {\n\t\t\t\t\toptions.abortSignal.addEventListener(\"abort\", onAbort, { once: true });\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tchild.stdout?.setEncoding(\"utf8\");\n\t\t\tchild.stderr?.setEncoding(\"utf8\");\n\t\t\tchild.stdout?.on(\"data\", (chunk: string) => {\n\t\t\t\tstdout += chunk;\n\t\t\t\ttry {\n\t\t\t\t\toptions?.onStdout?.(chunk);\n\t\t\t\t} catch (error) {\n\t\t\t\t\tcallbackError = new ExecutionError(\n\t\t\t\t\t\t\"unknown\",\n\t\t\t\t\t\terror instanceof Error ? error.message : String(error),\n\t\t\t\t\t\terror,\n\t\t\t\t\t);\n\t\t\t\t\tonAbort();\n\t\t\t\t}\n\t\t\t});\n\t\t\tchild.stderr?.on(\"data\", (chunk: string) => {\n\t\t\t\tstderr += chunk;\n\t\t\t\ttry {\n\t\t\t\t\toptions?.onStderr?.(chunk);\n\t\t\t\t} catch (error) {\n\t\t\t\t\tcallbackError = new ExecutionError(\n\t\t\t\t\t\t\"unknown\",\n\t\t\t\t\t\terror instanceof Error ? error.message : String(error),\n\t\t\t\t\t\terror,\n\t\t\t\t\t);\n\t\t\t\t\tonAbort();\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tchild.on(\"error\", (error) => {\n\t\t\t\tsettle(err(new ExecutionError(\"spawn_error\", error.message, error)));\n\t\t\t});\n\n\t\t\tchild.on(\"close\", (code) => {\n\t\t\t\tif (callbackError) {\n\t\t\t\t\tsettle(err(callbackError));\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (options?.abortSignal?.aborted) {\n\t\t\t\t\tsettle(err(new ExecutionError(\"aborted\", \"aborted\")));\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (timedOut) {\n\t\t\t\t\tsettle(err(new ExecutionError(\"timeout\", `timeout:${options?.timeout}`)));\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tsettle(ok({ stdout, stderr, exitCode: code ?? 0 }));\n\t\t\t});\n\t\t});\n\t}\n\n\tasync readTextFile(path: string, abortSignal?: AbortSignal): Promise<Result<string, FileError>> {\n\t\tconst resolved = resolvePath(this.cwd, path);\n\t\tconst aborted = abortResult<string>(abortSignal, resolved);\n\t\tif (aborted) return aborted;\n\t\ttry {\n\t\t\treturn ok(await readFile(resolved, { encoding: \"utf8\", signal: abortSignal }));\n\t\t} catch (error) {\n\t\t\treturn err(toFileError(error, resolved));\n\t\t}\n\t}\n\n\tasync readBinaryFile(path: string, abortSignal?: AbortSignal): Promise<Result<Uint8Array, FileError>> {\n\t\tconst resolved = resolvePath(this.cwd, path);\n\t\tconst aborted = abortResult<Uint8Array>(abortSignal, resolved);\n\t\tif (aborted) return aborted;\n\t\ttry {\n\t\t\treturn ok(await readFile(resolved, { signal: abortSignal }));\n\t\t} catch (error) {\n\t\t\treturn err(toFileError(error, resolved));\n\t\t}\n\t}\n\n\tasync writeFile(\n\t\tpath: string,\n\t\tcontent: string | Uint8Array,\n\t\tabortSignal?: AbortSignal,\n\t): Promise<Result<void, FileError>> {\n\t\tconst resolved = resolvePath(this.cwd, path);\n\t\tconst aborted = abortResult<void>(abortSignal, resolved);\n\t\tif (aborted) return aborted;\n\t\ttry {\n\t\t\tawait mkdir(resolve(resolved, \"..\"), { recursive: true });\n\t\t\tconst afterMkdirAbort = abortResult<void>(abortSignal, resolved);\n\t\t\tif (afterMkdirAbort) return afterMkdirAbort;\n\t\t\tawait writeFile(resolved, content, { signal: abortSignal });\n\t\t\treturn ok(undefined);\n\t\t} catch (error) {\n\t\t\treturn err(toFileError(error, resolved));\n\t\t}\n\t}\n\n\tasync appendFile(\n\t\tpath: string,\n\t\tcontent: string | Uint8Array,\n\t\tabortSignal?: AbortSignal,\n\t): Promise<Result<void, FileError>> {\n\t\tconst resolved = resolvePath(this.cwd, path);\n\t\tconst aborted = abortResult<void>(abortSignal, resolved);\n\t\tif (aborted) return aborted;\n\t\ttry {\n\t\t\tawait mkdir(resolve(resolved, \"..\"), { recursive: true });\n\t\t\tconst afterMkdirAbort = abortResult<void>(abortSignal, resolved);\n\t\t\tif (afterMkdirAbort) return afterMkdirAbort;\n\t\t\tawait appendFile(resolved, content);\n\t\t\tconst afterAppendAbort = abortResult<void>(abortSignal, resolved);\n\t\t\tif (afterAppendAbort) return afterAppendAbort;\n\t\t\treturn ok(undefined);\n\t\t} catch (error) {\n\t\t\treturn err(toFileError(error, resolved));\n\t\t}\n\t}\n\n\tasync fileInfo(path: string, abortSignal?: AbortSignal): Promise<Result<FileInfo, FileError>> {\n\t\tconst resolved = resolvePath(this.cwd, path);\n\t\tconst aborted = abortResult<FileInfo>(abortSignal, resolved);\n\t\tif (aborted) return aborted;\n\t\ttry {\n\t\t\treturn fileInfoFromStats(resolved, await lstat(resolved));\n\t\t} catch (error) {\n\t\t\treturn err(toFileError(error, resolved));\n\t\t}\n\t}\n\n\tasync listDir(path: string, abortSignal?: AbortSignal): Promise<Result<FileInfo[], FileError>> {\n\t\tconst resolved = resolvePath(this.cwd, path);\n\t\tconst aborted = abortResult<FileInfo[]>(abortSignal, resolved);\n\t\tif (aborted) return aborted;\n\t\ttry {\n\t\t\tconst entries = await readdir(resolved, { withFileTypes: true });\n\t\t\tconst infos: FileInfo[] = [];\n\t\t\tfor (const entry of entries) {\n\t\t\t\tconst loopAbort = abortResult<FileInfo[]>(abortSignal, resolved);\n\t\t\t\tif (loopAbort) return loopAbort;\n\t\t\t\tconst entryPath = resolve(resolved, entry.name);\n\t\t\t\ttry {\n\t\t\t\t\tconst info = fileInfoFromStats(entryPath, await lstat(entryPath));\n\t\t\t\t\tif (info.ok) infos.push(info.value);\n\t\t\t\t} catch (error) {\n\t\t\t\t\treturn err(toFileError(error, entryPath));\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn ok(infos);\n\t\t} catch (error) {\n\t\t\treturn err(toFileError(error, resolved));\n\t\t}\n\t}\n\n\tasync canonicalPath(path: string, abortSignal?: AbortSignal): Promise<Result<string, FileError>> {\n\t\tconst resolved = resolvePath(this.cwd, path);\n\t\tconst aborted = abortResult<string>(abortSignal, resolved);\n\t\tif (aborted) return aborted;\n\t\ttry {\n\t\t\treturn ok(await realpath(resolved));\n\t\t} catch (error) {\n\t\t\treturn err(toFileError(error, resolved));\n\t\t}\n\t}\n\n\tasync exists(path: string, abortSignal?: AbortSignal): Promise<Result<boolean, FileError>> {\n\t\tconst result = await this.fileInfo(path, abortSignal);\n\t\tif (result.ok) return ok(true);\n\t\tif (result.error.code === \"not_found\") return ok(false);\n\t\treturn err(result.error);\n\t}\n\n\tasync createDir(\n\t\tpath: string,\n\t\toptions?: { recursive?: boolean; abortSignal?: AbortSignal },\n\t): Promise<Result<void, FileError>> {\n\t\tconst resolved = resolvePath(this.cwd, path);\n\t\tconst aborted = abortResult<void>(options?.abortSignal, resolved);\n\t\tif (aborted) return aborted;\n\t\ttry {\n\t\t\tawait mkdir(resolved, { recursive: options?.recursive ?? true });\n\t\t\tconst afterMkdirAbort = abortResult<void>(options?.abortSignal, resolved);\n\t\t\tif (afterMkdirAbort) return afterMkdirAbort;\n\t\t\treturn ok(undefined);\n\t\t} catch (error) {\n\t\t\treturn err(toFileError(error, resolved));\n\t\t}\n\t}\n\n\tasync remove(\n\t\tpath: string,\n\t\toptions?: { recursive?: boolean; force?: boolean; abortSignal?: AbortSignal },\n\t): Promise<Result<void, FileError>> {\n\t\tconst resolved = resolvePath(this.cwd, path);\n\t\tconst aborted = abortResult<void>(options?.abortSignal, resolved);\n\t\tif (aborted) return aborted;\n\t\ttry {\n\t\t\tawait rm(resolved, { recursive: options?.recursive ?? false, force: options?.force ?? false });\n\t\t\tconst afterRemoveAbort = abortResult<void>(options?.abortSignal, resolved);\n\t\t\tif (afterRemoveAbort) return afterRemoveAbort;\n\t\t\treturn ok(undefined);\n\t\t} catch (error) {\n\t\t\treturn err(toFileError(error, resolved));\n\t\t}\n\t}\n\n\tasync createTempDir(prefix: string = \"tmp-\", abortSignal?: AbortSignal): Promise<Result<string, FileError>> {\n\t\tconst aborted = abortResult<string>(abortSignal);\n\t\tif (aborted) return aborted;\n\t\ttry {\n\t\t\tconst path = await mkdtemp(join(tmpdir(), prefix));\n\t\t\tconst afterMkdtempAbort = abortResult<string>(abortSignal, path);\n\t\t\tif (afterMkdtempAbort) return afterMkdtempAbort;\n\t\t\treturn ok(path);\n\t\t} catch (error) {\n\t\t\treturn err(toFileError(error));\n\t\t}\n\t}\n\n\tasync createTempFile(options?: {\n\t\tprefix?: string;\n\t\tsuffix?: string;\n\t\tabortSignal?: AbortSignal;\n\t}): Promise<Result<string, FileError>> {\n\t\tconst dir = await this.createTempDir(\"tmp-\", options?.abortSignal);\n\t\tif (!dir.ok) return dir;\n\t\tconst filePath = join(dir.value, `${options?.prefix ?? \"\"}${randomUUID()}${options?.suffix ?? \"\"}`);\n\t\tconst aborted = abortResult<string>(options?.abortSignal, filePath);\n\t\tif (aborted) return aborted;\n\t\ttry {\n\t\t\tawait writeFile(filePath, \"\", { signal: options?.abortSignal });\n\t\t\treturn ok(filePath);\n\t\t} catch (error) {\n\t\t\treturn err(toFileError(error, filePath));\n\t\t}\n\t}\n\n\tasync cleanup(): Promise<void> {\n\t\t// nothing to clean up for the local node implementation\n\t}\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"execution-env.d.ts","sourceRoot":"","sources":["../../src/harness/execution-env.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,YAAY,EAAE,YAAY,EAAE,uBAAuB,EAAE,aAAa,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC3G,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC","sourcesContent":["export { NodeExecutionEnv } from \"./env/nodejs.js\";\nexport type { ExecutionEnv, ExecutionEnvExecOptions, FileErrorCode, FileInfo, FileKind } from \"./types.js\";\nexport { FileError } from \"./types.js\";\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"execution-env.js","sourceRoot":"","sources":["../../src/harness/execution-env.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAEnD,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC","sourcesContent":["export { NodeExecutionEnv } from \"./env/nodejs.js\";\nexport type { ExecutionEnv, ExecutionEnvExecOptions, FileErrorCode, FileInfo, FileKind } from \"./types.js\";\nexport { FileError } from \"./types.js\";\n"]}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { AgentHarness } from "./agent-harness.js";
|
|
2
|
+
import { Session } from "./session/session.js";
|
|
3
|
+
import type { AgentHarnessOptions, SessionMetadata, SessionStorage } from "./types.js";
|
|
4
|
+
export declare function createSession<TMetadata extends SessionMetadata>(storage: SessionStorage<TMetadata>): Session<TMetadata>;
|
|
5
|
+
export declare function createAgentHarness(options: AgentHarnessOptions): AgentHarness;
|
|
6
|
+
//# sourceMappingURL=factory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../src/harness/factory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAC/C,OAAO,KAAK,EAAE,mBAAmB,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEvF,wBAAgB,aAAa,CAAC,SAAS,SAAS,eAAe,EAC9D,OAAO,EAAE,cAAc,CAAC,SAAS,CAAC,GAChC,OAAO,CAAC,SAAS,CAAC,CAEpB;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,mBAAmB,GAAG,YAAY,CAE7E","sourcesContent":["import { AgentHarness } from \"./agent-harness.js\";\nimport { Session } from \"./session/session.js\";\nimport type { AgentHarnessOptions, SessionMetadata, SessionStorage } from \"./types.js\";\n\nexport function createSession<TMetadata extends SessionMetadata>(\n\tstorage: SessionStorage<TMetadata>,\n): Session<TMetadata> {\n\treturn new Session(storage);\n}\n\nexport function createAgentHarness(options: AgentHarnessOptions): AgentHarness {\n\treturn new AgentHarness(options);\n}\n"]}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { AgentHarness } from "./agent-harness.js";
|
|
2
|
+
import { Session } from "./session/session.js";
|
|
3
|
+
export function createSession(storage) {
|
|
4
|
+
return new Session(storage);
|
|
5
|
+
}
|
|
6
|
+
export function createAgentHarness(options) {
|
|
7
|
+
return new AgentHarness(options);
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=factory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"factory.js","sourceRoot":"","sources":["../../src/harness/factory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAG/C,MAAM,UAAU,aAAa,CAC5B,OAAkC,EACb;IACrB,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;AAAA,CAC5B;AAED,MAAM,UAAU,kBAAkB,CAAC,OAA4B,EAAgB;IAC9E,OAAO,IAAI,YAAY,CAAC,OAAO,CAAC,CAAC;AAAA,CACjC","sourcesContent":["import { AgentHarness } from \"./agent-harness.js\";\nimport { Session } from \"./session/session.js\";\nimport type { AgentHarnessOptions, SessionMetadata, SessionStorage } from \"./types.js\";\n\nexport function createSession<TMetadata extends SessionMetadata>(\n\tstorage: SessionStorage<TMetadata>,\n): Session<TMetadata> {\n\treturn new Session(storage);\n}\n\nexport function createAgentHarness(options: AgentHarnessOptions): AgentHarness {\n\treturn new AgentHarness(options);\n}\n"]}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import type { ImageContent, Message, TextContent } from "@eminent337/aery-ai";
|
|
2
|
+
import type { AgentMessage } from "../types.js";
|
|
3
|
+
export declare const COMPACTION_SUMMARY_PREFIX = "The conversation history before this point was compacted into the following summary:\n\n<summary>\n";
|
|
4
|
+
export declare const COMPACTION_SUMMARY_SUFFIX = "\n</summary>";
|
|
5
|
+
export declare const BRANCH_SUMMARY_PREFIX = "The following is a summary of a branch that this conversation came back from:\n\n<summary>\n";
|
|
6
|
+
export declare const BRANCH_SUMMARY_SUFFIX = "</summary>";
|
|
7
|
+
export interface BashExecutionMessage {
|
|
8
|
+
role: "bashExecution";
|
|
9
|
+
command: string;
|
|
10
|
+
output: string;
|
|
11
|
+
exitCode: number | undefined;
|
|
12
|
+
cancelled: boolean;
|
|
13
|
+
truncated: boolean;
|
|
14
|
+
fullOutputPath?: string;
|
|
15
|
+
timestamp: number;
|
|
16
|
+
excludeFromContext?: boolean;
|
|
17
|
+
}
|
|
18
|
+
export interface CustomMessage<T = unknown> {
|
|
19
|
+
role: "custom";
|
|
20
|
+
customType: string;
|
|
21
|
+
content: string | (TextContent | ImageContent)[];
|
|
22
|
+
display: boolean;
|
|
23
|
+
details?: T;
|
|
24
|
+
timestamp: number;
|
|
25
|
+
}
|
|
26
|
+
export interface BranchSummaryMessage {
|
|
27
|
+
role: "branchSummary";
|
|
28
|
+
summary: string;
|
|
29
|
+
fromId: string;
|
|
30
|
+
timestamp: number;
|
|
31
|
+
}
|
|
32
|
+
export interface CompactionSummaryMessage {
|
|
33
|
+
role: "compactionSummary";
|
|
34
|
+
summary: string;
|
|
35
|
+
tokensBefore: number;
|
|
36
|
+
timestamp: number;
|
|
37
|
+
}
|
|
38
|
+
declare module "../types.js" {
|
|
39
|
+
interface CustomAgentMessages {
|
|
40
|
+
bashExecution: BashExecutionMessage;
|
|
41
|
+
custom: CustomMessage;
|
|
42
|
+
branchSummary: BranchSummaryMessage;
|
|
43
|
+
compactionSummary: CompactionSummaryMessage;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
export declare function bashExecutionToText(msg: BashExecutionMessage): string;
|
|
47
|
+
export declare function createBranchSummaryMessage(summary: string, fromId: string, timestamp: string): BranchSummaryMessage;
|
|
48
|
+
export declare function createCompactionSummaryMessage(summary: string, tokensBefore: number, timestamp: string): CompactionSummaryMessage;
|
|
49
|
+
export declare function createCustomMessage(customType: string, content: string | (TextContent | ImageContent)[], display: boolean, details: unknown | undefined, timestamp: string): CustomMessage;
|
|
50
|
+
export declare function convertToLlm(messages: AgentMessage[]): Message[];
|
|
51
|
+
//# sourceMappingURL=messages.d.ts.map
|