@pentoshi/clai 0.5.10 → 0.7.1
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/dist/agent/context-manager.d.ts +27 -0
- package/dist/agent/context-manager.js +75 -0
- package/dist/agent/context-manager.js.map +1 -0
- package/dist/agent/runner.d.ts +21 -1
- package/dist/agent/runner.js +120 -30
- package/dist/agent/runner.js.map +1 -1
- package/dist/commands/doctor.js +21 -3
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/update.js +11 -2
- package/dist/commands/update.js.map +1 -1
- package/dist/context/manager.d.ts +4 -0
- package/dist/context/manager.js +48 -0
- package/dist/context/manager.js.map +1 -0
- package/dist/index.js +156 -5
- package/dist/index.js.map +1 -1
- package/dist/llm/anthropic.js +29 -38
- package/dist/llm/anthropic.js.map +1 -1
- package/dist/llm/gemini.js +31 -40
- package/dist/llm/gemini.js.map +1 -1
- package/dist/llm/http.d.ts +21 -0
- package/dist/llm/http.js +140 -1
- package/dist/llm/http.js.map +1 -1
- package/dist/llm/ollama.js +18 -27
- package/dist/llm/ollama.js.map +1 -1
- package/dist/llm/router.d.ts +7 -0
- package/dist/llm/router.js +15 -9
- package/dist/llm/router.js.map +1 -1
- package/dist/modes/agent.d.ts +4 -2
- package/dist/modes/agent.js +2 -2
- package/dist/modes/agent.js.map +1 -1
- package/dist/os/pkgmgr.d.ts +7 -1
- package/dist/os/pkgmgr.js +97 -18
- package/dist/os/pkgmgr.js.map +1 -1
- package/dist/prompts/index.d.ts +7 -0
- package/dist/prompts/index.js +12 -4
- package/dist/prompts/index.js.map +1 -1
- package/dist/repl.d.ts +1 -0
- package/dist/repl.js +283 -18
- package/dist/repl.js.map +1 -1
- package/dist/safety/classifier.d.ts +5 -1
- package/dist/safety/classifier.js +254 -29
- package/dist/safety/classifier.js.map +1 -1
- package/dist/safety/patterns.d.ts +48 -1
- package/dist/safety/patterns.js +129 -13
- package/dist/safety/patterns.js.map +1 -1
- package/dist/store/config.d.ts +21 -1
- package/dist/store/config.js +28 -7
- package/dist/store/config.js.map +1 -1
- package/dist/store/history.d.ts +9 -0
- package/dist/store/history.js +58 -1
- package/dist/store/history.js.map +1 -1
- package/dist/store/keys.d.ts +2 -1
- package/dist/store/keys.js +8 -4
- package/dist/store/keys.js.map +1 -1
- package/dist/store/logs.d.ts +7 -0
- package/dist/store/logs.js +39 -1
- package/dist/store/logs.js.map +1 -1
- package/dist/store/project.d.ts +1 -0
- package/dist/store/project.js +34 -7
- package/dist/store/project.js.map +1 -1
- package/dist/store/scope.d.ts +29 -0
- package/dist/store/scope.js +113 -0
- package/dist/store/scope.js.map +1 -0
- package/dist/tools/artifacts.d.ts +9 -0
- package/dist/tools/artifacts.js +38 -0
- package/dist/tools/artifacts.js.map +1 -0
- package/dist/tools/fs.d.ts +6 -2
- package/dist/tools/fs.js +95 -17
- package/dist/tools/fs.js.map +1 -1
- package/dist/tools/http.d.ts +5 -2
- package/dist/tools/http.js +177 -8
- package/dist/tools/http.js.map +1 -1
- package/dist/tools/policies/output-policy.d.ts +13 -0
- package/dist/tools/policies/output-policy.js +56 -0
- package/dist/tools/policies/output-policy.js.map +1 -0
- package/dist/tools/reducers/ffuf.d.ts +6 -0
- package/dist/tools/reducers/ffuf.js +74 -0
- package/dist/tools/reducers/ffuf.js.map +1 -0
- package/dist/tools/reducers/generic.d.ts +2 -0
- package/dist/tools/reducers/generic.js +60 -0
- package/dist/tools/reducers/generic.js.map +1 -0
- package/dist/tools/reducers/gobuster.d.ts +2 -0
- package/dist/tools/reducers/gobuster.js +36 -0
- package/dist/tools/reducers/gobuster.js.map +1 -0
- package/dist/tools/reducers/httpx.d.ts +2 -0
- package/dist/tools/reducers/httpx.js +38 -0
- package/dist/tools/reducers/httpx.js.map +1 -0
- package/dist/tools/reducers/nmap.d.ts +7 -0
- package/dist/tools/reducers/nmap.js +82 -0
- package/dist/tools/reducers/nmap.js.map +1 -0
- package/dist/tools/reducers/nuclei.d.ts +2 -0
- package/dist/tools/reducers/nuclei.js +51 -0
- package/dist/tools/reducers/nuclei.js.map +1 -0
- package/dist/tools/reducers/sqlmap.d.ts +2 -0
- package/dist/tools/reducers/sqlmap.js +39 -0
- package/dist/tools/reducers/sqlmap.js.map +1 -0
- package/dist/tools/reducers/subdomains.d.ts +6 -0
- package/dist/tools/reducers/subdomains.js +31 -0
- package/dist/tools/reducers/subdomains.js.map +1 -0
- package/dist/tools/reducers/types.d.ts +14 -0
- package/dist/tools/reducers/types.js +2 -0
- package/dist/tools/reducers/types.js.map +1 -0
- package/dist/tools/registry.d.ts +1 -1
- package/dist/tools/registry.js +224 -43
- package/dist/tools/registry.js.map +1 -1
- package/dist/tools/shell.d.ts +45 -0
- package/dist/tools/shell.js +430 -12
- package/dist/tools/shell.js.map +1 -1
- package/dist/tools/validate.d.ts +37 -0
- package/dist/tools/validate.js +144 -0
- package/dist/tools/validate.js.map +1 -0
- package/dist/types.d.ts +8 -0
- package/dist/ui/keys.d.ts +21 -0
- package/dist/ui/keys.js +13 -0
- package/dist/ui/keys.js.map +1 -0
- package/dist/ui/output-pane.d.ts +31 -0
- package/dist/ui/output-pane.js +81 -0
- package/dist/ui/output-pane.js.map +1 -0
- package/dist/ui/tool-output.d.ts +18 -0
- package/dist/ui/tool-output.js +135 -0
- package/dist/ui/tool-output.js.map +1 -0
- package/package.json +1 -1
package/dist/tools/shell.js
CHANGED
|
@@ -1,8 +1,115 @@
|
|
|
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";
|
|
6
|
+
import { redactSecrets } from "../llm/provider.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
|
+
}
|
|
2
95
|
export async function shellExec(args) {
|
|
3
96
|
if (args.signal?.aborted) {
|
|
4
97
|
return { ok: false, output: "Command aborted.", exitCode: 130 };
|
|
5
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;
|
|
6
113
|
return new Promise((resolve, reject) => {
|
|
7
114
|
const detached = process.platform !== "win32";
|
|
8
115
|
const child = spawn(args.command, {
|
|
@@ -11,7 +118,6 @@ export async function shellExec(args) {
|
|
|
11
118
|
shell: true,
|
|
12
119
|
stdio: ["ignore", "pipe", "pipe"],
|
|
13
120
|
});
|
|
14
|
-
let output = "";
|
|
15
121
|
let aborted = false;
|
|
16
122
|
let timedOut = false;
|
|
17
123
|
let timeout;
|
|
@@ -22,13 +128,48 @@ export async function shellExec(args) {
|
|
|
22
128
|
if (forceKill)
|
|
23
129
|
clearTimeout(forceKill);
|
|
24
130
|
args.signal?.removeEventListener("abort", abort);
|
|
131
|
+
if (artifact) {
|
|
132
|
+
artifact.stream.end();
|
|
133
|
+
}
|
|
25
134
|
};
|
|
26
135
|
const append = (chunk, stream) => {
|
|
27
136
|
const text = chunk.toString();
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
//
|
|
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();
|
|
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.
|
|
31
168
|
args.onOutput?.(text, stream);
|
|
169
|
+
// Optional capture-limit termination.
|
|
170
|
+
if (captureLimitHit && onLimit === "terminate") {
|
|
171
|
+
terminate("cap");
|
|
172
|
+
}
|
|
32
173
|
};
|
|
33
174
|
const killChild = (signal) => {
|
|
34
175
|
if (!child.pid)
|
|
@@ -65,31 +206,308 @@ export async function shellExec(args) {
|
|
|
65
206
|
});
|
|
66
207
|
child.on("close", (code) => {
|
|
67
208
|
cleanup();
|
|
68
|
-
const
|
|
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
|
+
};
|
|
69
256
|
if (aborted || args.signal?.aborted) {
|
|
70
|
-
|
|
257
|
+
finalize({
|
|
71
258
|
ok: false,
|
|
72
|
-
output:
|
|
259
|
+
output: output ? `${output}\nCommand aborted.` : "Command aborted.",
|
|
73
260
|
exitCode: 130,
|
|
261
|
+
...(artifact ? { outputPath: artifact.path } : {}),
|
|
262
|
+
truncated: bytesRead > inMemory,
|
|
263
|
+
stats,
|
|
74
264
|
});
|
|
75
265
|
return;
|
|
76
266
|
}
|
|
77
267
|
if (timedOut) {
|
|
78
|
-
|
|
268
|
+
finalize({
|
|
79
269
|
ok: false,
|
|
80
|
-
output:
|
|
270
|
+
output: output
|
|
271
|
+
? `${output}\nCommand timed out.`
|
|
272
|
+
: "Command timed out.",
|
|
81
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();
|
|
355
|
+
};
|
|
356
|
+
const append = (chunk, stream) => {
|
|
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);
|
|
384
|
+
args.onOutput?.(text, stream);
|
|
385
|
+
if (captureLimitHit && onLimit === "terminate")
|
|
386
|
+
terminate("cap");
|
|
387
|
+
};
|
|
388
|
+
const killChild = (signal) => {
|
|
389
|
+
if (!child.pid)
|
|
390
|
+
return;
|
|
391
|
+
try {
|
|
392
|
+
if (detached)
|
|
393
|
+
process.kill(-child.pid, signal);
|
|
394
|
+
else
|
|
395
|
+
child.kill(signal);
|
|
396
|
+
}
|
|
397
|
+
catch {
|
|
398
|
+
// already exited
|
|
399
|
+
}
|
|
400
|
+
};
|
|
401
|
+
const terminate = (reason) => {
|
|
402
|
+
if (reason === "abort")
|
|
403
|
+
aborted = true;
|
|
404
|
+
if (reason === "timeout")
|
|
405
|
+
timedOut = true;
|
|
406
|
+
killChild("SIGTERM");
|
|
407
|
+
forceKill = setTimeout(() => killChild("SIGKILL"), 1_000);
|
|
408
|
+
};
|
|
409
|
+
const abort = () => terminate("abort");
|
|
410
|
+
child.stdout?.on("data", (chunk) => append(chunk, "stdout"));
|
|
411
|
+
child.stderr?.on("data", (chunk) => append(chunk, "stderr"));
|
|
412
|
+
child.on("error", (error) => {
|
|
413
|
+
cleanup();
|
|
414
|
+
if (aborted || args.signal?.aborted) {
|
|
415
|
+
resolve({ ok: false, output: "Command aborted.", exitCode: 130 });
|
|
416
|
+
}
|
|
417
|
+
else {
|
|
418
|
+
reject(error);
|
|
419
|
+
}
|
|
420
|
+
});
|
|
421
|
+
child.on("close", (code) => {
|
|
422
|
+
cleanup();
|
|
423
|
+
const stats = {
|
|
424
|
+
bytesRead,
|
|
425
|
+
bytesDropped,
|
|
426
|
+
linesRead,
|
|
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
|
+
}
|
|
462
|
+
};
|
|
463
|
+
if (aborted || args.signal?.aborted) {
|
|
464
|
+
finalize({
|
|
465
|
+
ok: false,
|
|
466
|
+
output: output ? `${output}\nCommand aborted.` : "Command aborted.",
|
|
467
|
+
exitCode: 130,
|
|
468
|
+
...(artifact ? { outputPath: artifact.path } : {}),
|
|
469
|
+
truncated: bytesRead > inMemory,
|
|
470
|
+
stats,
|
|
471
|
+
});
|
|
472
|
+
return;
|
|
473
|
+
}
|
|
474
|
+
if (timedOut) {
|
|
475
|
+
finalize({
|
|
476
|
+
ok: false,
|
|
477
|
+
output: output
|
|
478
|
+
? `${output}\nCommand timed out.`
|
|
479
|
+
: "Command timed out.",
|
|
480
|
+
exitCode: 124,
|
|
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,
|
|
496
|
+
stats,
|
|
82
497
|
});
|
|
83
498
|
return;
|
|
84
499
|
}
|
|
85
|
-
|
|
500
|
+
finalize({
|
|
86
501
|
ok: code === 0,
|
|
87
|
-
output
|
|
502
|
+
output,
|
|
88
503
|
exitCode: code ?? undefined,
|
|
504
|
+
...(artifact ? { outputPath: artifact.path } : {}),
|
|
505
|
+
truncated: bytesRead > inMemory,
|
|
506
|
+
stats,
|
|
89
507
|
});
|
|
90
508
|
});
|
|
91
509
|
args.signal?.addEventListener("abort", abort, { once: true });
|
|
92
|
-
timeout = setTimeout(() => terminate("timeout"), args.timeoutMs ??
|
|
510
|
+
timeout = setTimeout(() => terminate("timeout"), args.timeoutMs ?? DEFAULT_TIMEOUT_MS);
|
|
93
511
|
});
|
|
94
512
|
}
|
|
95
513
|
//# sourceMappingURL=shell.js.map
|
package/dist/tools/shell.js.map
CHANGED
|
@@ -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[];
|