@remnux/mcp-server 0.1.65 → 0.1.67

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 (41) hide show
  1. package/README.md +14 -7
  2. package/data/tools-index.json +16 -2
  3. package/dist/analysis/summarizer.d.ts.map +1 -1
  4. package/dist/analysis/summarizer.js +10 -3
  5. package/dist/analysis/summarizer.js.map +1 -1
  6. package/dist/catalog/index.d.ts.map +1 -1
  7. package/dist/catalog/index.js +7 -0
  8. package/dist/catalog/index.js.map +1 -1
  9. package/dist/file-type-mappings.d.ts.map +1 -1
  10. package/dist/file-type-mappings.js +16 -0
  11. package/dist/file-type-mappings.js.map +1 -1
  12. package/dist/handlers/analyze-file.d.ts +7 -0
  13. package/dist/handlers/analyze-file.d.ts.map +1 -1
  14. package/dist/handlers/analyze-file.js +35 -25
  15. package/dist/handlers/analyze-file.js.map +1 -1
  16. package/dist/handlers/get-server-info.d.ts +9 -0
  17. package/dist/handlers/get-server-info.d.ts.map +1 -0
  18. package/dist/handlers/get-server-info.js +52 -0
  19. package/dist/handlers/get-server-info.js.map +1 -0
  20. package/dist/handlers/output-spill.d.ts +29 -0
  21. package/dist/handlers/output-spill.d.ts.map +1 -0
  22. package/dist/handlers/output-spill.js +48 -0
  23. package/dist/handlers/output-spill.js.map +1 -0
  24. package/dist/handlers/run-tool.d.ts +15 -0
  25. package/dist/handlers/run-tool.d.ts.map +1 -1
  26. package/dist/handlers/run-tool.js +285 -14
  27. package/dist/handlers/run-tool.js.map +1 -1
  28. package/dist/handlers/suggest-tools.d.ts.map +1 -1
  29. package/dist/handlers/suggest-tools.js +10 -0
  30. package/dist/handlers/suggest-tools.js.map +1 -1
  31. package/dist/index.d.ts.map +1 -1
  32. package/dist/index.js +18 -6
  33. package/dist/index.js.map +1 -1
  34. package/dist/schemas/tools.d.ts +2 -0
  35. package/dist/schemas/tools.d.ts.map +1 -1
  36. package/dist/schemas/tools.js +12 -2
  37. package/dist/schemas/tools.js.map +1 -1
  38. package/dist/tools/definitions.d.ts.map +1 -1
  39. package/dist/tools/definitions.js +28 -0
  40. package/dist/tools/definitions.js.map +1 -1
  41. package/package.json +1 -1
@@ -0,0 +1,52 @@
1
+ import { formatResponse } from "../response.js";
2
+ /**
3
+ * get_server_info — report the MCP server version, how it reaches REMnux
4
+ * (connector mode + transport), and the REMnux distro version on the target.
5
+ *
6
+ * The REMnux version is best-effort. /etc/remnux-version is the authoritative
7
+ * source (the distro's own CLI reads it); `remnux version` is only a fallback,
8
+ * and its output can carry banner or help text ahead of the version, so each
9
+ * source is scanned for a bare version line or a "remnux-version X" line rather
10
+ * than trusting the first line. Any failure or non-version output yields remnux_version: null
11
+ * rather than an error, because the server-side facts are still useful.
12
+ */
13
+ // A line that IS a version ("7.0.9"), or the CLI's "remnux-version 7.0.9" line.
14
+ // Anything else (banners, help text, the CLI's own version) is not the distro version.
15
+ const BARE_VERSION_LINE = /^v?(\d+(?:\.\d+)+)$/;
16
+ const LABELED_VERSION_LINE = /\bremnux-version\s*[:=]?\s*v?(\d+(?:\.\d+)+)\b/i;
17
+ function extractVersion(stdout) {
18
+ for (const raw of (stdout || "").split("\n")) {
19
+ const line = raw.trim();
20
+ const m = line.match(BARE_VERSION_LINE) ?? line.match(LABELED_VERSION_LINE);
21
+ if (m)
22
+ return m[1];
23
+ }
24
+ return null;
25
+ }
26
+ async function readRemnuxVersion(deps) {
27
+ const probes = ["cat /etc/remnux-version 2>/dev/null", "remnux version 2>/dev/null"];
28
+ for (const cmd of probes) {
29
+ try {
30
+ const result = await deps.connector.executeShell(cmd, { timeout: 10000 });
31
+ const version = extractVersion(result.stdout);
32
+ if (version)
33
+ return version;
34
+ }
35
+ catch {
36
+ // try the next source
37
+ }
38
+ }
39
+ return null;
40
+ }
41
+ export async function handleGetServerInfo(deps, serverVersion) {
42
+ const startTime = Date.now();
43
+ const { config } = deps;
44
+ const remnuxVersion = await readRemnuxVersion(deps);
45
+ return formatResponse("get_server_info", {
46
+ server_version: serverVersion,
47
+ connector_mode: config.mode,
48
+ transport: config.transport ?? "stdio",
49
+ remnux_version: remnuxVersion,
50
+ }, startTime);
51
+ }
52
+ //# sourceMappingURL=get-server-info.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-server-info.js","sourceRoot":"","sources":["../../src/handlers/get-server-info.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAEhD;;;;;;;;;;GAUG;AACH,gFAAgF;AAChF,uFAAuF;AACvF,MAAM,iBAAiB,GAAG,qBAAqB,CAAC;AAChD,MAAM,oBAAoB,GAAG,iDAAiD,CAAC;AAE/E,SAAS,cAAc,CAAC,MAAc;IACpC,KAAK,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QAC7C,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;QACxB,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;QAC5E,IAAI,CAAC;YAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IACrB,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,KAAK,UAAU,iBAAiB,CAAC,IAAiB;IAChD,MAAM,MAAM,GAAG,CAAC,qCAAqC,EAAE,4BAA4B,CAAC,CAAC;IACrF,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;QACzB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;YAC1E,MAAM,OAAO,GAAG,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAC9C,IAAI,OAAO;gBAAE,OAAO,OAAO,CAAC;QAC9B,CAAC;QAAC,MAAM,CAAC;YACP,sBAAsB;QACxB,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,IAAiB,EAAE,aAAqB;IAChF,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC7B,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAExB,MAAM,aAAa,GAAG,MAAM,iBAAiB,CAAC,IAAI,CAAC,CAAC;IAEpD,OAAO,cAAc,CAAC,iBAAiB,EAAE;QACvC,cAAc,EAAE,aAAa;QAC7B,cAAc,EAAE,MAAM,CAAC,IAAI;QAC3B,SAAS,EAAE,MAAM,CAAC,SAAS,IAAI,OAAO;QACtC,cAAc,EAAE,aAAa;KAC9B,EAAE,SAAS,CAAC,CAAC;AAChB,CAAC"}
@@ -0,0 +1,29 @@
1
+ import type { Connector } from "../connectors/index.js";
2
+ /**
3
+ * Cap on what the server will write to the output directory when a tool's
4
+ * output exceeds a response budget (UTF-8 bytes). Bounds disk use per
5
+ * oversized run; larger output is left to the agent's own redirect recipe.
6
+ */
7
+ export declare const MAX_SAVED_OUTPUT_SIZE: number;
8
+ /** A write that has not settled by then is treated as failed (stalled SFTP/docker cp). */
9
+ export declare const DEFAULT_SPILL_TIMEOUT_MS = 30000;
10
+ export type SpillResult = {
11
+ saved: true;
12
+ path: string;
13
+ } | {
14
+ saved: false;
15
+ reason: "no_output_dir" | "bad_name" | "too_large" | "write_failed";
16
+ };
17
+ /**
18
+ * Save oversized tool output to `<outputDir>/<name>` so the agent can query
19
+ * the part that did not fit in the response (grep, sed -n, download_file)
20
+ * without re-running the tool. Never throws and never hangs: a failed or
21
+ * stalled write degrades to `saved: false` and the caller falls back to a
22
+ * re-run recipe. `name` must be a plain, caller-sanitized filename (tool name
23
+ * plus sanitized sample name, or tool name plus command hash); anything else
24
+ * is refused here as defense in depth.
25
+ */
26
+ export declare function saveOversizedOutput(connector: Pick<Connector, "writeFile">, outputDir: string | undefined, name: string, text: string, opts?: {
27
+ timeoutMs?: number;
28
+ }): Promise<SpillResult>;
29
+ //# sourceMappingURL=output-spill.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output-spill.d.ts","sourceRoot":"","sources":["../../src/handlers/output-spill.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAExD;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,QAAa,CAAC;AAEhD,0FAA0F;AAC1F,eAAO,MAAM,wBAAwB,QAAS,CAAC;AAK/C,MAAM,MAAM,WAAW,GACnB;IAAE,KAAK,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC7B;IAAE,KAAK,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,eAAe,GAAG,UAAU,GAAG,WAAW,GAAG,cAAc,CAAA;CAAE,CAAC;AAE1F;;;;;;;;GAQG;AACH,wBAAsB,mBAAmB,CACvC,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,EACvC,SAAS,EAAE,MAAM,GAAG,SAAS,EAC7B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,IAAI,GAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAO,GAChC,OAAO,CAAC,WAAW,CAAC,CAqBtB"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Cap on what the server will write to the output directory when a tool's
3
+ * output exceeds a response budget (UTF-8 bytes). Bounds disk use per
4
+ * oversized run; larger output is left to the agent's own redirect recipe.
5
+ */
6
+ export const MAX_SAVED_OUTPUT_SIZE = 500 * 1024; // 500 KiB
7
+ /** A write that has not settled by then is treated as failed (stalled SFTP/docker cp). */
8
+ export const DEFAULT_SPILL_TIMEOUT_MS = 30_000;
9
+ /** Plain filenames only: no separators, no traversal, no leading dot, no spaces. */
10
+ const SAFE_NAME = /^[A-Za-z0-9_][A-Za-z0-9._-]{0,254}$/;
11
+ /**
12
+ * Save oversized tool output to `<outputDir>/<name>` so the agent can query
13
+ * the part that did not fit in the response (grep, sed -n, download_file)
14
+ * without re-running the tool. Never throws and never hangs: a failed or
15
+ * stalled write degrades to `saved: false` and the caller falls back to a
16
+ * re-run recipe. `name` must be a plain, caller-sanitized filename (tool name
17
+ * plus sanitized sample name, or tool name plus command hash); anything else
18
+ * is refused here as defense in depth.
19
+ */
20
+ export async function saveOversizedOutput(connector, outputDir, name, text, opts = {}) {
21
+ if (!outputDir)
22
+ return { saved: false, reason: "no_output_dir" };
23
+ if (!SAFE_NAME.test(name) || name === "." || name === "..")
24
+ return { saved: false, reason: "bad_name" };
25
+ const bytes = Buffer.from(text, "utf-8");
26
+ if (bytes.length > MAX_SAVED_OUTPUT_SIZE)
27
+ return { saved: false, reason: "too_large" };
28
+ const path = `${outputDir}/${name}`;
29
+ const timeoutMs = opts.timeoutMs ?? DEFAULT_SPILL_TIMEOUT_MS;
30
+ let timer;
31
+ try {
32
+ await Promise.race([
33
+ connector.writeFile(path, bytes),
34
+ new Promise((_, reject) => {
35
+ timer = setTimeout(() => reject(new Error("spill timed out")), timeoutMs);
36
+ }),
37
+ ]);
38
+ return { saved: true, path };
39
+ }
40
+ catch {
41
+ return { saved: false, reason: "write_failed" };
42
+ }
43
+ finally {
44
+ if (timer)
45
+ clearTimeout(timer);
46
+ }
47
+ }
48
+ //# sourceMappingURL=output-spill.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output-spill.js","sourceRoot":"","sources":["../../src/handlers/output-spill.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,GAAG,GAAG,IAAI,CAAC,CAAC,UAAU;AAE3D,0FAA0F;AAC1F,MAAM,CAAC,MAAM,wBAAwB,GAAG,MAAM,CAAC;AAE/C,oFAAoF;AACpF,MAAM,SAAS,GAAG,qCAAqC,CAAC;AAMxD;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,SAAuC,EACvC,SAA6B,EAC7B,IAAY,EACZ,IAAY,EACZ,OAA+B,EAAE;IAEjC,IAAI,CAAC,SAAS;QAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,CAAC;IACjE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,IAAI;QAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;IACxG,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACzC,IAAI,KAAK,CAAC,MAAM,GAAG,qBAAqB;QAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;IACvF,MAAM,IAAI,GAAG,GAAG,SAAS,IAAI,IAAI,EAAE,CAAC;IACpC,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,wBAAwB,CAAC;IAC7D,IAAI,KAAgD,CAAC;IACrD,IAAI,CAAC;QACH,MAAM,OAAO,CAAC,IAAI,CAAC;YACjB,SAAS,CAAC,SAAS,CAAC,IAAI,EAAE,KAAK,CAAC;YAChC,IAAI,OAAO,CAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE;gBAC/B,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;YAC5E,CAAC,CAAC;SACH,CAAC,CAAC;QACH,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC;IAClD,CAAC;YAAS,CAAC;QACT,IAAI,KAAK;YAAE,YAAY,CAAC,KAAK,CAAC,CAAC;IACjC,CAAC;AACH,CAAC"}
@@ -1,5 +1,20 @@
1
1
  import type { HandlerDeps } from "./types.js";
2
2
  import type { RunToolArgs } from "../schemas/tools.js";
3
+ /**
4
+ * Detect a `head` or `tail` stage that reads from a pipe (any stage after the
5
+ * first; `tail -n 50 file` with no pipe before it is deliberate paging).
6
+ * Excluded: `tail -f/-F/--follow` (streams rather than limits) and
7
+ * `tail -n +1` (returns every line). Such a stage discards producer output the
8
+ * server would otherwise have returned whole, with exit 0 and no other
9
+ * signal — the model-side mirror of server truncation, and an upstream
10
+ * `head -500 | grep` caps the producer just as a terminal one does. Returns
11
+ * the first such stage's text (whitespace-normalized, trailing redirects and
12
+ * operators dropped, length-capped) and which limiter it is, or undefined.
13
+ */
14
+ export declare function detectPipedLimiter(command: string): {
15
+ limiter: "head" | "tail";
16
+ stage: string;
17
+ } | undefined;
3
18
  export declare function handleRunTool(deps: HandlerDeps, args: RunToolArgs): Promise<{
4
19
  content: Array<{
5
20
  type: "text";
@@ -1 +1 @@
1
- {"version":3,"file":"run-tool.d.ts","sourceRoot":"","sources":["../../src/handlers/run-tool.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AA4IvD,wBAAsB,aAAa,CACjC,IAAI,EAAE,WAAW,EACjB,IAAI,EAAE,WAAW;;;;;;GAuJlB"}
1
+ {"version":3,"file":"run-tool.d.ts","sourceRoot":"","sources":["../../src/handlers/run-tool.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AA6GvD;;;;;;;;;;GAUG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,MAAM,GACd;IAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAuBzD;AA4ND,wBAAsB,aAAa,CACjC,IAAI,EAAE,WAAW,EACjB,IAAI,EAAE,WAAW;;;;;;GAgNlB"}
@@ -6,6 +6,8 @@ import { parseToolOutput, hasParser } from "../parsers/index.js";
6
6
  import { toolRegistry } from "../tools/registry.js";
7
7
  import { filterStderrNoise } from "../utils/stderr-filter.js";
8
8
  import { OUTPUT_SENTINEL } from "../tools/invoker.js";
9
+ import { createHash } from "crypto";
10
+ import { saveOversizedOutput } from "./output-spill.js";
9
11
  const DISCOURAGED_PATTERNS = [
10
12
  {
11
13
  pattern: /^yara\s/,
@@ -32,9 +34,218 @@ const ADVISORY_PATTERNS = [
32
34
  "Other files → also run 'strings -el <file>' for Unicode (little-endian 16-bit).",
33
35
  },
34
36
  ];
37
+ /**
38
+ * Split a shell command on unquoted, unescaped single `|` characters (pipe
39
+ * stages). `||` is a control operator, not a pipe, and `|` inside quotes or
40
+ * after a backslash is literal text, so none of those split. This is not a
41
+ * full shell parser; it only needs to find the pipeline's last stage.
42
+ */
43
+ function splitPipeline(command) {
44
+ const stages = [];
45
+ let current = "";
46
+ let quote = null;
47
+ for (let i = 0; i < command.length; i++) {
48
+ const ch = command[i];
49
+ if (quote) {
50
+ current += ch;
51
+ if (ch === "\\" && quote === '"' && i + 1 < command.length) {
52
+ current += command[++i];
53
+ }
54
+ else if (ch === quote) {
55
+ quote = null;
56
+ }
57
+ continue;
58
+ }
59
+ if (ch === "\\" && i + 1 < command.length) {
60
+ current += ch + command[++i];
61
+ continue;
62
+ }
63
+ if (ch === "'" || ch === '"') {
64
+ quote = ch;
65
+ current += ch;
66
+ continue;
67
+ }
68
+ if (ch === "#" && (i === 0 || /\s/.test(command[i - 1]))) {
69
+ break; // the rest of the line is a shell comment
70
+ }
71
+ if (ch === "|") {
72
+ if (command[i + 1] === "|") {
73
+ current += "||";
74
+ i++;
75
+ continue;
76
+ }
77
+ if (command[i + 1] === "&")
78
+ i++; // `|&` pipes stderr too; still a pipe
79
+ stages.push(current);
80
+ current = "";
81
+ continue;
82
+ }
83
+ current += ch;
84
+ }
85
+ stages.push(current);
86
+ return stages;
87
+ }
88
+ /**
89
+ * Detect a `head` or `tail` stage that reads from a pipe (any stage after the
90
+ * first; `tail -n 50 file` with no pipe before it is deliberate paging).
91
+ * Excluded: `tail -f/-F/--follow` (streams rather than limits) and
92
+ * `tail -n +1` (returns every line). Such a stage discards producer output the
93
+ * server would otherwise have returned whole, with exit 0 and no other
94
+ * signal — the model-side mirror of server truncation, and an upstream
95
+ * `head -500 | grep` caps the producer just as a terminal one does. Returns
96
+ * the first such stage's text (whitespace-normalized, trailing redirects and
97
+ * operators dropped, length-capped) and which limiter it is, or undefined.
98
+ */
99
+ export function detectPipedLimiter(command) {
100
+ const stages = splitPipeline(command);
101
+ for (let n = 1; n < stages.length; n++) {
102
+ // Keep only the command word and its arguments: drop anything after a
103
+ // redirect or control operator that follows the limiter.
104
+ const text = stages[n].trim().split(/\s*(?:\d*[<>]|&&|;)/)[0].trim();
105
+ const words = text.split(/\s+/).filter(Boolean);
106
+ if (words.length === 0)
107
+ continue;
108
+ const cmd = words[0].replace(/^.*\//, "");
109
+ if (cmd !== "head" && cmd !== "tail")
110
+ continue;
111
+ if (cmd === "tail") {
112
+ const args = words.slice(1);
113
+ const follows = args.some((w) => w === "--follow" || w.startsWith("--follow=") || /^-[A-Za-z]*[fF][A-Za-z]*$/.test(w));
114
+ if (follows)
115
+ continue;
116
+ // `tail -n +1` / `tail +1` / `--lines=+1` print from line 1: nothing is dropped
117
+ const fromStart = args.some((w, k) => w === "+1" || w === "--lines=+1" || (w === "-n" && args[k + 1] === "+1"));
118
+ if (fromStart)
119
+ continue;
120
+ }
121
+ return { limiter: cmd, stage: text.replace(/\s+/g, " ").slice(0, 60) };
122
+ }
123
+ return undefined;
124
+ }
125
+ // Response budgets (JS string length): 100 KiB of stdout, 50 KiB of stderr.
126
+ const STDOUT_CAP_CHARS = 100 * 1024;
127
+ const MAX_STDERR_RESPONSE = 50 * 1024;
128
+ // Parsers run on captured stdout (not just the returned slice) up to this
129
+ // bound, mirroring analyze_file's IOC_SCAN_CAP, so a finding past the response
130
+ // cap is still reported rather than silently lost.
131
+ const PARSE_CAP_CHARS = 512 * 1024;
132
+ // Parsers can emit one finding per line, so the response carries at most this
133
+ // many; findings_total reports the parsed count when capped.
134
+ const MAX_FINDINGS = 500;
135
+ function limiterAdvisory(l) {
136
+ const part = l.limiter === "head" ? "leading" : "trailing";
137
+ return (`PARTIAL: the pipeline stage '${l.stage}' keeps only the ${part} part of its input; anything past that ` +
138
+ `point is discarded with no signal, and a pipeline's exit status is its last stage's, not the producer's. ` +
139
+ `run_tool returns stdout whole up to ${STDOUT_CAP_CHARS.toLocaleString("en-US")} characters and says so when ` +
140
+ `it has to cut, so drop the ${l.limiter} stage, or select by content with grep.`);
141
+ }
142
+ /**
143
+ * Collect every matching command advisory (newline-joined) so a command like
144
+ * `strings x | head` carries both the INCOMPLETE and the PARTIAL guidance.
145
+ */
35
146
  function getCommandAdvisory(command) {
36
- const matched = ADVISORY_PATTERNS.find((p) => p.match(command));
37
- return matched?.advisory;
147
+ const advisories = ADVISORY_PATTERNS.filter((p) => p.match(command)).map((p) => p.advisory);
148
+ const limiter = detectPipedLimiter(command);
149
+ if (limiter)
150
+ advisories.push(limiterAdvisory(limiter));
151
+ return advisories.length > 0 ? advisories.join("\n") : undefined;
152
+ }
153
+ /** Count lines the way `wc -l` would, plus one for a final unterminated line. */
154
+ function countLines(text) {
155
+ if (text.length === 0)
156
+ return 0;
157
+ let n = 0;
158
+ for (let i = 0; i < text.length; i++)
159
+ if (text.charCodeAt(i) === 10)
160
+ n++;
161
+ return text.endsWith("\n") ? n : n + 1;
162
+ }
163
+ /**
164
+ * Deterministic, sanitized filename for the redirect-to-file recovery recipe:
165
+ * derived only from the registry tool name (or the sanitized command word) and
166
+ * a hash of the full command, so re-running the same command maps to the same
167
+ * file and no untrusted text reaches the filename.
168
+ */
169
+ function suggestedOutputFilename(fullCommand, toolName) {
170
+ const firstWord = fullCommand.trim().split(/\s/)[0]?.replace(/^.*\//, "") ?? "";
171
+ const base = (toolName ?? firstWord).replace(/[^A-Za-z0-9._-]/g, "_").slice(0, 32) || "cmd";
172
+ const hash = createHash("sha256").update(fullCommand).digest("hex").slice(0, 12);
173
+ return `run_tool-${base}-${hash}.stdout.txt`;
174
+ }
175
+ /**
176
+ * Per-stream truncation notice. Names the omitted line range with
177
+ * server-computed integers and gives a recovery recipe that can actually reach
178
+ * the tail; `head` is never offered as a remedy (it returns another prefix).
179
+ */
180
+ function buildTruncationNotice(args) {
181
+ const parts = [];
182
+ const fmt = (n) => String(n); // raw integers: copy-safe into sed ranges
183
+ const cap = STDOUT_CAP_CHARS.toLocaleString("en-US");
184
+ // Quoted so an output directory with spaces still resolves (substitution is textual).
185
+ const outPath = `'${OUTPUT_SENTINEL}${args.outFile}'`;
186
+ const errPath = `'${OUTPUT_SENTINEL}${args.outFile.replace(/\.stdout\.txt$/, ".stderr.txt")}'`;
187
+ if (args.stdoutTruncated && args.stdoutReturnedLines === 0) {
188
+ // Not even one complete line fits: line ranges cannot help, so offer
189
+ // content and chunking recipes instead. (`cut -c` slices per line, not
190
+ // the stream, so it is not offered.)
191
+ parts.push(`stdout: ${fmt(args.stdoutCapturedLines)} line(s) captured (${fmt(args.stdoutCapturedLength)} characters); ` +
192
+ `the first line alone fills the ${cap}-character limit, so line ranges cannot help. Narrow by content ` +
193
+ `(e.g. \`<command> | grep -oE '<pattern>'\`) or chunk it: ` +
194
+ (args.savedFile
195
+ ? `the captured stdout is saved as ${outPath}; run_tool \`fold -w 1000 ${outPath} | sed -n '103,$p'\` ` +
196
+ `(chunks of 1000 characters from character 102001 to the end; repeat with a later start if still cut). `
197
+ : args.outputDirSet
198
+ ? `re-run with \` > ${outPath}\` appended, then \`fold -w 1000 ${outPath} | sed -n '103,$p'\` ` +
199
+ `(chunks of 1000 characters from character 102001 to the end; repeat with a later start if still cut). `
200
+ : `\`<command> | fold -w 1000 | sed -n '103,$p'\` (chunks of 1000 characters from character 102001; ` +
201
+ `repeat with a later start if still cut). `) +
202
+ "'head' returns another prefix and cannot recover the omitted part.");
203
+ }
204
+ else if (args.stdoutTruncated) {
205
+ const from = args.stdoutReturnedLines + 1;
206
+ // Open-ended range: the line count describes captured stdout, which the
207
+ // connector trims and caps (10 MiB), so a fixed end could miss the tail.
208
+ const range = `${from},$p`;
209
+ let msg = `stdout: ${fmt(args.stdoutCapturedLines)} lines captured (${fmt(args.stdoutCapturedLength)} characters); ` +
210
+ `lines 1-${fmt(args.stdoutReturnedLines)} returned in full, the rest omitted (the cut can fall mid-line, ` +
211
+ `so the range below re-reads the cut line whole). `;
212
+ if (args.savedFile) {
213
+ msg +=
214
+ `The captured stdout is saved as ${outPath} (the server resolves %OUTPUT% to the output directory): ` +
215
+ `read the omitted part with run_tool \`sed -n '${range}' ${outPath}\`, grep that file for specifics, ` +
216
+ `or fetch it with download_file '${args.outFile}'. `;
217
+ }
218
+ else if (args.outputDirSet) {
219
+ msg +=
220
+ `To read the omitted part: re-run the same command with \` > ${outPath}\` appended ` +
221
+ `(the server resolves %OUTPUT% to the output directory), then run_tool \`sed -n '${range}' ${outPath}\` ` +
222
+ `(grep that file for specifics; download_file fetches '${args.outFile}'). If re-running is cheap, ` +
223
+ `\`<command> | sed -n '${range}'\` does it in one call. `;
224
+ }
225
+ else {
226
+ msg +=
227
+ `To read the omitted part, re-run as \`<command> | sed -n '${range}'\` (repeat with a later start if that ` +
228
+ `is still over the limit), or narrow by content with grep. `;
229
+ }
230
+ msg += "'head' returns another prefix and cannot recover the omitted tail.";
231
+ parts.push(msg);
232
+ }
233
+ if (args.stderrTruncated) {
234
+ let msg = `stderr: ${fmt(args.stderrCapturedLength)} characters captured (after noise filtering), the first ` +
235
+ `${fmt(MAX_STDERR_RESPONSE)} returned` +
236
+ (args.stdoutTruncated ? ". " : "; stdout is complete. ");
237
+ if (args.outputDirSet) {
238
+ msg +=
239
+ `To keep all of stderr, re-run as \`( <command> ) 2> ${errPath}\` (the parentheses matter for a pipeline: ` +
240
+ `a bare 2> covers only its last stage; use \`( <command> ) > ${outPath} 2>&1\` for both streams) and ` +
241
+ `query that file with grep or sed -n.`;
242
+ }
243
+ else {
244
+ msg += "To see more of it, re-run as `( <command> ) 2>&1 | grep -i error` or with a similar filter.";
245
+ }
246
+ parts.push(msg);
247
+ }
248
+ return parts.join("\n");
38
249
  }
39
250
  // An actual js_unshroud capture invocation: the executable (wrapper, full or
40
251
  // quoted path, or raw js_unshroud-linux-x64 binary) followed by the `run`
@@ -142,8 +353,7 @@ export async function handleRunTool(deps, args) {
142
353
  }, startTime);
143
354
  }
144
355
  }
145
- const MAX_STDOUT_RESPONSE = 100 * 1024; // 100KB — fits in LLM context
146
- const MAX_STDERR_RESPONSE = 50 * 1024;
356
+ const MAX_STDOUT_RESPONSE = STDOUT_CAP_CHARS; // 100KB — fits in LLM context
147
357
  try {
148
358
  const execOptions = {
149
359
  timeout: (args.timeout || config.timeout) * 1000,
@@ -156,27 +366,67 @@ export async function handleRunTool(deps, args) {
156
366
  let stdout = result.stdout || "";
157
367
  let stderr = result.stderr || "";
158
368
  stderr = filterStderrNoise(stderr);
159
- let truncated = false;
160
369
  const fullStdoutLength = stdout.length;
161
- if (stdout.length > MAX_STDOUT_RESPONSE) {
370
+ const stderrCapturedLength = stderr.length; // after noise filtering
371
+ const stdoutTruncated = stdout.length > MAX_STDOUT_RESPONSE;
372
+ const stderrTruncated = stderr.length > MAX_STDERR_RESPONSE;
373
+ const truncated = stdoutTruncated || stderrTruncated;
374
+ // Line accounting only on the (rare) truncated path; the returned stdout
375
+ // stays an exact slice with nothing appended, so a forged marker inside
376
+ // the sample's output cannot masquerade as server metadata.
377
+ let stdoutCapturedLines = 0;
378
+ let stdoutReturnedLines = 0;
379
+ if (stdoutTruncated) {
380
+ stdoutCapturedLines = countLines(stdout);
162
381
  stdout = stdout.slice(0, MAX_STDOUT_RESPONSE);
163
- truncated = true;
382
+ // complete lines inside the slice; a trailing partial line is re-read by the recipe
383
+ for (let i = 0; i < stdout.length; i++)
384
+ if (stdout.charCodeAt(i) === 10)
385
+ stdoutReturnedLines++;
164
386
  }
165
- if (stderr.length > MAX_STDERR_RESPONSE) {
387
+ if (stderrTruncated) {
166
388
  stderr = stderr.slice(0, MAX_STDERR_RESPONSE);
167
- truncated = true;
168
389
  }
169
- // Auto-parse output if command matches a known tool with a parser
390
+ // Auto-parse output if command matches a known tool with a parser. Parse
391
+ // the CAPTURED stdout (bounded), not just the returned slice, so a finding
392
+ // past the response cap is still reported; findings_scope says which.
170
393
  let findings;
394
+ let findingsTotal;
171
395
  let parsedMetadata;
396
+ let findingsScope;
172
397
  const toolName = detectToolName(fullCommand);
173
- if (toolName && hasParser(toolName) && stdout) {
174
- const parsed = parseToolOutput(toolName, stdout);
398
+ const capturedStdout = result.stdout || "";
399
+ if (toolName && hasParser(toolName) && capturedStdout) {
400
+ const parseInput = stdoutTruncated ? capturedStdout.slice(0, PARSE_CAP_CHARS) : stdout;
401
+ const parsed = parseToolOutput(toolName, parseInput);
175
402
  if (parsed.parsed) {
176
403
  findings = parsed.findings;
177
404
  parsedMetadata = parsed.metadata;
405
+ if (findings.length > MAX_FINDINGS) {
406
+ findingsTotal = findings.length;
407
+ findings = findings.slice(0, MAX_FINDINGS);
408
+ }
409
+ // The agent's own head/tail limited the producer: that loss is
410
+ // upstream of anything the server captured, so it takes precedence.
411
+ if (detectPipedLimiter(fullCommand)) {
412
+ findingsScope = "pipeline_limited";
413
+ }
414
+ else if (stdoutTruncated) {
415
+ findingsScope = capturedStdout.length > PARSE_CAP_CHARS ? "captured_prefix" : "captured_stdout";
416
+ }
178
417
  }
179
418
  }
419
+ // Spill the captured stdout to the output directory (bounded, hash-named,
420
+ // idempotent per command) so the omitted tail can be read without
421
+ // re-running the tool. Non-fatal: on failure the notice carries the
422
+ // re-run recipe instead.
423
+ const outFile = suggestedOutputFilename(fullCommand, toolName);
424
+ let stdoutSavedFile;
425
+ if (stdoutTruncated) {
426
+ const spill = await saveOversizedOutput(connector, config.outputDir, outFile, capturedStdout);
427
+ if (spill.saved)
428
+ stdoutSavedFile = outFile;
429
+ }
180
430
  // Check for advisory (non-blocking guidance)
181
431
  const advisory = getCommandAdvisory(fullCommand);
182
432
  // Output-conditioned advisory (tools that exit 0 on failure); scans the
@@ -194,10 +444,31 @@ export async function handleRunTool(deps, args) {
194
444
  exit_code: result.exitCode,
195
445
  truncated,
196
446
  ...(truncated && {
197
- truncation_notice: "Output exceeded response size limit. Use 'run_tool' with '| head -N' or redirect to a file for full output.",
198
- full_stdout_length: fullStdoutLength,
447
+ truncation_notice: buildTruncationNotice({
448
+ stdoutTruncated,
449
+ stderrTruncated,
450
+ stdoutCapturedLength: fullStdoutLength,
451
+ stdoutCapturedLines,
452
+ stdoutReturnedLines,
453
+ stderrCapturedLength,
454
+ outputDirSet: Boolean(config.outputDir),
455
+ outFile,
456
+ savedFile: Boolean(stdoutSavedFile),
457
+ }),
458
+ full_stdout_length: fullStdoutLength, // legacy alias of stdout_captured_length
459
+ stdout_truncated: stdoutTruncated,
460
+ stderr_truncated: stderrTruncated,
461
+ stdout_captured_length: fullStdoutLength,
462
+ stderr_captured_length: stderrCapturedLength,
463
+ ...(stdoutTruncated && {
464
+ stdout_captured_lines: stdoutCapturedLines,
465
+ stdout_returned_lines: stdoutReturnedLines,
466
+ }),
467
+ ...(stdoutSavedFile && { stdout_saved_file: stdoutSavedFile }),
199
468
  }),
200
469
  ...(findings && { findings, parsed_metadata: parsedMetadata }),
470
+ ...(findingsTotal !== undefined && { findings_total: findingsTotal }),
471
+ ...(findings && findingsScope && { findings_scope: findingsScope }),
201
472
  ...(advisory && { advisory }),
202
473
  ...(outputAdvisory && { output_advisory: outputAdvisory }),
203
474
  }, startTime);
@@ -1 +1 @@
1
- {"version":3,"file":"run-tool.js","sourceRoot":"","sources":["../../src/handlers/run-tool.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAC3E,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AACjE,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAYtD,MAAM,oBAAoB,GAAyB;IACjD;QACE,OAAO,EAAE,SAAS;QAClB,OAAO,EAAE,4BAA4B;QACrC,UAAU,EACR,0FAA0F;YAC1F,+DAA+D;YAC/D,6EAA6E;KAChF;CACF,CAAC;AAWF,MAAM,iBAAiB,GAAsB;IAC3C;QACE,KAAK,EAAE,CAAC,GAAG,EAAE,EAAE;YACb,MAAM,SAAS,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;YACjE,IAAI,SAAS,KAAK,SAAS;gBAAE,OAAO,KAAK,CAAC;YAC1C,0EAA0E;YAC1E,wEAAwE;YACxE,IAAI,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC;gBAAE,OAAO,KAAK,CAAC;YACvC,OAAO,IAAI,CAAC;QACd,CAAC;QACD,QAAQ,EACN,yEAAyE;YACzE,qFAAqF;YACrF,iFAAiF;KACpF;CACF,CAAC;AAEF,SAAS,kBAAkB,CAAC,OAAe;IACzC,MAAM,OAAO,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;IAChE,OAAO,OAAO,EAAE,QAAQ,CAAC;AAC3B,CAAC;AAoBD,6EAA6E;AAC7E,0EAA0E;AAC1E,4EAA4E;AAC5E,4EAA4E;AAC5E,MAAM,mBAAmB,GAAG,sDAAsD,CAAC;AAEnF,yEAAyE;AACzE,4EAA4E;AAC5E,2EAA2E;AAC3E,sCAAsC;AACtC,MAAM,0BAA0B,GAC9B,yKAAyK,CAAC;AAE5K,MAAM,wBAAwB,GAA4B;IACxD;QACE,0EAA0E;QAC1E,qEAAqE;QACrE,qBAAqB;QACrB,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,CACvC,mBAAmB,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;YACxC,CAAC,0BAA0B,CAAC,IAAI,CAAC,MAAM,CAAC;gBACtC,0BAA0B,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC5C,QAAQ,EACN,iFAAiF;YACjF,iFAAiF;YACjF,8EAA8E;YAC9E,8EAA8E;YAC9E,iFAAiF;YACjF,gFAAgF;YAChF,4EAA4E;KAC/E;CACF,CAAC;AAEF;;;;GAIG;AACH,SAAS,iBAAiB,CAAC,GAA0B;IACnD,MAAM,OAAO,GAAG,wBAAwB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;IACvE,OAAO,OAAO,CAAC,MAAM,GAAG,CAAC;QACvB,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;QAC3C,CAAC,CAAC,SAAS,CAAC;AAChB,CAAC;AAED;;;GAGG;AACH,SAAS,uBAAuB,CAC9B,OAAe;IAEf,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAChD,oFAAoF;IACpF,MAAM,OAAO,GAAG,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IAC/C,wFAAwF;IACxF,OAAO,oBAAoB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC;AACzE,CAAC;AAGD,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,IAAiB,EACjB,IAAiB;IAEjB,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC7B,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAEnC,sEAAsE;IACtE,4EAA4E;IAC5E,0EAA0E;IAC1E,oEAAoE;IACpE,8EAA8E;IAC9E,+EAA+E;IAC/E,wEAAwE;IACxE,IAAI,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAC/C,MAAM,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1C,MAAM,GAAG,GAAG,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IACzC,IAAI,GAAG,IAAI,GAAG,CAAC,OAAO,KAAK,GAAG,UAAU,KAAK,EAAE,CAAC;QAC9C,OAAO,GAAG,GAAG,CAAC,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;IAC3D,CAAC;IAED,yEAAyE;IACzE,8EAA8E;IAC9E,mFAAmF;IACnF,IAAI,MAAM,CAAC,SAAS,IAAI,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC;QAC1D,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,SAAS,GAAG,CAAC,CAAC;IACxE,CAAC;IAED,qBAAqB;IACrB,IAAI,WAAW,GAAG,OAAO,CAAC;IAC1B,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;QACpB,mDAAmD;QACnD,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;YACtB,MAAM,cAAc,GAAG,gBAAgB,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;YAC5E,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;gBACzB,OAAO,WAAW,CAAC,UAAU,EAAE,IAAI,WAAW,CAC5C,cAAc,CAAC,KAAK,IAAI,yBAAyB,EACjD,cAAc,EACd,YAAY,EACZ,kDAAkD,CACnD,EAAE,SAAS,CAAC,CAAC;YAChB,CAAC;QACH,CAAC;QACD,6EAA6E;QAC7E,0FAA0F;QAC1F,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC3D,MAAM,iBAAiB,GAAG,CAAC,MAAM,CAAC,IAAI,KAAK,OAAO,IAAI,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,UAAU,IAAI,WAAW,EAAE,CAAC;QAC7I,WAAW,GAAG,GAAG,OAAO,KAAK,iBAAiB,GAAG,CAAC;IACpD,CAAC;IAED,+CAA+C;IAC/C,MAAM,UAAU,GAAG,aAAa,CAAC,WAAW,CAAC,CAAC;IAC9C,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;QACrB,OAAO,WAAW,CAAC,UAAU,EAAE,IAAI,WAAW,CAC5C,UAAU,CAAC,KAAK,IAAI,iBAAiB,EACrC,iBAAiB,EACjB,UAAU,EACV,4EAA4E,CAC7E,EAAE,SAAS,CAAC,CAAC;IAChB,CAAC;IAED,wEAAwE;IACxE,0EAA0E;IAC1E,MAAM,cAAc,GAAG,mCAAmC,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC9E,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,MAAM,WAAW,GAAG,uBAAuB,CAAC,WAAW,CAAC,CAAC;QACzD,IAAI,WAAW,EAAE,CAAC;YAChB,OAAO,cAAc,CACnB,UAAU,EACV;gBACE,OAAO,EAAE,WAAW,CAAC,OAAO;gBAC5B,UAAU,EAAE,WAAW,CAAC,UAAU;gBAClC,eAAe,EAAE,IAAI;gBACrB,IAAI,EAAE,2FAA2F;aAClG,EACD,SAAS,CACV,CAAC;QACJ,CAAC;IACH,CAAC;IAED,MAAM,mBAAmB,GAAG,GAAG,GAAG,IAAI,CAAC,CAAC,8BAA8B;IACtE,MAAM,mBAAmB,GAAG,EAAE,GAAG,IAAI,CAAC;IAEtC,IAAI,CAAC;QACH,MAAM,WAAW,GAAsC;YACrD,OAAO,EAAE,CAAC,IAAI,CAAC,OAAO,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,IAAI;SACjD,CAAC;QAEF,iEAAiE;QACjE,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,WAAW,CAAC,GAAG,GAAG,MAAM,CAAC,UAAU,CAAC;QACtC,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,YAAY,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;QAEtE,IAAI,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC;QACjC,IAAI,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC;QAEjC,MAAM,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;QAEnC,IAAI,SAAS,GAAG,KAAK,CAAC;QACtB,MAAM,gBAAgB,GAAG,MAAM,CAAC,MAAM,CAAC;QAEvC,IAAI,MAAM,CAAC,MAAM,GAAG,mBAAmB,EAAE,CAAC;YACxC,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,mBAAmB,CAAC,CAAC;YAC9C,SAAS,GAAG,IAAI,CAAC;QACnB,CAAC;QACD,IAAI,MAAM,CAAC,MAAM,GAAG,mBAAmB,EAAE,CAAC;YACxC,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,mBAAmB,CAAC,CAAC;YAC9C,SAAS,GAAG,IAAI,CAAC;QACnB,CAAC;QAED,kEAAkE;QAClE,IAAI,QAAQ,CAAC;QACb,IAAI,cAAc,CAAC;QACnB,MAAM,QAAQ,GAAG,cAAc,CAAC,WAAW,CAAC,CAAC;QAC7C,IAAI,QAAQ,IAAI,SAAS,CAAC,QAAQ,CAAC,IAAI,MAAM,EAAE,CAAC;YAC9C,MAAM,MAAM,GAAG,eAAe,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YACjD,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;gBAClB,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;gBAC3B,cAAc,GAAG,MAAM,CAAC,QAAQ,CAAC;YACnC,CAAC;QACH,CAAC;QAED,6CAA6C;QAC7C,MAAM,QAAQ,GAAG,kBAAkB,CAAC,WAAW,CAAC,CAAC;QAEjD,wEAAwE;QACxE,mEAAmE;QACnE,MAAM,cAAc,GAAG,iBAAiB,CAAC;YACvC,OAAO,EAAE,WAAW;YACpB,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,EAAE;YAC3B,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,EAAE;YAC3B,QAAQ,EAAE,MAAM,CAAC,QAAQ;SAC1B,CAAC,CAAC;QAEH,OAAO,cAAc,CAAC,UAAU,EAAE;YAChC,OAAO,EAAE,WAAW;YACpB,MAAM;YACN,MAAM;YACN,SAAS,EAAE,MAAM,CAAC,QAAQ;YAC1B,SAAS;YACT,GAAG,CAAC,SAAS,IAAI;gBACf,iBAAiB,EAAE,6GAA6G;gBAChI,kBAAkB,EAAE,gBAAgB;aACrC,CAAC;YACF,GAAG,CAAC,QAAQ,IAAI,EAAE,QAAQ,EAAE,eAAe,EAAE,cAAc,EAAE,CAAC;YAC9D,GAAG,CAAC,QAAQ,IAAI,EAAE,QAAQ,EAAE,CAAC;YAC7B,GAAG,CAAC,cAAc,IAAI,EAAE,eAAe,EAAE,cAAc,EAAE,CAAC;SAC3D,EAAE,SAAS,CAAC,CAAC;IAChB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,WAAW,CAAC,UAAU,EAAE,aAAa,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,SAAS,CAAC,CAAC;IAC/E,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,SAAS,cAAc,CAAC,OAAe;IACrC,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IACzC,8DAA8D;IAC9D,MAAM,OAAO,GAAG,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IAEpE,gDAAgD;IAChD,KAAK,MAAM,GAAG,IAAI,YAAY,CAAC,GAAG,EAAE,EAAE,CAAC;QACrC,IAAI,GAAG,CAAC,OAAO,KAAK,OAAO,IAAI,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YACnD,OAAO,GAAG,CAAC,IAAI,CAAC;QAClB,CAAC;IACH,CAAC;IACD,iEAAiE;IACjE,IAAI,SAAS,CAAC,OAAO,CAAC;QAAE,OAAO,OAAO,CAAC;IACvC,OAAO,SAAS,CAAC;AACnB,CAAC"}
1
+ {"version":3,"file":"run-tool.js","sourceRoot":"","sources":["../../src/handlers/run-tool.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"suggest-tools.d.ts","sourceRoot":"","sources":["../../src/handlers/suggest-tools.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAyQ5D,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,WAAW,EACjB,IAAI,EAAE,gBAAgB;;;;;;GAiJvB"}
1
+ {"version":3,"file":"suggest-tools.d.ts","sourceRoot":"","sources":["../../src/handlers/suggest-tools.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAoR5D,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,WAAW,EACjB,IAAI,EAAE,gBAAgB;;;;;;GAiJvB"}
@@ -144,6 +144,16 @@ const BASE_HINTS = {
144
144
  "Look for resolved API names, network connections, file system access, and registry modifications in emulation output. " +
145
145
  "For deep analysis, qltool (Qiling) provides multi-platform emulation and tracesc traces execution via Wine. " +
146
146
  "Use strings and xorsearch for static indicators before emulation.",
147
+ ETL: "Windows Event Trace Log (ETL) detected. Start with etl2xml to convert the trace to XML, " +
148
+ "then inspect the events. This build decodes AMSI traces: search the XML for AmsiScript " +
149
+ "(TraceLogging captures) or Microsoft_Antimalware_Scan_Interface (manifest/logman captures) " +
150
+ "to recover the script content the antimalware engine scanned — an empty result means the " +
151
+ "trace holds no AMSI events, not that it is clean. etl2pcap extracts network packets when " +
152
+ "the trace contains Microsoft-Windows-NDIS-PacketCapture events (a 24-byte header-only pcap " +
153
+ "means none were present); to continue with the network toolchain, run tshark or capinfos " +
154
+ "on it directly via run_tool (e.g. run_tool command='capinfos %OUTPUT%/etl2pcap.pcap'), or " +
155
+ "copy it into the samples directory to use analyze_file. Note that `file` misidentifies some ETL variants " +
156
+ "(e.g. as an Apple HFS resource fork) — the .etl extension is the reliable signal.",
147
157
  Memory: "Memory image detected. Start with vol3-info to identify OS and kernel version. " +
148
158
  "vol3-pslist and vol3-pstree reveal running processes. " +
149
159
  "vol3-netscan shows network connections. vol3-psscan finds hidden/unlinked processes. " +