@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.
Files changed (122) hide show
  1. package/dist/agent/context-manager.d.ts +27 -0
  2. package/dist/agent/context-manager.js +75 -0
  3. package/dist/agent/context-manager.js.map +1 -0
  4. package/dist/agent/runner.d.ts +21 -1
  5. package/dist/agent/runner.js +120 -30
  6. package/dist/agent/runner.js.map +1 -1
  7. package/dist/commands/doctor.js +21 -3
  8. package/dist/commands/doctor.js.map +1 -1
  9. package/dist/commands/update.js +11 -2
  10. package/dist/commands/update.js.map +1 -1
  11. package/dist/context/manager.d.ts +4 -0
  12. package/dist/context/manager.js +48 -0
  13. package/dist/context/manager.js.map +1 -0
  14. package/dist/index.js +156 -5
  15. package/dist/index.js.map +1 -1
  16. package/dist/llm/anthropic.js +29 -38
  17. package/dist/llm/anthropic.js.map +1 -1
  18. package/dist/llm/gemini.js +31 -40
  19. package/dist/llm/gemini.js.map +1 -1
  20. package/dist/llm/http.d.ts +21 -0
  21. package/dist/llm/http.js +140 -1
  22. package/dist/llm/http.js.map +1 -1
  23. package/dist/llm/ollama.js +18 -27
  24. package/dist/llm/ollama.js.map +1 -1
  25. package/dist/llm/router.d.ts +7 -0
  26. package/dist/llm/router.js +15 -9
  27. package/dist/llm/router.js.map +1 -1
  28. package/dist/modes/agent.d.ts +4 -2
  29. package/dist/modes/agent.js +2 -2
  30. package/dist/modes/agent.js.map +1 -1
  31. package/dist/os/pkgmgr.d.ts +7 -1
  32. package/dist/os/pkgmgr.js +97 -18
  33. package/dist/os/pkgmgr.js.map +1 -1
  34. package/dist/prompts/index.d.ts +7 -0
  35. package/dist/prompts/index.js +12 -4
  36. package/dist/prompts/index.js.map +1 -1
  37. package/dist/repl.d.ts +1 -0
  38. package/dist/repl.js +283 -18
  39. package/dist/repl.js.map +1 -1
  40. package/dist/safety/classifier.d.ts +5 -1
  41. package/dist/safety/classifier.js +254 -29
  42. package/dist/safety/classifier.js.map +1 -1
  43. package/dist/safety/patterns.d.ts +48 -1
  44. package/dist/safety/patterns.js +129 -13
  45. package/dist/safety/patterns.js.map +1 -1
  46. package/dist/store/config.d.ts +21 -1
  47. package/dist/store/config.js +28 -7
  48. package/dist/store/config.js.map +1 -1
  49. package/dist/store/history.d.ts +9 -0
  50. package/dist/store/history.js +58 -1
  51. package/dist/store/history.js.map +1 -1
  52. package/dist/store/keys.d.ts +2 -1
  53. package/dist/store/keys.js +8 -4
  54. package/dist/store/keys.js.map +1 -1
  55. package/dist/store/logs.d.ts +7 -0
  56. package/dist/store/logs.js +39 -1
  57. package/dist/store/logs.js.map +1 -1
  58. package/dist/store/project.d.ts +1 -0
  59. package/dist/store/project.js +34 -7
  60. package/dist/store/project.js.map +1 -1
  61. package/dist/store/scope.d.ts +29 -0
  62. package/dist/store/scope.js +113 -0
  63. package/dist/store/scope.js.map +1 -0
  64. package/dist/tools/artifacts.d.ts +9 -0
  65. package/dist/tools/artifacts.js +38 -0
  66. package/dist/tools/artifacts.js.map +1 -0
  67. package/dist/tools/fs.d.ts +6 -2
  68. package/dist/tools/fs.js +95 -17
  69. package/dist/tools/fs.js.map +1 -1
  70. package/dist/tools/http.d.ts +5 -2
  71. package/dist/tools/http.js +177 -8
  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 +224 -43
  105. package/dist/tools/registry.js.map +1 -1
  106. package/dist/tools/shell.d.ts +45 -0
  107. package/dist/tools/shell.js +430 -12
  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 +8 -0
  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/dist/ui/tool-output.d.ts +18 -0
  120. package/dist/ui/tool-output.js +135 -0
  121. package/dist/ui/tool-output.js.map +1 -0
  122. package/package.json +1 -1
@@ -0,0 +1,51 @@
1
+ const SEVERITY_ORDER = ["critical", "high", "medium", "low", "info", "unknown"];
2
+ export const nucleiReducer = (raw) => {
3
+ const hits = [];
4
+ for (const line of raw.split(/\r?\n/)) {
5
+ const trimmed = line.trim();
6
+ if (!trimmed.startsWith("{"))
7
+ continue;
8
+ try {
9
+ hits.push(JSON.parse(trimmed));
10
+ }
11
+ catch {
12
+ // skip malformed lines
13
+ }
14
+ }
15
+ if (hits.length === 0) {
16
+ return { summary: "# nuclei — no JSONL hits parsed (pass -jsonl to get structured output)" };
17
+ }
18
+ const bySeverity = new Map();
19
+ for (const hit of hits) {
20
+ const sev = hit.info?.severity?.toLowerCase() ?? "unknown";
21
+ const list = bySeverity.get(sev) ?? [];
22
+ list.push(hit);
23
+ bySeverity.set(sev, list);
24
+ }
25
+ const counts = SEVERITY_ORDER
26
+ .filter((sev) => bySeverity.has(sev))
27
+ .map((sev) => `${sev}=${bySeverity.get(sev).length}`);
28
+ const lines = [
29
+ `# nuclei reduced summary — ${hits.length} hit(s) ${counts.join(" ")}`,
30
+ ];
31
+ for (const sev of SEVERITY_ORDER) {
32
+ const list = bySeverity.get(sev);
33
+ if (!list)
34
+ continue;
35
+ lines.push("");
36
+ lines.push(`## ${sev.toUpperCase()} (${list.length})`);
37
+ for (const hit of list.slice(0, 15)) {
38
+ const id = hit["template-id"] ?? hit.template ?? "?";
39
+ const name = hit.info?.name ?? "";
40
+ const matched = hit["matched-at"] ?? hit.matched ?? hit.host ?? "?";
41
+ lines.push(`- ${id}${name ? ` [${name}]` : ""} — ${matched}`);
42
+ }
43
+ if (list.length > 15)
44
+ lines.push(`- ... ${list.length - 15} more`);
45
+ }
46
+ return {
47
+ summary: lines.join("\n"),
48
+ findings: { total: hits.length, bySeverity: Object.fromEntries([...bySeverity.entries()].map(([k, v]) => [k, v.length])) },
49
+ };
50
+ };
51
+ //# sourceMappingURL=nuclei.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nuclei.js","sourceRoot":"","sources":["../../../src/tools/reducers/nuclei.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { Reducer } from "./types.js";
2
+ export declare const sqlmapReducer: Reducer;
@@ -0,0 +1,39 @@
1
+ const INJECTABLE_RE = /Parameter:\s*([^\s(]+)\s*\(([^)]+)\)/g;
2
+ const DBMS_RE = /back-end DBMS:\s*(.+)/i;
3
+ const PAYLOAD_RE = /Payload:\s*(.+)/g;
4
+ export const sqlmapReducer = (raw) => {
5
+ const injectables = [];
6
+ let dbms;
7
+ const payloads = [];
8
+ for (const match of raw.matchAll(INJECTABLE_RE)) {
9
+ injectables.push({ parameter: match[1], place: match[2] });
10
+ }
11
+ const dbmsMatch = DBMS_RE.exec(raw);
12
+ if (dbmsMatch)
13
+ dbms = dbmsMatch[1].trim();
14
+ for (const match of raw.matchAll(PAYLOAD_RE)) {
15
+ payloads.push(match[1].trim());
16
+ if (payloads.length >= 5)
17
+ break;
18
+ }
19
+ if (injectables.length === 0 && !dbms) {
20
+ return { summary: "# sqlmap — no injectable parameters or DBMS detected" };
21
+ }
22
+ const lines = [
23
+ `# sqlmap reduced summary — ${injectables.length} injectable parameter(s)${dbms ? `, DBMS=${dbms}` : ""}`,
24
+ ];
25
+ for (const inj of injectables) {
26
+ lines.push(`- ${inj.parameter} (${inj.place})`);
27
+ }
28
+ if (payloads.length > 0) {
29
+ lines.push("");
30
+ lines.push("## Sample payloads");
31
+ for (const payload of payloads)
32
+ lines.push(`- ${payload}`);
33
+ }
34
+ return {
35
+ summary: lines.join("\n"),
36
+ findings: { injectables, dbms, samplePayloads: payloads },
37
+ };
38
+ };
39
+ //# sourceMappingURL=sqlmap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlmap.js","sourceRoot":"","sources":["../../../src/tools/reducers/sqlmap.ts"],"names":[],"mappings":"AAEA,MAAM,aAAa,GAAG,uCAAuC,CAAC;AAC9D,MAAM,OAAO,GAAG,wBAAwB,CAAC;AACzC,MAAM,UAAU,GAAG,kBAAkB,CAAC;AAEtC,MAAM,CAAC,MAAM,aAAa,GAAY,CAAC,GAAG,EAAiB,EAAE;IAC3D,MAAM,WAAW,GAAgD,EAAE,CAAC;IACpE,IAAI,IAAwB,CAAC;IAC7B,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,KAAK,MAAM,KAAK,IAAI,GAAG,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC;QAChD,WAAW,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC,CAAE,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAE,EAAE,CAAC,CAAC;IAC/D,CAAC;IACD,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACpC,IAAI,SAAS;QAAE,IAAI,GAAG,SAAS,CAAC,CAAC,CAAE,CAAC,IAAI,EAAE,CAAC;IAC3C,KAAK,MAAM,KAAK,IAAI,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;QAC7C,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,IAAI,EAAE,CAAC,CAAC;QAChC,IAAI,QAAQ,CAAC,MAAM,IAAI,CAAC;YAAE,MAAM;IAClC,CAAC;IACD,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QACtC,OAAO,EAAE,OAAO,EAAE,sDAAsD,EAAE,CAAC;IAC7E,CAAC;IACD,MAAM,KAAK,GAAa;QACtB,8BAA8B,WAAW,CAAC,MAAM,2BAA2B,IAAI,CAAC,CAAC,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE;KAC1G,CAAC;IACF,KAAK,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;QAC9B,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,SAAS,KAAK,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC;IAClD,CAAC;IACD,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;QACjC,KAAK,MAAM,OAAO,IAAI,QAAQ;YAAE,KAAK,CAAC,IAAI,CAAC,KAAK,OAAO,EAAE,CAAC,CAAC;IAC7D,CAAC;IACD,OAAO;QACL,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;QACzB,QAAQ,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,cAAc,EAAE,QAAQ,EAAE;KAC1D,CAAC;AACJ,CAAC,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { Reducer } from "./types.js";
2
+ /**
3
+ * Reducer for subfinder / amass / sublist3r output. Dedup, normalize,
4
+ * sort. The user can still pull the raw list from the artifact.
5
+ */
6
+ export declare const subdomainsReducer: Reducer;
@@ -0,0 +1,31 @@
1
+ const DOMAIN_RE = /^[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\.[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?)+$/i;
2
+ /**
3
+ * Reducer for subfinder / amass / sublist3r output. Dedup, normalize,
4
+ * sort. The user can still pull the raw list from the artifact.
5
+ */
6
+ export const subdomainsReducer = (raw) => {
7
+ const set = new Set();
8
+ for (const line of raw.split(/\r?\n/)) {
9
+ const token = line.trim();
10
+ if (DOMAIN_RE.test(token)) {
11
+ set.add(token.toLowerCase());
12
+ }
13
+ }
14
+ if (set.size === 0) {
15
+ return { summary: "# subdomains — none parsed from output" };
16
+ }
17
+ const sorted = [...set].sort();
18
+ const preview = sorted.slice(0, 200);
19
+ const lines = [
20
+ `# subdomain enumeration — ${sorted.length} unique domain(s)`,
21
+ ...preview,
22
+ ];
23
+ if (sorted.length > preview.length) {
24
+ lines.push(`... ${sorted.length - preview.length} more in artifact`);
25
+ }
26
+ return {
27
+ summary: lines.join("\n"),
28
+ findings: { count: sorted.length, sample: preview },
29
+ };
30
+ };
31
+ //# sourceMappingURL=subdomains.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subdomains.js","sourceRoot":"","sources":["../../../src/tools/reducers/subdomains.ts"],"names":[],"mappings":"AAEA,MAAM,SAAS,GAAG,oFAAoF,CAAC;AAEvG;;;GAGG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAY,CAAC,GAAG,EAAiB,EAAE;IAC/D,MAAM,GAAG,GAAG,IAAI,GAAG,EAAU,CAAC;IAC9B,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;QACtC,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC1B,IAAI,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YAC1B,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC;IACD,IAAI,GAAG,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QACnB,OAAO,EAAE,OAAO,EAAE,wCAAwC,EAAE,CAAC;IAC/D,CAAC;IACD,MAAM,MAAM,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IAC/B,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACrC,MAAM,KAAK,GAAa;QACtB,6BAA6B,MAAM,CAAC,MAAM,mBAAmB;QAC7D,GAAG,OAAO;KACX,CAAC;IACF,IAAI,MAAM,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;QACnC,KAAK,CAAC,IAAI,CAAC,OAAO,MAAM,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,mBAAmB,CAAC,CAAC;IACvE,CAAC;IACD,OAAO;QACL,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;QACzB,QAAQ,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE;KACpD,CAAC;AACJ,CAAC,CAAC"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * A reducer takes raw tool output and returns a compact, finding-aware
3
+ * summary that the model sees instead of the raw blob. The full raw output
4
+ * still lives in the artifact file for the user to inspect.
5
+ */
6
+ export interface ReducerOutput {
7
+ summary: string;
8
+ findings?: unknown;
9
+ warnings?: string[];
10
+ }
11
+ export type Reducer = (raw: string, context: {
12
+ command: string;
13
+ argv?: string[] | undefined;
14
+ }) => ReducerOutput;
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/tools/reducers/types.ts"],"names":[],"mappings":""}
@@ -1,4 +1,4 @@
1
- import type { ToolCall, ToolResult } from '../types.js';
1
+ import type { ToolCall, ToolResult } from "../types.js";
2
2
  export interface ToolRunOptions {
3
3
  signal?: AbortSignal | undefined;
4
4
  onOutput?: ((chunk: string, stream: "stdout" | "stderr") => void) | undefined;
@@ -1,87 +1,146 @@
1
- import { detectSystem } from '../os/detect.js';
2
- import { detectPackageManager } from '../os/pkgmgr.js';
3
- import { fsList, fsRead, fsSearch, fsWrite } from './fs.js';
4
- import { httpFetch } from './http.js';
5
- import { shellExec } from './shell.js';
1
+ import { detectSystem } from "../os/detect.js";
2
+ import { detectPackageManager, assertSafePackageName } from "../os/pkgmgr.js";
3
+ import { fsList, fsRead, fsSearch, fsWrite } from "./fs.js";
4
+ import { httpFetch } from "./http.js";
5
+ import { shellExec, spawnArgv } from "./shell.js";
6
+ import { classifyToolCall } from "../safety/classifier.js";
7
+ import { loadScope } from "../store/scope.js";
8
+ import { parseHost, parsePortSpec, parseLegacyFlags, profileToNmapArgs, } from "./validate.js";
6
9
  function requireString(args, key) {
7
10
  const value = args[key];
8
- if (typeof value !== 'string' || value.length === 0) {
11
+ if (typeof value !== "string" || value.length === 0) {
9
12
  throw new Error(`Tool argument "${key}" must be a non-empty string`);
10
13
  }
11
14
  return value;
12
15
  }
13
16
  function optionalString(args, key) {
14
17
  const value = args[key];
15
- return typeof value === 'string' && value.length > 0 ? value : undefined;
18
+ return typeof value === "string" && value.length > 0 ? value : undefined;
16
19
  }
17
20
  function optionalNumber(args, key) {
18
21
  const value = args[key];
19
- return typeof value === 'number' ? value : undefined;
22
+ return typeof value === "number" ? value : undefined;
20
23
  }
21
24
  export const toolRegistry = {
22
- async 'shell.exec'(args, options) {
23
- return shellExec({ command: requireString(args, 'command'), cwd: optionalString(args, 'cwd'), timeoutMs: optionalNumber(args, 'timeoutMs'), signal: options?.signal, onOutput: options?.onOutput });
25
+ async "shell.exec"(args, options) {
26
+ return shellExec({
27
+ command: requireString(args, "command"),
28
+ cwd: optionalString(args, "cwd"),
29
+ timeoutMs: optionalNumber(args, "timeoutMs"),
30
+ signal: options?.signal,
31
+ onOutput: options?.onOutput,
32
+ });
24
33
  },
25
- async 'fs.read'(args) {
26
- return fsRead(requireString(args, 'path'));
34
+ async "fs.read"(args) {
35
+ return fsRead(requireString(args, "path"), {
36
+ maxBytes: optionalNumber(args, "maxBytes"),
37
+ });
27
38
  },
28
- async 'fs.write'(args) {
29
- return fsWrite(requireString(args, 'path'), requireString(args, 'content'));
39
+ async "fs.write"(args) {
40
+ return fsWrite(requireString(args, "path"), requireString(args, "content"));
30
41
  },
31
- async 'fs.list'(args) {
32
- return fsList(optionalString(args, 'path') ?? process.cwd());
42
+ async "fs.list"(args) {
43
+ return fsList(optionalString(args, "path") ?? process.cwd(), {
44
+ maxEntries: optionalNumber(args, "maxEntries"),
45
+ });
33
46
  },
34
- async 'fs.search'(args) {
35
- return fsSearch(requireString(args, 'pattern'), optionalString(args, 'path'));
47
+ async "fs.search"(args) {
48
+ return fsSearch(requireString(args, "pattern"), optionalString(args, "path"));
36
49
  },
37
- async 'pkg.install'(args, options) {
38
- const tool = requireString(args, 'tool');
50
+ async "pkg.install"(args, options) {
51
+ const tool = assertSafePackageName(requireString(args, "tool"));
39
52
  const pkgmgr = await detectPackageManager();
40
- return shellExec({ command: pkgmgr.installCommand(tool), signal: options?.signal, onOutput: options?.onOutput });
53
+ const spec = pkgmgr.installArgv(tool);
54
+ if (!spec) {
55
+ // Unknown manager: fall back to an instructional message instead of
56
+ // executing a malformed shell string.
57
+ return { ok: false, output: pkgmgr.installCommand(tool), exitCode: 1 };
58
+ }
59
+ return spawnArgv({
60
+ command: spec.command,
61
+ argv: spec.argv,
62
+ timeoutMs: 600_000,
63
+ signal: options?.signal,
64
+ onOutput: options?.onOutput,
65
+ });
41
66
  },
42
- async 'net.scan'(args, options) {
43
- const target = requireString(args, 'target');
44
- const ports = optionalString(args, 'ports');
45
- const flags = optionalString(args, 'flags') ?? '';
46
- const command = ports
47
- ? `nmap -p ${ports} ${flags} ${target}`.trim()
48
- : `nmap ${flags} ${target}`.trim();
49
- return shellExec({ command, timeoutMs: 300_000, signal: options?.signal, onOutput: options?.onOutput });
67
+ async "net.scan"(args, options) {
68
+ const host = parseHost(requireString(args, "target"));
69
+ const portsRaw = optionalString(args, "ports");
70
+ const ports = portsRaw ? parsePortSpec(portsRaw) : undefined;
71
+ const profile = args.profile &&
72
+ typeof args.profile === "object" &&
73
+ !Array.isArray(args.profile)
74
+ ? args.profile
75
+ : undefined;
76
+ const legacyFlags = optionalString(args, "flags");
77
+ const profileArgs = profileToNmapArgs(profile);
78
+ const legacyArgs = legacyFlags ? parseLegacyFlags(legacyFlags) : [];
79
+ const argv = [];
80
+ if (ports)
81
+ argv.push("-p", ports);
82
+ argv.push(...profileArgs, ...legacyArgs, host.value);
83
+ return spawnArgv({
84
+ command: "nmap",
85
+ argv,
86
+ timeoutMs: 300_000,
87
+ signal: options?.signal,
88
+ onOutput: options?.onOutput,
89
+ });
50
90
  },
51
- async 'http.fetch'(args) {
52
- const headers = args.headers && typeof args.headers === 'object' && !Array.isArray(args.headers)
91
+ async "http.fetch"(args) {
92
+ const headers = args.headers &&
93
+ typeof args.headers === "object" &&
94
+ !Array.isArray(args.headers)
53
95
  ? args.headers
54
96
  : undefined;
55
- return httpFetch(requireString(args, 'url'), {
56
- method: optionalString(args, 'method'),
57
- body: optionalString(args, 'body'),
97
+ return httpFetch(requireString(args, "url"), {
98
+ method: optionalString(args, "method"),
99
+ body: optionalString(args, "body"),
58
100
  headers,
59
- maxBytes: optionalNumber(args, 'maxBytes'),
101
+ maxBytes: optionalNumber(args, "maxBytes"),
102
+ iOwnThis: args.iOwnThis === true || args.own === true,
60
103
  });
61
104
  },
62
105
  async sysinfo() {
63
106
  return { ok: true, output: JSON.stringify(detectSystem(), null, 2) };
64
107
  },
65
- async 'pentest.recon'(args, options) {
66
- const target = requireString(args, 'target');
67
- const commands = [`whois ${target}`, `dig ${target} ANY +noall +answer`, `nmap -sV --top-ports 100 ${target}`];
108
+ async "pentest.recon"(args, options) {
109
+ const host = parseHost(requireString(args, "target"));
110
+ const steps = [
111
+ { command: "whois", argv: [host.value] },
112
+ { command: "dig", argv: [host.value, "ANY", "+noall", "+answer"] },
113
+ { command: "nmap", argv: ["-sV", "--top-ports", "100", host.value] },
114
+ ];
68
115
  const outputs = [];
69
- for (const command of commands) {
116
+ for (const step of steps) {
70
117
  if (options?.signal?.aborted)
71
118
  break;
119
+ const display = `${step.command} ${step.argv.join(" ")}`;
72
120
  // Announce each sub-step so users see progress through long recons.
73
- options?.onOutput?.(`\n$ ${command}\n`, "stdout");
74
- const result = await shellExec({ command, timeoutMs: 180_000, signal: options?.signal, onOutput: options?.onOutput });
75
- outputs.push(`$ ${command}\n${result.output}`);
121
+ options?.onOutput?.(`\n$ ${display}\n`, "stdout");
122
+ const result = await spawnArgv({
123
+ command: step.command,
124
+ argv: step.argv,
125
+ timeoutMs: 180_000,
126
+ signal: options?.signal,
127
+ onOutput: options?.onOutput,
128
+ });
129
+ outputs.push(result.output);
76
130
  if (options?.signal?.aborted)
77
131
  break;
78
132
  }
79
133
  return {
80
134
  ok: !options?.signal?.aborted,
81
- output: options?.signal?.aborted ? `${outputs.join('\n\n')}\n\nCommand aborted.`.trim() : outputs.join('\n\n'),
135
+ output: options?.signal?.aborted
136
+ ? `${outputs.join("\n\n")}\n\nCommand aborted.`.trim()
137
+ : outputs.join("\n\n"),
82
138
  exitCode: options?.signal?.aborted ? 130 : 0,
83
139
  };
84
140
  },
141
+ async "tool.batch"(args, options) {
142
+ return runToolBatch(args, options);
143
+ },
85
144
  };
86
145
  export function availableToolNames() {
87
146
  return Object.keys(toolRegistry);
@@ -93,4 +152,126 @@ export async function runToolCall(call, options = {}) {
93
152
  }
94
153
  return handler(call.args, options);
95
154
  }
155
+ /**
156
+ * Tools that `tool.batch` is allowed to invoke. Limited to read-only
157
+ * operations so the batch runner cannot escalate into shell execution
158
+ * or mutating HTTP methods. http.fetch is allowed but downstream
159
+ * GET/HEAD enforcement still happens in the classifier when individual
160
+ * calls are routed.
161
+ */
162
+ const BATCH_SAFE_TOOLS = new Set([
163
+ "fs.read",
164
+ "fs.list",
165
+ "fs.search",
166
+ "http.fetch",
167
+ "sysinfo",
168
+ ]);
169
+ const BATCH_MAX_CALLS = 8;
170
+ const BATCH_DEFAULT_CONCURRENCY = 3;
171
+ const BATCH_MAX_CONCURRENCY = 4;
172
+ function parseBatchCalls(value) {
173
+ if (!Array.isArray(value)) {
174
+ throw new Error("tool.batch expects { calls: [{name, args}, ...] }");
175
+ }
176
+ if (value.length === 0) {
177
+ throw new Error("tool.batch requires at least one call");
178
+ }
179
+ if (value.length > BATCH_MAX_CALLS) {
180
+ throw new Error(`tool.batch accepts at most ${BATCH_MAX_CALLS} calls per invocation`);
181
+ }
182
+ return value.map((entry, index) => {
183
+ if (!entry ||
184
+ typeof entry !== "object" ||
185
+ Array.isArray(entry) ||
186
+ typeof entry.name !== "string" ||
187
+ typeof entry.args !== "object" ||
188
+ entry.args === null) {
189
+ throw new Error(`tool.batch call #${index} must be { name: string, args: object }`);
190
+ }
191
+ const { name, args } = entry;
192
+ if (!BATCH_SAFE_TOOLS.has(name)) {
193
+ throw new Error(`tool.batch refuses to run "${name}" — only read-only tools are allowed (${[...BATCH_SAFE_TOOLS].join(", ")})`);
194
+ }
195
+ return { name, args };
196
+ });
197
+ }
198
+ async function runWithLimit(items, limit, worker) {
199
+ const queue = items.map((item, index) => ({ item, index }));
200
+ const runners = [];
201
+ for (let n = 0; n < Math.min(limit, queue.length); n += 1) {
202
+ runners.push((async () => {
203
+ while (queue.length > 0) {
204
+ const next = queue.shift();
205
+ if (!next)
206
+ break;
207
+ await worker(next.item, next.index);
208
+ }
209
+ })());
210
+ }
211
+ await Promise.all(runners);
212
+ }
213
+ async function runToolBatch(args, options) {
214
+ const calls = parseBatchCalls(args.calls);
215
+ // Re-classify each child call so confirm/block tools (eg http.fetch POST,
216
+ // public scans without scope) cannot ride in on tool.batch's safe label.
217
+ const scope = await loadScope().catch(() => undefined);
218
+ for (const spec of calls) {
219
+ const decision = classifyToolCall({ name: spec.name, args: spec.args }, { scope });
220
+ if (decision.level !== "safe") {
221
+ throw new Error(`tool.batch refuses ${spec.name}: ${decision.reason} (only safe-classified calls are allowed inside a batch)`);
222
+ }
223
+ }
224
+ const concurrency = Math.max(1, Math.min(typeof args.concurrency === "number"
225
+ ? Math.floor(args.concurrency)
226
+ : BATCH_DEFAULT_CONCURRENCY, BATCH_MAX_CONCURRENCY));
227
+ const outcomes = new Array(calls.length);
228
+ await runWithLimit(calls, concurrency, async (spec, index) => {
229
+ if (options?.signal?.aborted) {
230
+ outcomes[index] = {
231
+ index,
232
+ name: spec.name,
233
+ ok: false,
234
+ output: "Aborted before execution.",
235
+ exitCode: 130,
236
+ };
237
+ return;
238
+ }
239
+ try {
240
+ const result = await runToolCall({ name: spec.name, args: spec.args },
241
+ // Skip onOutput streaming: batch results are summarized after all
242
+ // members complete to keep the live preview readable.
243
+ { signal: options?.signal });
244
+ outcomes[index] = {
245
+ index,
246
+ name: spec.name,
247
+ ok: result.ok,
248
+ output: result.output,
249
+ exitCode: result.exitCode,
250
+ };
251
+ }
252
+ catch (error) {
253
+ outcomes[index] = {
254
+ index,
255
+ name: spec.name,
256
+ ok: false,
257
+ output: "",
258
+ error: error instanceof Error ? error.message : String(error),
259
+ };
260
+ }
261
+ });
262
+ const allOk = outcomes.every((outcome) => outcome.ok);
263
+ const sections = outcomes.map((outcome) => {
264
+ const status = outcome.ok ? "ok" : "fail";
265
+ const head = `── #${outcome.index + 1} ${outcome.name} [${status}${outcome.exitCode !== undefined ? ` exit=${outcome.exitCode}` : ""}]`;
266
+ const body = outcome.error
267
+ ? `error: ${outcome.error}`
268
+ : outcome.output.trim();
269
+ return `${head}\n${body}`;
270
+ });
271
+ return {
272
+ ok: allOk,
273
+ output: sections.join("\n\n"),
274
+ exitCode: allOk ? 0 : 1,
275
+ };
276
+ }
96
277
  //# sourceMappingURL=registry.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/tools/registry.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/tools/registry.ts"],"names":[],"mappings":"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"}
@@ -5,5 +5,50 @@ export interface ShellExecArgs {
5
5
  timeoutMs?: number | undefined;
6
6
  signal?: AbortSignal | undefined;
7
7
  onOutput?: ((chunk: string, stream: "stdout" | "stderr") => void) | undefined;
8
+ /** Max bytes of output to retain in memory for the model (head+tail). */
9
+ maxModelBytes?: number | undefined;
10
+ /** Max bytes streamed to the artifact file before the child is terminated. */
11
+ maxCaptureBytes?: number | undefined;
12
+ /** Behavior when maxCaptureBytes is exceeded. Defaults to "terminate". */
13
+ onLimit?: "terminate" | "continue" | undefined;
14
+ /** Where to save the raw artifact. When undefined, ~/.clai/outputs is used. */
15
+ artifactPath?: string | undefined;
16
+ /** When true, do not allocate an artifact file (used by tests / dry runs). */
17
+ noArtifact?: boolean | undefined;
18
+ }
19
+ export interface SpawnArgvArgs {
20
+ command: string;
21
+ argv: string[];
22
+ cwd?: string | undefined;
23
+ timeoutMs?: number | undefined;
24
+ signal?: AbortSignal | undefined;
25
+ onOutput?: ((chunk: string, stream: "stdout" | "stderr") => void) | undefined;
26
+ maxModelBytes?: number | undefined;
27
+ maxCaptureBytes?: number | undefined;
28
+ onLimit?: "terminate" | "continue" | undefined;
29
+ artifactPath?: string | undefined;
30
+ noArtifact?: boolean | undefined;
31
+ }
32
+ /** A small ring buffer of recent output lines used as the "tail" summary.
33
+ * Exported only for tests. */
34
+ export declare class RingBuffer {
35
+ private readonly capacity;
36
+ private chunks;
37
+ private bytes;
38
+ constructor(capacity: number);
39
+ push(text: string): void;
40
+ toString(): string;
41
+ size(): number;
8
42
  }
9
43
  export declare function shellExec(args: ShellExecArgs): Promise<ToolResult>;
44
+ /**
45
+ * Run a child process with `shell: false`, passing argv directly. Use this
46
+ * for any tool that builds command lines from model-provided strings (eg
47
+ * `net.scan`, `pentest.recon`, `pkg.install`). Sharing argv with the OS
48
+ * shell would let a malicious target turn into "; rm -rf /" — `shell: false`
49
+ * + argv prevents that even if the model is adversarial.
50
+ *
51
+ * The capture pipeline (head + ring-tail + artifact + cap-and-kill + stats)
52
+ * is identical to shellExec.
53
+ */
54
+ export declare function spawnArgv(args: SpawnArgvArgs): Promise<ToolResult>;