@pentoshi/clai 0.6.0 → 0.7.2

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 (119) hide show
  1. package/README.md +18 -15
  2. package/dist/agent/context-manager.d.ts +27 -0
  3. package/dist/agent/context-manager.js +75 -0
  4. package/dist/agent/context-manager.js.map +1 -0
  5. package/dist/agent/runner.d.ts +21 -1
  6. package/dist/agent/runner.js +185 -74
  7. package/dist/agent/runner.js.map +1 -1
  8. package/dist/commands/doctor.js +21 -2
  9. package/dist/commands/doctor.js.map +1 -1
  10. package/dist/commands/update.js +11 -2
  11. package/dist/commands/update.js.map +1 -1
  12. package/dist/index.js +172 -5
  13. package/dist/index.js.map +1 -1
  14. package/dist/llm/anthropic.js +29 -38
  15. package/dist/llm/anthropic.js.map +1 -1
  16. package/dist/llm/gemini.d.ts +2 -0
  17. package/dist/llm/gemini.js +40 -43
  18. package/dist/llm/gemini.js.map +1 -1
  19. package/dist/llm/http.d.ts +23 -1
  20. package/dist/llm/http.js +197 -13
  21. package/dist/llm/http.js.map +1 -1
  22. package/dist/llm/nvidia.js +1 -0
  23. package/dist/llm/nvidia.js.map +1 -1
  24. package/dist/llm/ollama.js +18 -27
  25. package/dist/llm/ollama.js.map +1 -1
  26. package/dist/llm/router.d.ts +7 -0
  27. package/dist/llm/router.js +16 -23
  28. package/dist/llm/router.js.map +1 -1
  29. package/dist/modes/agent.d.ts +4 -2
  30. package/dist/modes/agent.js +2 -2
  31. package/dist/modes/agent.js.map +1 -1
  32. package/dist/modes/ask.js +3 -4
  33. package/dist/modes/ask.js.map +1 -1
  34. package/dist/os/pkgmgr.d.ts +7 -1
  35. package/dist/os/pkgmgr.js +97 -18
  36. package/dist/os/pkgmgr.js.map +1 -1
  37. package/dist/prompts/index.d.ts +7 -0
  38. package/dist/prompts/index.js +12 -4
  39. package/dist/prompts/index.js.map +1 -1
  40. package/dist/repl.d.ts +1 -0
  41. package/dist/repl.js +363 -45
  42. package/dist/repl.js.map +1 -1
  43. package/dist/safety/classifier.d.ts +7 -1
  44. package/dist/safety/classifier.js +260 -86
  45. package/dist/safety/classifier.js.map +1 -1
  46. package/dist/safety/patterns.d.ts +48 -1
  47. package/dist/safety/patterns.js +140 -7
  48. package/dist/safety/patterns.js.map +1 -1
  49. package/dist/store/config.d.ts +23 -3
  50. package/dist/store/config.js +31 -11
  51. package/dist/store/config.js.map +1 -1
  52. package/dist/store/history.d.ts +9 -0
  53. package/dist/store/history.js +58 -1
  54. package/dist/store/history.js.map +1 -1
  55. package/dist/store/keys.d.ts +2 -1
  56. package/dist/store/keys.js +7 -3
  57. package/dist/store/keys.js.map +1 -1
  58. package/dist/store/logs.d.ts +7 -0
  59. package/dist/store/logs.js +39 -1
  60. package/dist/store/logs.js.map +1 -1
  61. package/dist/store/project.d.ts +1 -0
  62. package/dist/store/project.js +34 -9
  63. package/dist/store/project.js.map +1 -1
  64. package/dist/store/scope.d.ts +32 -0
  65. package/dist/store/scope.js +161 -0
  66. package/dist/store/scope.js.map +1 -0
  67. package/dist/tools/fs.d.ts +6 -2
  68. package/dist/tools/fs.js +99 -87
  69. package/dist/tools/fs.js.map +1 -1
  70. package/dist/tools/http.d.ts +5 -3
  71. package/dist/tools/http.js +170 -31
  72. package/dist/tools/http.js.map +1 -1
  73. package/dist/tools/policies/output-policy.d.ts +13 -0
  74. package/dist/tools/policies/output-policy.js +56 -0
  75. package/dist/tools/policies/output-policy.js.map +1 -0
  76. package/dist/tools/reducers/ffuf.d.ts +6 -0
  77. package/dist/tools/reducers/ffuf.js +74 -0
  78. package/dist/tools/reducers/ffuf.js.map +1 -0
  79. package/dist/tools/reducers/generic.d.ts +2 -0
  80. package/dist/tools/reducers/generic.js +60 -0
  81. package/dist/tools/reducers/generic.js.map +1 -0
  82. package/dist/tools/reducers/gobuster.d.ts +2 -0
  83. package/dist/tools/reducers/gobuster.js +36 -0
  84. package/dist/tools/reducers/gobuster.js.map +1 -0
  85. package/dist/tools/reducers/httpx.d.ts +2 -0
  86. package/dist/tools/reducers/httpx.js +38 -0
  87. package/dist/tools/reducers/httpx.js.map +1 -0
  88. package/dist/tools/reducers/nmap.d.ts +7 -0
  89. package/dist/tools/reducers/nmap.js +82 -0
  90. package/dist/tools/reducers/nmap.js.map +1 -0
  91. package/dist/tools/reducers/nuclei.d.ts +2 -0
  92. package/dist/tools/reducers/nuclei.js +51 -0
  93. package/dist/tools/reducers/nuclei.js.map +1 -0
  94. package/dist/tools/reducers/sqlmap.d.ts +2 -0
  95. package/dist/tools/reducers/sqlmap.js +39 -0
  96. package/dist/tools/reducers/sqlmap.js.map +1 -0
  97. package/dist/tools/reducers/subdomains.d.ts +6 -0
  98. package/dist/tools/reducers/subdomains.js +31 -0
  99. package/dist/tools/reducers/subdomains.js.map +1 -0
  100. package/dist/tools/reducers/types.d.ts +14 -0
  101. package/dist/tools/reducers/types.js +2 -0
  102. package/dist/tools/reducers/types.js.map +1 -0
  103. package/dist/tools/registry.d.ts +1 -1
  104. package/dist/tools/registry.js +223 -79
  105. package/dist/tools/registry.js.map +1 -1
  106. package/dist/tools/shell.d.ts +45 -4
  107. package/dist/tools/shell.js +419 -88
  108. package/dist/tools/shell.js.map +1 -1
  109. package/dist/tools/validate.d.ts +37 -0
  110. package/dist/tools/validate.js +144 -0
  111. package/dist/tools/validate.js.map +1 -0
  112. package/dist/types.d.ts +7 -15
  113. package/dist/ui/keys.d.ts +21 -0
  114. package/dist/ui/keys.js +13 -0
  115. package/dist/ui/keys.js.map +1 -0
  116. package/dist/ui/output-pane.d.ts +31 -0
  117. package/dist/ui/output-pane.js +81 -0
  118. package/dist/ui/output-pane.js.map +1 -0
  119. package/package.json +1 -1
@@ -1,35 +1,125 @@
1
1
  import { spawn } from "node:child_process";
2
+ import { createWriteStream } from "node:fs";
3
+ import { mkdir, readFile, writeFile } from "node:fs/promises";
4
+ import { join } from "node:path";
5
+ import { homedir } from "node:os";
2
6
  import { redactSecrets } from "../llm/provider.js";
3
- import { createArtifactStream } from "./artifacts.js";
7
+ const DEFAULT_MAX_MODEL_BYTES = 12_000;
8
+ const DEFAULT_MAX_CAPTURE_BYTES = 5 * 1024 * 1024;
9
+ const DEFAULT_TIMEOUT_MS = 180_000;
10
+ function safeArtifactName(command) {
11
+ const head = command.trim().split(/\s+/)[0] ?? "shell";
12
+ const clean = head.replace(/[^a-z0-9_.-]+/gi, "-").replace(/^-+|-+$/g, "");
13
+ return clean || "shell";
14
+ }
15
+ async function openArtifact(command, override) {
16
+ try {
17
+ const dir = override
18
+ ? join(override, "..")
19
+ : join(homedir(), ".clai", "outputs");
20
+ await mkdir(dir, { recursive: true });
21
+ const path = override ??
22
+ join(dir, `${new Date().toISOString().replace(/[:.]/g, "-")}-${safeArtifactName(command)}.txt`);
23
+ const stream = createWriteStream(path, { flags: "w" });
24
+ return { path, stream };
25
+ }
26
+ catch {
27
+ return undefined;
28
+ }
29
+ }
30
+ /** A small ring buffer of recent output lines used as the "tail" summary.
31
+ * Exported only for tests. */
32
+ export class RingBuffer {
33
+ capacity;
34
+ chunks = [];
35
+ bytes = 0;
36
+ constructor(capacity) {
37
+ this.capacity = capacity;
38
+ }
39
+ push(text) {
40
+ // When a single chunk is larger than our capacity, keep only its
41
+ // tail. Otherwise some platforms (notably Windows, where Node delivers
42
+ // stdout in one big buffer) leave the ring holding far more than
43
+ // capacity bytes and the model-facing summary blows past maxModelBytes.
44
+ if (text.length >= this.capacity) {
45
+ this.chunks = [text.slice(text.length - this.capacity)];
46
+ this.bytes = this.chunks[0].length;
47
+ return;
48
+ }
49
+ this.chunks.push(text);
50
+ this.bytes += text.length;
51
+ while (this.bytes > this.capacity && this.chunks.length > 1) {
52
+ const removed = this.chunks.shift();
53
+ this.bytes -= removed.length;
54
+ }
55
+ // After shifting all but one chunk we may still be over capacity if
56
+ // the remaining chunk is itself larger than the cap. Trim it down.
57
+ if (this.bytes > this.capacity && this.chunks.length === 1) {
58
+ const only = this.chunks[0];
59
+ this.chunks[0] = only.slice(only.length - this.capacity);
60
+ this.bytes = this.chunks[0].length;
61
+ }
62
+ }
63
+ toString() {
64
+ return this.chunks.join("");
65
+ }
66
+ size() {
67
+ return this.bytes;
68
+ }
69
+ }
70
+ /**
71
+ * Re-read a freshly written artifact, run it through the same redactor
72
+ * the model-facing output uses, and write it back atomically. This is a
73
+ * defense-in-depth measure: live capture is unavoidable byte-by-byte, so
74
+ * we redact post-hoc the moment the child closes, before any reader
75
+ * (user, model, or `/output last`) gets a chance to see the raw bytes.
76
+ *
77
+ * Returns whether the artifact was rewritten. Any error is swallowed — a
78
+ * raw artifact is still better than an inaccessible one, and the model
79
+ * never receives the unredacted content (that path runs through
80
+ * redactSecrets() too).
81
+ */
82
+ async function redactArtifactInPlace(path) {
83
+ try {
84
+ const raw = await readFile(path, "utf8");
85
+ const redacted = redactSecrets(raw);
86
+ if (redacted === raw)
87
+ return false;
88
+ await writeFile(path, redacted, { mode: 0o600 });
89
+ return true;
90
+ }
91
+ catch {
92
+ return false;
93
+ }
94
+ }
4
95
  export async function shellExec(args) {
5
96
  if (args.signal?.aborted) {
6
97
  return { ok: false, output: "Command aborted.", exitCode: 130 };
7
98
  }
99
+ const maxModelBytes = args.maxModelBytes ?? DEFAULT_MAX_MODEL_BYTES;
100
+ const maxCaptureBytes = args.maxCaptureBytes ?? DEFAULT_MAX_CAPTURE_BYTES;
101
+ const onLimit = args.onLimit ?? "terminate";
102
+ const halfModel = Math.max(512, Math.floor(maxModelBytes / 2));
103
+ const start = Date.now();
104
+ const artifact = args.noArtifact
105
+ ? undefined
106
+ : await openArtifact(args.command, args.artifactPath);
107
+ let head = "";
108
+ const tail = new RingBuffer(halfModel);
109
+ let bytesRead = 0;
110
+ let bytesDropped = 0;
111
+ let linesRead = 0;
112
+ let captureLimitHit = false;
8
113
  return new Promise((resolve, reject) => {
9
114
  const detached = process.platform !== "win32";
10
- const spawnOptions = {
115
+ const child = spawn(args.command, {
11
116
  cwd: args.cwd ?? process.cwd(),
12
117
  detached,
13
- shell: args.shell ?? !args.argv,
118
+ shell: true,
14
119
  stdio: ["ignore", "pipe", "pipe"],
15
- };
16
- const child = args.argv
17
- ? spawn(args.command, args.argv, spawnOptions)
18
- : spawn(args.command, spawnOptions);
19
- let output = "";
120
+ });
20
121
  let aborted = false;
21
122
  let timedOut = false;
22
- let outputTruncated = false;
23
- let bytesRead = 0;
24
- let bytesShown = 0;
25
- let bytesDropped = 0;
26
- let linesRead = 0;
27
- let artifactBytes = 0;
28
- let artifactLimitNoted = false;
29
- const started = Date.now();
30
- const maxOutputBytes = args.maxOutputBytes ?? 64_000;
31
- const maxArtifactBytes = args.maxArtifactBytes ?? 10 * 1024 * 1024;
32
- const artifact = createArtifactStream("shell.exec");
33
123
  let timeout;
34
124
  let forceKill;
35
125
  const cleanup = () => {
@@ -38,52 +128,262 @@ export async function shellExec(args) {
38
128
  if (forceKill)
39
129
  clearTimeout(forceKill);
40
130
  args.signal?.removeEventListener("abort", abort);
131
+ if (artifact) {
132
+ artifact.stream.end();
133
+ }
41
134
  };
42
- const closeArtifact = async () => {
43
- await new Promise((resolve) => {
44
- artifact.stream.end(resolve);
45
- });
46
- };
47
- const writeArtifact = (text) => {
48
- const bytes = Buffer.byteLength(text);
49
- const remaining = maxArtifactBytes - artifactBytes;
50
- if (remaining <= 0) {
51
- bytesDropped += bytes;
52
- if (!artifactLimitNoted) {
53
- artifactLimitNoted = true;
54
- artifact.stream.write(`\n... full output artifact capped at ${maxArtifactBytes} bytes ...\n`);
135
+ const append = (chunk, stream) => {
136
+ const text = chunk.toString();
137
+ bytesRead += text.length;
138
+ linesRead += text.split("\n").length - 1;
139
+ // Stream raw bytes to the artifact file (cheap; no concat).
140
+ if (artifact && !captureLimitHit) {
141
+ if (bytesRead <= maxCaptureBytes) {
142
+ artifact.stream.write(text);
143
+ }
144
+ else {
145
+ // Write only the prefix that fits under the cap, then close.
146
+ const overflow = bytesRead - maxCaptureBytes;
147
+ const allowed = text.length - overflow;
148
+ if (allowed > 0)
149
+ artifact.stream.write(text.slice(0, allowed));
150
+ captureLimitHit = true;
151
+ artifact.stream.end();
55
152
  }
153
+ }
154
+ // Maintain head + ring-tail model summary.
155
+ if (head.length < halfModel) {
156
+ const room = halfModel - head.length;
157
+ head += text.slice(0, room);
158
+ if (text.length > room)
159
+ tail.push(text.slice(room));
160
+ }
161
+ else {
162
+ tail.push(text);
163
+ }
164
+ // Track bytes we dropped from the in-memory ring buffer for stats.
165
+ const inMemory = head.length + tail.size();
166
+ bytesDropped = Math.max(0, bytesRead - inMemory);
167
+ // Live preview is still sent through onOutput so the UI can dim it.
168
+ args.onOutput?.(text, stream);
169
+ // Optional capture-limit termination.
170
+ if (captureLimitHit && onLimit === "terminate") {
171
+ terminate("cap");
172
+ }
173
+ };
174
+ const killChild = (signal) => {
175
+ if (!child.pid)
56
176
  return;
177
+ try {
178
+ if (detached)
179
+ process.kill(-child.pid, signal);
180
+ else
181
+ child.kill(signal);
57
182
  }
58
- const chunk = bytes > remaining ? text.slice(0, remaining) : text;
59
- artifact.stream.write(chunk);
60
- artifactBytes += Buffer.byteLength(chunk);
61
- if (bytes > remaining) {
62
- bytesDropped += bytes - remaining;
63
- artifactLimitNoted = true;
64
- artifact.stream.write(`\n... full output artifact capped at ${maxArtifactBytes} bytes ...\n`);
183
+ catch {
184
+ // Process may have already exited.
65
185
  }
66
186
  };
67
- const appendModelOutput = (text) => {
68
- const bytes = Buffer.byteLength(text);
69
- const remaining = maxOutputBytes - bytesShown;
70
- if (remaining <= 0) {
71
- outputTruncated = true;
187
+ const terminate = (reason) => {
188
+ if (reason === "abort")
189
+ aborted = true;
190
+ if (reason === "timeout")
191
+ timedOut = true;
192
+ killChild("SIGTERM");
193
+ forceKill = setTimeout(() => killChild("SIGKILL"), 1_000);
194
+ };
195
+ const abort = () => terminate("abort");
196
+ child.stdout?.on("data", (chunk) => append(chunk, "stdout"));
197
+ child.stderr?.on("data", (chunk) => append(chunk, "stderr"));
198
+ child.on("error", (error) => {
199
+ cleanup();
200
+ if (aborted || args.signal?.aborted) {
201
+ resolve({ ok: false, output: "Command aborted.", exitCode: 130 });
202
+ }
203
+ else {
204
+ reject(error);
205
+ }
206
+ });
207
+ child.on("close", (code) => {
208
+ cleanup();
209
+ const stats = {
210
+ bytesRead,
211
+ bytesDropped,
212
+ linesRead,
213
+ elapsedMs: Date.now() - start,
214
+ captureLimitHit,
215
+ };
216
+ const trimmedTail = tail.toString().trim();
217
+ const trimmedHead = head.trim();
218
+ const inMemory = head.length + tail.size();
219
+ let combined;
220
+ if (bytesRead === 0) {
221
+ combined = "";
222
+ }
223
+ else if (inMemory >= bytesRead) {
224
+ // Everything fit in memory; concat head+tail back into one string.
225
+ combined = (head + tail.toString()).trimEnd();
226
+ }
227
+ else {
228
+ const omittedBytes = bytesRead - inMemory;
229
+ combined =
230
+ `${trimmedHead}\n... (${omittedBytes.toLocaleString()} bytes / ~${linesRead.toLocaleString()} lines truncated — full output in artifact) ...\n${trimmedTail}`.trim();
231
+ }
232
+ // Always redact before exposing the bounded text to callers.
233
+ const output = redactSecrets(combined);
234
+ // Redact the on-disk artifact too so `/output last` and any later
235
+ // reader (model, user, audit) sees the same scrubbed bytes.
236
+ const finalize = (result) => {
237
+ if (artifact) {
238
+ // Wait for the artifact write stream to flush, then redact in
239
+ // place, then resolve. Awaiting matters: tests and downstream
240
+ // readers must never see the unredacted bytes, even briefly.
241
+ const onFlushed = () => {
242
+ void redactArtifactInPlace(artifact.path).then(() => resolve(result));
243
+ };
244
+ if (artifact.stream.writableFinished) {
245
+ onFlushed();
246
+ }
247
+ else {
248
+ artifact.stream.once("finish", onFlushed);
249
+ artifact.stream.once("error", onFlushed);
250
+ }
251
+ }
252
+ else {
253
+ resolve(result);
254
+ }
255
+ };
256
+ if (aborted || args.signal?.aborted) {
257
+ finalize({
258
+ ok: false,
259
+ output: output ? `${output}\nCommand aborted.` : "Command aborted.",
260
+ exitCode: 130,
261
+ ...(artifact ? { outputPath: artifact.path } : {}),
262
+ truncated: bytesRead > inMemory,
263
+ stats,
264
+ });
72
265
  return;
73
266
  }
74
- const chunk = bytes > remaining ? text.slice(0, remaining) : text;
75
- output += chunk;
76
- bytesShown += Buffer.byteLength(chunk);
77
- if (bytes > remaining)
78
- outputTruncated = true;
267
+ if (timedOut) {
268
+ finalize({
269
+ ok: false,
270
+ output: output
271
+ ? `${output}\nCommand timed out.`
272
+ : "Command timed out.",
273
+ exitCode: 124,
274
+ ...(artifact ? { outputPath: artifact.path } : {}),
275
+ truncated: bytesRead > inMemory,
276
+ stats,
277
+ });
278
+ return;
279
+ }
280
+ if (captureLimitHit) {
281
+ finalize({
282
+ ok: false,
283
+ output: output
284
+ ? `${output}\nCommand killed after exceeding capture cap of ${maxCaptureBytes.toLocaleString()} bytes.`
285
+ : "Command exceeded capture cap.",
286
+ exitCode: 137,
287
+ ...(artifact ? { outputPath: artifact.path } : {}),
288
+ truncated: true,
289
+ stats,
290
+ });
291
+ return;
292
+ }
293
+ finalize({
294
+ ok: code === 0,
295
+ output,
296
+ exitCode: code ?? undefined,
297
+ ...(artifact ? { outputPath: artifact.path } : {}),
298
+ truncated: bytesRead > inMemory,
299
+ stats,
300
+ });
301
+ });
302
+ args.signal?.addEventListener("abort", abort, { once: true });
303
+ timeout = setTimeout(() => terminate("timeout"), args.timeoutMs ?? DEFAULT_TIMEOUT_MS);
304
+ });
305
+ }
306
+ /**
307
+ * Run a child process with `shell: false`, passing argv directly. Use this
308
+ * for any tool that builds command lines from model-provided strings (eg
309
+ * `net.scan`, `pentest.recon`, `pkg.install`). Sharing argv with the OS
310
+ * shell would let a malicious target turn into "; rm -rf /" — `shell: false`
311
+ * + argv prevents that even if the model is adversarial.
312
+ *
313
+ * The capture pipeline (head + ring-tail + artifact + cap-and-kill + stats)
314
+ * is identical to shellExec.
315
+ */
316
+ export async function spawnArgv(args) {
317
+ if (args.signal?.aborted) {
318
+ return { ok: false, output: "Command aborted.", exitCode: 130 };
319
+ }
320
+ const maxModelBytes = args.maxModelBytes ?? DEFAULT_MAX_MODEL_BYTES;
321
+ const maxCaptureBytes = args.maxCaptureBytes ?? DEFAULT_MAX_CAPTURE_BYTES;
322
+ const onLimit = args.onLimit ?? "terminate";
323
+ const halfModel = Math.max(512, Math.floor(maxModelBytes / 2));
324
+ const display = `${args.command} ${args.argv.join(" ")}`.trim();
325
+ const start = Date.now();
326
+ const artifact = args.noArtifact
327
+ ? undefined
328
+ : await openArtifact(args.command, args.artifactPath);
329
+ let head = "";
330
+ const tail = new RingBuffer(halfModel);
331
+ let bytesRead = 0;
332
+ let bytesDropped = 0;
333
+ let linesRead = 0;
334
+ let captureLimitHit = false;
335
+ return new Promise((resolve, reject) => {
336
+ const detached = process.platform !== "win32";
337
+ const child = spawn(args.command, args.argv, {
338
+ cwd: args.cwd ?? process.cwd(),
339
+ detached,
340
+ shell: false,
341
+ stdio: ["ignore", "pipe", "pipe"],
342
+ });
343
+ let aborted = false;
344
+ let timedOut = false;
345
+ let timeout;
346
+ let forceKill;
347
+ const cleanup = () => {
348
+ if (timeout)
349
+ clearTimeout(timeout);
350
+ if (forceKill)
351
+ clearTimeout(forceKill);
352
+ args.signal?.removeEventListener("abort", abort);
353
+ if (artifact)
354
+ artifact.stream.end();
79
355
  };
80
356
  const append = (chunk, stream) => {
81
- const text = redactSecrets(chunk.toString());
82
- bytesRead += Buffer.byteLength(text);
83
- linesRead += text.split(/\r?\n/).length - 1;
84
- writeArtifact(text);
85
- appendModelOutput(text);
357
+ const text = chunk.toString();
358
+ bytesRead += text.length;
359
+ linesRead += text.split("\n").length - 1;
360
+ if (artifact && !captureLimitHit) {
361
+ if (bytesRead <= maxCaptureBytes) {
362
+ artifact.stream.write(text);
363
+ }
364
+ else {
365
+ const overflow = bytesRead - maxCaptureBytes;
366
+ const allowed = text.length - overflow;
367
+ if (allowed > 0)
368
+ artifact.stream.write(text.slice(0, allowed));
369
+ captureLimitHit = true;
370
+ artifact.stream.end();
371
+ }
372
+ }
373
+ if (head.length < halfModel) {
374
+ const room = halfModel - head.length;
375
+ head += text.slice(0, room);
376
+ if (text.length > room)
377
+ tail.push(text.slice(room));
378
+ }
379
+ else {
380
+ tail.push(text);
381
+ }
382
+ const inMemory = head.length + tail.size();
383
+ bytesDropped = Math.max(0, bytesRead - inMemory);
86
384
  args.onOutput?.(text, stream);
385
+ if (captureLimitHit && onLimit === "terminate")
386
+ terminate("cap");
87
387
  };
88
388
  const killChild = (signal) => {
89
389
  if (!child.pid)
@@ -95,7 +395,7 @@ export async function shellExec(args) {
95
395
  child.kill(signal);
96
396
  }
97
397
  catch {
98
- // Process may have already exited.
398
+ // already exited
99
399
  }
100
400
  };
101
401
  const terminate = (reason) => {
@@ -118,65 +418,96 @@ export async function shellExec(args) {
118
418
  reject(error);
119
419
  }
120
420
  });
121
- child.on("close", async (code) => {
421
+ child.on("close", (code) => {
122
422
  cleanup();
123
- await closeArtifact();
124
- const artifactPath = outputTruncated || bytesDropped > 0 ? artifact.path : undefined;
125
- if (!artifactPath)
126
- artifact.remove();
127
- const truncationNote = outputTruncated
128
- ? `\n... model-facing output truncated at ${maxOutputBytes} bytes; full output saved to ${artifact.path} ...`
129
- : "";
130
- const trimmed = `${output.trim()}${truncationNote}`.trim();
131
423
  const stats = {
132
424
  bytesRead,
133
- bytesShown,
134
425
  bytesDropped,
135
426
  linesRead,
136
- elapsedMs: Date.now() - started,
427
+ elapsedMs: Date.now() - start,
428
+ captureLimitHit,
429
+ };
430
+ const trimmedTail = tail.toString().trim();
431
+ const trimmedHead = head.trim();
432
+ const inMemory = head.length + tail.size();
433
+ let combined;
434
+ if (bytesRead === 0) {
435
+ combined = "";
436
+ }
437
+ else if (inMemory >= bytesRead) {
438
+ combined = (head + tail.toString()).trimEnd();
439
+ }
440
+ else {
441
+ const omittedBytes = bytesRead - inMemory;
442
+ combined =
443
+ `${trimmedHead}\n... (${omittedBytes.toLocaleString()} bytes / ~${linesRead.toLocaleString()} lines truncated — full output in artifact) ...\n${trimmedTail}`.trim();
444
+ }
445
+ const output = redactSecrets(`$ ${display}\n${combined}`.trimEnd());
446
+ const finalize = (result) => {
447
+ if (artifact) {
448
+ const onFlushed = () => {
449
+ void redactArtifactInPlace(artifact.path).then(() => resolve(result));
450
+ };
451
+ if (artifact.stream.writableFinished) {
452
+ onFlushed();
453
+ }
454
+ else {
455
+ artifact.stream.once("finish", onFlushed);
456
+ artifact.stream.once("error", onFlushed);
457
+ }
458
+ }
459
+ else {
460
+ resolve(result);
461
+ }
137
462
  };
138
463
  if (aborted || args.signal?.aborted) {
139
- resolve({
464
+ finalize({
140
465
  ok: false,
141
- output: trimmed ? `${trimmed}\nCommand aborted.` : "Command aborted.",
466
+ output: output ? `${output}\nCommand aborted.` : "Command aborted.",
142
467
  exitCode: 130,
143
- outputPath: artifactPath,
144
- truncated: outputTruncated || bytesDropped > 0,
145
- artifacts: artifactPath
146
- ? [{ path: artifactPath, kind: "raw", redacted: true }]
147
- : undefined,
468
+ ...(artifact ? { outputPath: artifact.path } : {}),
469
+ truncated: bytesRead > inMemory,
148
470
  stats,
149
471
  });
150
472
  return;
151
473
  }
152
474
  if (timedOut) {
153
- resolve({
475
+ finalize({
154
476
  ok: false,
155
- output: trimmed ? `${trimmed}\nCommand timed out.` : "Command timed out.",
477
+ output: output
478
+ ? `${output}\nCommand timed out.`
479
+ : "Command timed out.",
156
480
  exitCode: 124,
157
- outputPath: artifactPath,
158
- truncated: outputTruncated || bytesDropped > 0,
159
- artifacts: artifactPath
160
- ? [{ path: artifactPath, kind: "raw", redacted: true }]
161
- : undefined,
481
+ ...(artifact ? { outputPath: artifact.path } : {}),
482
+ truncated: bytesRead > inMemory,
483
+ stats,
484
+ });
485
+ return;
486
+ }
487
+ if (captureLimitHit) {
488
+ finalize({
489
+ ok: false,
490
+ output: output
491
+ ? `${output}\nCommand killed after exceeding capture cap of ${maxCaptureBytes.toLocaleString()} bytes.`
492
+ : "Command exceeded capture cap.",
493
+ exitCode: 137,
494
+ ...(artifact ? { outputPath: artifact.path } : {}),
495
+ truncated: true,
162
496
  stats,
163
497
  });
164
498
  return;
165
499
  }
166
- resolve({
500
+ finalize({
167
501
  ok: code === 0,
168
- output: trimmed,
502
+ output,
169
503
  exitCode: code ?? undefined,
170
- outputPath: artifactPath,
171
- truncated: outputTruncated || bytesDropped > 0,
172
- artifacts: artifactPath
173
- ? [{ path: artifactPath, kind: "raw", redacted: true }]
174
- : undefined,
504
+ ...(artifact ? { outputPath: artifact.path } : {}),
505
+ truncated: bytesRead > inMemory,
175
506
  stats,
176
507
  });
177
508
  });
178
509
  args.signal?.addEventListener("abort", abort, { once: true });
179
- timeout = setTimeout(() => terminate("timeout"), args.timeoutMs ?? 180_000);
510
+ timeout = setTimeout(() => terminate("timeout"), args.timeoutMs ?? DEFAULT_TIMEOUT_MS);
180
511
  });
181
512
  }
182
513
  //# sourceMappingURL=shell.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"shell.js","sourceRoot":"","sources":["../../src/tools/shell.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"shell.js","sourceRoot":"","sources":["../../src/tools/shell.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ export type HostKind = "ip" | "cidr" | "hostname";
2
+ export interface ParsedHost {
3
+ kind: HostKind;
4
+ value: string;
5
+ }
6
+ /**
7
+ * Parse a network target as IP, CIDR, or hostname. Throws on shell-injection
8
+ * attempts. The output is safe to pass to spawn() with `shell: false`.
9
+ */
10
+ export declare function parseHost(raw: string): ParsedHost;
11
+ /**
12
+ * Validate an nmap-compatible port specification. Accepts:
13
+ * - single port: "80"
14
+ * - csv: "80,443,8080"
15
+ * - ranges: "1-1000"
16
+ * - mixed: "22,80,443,8000-9000"
17
+ */
18
+ export declare function parsePortSpec(raw: string): string;
19
+ export type ScanType = "syn" | "tcp" | "udp" | "ping";
20
+ export type TimingTemplate = "T0" | "T1" | "T2" | "T3" | "T4" | "T5";
21
+ export interface ScanProfile {
22
+ scanType?: ScanType | undefined;
23
+ topPorts?: number | undefined;
24
+ serviceDetect?: boolean | undefined;
25
+ scripts?: string[] | undefined;
26
+ timing?: TimingTemplate | undefined;
27
+ udp?: boolean | undefined;
28
+ }
29
+ /** Convert a structured scan profile into safe argv for nmap. */
30
+ export declare function profileToNmapArgs(profile?: ScanProfile): string[];
31
+ /**
32
+ * For backwards compatibility with the legacy `flags` string. We accept a
33
+ * whitespace-delimited list, but only if every token matches a strict
34
+ * safe pattern (no shell metacharacters, no leading `-` followed by anything
35
+ * we don't recognize as a benign flag).
36
+ */
37
+ export declare function parseLegacyFlags(raw: string): string[];