@nervekit/agent 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (263) hide show
  1. package/LICENSE +201 -0
  2. package/NOTICE +5 -0
  3. package/dist/agent-loop.d.ts +2 -0
  4. package/dist/agent-loop.d.ts.map +1 -0
  5. package/dist/agent-loop.js +2 -0
  6. package/dist/agent-loop.js.map +1 -0
  7. package/dist/agent.d.ts +125 -0
  8. package/dist/agent.d.ts.map +1 -0
  9. package/dist/agent.js +427 -0
  10. package/dist/agent.js.map +1 -0
  11. package/dist/harness/agent-harness.d.ts +114 -0
  12. package/dist/harness/agent-harness.d.ts.map +1 -0
  13. package/dist/harness/agent-harness.js +474 -0
  14. package/dist/harness/agent-harness.js.map +1 -0
  15. package/dist/harness/compaction/branch-summarization.d.ts +54 -0
  16. package/dist/harness/compaction/branch-summarization.d.ts.map +1 -0
  17. package/dist/harness/compaction/branch-summarization.js +183 -0
  18. package/dist/harness/compaction/branch-summarization.js.map +1 -0
  19. package/dist/harness/compaction/compaction.d.ts +19 -0
  20. package/dist/harness/compaction/compaction.d.ts.map +1 -0
  21. package/dist/harness/compaction/compaction.js +335 -0
  22. package/dist/harness/compaction/compaction.js.map +1 -0
  23. package/dist/harness/compaction/cut-points.d.ts +7 -0
  24. package/dist/harness/compaction/cut-points.d.ts.map +1 -0
  25. package/dist/harness/compaction/cut-points.js +106 -0
  26. package/dist/harness/compaction/cut-points.js.map +1 -0
  27. package/dist/harness/compaction/overflow.d.ts +3 -0
  28. package/dist/harness/compaction/overflow.d.ts.map +1 -0
  29. package/dist/harness/compaction/overflow.js +54 -0
  30. package/dist/harness/compaction/overflow.js.map +1 -0
  31. package/dist/harness/compaction/policy.d.ts +8 -0
  32. package/dist/harness/compaction/policy.d.ts.map +1 -0
  33. package/dist/harness/compaction/policy.js +57 -0
  34. package/dist/harness/compaction/policy.js.map +1 -0
  35. package/dist/harness/compaction/types.d.ts +79 -0
  36. package/dist/harness/compaction/types.d.ts.map +1 -0
  37. package/dist/harness/compaction/types.js +2 -0
  38. package/dist/harness/compaction/types.js.map +1 -0
  39. package/dist/harness/compaction/usage.d.ts +30 -0
  40. package/dist/harness/compaction/usage.d.ts.map +1 -0
  41. package/dist/harness/compaction/usage.js +177 -0
  42. package/dist/harness/compaction/usage.js.map +1 -0
  43. package/dist/harness/compaction/utils.d.ts +25 -0
  44. package/dist/harness/compaction/utils.d.ts.map +1 -0
  45. package/dist/harness/compaction/utils.js +131 -0
  46. package/dist/harness/compaction/utils.js.map +1 -0
  47. package/dist/harness/configuration.d.ts +34 -0
  48. package/dist/harness/configuration.d.ts.map +1 -0
  49. package/dist/harness/configuration.js +75 -0
  50. package/dist/harness/configuration.js.map +1 -0
  51. package/dist/harness/conversation/context.d.ts +24 -0
  52. package/dist/harness/conversation/context.d.ts.map +1 -0
  53. package/dist/harness/conversation/context.js +76 -0
  54. package/dist/harness/conversation/context.js.map +1 -0
  55. package/dist/harness/conversation/conversation.d.ts +36 -0
  56. package/dist/harness/conversation/conversation.d.ts.map +1 -0
  57. package/dist/harness/conversation/conversation.js +163 -0
  58. package/dist/harness/conversation/conversation.js.map +1 -0
  59. package/dist/harness/conversation/entries.d.ts +117 -0
  60. package/dist/harness/conversation/entries.d.ts.map +1 -0
  61. package/dist/harness/conversation/entries.js +2 -0
  62. package/dist/harness/conversation/entries.js.map +1 -0
  63. package/dist/harness/conversation/jsonl-repo.d.ts +27 -0
  64. package/dist/harness/conversation/jsonl-repo.d.ts.map +1 -0
  65. package/dist/harness/conversation/jsonl-repo.js +110 -0
  66. package/dist/harness/conversation/jsonl-repo.js.map +1 -0
  67. package/dist/harness/conversation/jsonl-storage.d.ts +34 -0
  68. package/dist/harness/conversation/jsonl-storage.d.ts.map +1 -0
  69. package/dist/harness/conversation/jsonl-storage.js +213 -0
  70. package/dist/harness/conversation/jsonl-storage.js.map +1 -0
  71. package/dist/harness/conversation/memory-repo.d.ts +18 -0
  72. package/dist/harness/conversation/memory-repo.d.ts.map +1 -0
  73. package/dist/harness/conversation/memory-repo.js +45 -0
  74. package/dist/harness/conversation/memory-repo.js.map +1 -0
  75. package/dist/harness/conversation/memory-storage.d.ts +25 -0
  76. package/dist/harness/conversation/memory-storage.d.ts.map +1 -0
  77. package/dist/harness/conversation/memory-storage.js +88 -0
  78. package/dist/harness/conversation/memory-storage.js.map +1 -0
  79. package/dist/harness/conversation/repo-utils.d.ts +13 -0
  80. package/dist/harness/conversation/repo-utils.d.ts.map +1 -0
  81. package/dist/harness/conversation/repo-utils.js +39 -0
  82. package/dist/harness/conversation/repo-utils.js.map +1 -0
  83. package/dist/harness/conversation/storage-utils.d.ts +11 -0
  84. package/dist/harness/conversation/storage-utils.d.ts.map +1 -0
  85. package/dist/harness/conversation/storage-utils.js +32 -0
  86. package/dist/harness/conversation/storage-utils.js.map +1 -0
  87. package/dist/harness/conversation/text-extraction.d.ts +8 -0
  88. package/dist/harness/conversation/text-extraction.d.ts.map +1 -0
  89. package/dist/harness/conversation/text-extraction.js +24 -0
  90. package/dist/harness/conversation/text-extraction.js.map +1 -0
  91. package/dist/harness/conversation/uuid.d.ts +2 -0
  92. package/dist/harness/conversation/uuid.d.ts.map +1 -0
  93. package/dist/harness/conversation/uuid.js +54 -0
  94. package/dist/harness/conversation/uuid.js.map +1 -0
  95. package/dist/harness/conversation-writes.d.ts +9 -0
  96. package/dist/harness/conversation-writes.d.ts.map +1 -0
  97. package/dist/harness/conversation-writes.js +54 -0
  98. package/dist/harness/conversation-writes.js.map +1 -0
  99. package/dist/harness/env/nodejs.d.ts +53 -0
  100. package/dist/harness/env/nodejs.d.ts.map +1 -0
  101. package/dist/harness/env/nodejs.js +497 -0
  102. package/dist/harness/env/nodejs.js.map +1 -0
  103. package/dist/harness/env/types.d.ts +106 -0
  104. package/dist/harness/env/types.d.ts.map +1 -0
  105. package/dist/harness/env/types.js +2 -0
  106. package/dist/harness/env/types.js.map +1 -0
  107. package/dist/harness/errors.d.ts +48 -0
  108. package/dist/harness/errors.d.ts.map +1 -0
  109. package/dist/harness/errors.js +63 -0
  110. package/dist/harness/errors.js.map +1 -0
  111. package/dist/harness/events.d.ts +238 -0
  112. package/dist/harness/events.d.ts.map +1 -0
  113. package/dist/harness/events.js +2 -0
  114. package/dist/harness/events.js.map +1 -0
  115. package/dist/harness/harness-configuration-methods.d.ts +36 -0
  116. package/dist/harness/harness-configuration-methods.d.ts.map +1 -0
  117. package/dist/harness/harness-configuration-methods.js +145 -0
  118. package/dist/harness/harness-configuration-methods.js.map +1 -0
  119. package/dist/harness/harness-continuation.d.ts +18 -0
  120. package/dist/harness/harness-continuation.d.ts.map +1 -0
  121. package/dist/harness/harness-continuation.js +56 -0
  122. package/dist/harness/harness-continuation.js.map +1 -0
  123. package/dist/harness/harness-events.d.ts +23 -0
  124. package/dist/harness/harness-events.d.ts.map +1 -0
  125. package/dist/harness/harness-events.js +129 -0
  126. package/dist/harness/harness-events.js.map +1 -0
  127. package/dist/harness/harness-invocations.d.ts +20 -0
  128. package/dist/harness/harness-invocations.d.ts.map +1 -0
  129. package/dist/harness/harness-invocations.js +22 -0
  130. package/dist/harness/harness-invocations.js.map +1 -0
  131. package/dist/harness/harness-maintenance.d.ts +30 -0
  132. package/dist/harness/harness-maintenance.d.ts.map +1 -0
  133. package/dist/harness/harness-maintenance.js +155 -0
  134. package/dist/harness/harness-maintenance.js.map +1 -0
  135. package/dist/harness/harness-queue-methods.d.ts +45 -0
  136. package/dist/harness/harness-queue-methods.d.ts.map +1 -0
  137. package/dist/harness/harness-queue-methods.js +51 -0
  138. package/dist/harness/harness-queue-methods.js.map +1 -0
  139. package/dist/harness/messages.d.ts +76 -0
  140. package/dist/harness/messages.d.ts.map +1 -0
  141. package/dist/harness/messages.js +147 -0
  142. package/dist/harness/messages.js.map +1 -0
  143. package/dist/harness/options.d.ts +95 -0
  144. package/dist/harness/options.d.ts.map +1 -0
  145. package/dist/harness/options.js +2 -0
  146. package/dist/harness/options.js.map +1 -0
  147. package/dist/harness/prompt-templates.d.ts +49 -0
  148. package/dist/harness/prompt-templates.d.ts.map +1 -0
  149. package/dist/harness/prompt-templates.js +230 -0
  150. package/dist/harness/prompt-templates.js.map +1 -0
  151. package/dist/harness/result.d.ts +19 -0
  152. package/dist/harness/result.d.ts.map +1 -0
  153. package/dist/harness/result.js +32 -0
  154. package/dist/harness/result.js.map +1 -0
  155. package/dist/harness/run/messages.d.ts +5 -0
  156. package/dist/harness/run/messages.d.ts.map +1 -0
  157. package/dist/harness/run/messages.js +37 -0
  158. package/dist/harness/run/messages.js.map +1 -0
  159. package/dist/harness/skills/format.d.ts +6 -0
  160. package/dist/harness/skills/format.d.ts.map +1 -0
  161. package/dist/harness/skills/format.js +38 -0
  162. package/dist/harness/skills/format.js.map +1 -0
  163. package/dist/harness/skills/index.d.ts +5 -0
  164. package/dist/harness/skills/index.d.ts.map +1 -0
  165. package/dist/harness/skills/index.js +5 -0
  166. package/dist/harness/skills/index.js.map +1 -0
  167. package/dist/harness/skills/loader.d.ts +43 -0
  168. package/dist/harness/skills/loader.d.ts.map +1 -0
  169. package/dist/harness/skills/loader.js +279 -0
  170. package/dist/harness/skills/loader.js.map +1 -0
  171. package/dist/harness/skills/parser.d.ts +12 -0
  172. package/dist/harness/skills/parser.d.ts.map +1 -0
  173. package/dist/harness/skills/parser.js +22 -0
  174. package/dist/harness/skills/parser.js.map +1 -0
  175. package/dist/harness/skills/validation.d.ts +3 -0
  176. package/dist/harness/skills/validation.d.ts.map +1 -0
  177. package/dist/harness/skills/validation.js +28 -0
  178. package/dist/harness/skills/validation.js.map +1 -0
  179. package/dist/harness/skills.d.ts +2 -0
  180. package/dist/harness/skills.d.ts.map +1 -0
  181. package/dist/harness/skills.js +2 -0
  182. package/dist/harness/skills.js.map +1 -0
  183. package/dist/harness/stream-options.d.ts +5 -0
  184. package/dist/harness/stream-options.d.ts.map +1 -0
  185. package/dist/harness/stream-options.js +67 -0
  186. package/dist/harness/stream-options.js.map +1 -0
  187. package/dist/harness/system-prompt.d.ts +2 -0
  188. package/dist/harness/system-prompt.d.ts.map +1 -0
  189. package/dist/harness/system-prompt.js +2 -0
  190. package/dist/harness/system-prompt.js.map +1 -0
  191. package/dist/harness/turn-state.d.ts +27 -0
  192. package/dist/harness/turn-state.d.ts.map +1 -0
  193. package/dist/harness/turn-state.js +35 -0
  194. package/dist/harness/turn-state.js.map +1 -0
  195. package/dist/harness/types.d.ts +9 -0
  196. package/dist/harness/types.d.ts.map +1 -0
  197. package/dist/harness/types.js +8 -0
  198. package/dist/harness/types.js.map +1 -0
  199. package/dist/harness/utils/env-path.d.ts +14 -0
  200. package/dist/harness/utils/env-path.d.ts.map +1 -0
  201. package/dist/harness/utils/env-path.js +99 -0
  202. package/dist/harness/utils/env-path.js.map +1 -0
  203. package/dist/harness/utils/shell-output.d.ts +16 -0
  204. package/dist/harness/utils/shell-output.d.ts.map +1 -0
  205. package/dist/harness/utils/shell-output.js +137 -0
  206. package/dist/harness/utils/shell-output.js.map +1 -0
  207. package/dist/harness/utils/truncate.d.ts +70 -0
  208. package/dist/harness/utils/truncate.d.ts.map +1 -0
  209. package/dist/harness/utils/truncate.js +289 -0
  210. package/dist/harness/utils/truncate.js.map +1 -0
  211. package/dist/index.d.ts +24 -0
  212. package/dist/index.d.ts.map +1 -0
  213. package/dist/index.js +25 -0
  214. package/dist/index.js.map +1 -0
  215. package/dist/node.d.ts +3 -0
  216. package/dist/node.d.ts.map +1 -0
  217. package/dist/node.js +3 -0
  218. package/dist/node.js.map +1 -0
  219. package/dist/proxy.d.ts +67 -0
  220. package/dist/proxy.d.ts.map +1 -0
  221. package/dist/proxy.js +299 -0
  222. package/dist/proxy.js.map +1 -0
  223. package/dist/runtime/loop/agent-loop.d.ts +24 -0
  224. package/dist/runtime/loop/agent-loop.d.ts.map +1 -0
  225. package/dist/runtime/loop/agent-loop.js +72 -0
  226. package/dist/runtime/loop/agent-loop.js.map +1 -0
  227. package/dist/runtime/loop/events.d.ts +5 -0
  228. package/dist/runtime/loop/events.d.ts.map +1 -0
  229. package/dist/runtime/loop/events.js +5 -0
  230. package/dist/runtime/loop/events.js.map +1 -0
  231. package/dist/runtime/loop/index.d.ts +6 -0
  232. package/dist/runtime/loop/index.d.ts.map +1 -0
  233. package/dist/runtime/loop/index.js +6 -0
  234. package/dist/runtime/loop/index.js.map +1 -0
  235. package/dist/runtime/loop/stream-assistant.d.ts +9 -0
  236. package/dist/runtime/loop/stream-assistant.d.ts.map +1 -0
  237. package/dist/runtime/loop/stream-assistant.js +87 -0
  238. package/dist/runtime/loop/stream-assistant.js.map +1 -0
  239. package/dist/runtime/loop/tool-execution.d.ts +15 -0
  240. package/dist/runtime/loop/tool-execution.d.ts.map +1 -0
  241. package/dist/runtime/loop/tool-execution.js +271 -0
  242. package/dist/runtime/loop/tool-execution.js.map +1 -0
  243. package/dist/runtime/loop/turn-loop.d.ts +7 -0
  244. package/dist/runtime/loop/turn-loop.d.ts.map +1 -0
  245. package/dist/runtime/loop/turn-loop.js +84 -0
  246. package/dist/runtime/loop/turn-loop.js.map +1 -0
  247. package/dist/runtime.d.ts +63 -0
  248. package/dist/runtime.d.ts.map +1 -0
  249. package/dist/runtime.js +170 -0
  250. package/dist/runtime.js.map +1 -0
  251. package/dist/suspension.d.ts +18 -0
  252. package/dist/suspension.d.ts.map +1 -0
  253. package/dist/suspension.js +19 -0
  254. package/dist/suspension.js.map +1 -0
  255. package/dist/types.d.ts +395 -0
  256. package/dist/types.d.ts.map +1 -0
  257. package/dist/types.js +2 -0
  258. package/dist/types.js.map +1 -0
  259. package/dist/worker.d.ts +2 -0
  260. package/dist/worker.d.ts.map +1 -0
  261. package/dist/worker.js +88 -0
  262. package/dist/worker.js.map +1 -0
  263. package/package.json +54 -0
@@ -0,0 +1,497 @@
1
+ import { spawn } from "node:child_process";
2
+ import { randomUUID } from "node:crypto";
3
+ import { constants, createReadStream } 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 { basename, isAbsolute, join, resolve } from "node:path";
7
+ import { createInterface } from "node:readline";
8
+ import { ExecutionError, FileError } from "../errors.js";
9
+ import { err, ok, toError } from "../result.js";
10
+ function resolvePath(cwd, path) {
11
+ return isAbsolute(path) ? path : resolve(cwd, path);
12
+ }
13
+ function fileKindFromStats(stats) {
14
+ if (stats.isFile())
15
+ return "file";
16
+ if (stats.isDirectory())
17
+ return "directory";
18
+ if (stats.isSymbolicLink())
19
+ return "symlink";
20
+ return undefined;
21
+ }
22
+ function fileInfoFromStats(path, stats) {
23
+ const kind = fileKindFromStats(stats);
24
+ if (!kind)
25
+ return err(new FileError("invalid", "Unsupported file type", path));
26
+ return ok({
27
+ name: basename(path),
28
+ path,
29
+ kind,
30
+ size: stats.size,
31
+ mtimeMs: stats.mtimeMs,
32
+ });
33
+ }
34
+ function isNodeError(error) {
35
+ return error instanceof Error && "code" in error;
36
+ }
37
+ function toFileError(error, path) {
38
+ if (error instanceof FileError)
39
+ return error;
40
+ const cause = toError(error);
41
+ if (isNodeError(error)) {
42
+ const message = error.message;
43
+ switch (error.code) {
44
+ case "ABORT_ERR":
45
+ return new FileError("aborted", message, path, cause);
46
+ case "ENOENT":
47
+ return new FileError("not_found", message, path, cause);
48
+ case "EACCES":
49
+ case "EPERM":
50
+ return new FileError("permission_denied", message, path, cause);
51
+ case "ENOTDIR":
52
+ return new FileError("not_directory", message, path, cause);
53
+ case "EISDIR":
54
+ return new FileError("is_directory", message, path, cause);
55
+ case "EINVAL":
56
+ return new FileError("invalid", message, path, cause);
57
+ }
58
+ }
59
+ return new FileError("unknown", cause.message, path, cause);
60
+ }
61
+ function abortResult(signal, path) {
62
+ return signal?.aborted
63
+ ? err(new FileError("aborted", "aborted", path))
64
+ : undefined;
65
+ }
66
+ async function pathExists(path) {
67
+ try {
68
+ await access(path, constants.F_OK);
69
+ return true;
70
+ }
71
+ catch {
72
+ return false;
73
+ }
74
+ }
75
+ async function runCommand(command, args, timeoutMs) {
76
+ return await new Promise((resolve) => {
77
+ let stdout = "";
78
+ let child;
79
+ try {
80
+ child = spawn(command, args, {
81
+ stdio: ["ignore", "pipe", "ignore"],
82
+ windowsHide: true,
83
+ });
84
+ }
85
+ catch {
86
+ resolve({ stdout: "", status: null });
87
+ return;
88
+ }
89
+ const timeout = setTimeout(() => {
90
+ if (child.pid)
91
+ killProcessTree(child.pid);
92
+ }, timeoutMs);
93
+ child.stdout?.setEncoding("utf8");
94
+ child.stdout?.on("data", (chunk) => {
95
+ stdout += chunk;
96
+ });
97
+ child.on("error", () => {
98
+ clearTimeout(timeout);
99
+ resolve({ stdout: "", status: null });
100
+ });
101
+ child.on("close", (status) => {
102
+ clearTimeout(timeout);
103
+ resolve({ stdout, status });
104
+ });
105
+ });
106
+ }
107
+ async function findBashOnPath() {
108
+ const result = process.platform === "win32"
109
+ ? await runCommand("where", ["bash.exe"], 5000)
110
+ : await runCommand("which", ["bash"], 5000);
111
+ if (result.status !== 0 || !result.stdout)
112
+ return null;
113
+ const firstMatch = result.stdout.trim().split(/\r?\n/)[0];
114
+ return firstMatch && (await pathExists(firstMatch)) ? firstMatch : null;
115
+ }
116
+ async function getShellConfig(customShellPath) {
117
+ if (customShellPath) {
118
+ if (await pathExists(customShellPath)) {
119
+ return ok({ shell: customShellPath, args: ["-c"] });
120
+ }
121
+ return err(new ExecutionError("shell_unavailable", `Custom shell path not found: ${customShellPath}`));
122
+ }
123
+ if (process.platform === "win32") {
124
+ const candidates = [];
125
+ const programFiles = process.env.ProgramFiles;
126
+ if (programFiles)
127
+ candidates.push(`${programFiles}\\Git\\bin\\bash.exe`);
128
+ const programFilesX86 = process.env["ProgramFiles(x86)"];
129
+ if (programFilesX86)
130
+ candidates.push(`${programFilesX86}\\Git\\bin\\bash.exe`);
131
+ for (const candidate of candidates) {
132
+ if (await pathExists(candidate)) {
133
+ return ok({ shell: candidate, args: ["-c"] });
134
+ }
135
+ }
136
+ const bashOnPath = await findBashOnPath();
137
+ if (bashOnPath) {
138
+ return ok({ shell: bashOnPath, args: ["-c"] });
139
+ }
140
+ return err(new ExecutionError("shell_unavailable", "No bash shell found"));
141
+ }
142
+ if (await pathExists("/bin/bash")) {
143
+ return ok({ shell: "/bin/bash", args: ["-c"] });
144
+ }
145
+ const bashOnPath = await findBashOnPath();
146
+ if (bashOnPath) {
147
+ return ok({ shell: bashOnPath, args: ["-c"] });
148
+ }
149
+ return ok({ shell: "sh", args: ["-c"] });
150
+ }
151
+ function getShellEnv(baseEnv, extraEnv) {
152
+ return {
153
+ ...process.env,
154
+ ...baseEnv,
155
+ ...extraEnv,
156
+ };
157
+ }
158
+ function killProcessTree(pid) {
159
+ if (process.platform === "win32") {
160
+ try {
161
+ spawn("taskkill", ["/F", "/T", "/PID", String(pid)], {
162
+ stdio: "ignore",
163
+ detached: true,
164
+ windowsHide: true,
165
+ });
166
+ }
167
+ catch {
168
+ // Ignore errors.
169
+ }
170
+ return;
171
+ }
172
+ try {
173
+ process.kill(-pid, "SIGKILL");
174
+ }
175
+ catch {
176
+ try {
177
+ process.kill(pid, "SIGKILL");
178
+ }
179
+ catch {
180
+ // Process already dead.
181
+ }
182
+ }
183
+ }
184
+ export class NodeExecutionEnv {
185
+ cwd;
186
+ shellPath;
187
+ shellEnv;
188
+ constructor(options) {
189
+ this.cwd = options.cwd;
190
+ this.shellPath = options.shellPath;
191
+ this.shellEnv = options.shellEnv;
192
+ }
193
+ async absolutePath(path) {
194
+ return ok(resolvePath(this.cwd, path));
195
+ }
196
+ async joinPath(parts) {
197
+ return ok(join(...parts));
198
+ }
199
+ async exec(command, options) {
200
+ if (options?.abortSignal?.aborted)
201
+ return err(new ExecutionError("aborted", "aborted"));
202
+ const cwd = options?.cwd ? resolvePath(this.cwd, options.cwd) : this.cwd;
203
+ const shellConfig = await getShellConfig(this.shellPath);
204
+ if (!shellConfig.ok)
205
+ return shellConfig;
206
+ return await new Promise((resolvePromise) => {
207
+ let stdout = "";
208
+ let stderr = "";
209
+ let settled = false;
210
+ let timedOut = false;
211
+ let callbackError;
212
+ let child;
213
+ let timeoutId;
214
+ const onAbort = () => {
215
+ if (child?.pid) {
216
+ killProcessTree(child.pid);
217
+ }
218
+ };
219
+ const settle = (result) => {
220
+ if (timeoutId)
221
+ clearTimeout(timeoutId);
222
+ if (options?.abortSignal)
223
+ options.abortSignal.removeEventListener("abort", onAbort);
224
+ if (settled)
225
+ return;
226
+ settled = true;
227
+ resolvePromise(result);
228
+ };
229
+ try {
230
+ child = spawn(shellConfig.value.shell, [...shellConfig.value.args, command], {
231
+ cwd,
232
+ detached: process.platform !== "win32",
233
+ env: getShellEnv(this.shellEnv, options?.env),
234
+ stdio: ["ignore", "pipe", "pipe"],
235
+ windowsHide: true,
236
+ });
237
+ }
238
+ catch (error) {
239
+ const cause = toError(error);
240
+ settle(err(new ExecutionError("spawn_error", cause.message, cause)));
241
+ return;
242
+ }
243
+ timeoutId =
244
+ typeof options?.timeout === "number"
245
+ ? setTimeout(() => {
246
+ timedOut = true;
247
+ if (child?.pid) {
248
+ killProcessTree(child.pid);
249
+ }
250
+ }, options.timeout * 1000)
251
+ : undefined;
252
+ if (options?.abortSignal) {
253
+ if (options.abortSignal.aborted) {
254
+ onAbort();
255
+ }
256
+ else {
257
+ options.abortSignal.addEventListener("abort", onAbort, {
258
+ once: true,
259
+ });
260
+ }
261
+ }
262
+ child.stdout?.setEncoding("utf8");
263
+ child.stderr?.setEncoding("utf8");
264
+ child.stdout?.on("data", (chunk) => {
265
+ stdout += chunk;
266
+ try {
267
+ options?.onStdout?.(chunk);
268
+ }
269
+ catch (error) {
270
+ const cause = toError(error);
271
+ callbackError = new ExecutionError("callback_error", cause.message, cause);
272
+ onAbort();
273
+ }
274
+ });
275
+ child.stderr?.on("data", (chunk) => {
276
+ stderr += chunk;
277
+ try {
278
+ options?.onStderr?.(chunk);
279
+ }
280
+ catch (error) {
281
+ const cause = toError(error);
282
+ callbackError = new ExecutionError("callback_error", cause.message, cause);
283
+ onAbort();
284
+ }
285
+ });
286
+ child.on("error", (error) => {
287
+ settle(err(new ExecutionError("spawn_error", error.message, error)));
288
+ });
289
+ child.on("close", (code) => {
290
+ if (callbackError) {
291
+ settle(err(callbackError));
292
+ return;
293
+ }
294
+ if (timedOut) {
295
+ settle(err(new ExecutionError("timeout", `timeout:${options?.timeout}`)));
296
+ return;
297
+ }
298
+ if (options?.abortSignal?.aborted) {
299
+ settle(err(new ExecutionError("aborted", "aborted")));
300
+ return;
301
+ }
302
+ settle(ok({ stdout, stderr, exitCode: code ?? 0 }));
303
+ });
304
+ });
305
+ }
306
+ async readTextFile(path, abortSignal) {
307
+ const resolved = resolvePath(this.cwd, path);
308
+ const aborted = abortResult(abortSignal, resolved);
309
+ if (aborted)
310
+ return aborted;
311
+ try {
312
+ return ok(await readFile(resolved, { encoding: "utf8", signal: abortSignal }));
313
+ }
314
+ catch (error) {
315
+ return err(toFileError(error, resolved));
316
+ }
317
+ }
318
+ async readTextLines(path, options) {
319
+ const resolved = resolvePath(this.cwd, path);
320
+ const aborted = abortResult(options?.abortSignal, resolved);
321
+ if (aborted)
322
+ return aborted;
323
+ if (options?.maxLines !== undefined && options.maxLines <= 0)
324
+ return ok([]);
325
+ let stream;
326
+ let lineReader;
327
+ try {
328
+ stream = createReadStream(resolved, {
329
+ encoding: "utf8",
330
+ signal: options?.abortSignal,
331
+ });
332
+ lineReader = createInterface({ input: stream, crlfDelay: Infinity });
333
+ const lines = [];
334
+ for await (const line of lineReader) {
335
+ const loopAbort = abortResult(options?.abortSignal, resolved);
336
+ if (loopAbort)
337
+ return loopAbort;
338
+ lines.push(line);
339
+ if (options?.maxLines !== undefined && lines.length >= options.maxLines)
340
+ break;
341
+ }
342
+ const afterReadAbort = abortResult(options?.abortSignal, resolved);
343
+ if (afterReadAbort)
344
+ return afterReadAbort;
345
+ return ok(lines);
346
+ }
347
+ catch (error) {
348
+ return err(toFileError(error, resolved));
349
+ }
350
+ finally {
351
+ lineReader?.close();
352
+ stream?.destroy();
353
+ }
354
+ }
355
+ async readBinaryFile(path, abortSignal) {
356
+ const resolved = resolvePath(this.cwd, path);
357
+ const aborted = abortResult(abortSignal, resolved);
358
+ if (aborted)
359
+ return aborted;
360
+ try {
361
+ return ok(await readFile(resolved, { signal: abortSignal }));
362
+ }
363
+ catch (error) {
364
+ return err(toFileError(error, resolved));
365
+ }
366
+ }
367
+ async writeFile(path, content, abortSignal) {
368
+ const resolved = resolvePath(this.cwd, path);
369
+ const aborted = abortResult(abortSignal, resolved);
370
+ if (aborted)
371
+ return aborted;
372
+ try {
373
+ await mkdir(resolve(resolved, ".."), { recursive: true });
374
+ const afterMkdirAbort = abortResult(abortSignal, resolved);
375
+ if (afterMkdirAbort)
376
+ return afterMkdirAbort;
377
+ await writeFile(resolved, content, { signal: abortSignal });
378
+ return ok(undefined);
379
+ }
380
+ catch (error) {
381
+ return err(toFileError(error, resolved));
382
+ }
383
+ }
384
+ async appendFile(path, content) {
385
+ const resolved = resolvePath(this.cwd, path);
386
+ try {
387
+ await mkdir(resolve(resolved, ".."), { recursive: true });
388
+ await appendFile(resolved, content);
389
+ return ok(undefined);
390
+ }
391
+ catch (error) {
392
+ return err(toFileError(error, resolved));
393
+ }
394
+ }
395
+ async fileInfo(path) {
396
+ const resolved = resolvePath(this.cwd, path);
397
+ try {
398
+ return fileInfoFromStats(resolved, await lstat(resolved));
399
+ }
400
+ catch (error) {
401
+ return err(toFileError(error, resolved));
402
+ }
403
+ }
404
+ async listDir(path, abortSignal) {
405
+ const resolved = resolvePath(this.cwd, path);
406
+ const aborted = abortResult(abortSignal, resolved);
407
+ if (aborted)
408
+ return aborted;
409
+ try {
410
+ const entries = await readdir(resolved, { withFileTypes: true });
411
+ const infos = [];
412
+ for (const entry of entries) {
413
+ const loopAbort = abortResult(abortSignal, resolved);
414
+ if (loopAbort)
415
+ return loopAbort;
416
+ const entryPath = resolve(resolved, entry.name);
417
+ try {
418
+ const info = fileInfoFromStats(entryPath, await lstat(entryPath));
419
+ if (info.ok)
420
+ infos.push(info.value);
421
+ }
422
+ catch (error) {
423
+ return err(toFileError(error, entryPath));
424
+ }
425
+ }
426
+ return ok(infos);
427
+ }
428
+ catch (error) {
429
+ return err(toFileError(error, resolved));
430
+ }
431
+ }
432
+ async canonicalPath(path) {
433
+ const resolved = resolvePath(this.cwd, path);
434
+ try {
435
+ return ok(await realpath(resolved));
436
+ }
437
+ catch (error) {
438
+ return err(toFileError(error, resolved));
439
+ }
440
+ }
441
+ async exists(path) {
442
+ const result = await this.fileInfo(path);
443
+ if (result.ok)
444
+ return ok(true);
445
+ if (result.error.code === "not_found")
446
+ return ok(false);
447
+ return err(result.error);
448
+ }
449
+ async createDir(path, options) {
450
+ const resolved = resolvePath(this.cwd, path);
451
+ try {
452
+ await mkdir(resolved, { recursive: options?.recursive ?? true });
453
+ return ok(undefined);
454
+ }
455
+ catch (error) {
456
+ return err(toFileError(error, resolved));
457
+ }
458
+ }
459
+ async remove(path, options) {
460
+ const resolved = resolvePath(this.cwd, path);
461
+ try {
462
+ await rm(resolved, {
463
+ recursive: options?.recursive ?? false,
464
+ force: options?.force ?? false,
465
+ });
466
+ return ok(undefined);
467
+ }
468
+ catch (error) {
469
+ return err(toFileError(error, resolved));
470
+ }
471
+ }
472
+ async createTempDir(prefix = "tmp-") {
473
+ try {
474
+ return ok(await mkdtemp(join(tmpdir(), prefix)));
475
+ }
476
+ catch (error) {
477
+ return err(toFileError(error));
478
+ }
479
+ }
480
+ async createTempFile(options) {
481
+ const dir = await this.createTempDir("tmp-");
482
+ if (!dir.ok)
483
+ return dir;
484
+ const filePath = join(dir.value, `${options?.prefix ?? ""}${randomUUID()}${options?.suffix ?? ""}`);
485
+ try {
486
+ await writeFile(filePath, "");
487
+ return ok(filePath);
488
+ }
489
+ catch (error) {
490
+ return err(toFileError(error, filePath));
491
+ }
492
+ }
493
+ async cleanup() {
494
+ // nothing to clean up for the local node implementation
495
+ }
496
+ }
497
+ //# sourceMappingURL=nodejs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nodejs.js","sourceRoot":"","sources":["../../../src/harness/env/nodejs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,106 @@
1
+ import type { ExecutionError, FileError } from "../errors.js";
2
+ import type { Result } from "../result.js";
3
+ /** Kind of filesystem object as addressed by a {@link FileSystem}. Symlinks are not followed automatically. */
4
+ export type FileKind = "file" | "directory" | "symlink";
5
+ /** Metadata for one filesystem object in a {@link FileSystem}. */
6
+ export interface FileInfo {
7
+ /** Basename of {@link path}. */
8
+ name: string;
9
+ /** Absolute, syntactically normalized addressed path in the execution environment. Symlinks are not followed. */
10
+ path: string;
11
+ /** Object kind. Symlink targets are not followed; use {@link FileSystem.canonicalPath} explicitly. */
12
+ kind: FileKind;
13
+ /** Size in bytes for the addressed filesystem object. */
14
+ size: number;
15
+ /** Modification time as milliseconds since Unix epoch. */
16
+ mtimeMs: number;
17
+ }
18
+ /** Options for {@link Shell.exec}. */
19
+ export interface ExecutionEnvExecOptions {
20
+ /** Working directory for the command. Relative paths are resolved against {@link ExecutionEnv.cwd}. Defaults to {@link ExecutionEnv.cwd}. */
21
+ cwd?: string;
22
+ /** Additional environment variables for the command. Values override the environment defaults. Defaults to no overrides. */
23
+ env?: Record<string, string>;
24
+ /** Timeout in seconds. Implementations should return a timeout error when the command exceeds this duration. Defaults to no timeout. */
25
+ timeout?: number;
26
+ /** Abort signal used to terminate the command. Defaults to no abort signal. */
27
+ abortSignal?: AbortSignal;
28
+ /** Called with stdout chunks as they are produced. */
29
+ onStdout?: (chunk: string) => void;
30
+ /** Called with stderr chunks as they are produced. */
31
+ onStderr?: (chunk: string) => void;
32
+ }
33
+ /**
34
+ * Filesystem capability used by the harness.
35
+ *
36
+ * Paths passed to methods may be absolute or relative to {@link cwd}. Paths returned by file operations are addressed paths
37
+ * in the filesystem namespace, but are not canonicalized through symlinks unless returned by {@link canonicalPath}.
38
+ *
39
+ * Operation methods must never throw or reject. All filesystem failures, including unexpected backend failures, must be
40
+ * encoded in the returned {@link Result}. Implementations must preserve this invariant.
41
+ */
42
+ export interface FileSystem {
43
+ /** Current working directory for relative paths. */
44
+ cwd: string;
45
+ /** Return an absolute addressed path without requiring it to exist and without resolving symlinks. */
46
+ absolutePath(path: string, abortSignal?: AbortSignal): Promise<Result<string, FileError>>;
47
+ /** Join path segments in the filesystem namespace without requiring the result to exist. */
48
+ joinPath(parts: string[], abortSignal?: AbortSignal): Promise<Result<string, FileError>>;
49
+ /** Read a UTF-8 text file. */
50
+ readTextFile(path: string, abortSignal?: AbortSignal): Promise<Result<string, FileError>>;
51
+ /** Read UTF-8 text lines. Implementations should stop once `maxLines` lines have been read. */
52
+ readTextLines(path: string, options?: {
53
+ maxLines?: number;
54
+ abortSignal?: AbortSignal;
55
+ }): Promise<Result<string[], FileError>>;
56
+ /** Read a binary file. */
57
+ readBinaryFile(path: string, abortSignal?: AbortSignal): Promise<Result<Uint8Array, FileError>>;
58
+ /** Create or overwrite a file, creating parent directories when supported. */
59
+ writeFile(path: string, content: string | Uint8Array, abortSignal?: AbortSignal): Promise<Result<void, FileError>>;
60
+ /** Create or append to a file, creating parent directories when supported. */
61
+ appendFile(path: string, content: string | Uint8Array, abortSignal?: AbortSignal): Promise<Result<void, FileError>>;
62
+ /** Return metadata for the addressed path without following symlinks. */
63
+ fileInfo(path: string, abortSignal?: AbortSignal): Promise<Result<FileInfo, FileError>>;
64
+ /** List direct children of a directory without following symlinks. */
65
+ listDir(path: string, abortSignal?: AbortSignal): Promise<Result<FileInfo[], FileError>>;
66
+ /** Return the canonical path for an existing path, resolving symlinks where supported. */
67
+ canonicalPath(path: string, abortSignal?: AbortSignal): Promise<Result<string, FileError>>;
68
+ /** Return false for missing paths. Other errors, such as permission failures, return a {@link FileError}. */
69
+ exists(path: string, abortSignal?: AbortSignal): Promise<Result<boolean, FileError>>;
70
+ /** Create a directory. Defaults: `recursive: true`, no abort signal. */
71
+ createDir(path: string, options?: {
72
+ recursive?: boolean;
73
+ abortSignal?: AbortSignal;
74
+ }): Promise<Result<void, FileError>>;
75
+ /** Remove a file or directory. Defaults: `recursive: false`, `force: false`, no abort signal. */
76
+ remove(path: string, options?: {
77
+ recursive?: boolean;
78
+ force?: boolean;
79
+ abortSignal?: AbortSignal;
80
+ }): Promise<Result<void, FileError>>;
81
+ /** Create a temporary directory and return its absolute path. Defaults: `prefix: "tmp-"`, no abort signal. */
82
+ createTempDir(prefix?: string, abortSignal?: AbortSignal): Promise<Result<string, FileError>>;
83
+ /** Create a temporary file and return its absolute path. Defaults: `prefix: ""`, `suffix: ""`, no abort signal. */
84
+ createTempFile(options?: {
85
+ prefix?: string;
86
+ suffix?: string;
87
+ abortSignal?: AbortSignal;
88
+ }): Promise<Result<string, FileError>>;
89
+ /** Release filesystem resources. Must be best-effort and must not throw or reject. */
90
+ cleanup(): Promise<void>;
91
+ }
92
+ /** Shell execution capability used by the harness. */
93
+ export interface Shell {
94
+ /** Execute a shell command in {@link FileSystem.cwd} unless `options.cwd` is provided. */
95
+ exec(command: string, options?: ExecutionEnvExecOptions): Promise<Result<{
96
+ stdout: string;
97
+ stderr: string;
98
+ exitCode: number;
99
+ }, ExecutionError>>;
100
+ /** Release shell resources. Must be best-effort and must not throw or reject. */
101
+ cleanup(): Promise<void>;
102
+ }
103
+ /** Filesystem and process execution environment used by the harness. */
104
+ export interface ExecutionEnv extends FileSystem, Shell {
105
+ }
106
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/harness/env/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/harness/env/types.ts"],"names":[],"mappings":""}