@pentoshi/clai 4.11.11 → 4.11.13

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 (314) hide show
  1. package/README.md +31 -3
  2. package/dist/agent/compaction/summary-execution.d.ts +1 -0
  3. package/dist/agent/compaction/summary-execution.js +101 -27
  4. package/dist/agent/compaction/summary-execution.js.map +1 -1
  5. package/dist/agent/compaction-executor.js +3 -3
  6. package/dist/agent/compaction-executor.js.map +1 -1
  7. package/dist/agent/compaction-summary.d.ts +2 -0
  8. package/dist/agent/compaction-summary.js +8 -0
  9. package/dist/agent/compaction-summary.js.map +1 -1
  10. package/dist/agent/context/compact-with-summary.d.ts +1 -0
  11. package/dist/agent/context/compact-with-summary.js +60 -30
  12. package/dist/agent/context/compact-with-summary.js.map +1 -1
  13. package/dist/agent/events.d.ts +1 -0
  14. package/dist/agent/evidence/task-classification.js +0 -1
  15. package/dist/agent/evidence/task-classification.js.map +1 -1
  16. package/dist/agent/evidence/tool-budgets.js +0 -9
  17. package/dist/agent/evidence/tool-budgets.js.map +1 -1
  18. package/dist/agent/loop-guard.js +0 -4
  19. package/dist/agent/loop-guard.js.map +1 -1
  20. package/dist/agent/outcomes.js +1 -1
  21. package/dist/agent/outcomes.js.map +1 -1
  22. package/dist/agent/parser/arg-formatting.js +0 -8
  23. package/dist/agent/parser/arg-formatting.js.map +1 -1
  24. package/dist/agent/parser/bare-recognition.js +0 -4
  25. package/dist/agent/parser/bare-recognition.js.map +1 -1
  26. package/dist/agent/progress.js +0 -26
  27. package/dist/agent/progress.js.map +1 -1
  28. package/dist/agent/request-accounting.d.ts +1 -0
  29. package/dist/agent/request-accounting.js +24 -8
  30. package/dist/agent/request-accounting.js.map +1 -1
  31. package/dist/agent/request-budget.d.ts +3 -0
  32. package/dist/agent/request-budget.js +22 -8
  33. package/dist/agent/request-budget.js.map +1 -1
  34. package/dist/agent/runner.js +1 -2
  35. package/dist/agent/runner.js.map +1 -1
  36. package/dist/agent/session-policy.js +0 -5
  37. package/dist/agent/session-policy.js.map +1 -1
  38. package/dist/agent/stream-recovery.d.ts +4 -0
  39. package/dist/agent/stream-recovery.js +14 -15
  40. package/dist/agent/stream-recovery.js.map +1 -1
  41. package/dist/agent/task-evidence.js +3 -12
  42. package/dist/agent/task-evidence.js.map +1 -1
  43. package/dist/agent/tool-call-parser.js +2 -2
  44. package/dist/agent/tool-call-parser.js.map +1 -1
  45. package/dist/agent/turn/automatic-compaction-execution.d.ts +1 -0
  46. package/dist/agent/turn/automatic-compaction-execution.js +4 -2
  47. package/dist/agent/turn/automatic-compaction-execution.js.map +1 -1
  48. package/dist/agent/turn/compaction-admission.d.ts +5 -1
  49. package/dist/agent/turn/compaction-admission.js +7 -5
  50. package/dist/agent/turn/compaction-admission.js.map +1 -1
  51. package/dist/agent/turn/compaction-coordinator.d.ts +2 -1
  52. package/dist/agent/turn/compaction-coordinator.js +24 -7
  53. package/dist/agent/turn/compaction-coordinator.js.map +1 -1
  54. package/dist/agent/turn/compaction-final-fit.d.ts +1 -1
  55. package/dist/agent/turn/compaction-final-fit.js +5 -4
  56. package/dist/agent/turn/compaction-final-fit.js.map +1 -1
  57. package/dist/agent/turn/compaction-summarizer.js +1 -1
  58. package/dist/agent/turn/compaction-summarizer.js.map +1 -1
  59. package/dist/agent/turn/event-emitter.js +3 -0
  60. package/dist/agent/turn/event-emitter.js.map +1 -1
  61. package/dist/agent/turn/loop/completion-interpretation.js +4 -4
  62. package/dist/agent/turn/loop/completion-interpretation.js.map +1 -1
  63. package/dist/agent/turn/loop/deps.d.ts +2 -1
  64. package/dist/agent/turn/loop/round-request.d.ts +2 -0
  65. package/dist/agent/turn/loop/round-request.js +17 -3
  66. package/dist/agent/turn/loop/round-request.js.map +1 -1
  67. package/dist/agent/turn/loop/run-rounds.js +1 -3
  68. package/dist/agent/turn/loop/run-rounds.js.map +1 -1
  69. package/dist/agent/turn/loop/stream-failure.js +4 -1
  70. package/dist/agent/turn/loop/stream-failure.js.map +1 -1
  71. package/dist/agent/turn/tool-evidence-signals.js +0 -2
  72. package/dist/agent/turn/tool-evidence-signals.js.map +1 -1
  73. package/dist/agent/turn/tool-execution/engagement-checkpoint.js +2 -1
  74. package/dist/agent/turn/tool-execution/engagement-checkpoint.js.map +1 -1
  75. package/dist/agent/turn/tool-execution/guards.js +8 -3
  76. package/dist/agent/turn/tool-execution/guards.js.map +1 -1
  77. package/dist/agent/turn/tool-routing.d.ts +0 -1
  78. package/dist/agent/turn/tool-routing.js +0 -2
  79. package/dist/agent/turn/tool-routing.js.map +1 -1
  80. package/dist/app/adapters/agent-event-adapter.js +3 -0
  81. package/dist/app/adapters/agent-event-adapter.js.map +1 -1
  82. package/dist/app/commands/catalog.js +15 -1
  83. package/dist/app/commands/catalog.js.map +1 -1
  84. package/dist/app/controllers/session-compact-helper.js +59 -45
  85. package/dist/app/controllers/session-compact-helper.js.map +1 -1
  86. package/dist/app/controllers/session-context-usage.js +16 -5
  87. package/dist/app/controllers/session-context-usage.js.map +1 -1
  88. package/dist/app/events/app-event.d.ts +1 -0
  89. package/dist/app/events/app-event.js.map +1 -1
  90. package/dist/commands/providers.js +2 -0
  91. package/dist/commands/providers.js.map +1 -1
  92. package/dist/commands/update/installers.js +17 -2
  93. package/dist/commands/update/installers.js.map +1 -1
  94. package/dist/llm/adapters/anthropic-tools.d.ts +1 -0
  95. package/dist/llm/adapters/anthropic-tools.js +8 -4
  96. package/dist/llm/adapters/anthropic-tools.js.map +1 -1
  97. package/dist/llm/anthropic.d.ts +1 -1
  98. package/dist/llm/anthropic.js +8 -3
  99. package/dist/llm/anthropic.js.map +1 -1
  100. package/dist/llm/capability/state.d.ts +1 -1
  101. package/dist/llm/capability/tool-dialect.js +1 -0
  102. package/dist/llm/capability/tool-dialect.js.map +1 -1
  103. package/dist/llm/capability/vision-patterns.js +12 -0
  104. package/dist/llm/capability/vision-patterns.js.map +1 -1
  105. package/dist/llm/explabs.d.ts +12 -0
  106. package/dist/llm/explabs.js +348 -0
  107. package/dist/llm/explabs.js.map +1 -0
  108. package/dist/llm/key-rotation.d.ts +4 -0
  109. package/dist/llm/key-rotation.js +30 -0
  110. package/dist/llm/key-rotation.js.map +1 -1
  111. package/dist/llm/model-layers/model-rules.js +6 -0
  112. package/dist/llm/model-layers/model-rules.js.map +1 -1
  113. package/dist/llm/provider-identity.js +7 -0
  114. package/dist/llm/provider-identity.js.map +1 -1
  115. package/dist/llm/provider-info-text.js +65 -0
  116. package/dist/llm/provider-info-text.js.map +1 -1
  117. package/dist/llm/provider-profile-layers.js +40 -2
  118. package/dist/llm/provider-profile-layers.js.map +1 -1
  119. package/dist/llm/reasoning-capability.js +19 -1
  120. package/dist/llm/reasoning-capability.js.map +1 -1
  121. package/dist/llm/reasoning-controls.d.ts +1 -0
  122. package/dist/llm/reasoning-controls.js +4 -0
  123. package/dist/llm/reasoning-controls.js.map +1 -1
  124. package/dist/llm/reasoning-errors.js +2 -2
  125. package/dist/llm/reasoning-errors.js.map +1 -1
  126. package/dist/llm/responses/item-events.js +1 -1
  127. package/dist/llm/responses/item-events.js.map +1 -1
  128. package/dist/llm/responses-complete.js +2 -1
  129. package/dist/llm/responses-complete.js.map +1 -1
  130. package/dist/llm/responses-config.d.ts +1 -0
  131. package/dist/llm/responses-config.js.map +1 -1
  132. package/dist/llm/responses-empty-output.d.ts +2 -0
  133. package/dist/llm/responses-empty-output.js +22 -0
  134. package/dist/llm/responses-empty-output.js.map +1 -0
  135. package/dist/llm/responses-parse.js +8 -2
  136. package/dist/llm/responses-parse.js.map +1 -1
  137. package/dist/llm/responses-request.d.ts +1 -0
  138. package/dist/llm/responses-request.js +19 -6
  139. package/dist/llm/responses-request.js.map +1 -1
  140. package/dist/llm/responses-stream-accumulator.js +7 -1
  141. package/dist/llm/responses-stream-accumulator.js.map +1 -1
  142. package/dist/llm/routing/attempt-complete.js +3 -1
  143. package/dist/llm/routing/attempt-complete.js.map +1 -1
  144. package/dist/llm/routing/attempt-stream.js +3 -1
  145. package/dist/llm/routing/attempt-stream.js.map +1 -1
  146. package/dist/llm/routing/error-classification.d.ts +4 -0
  147. package/dist/llm/routing/error-classification.js +34 -0
  148. package/dist/llm/routing/error-classification.js.map +1 -1
  149. package/dist/llm/routing/failure-report.js +4 -2
  150. package/dist/llm/routing/failure-report.js.map +1 -1
  151. package/dist/llm/routing/key-rotation.js +13 -2
  152. package/dist/llm/routing/key-rotation.js.map +1 -1
  153. package/dist/llm/routing/provider-selection.js +3 -0
  154. package/dist/llm/routing/provider-selection.js.map +1 -1
  155. package/dist/llm/token-estimate-calibration.js +20 -3
  156. package/dist/llm/token-estimate-calibration.js.map +1 -1
  157. package/dist/llm/token-usage.d.ts +1 -0
  158. package/dist/llm/token-usage.js +10 -3
  159. package/dist/llm/token-usage.js.map +1 -1
  160. package/dist/llm/tokenrouter.d.ts +11 -0
  161. package/dist/llm/tokenrouter.js +27 -1
  162. package/dist/llm/tokenrouter.js.map +1 -1
  163. package/dist/llm/wire/chat-body.js +10 -1
  164. package/dist/llm/wire/chat-body.js.map +1 -1
  165. package/dist/llm/wire/responses-failure.js +1 -1
  166. package/dist/llm/wire/responses-failure.js.map +1 -1
  167. package/dist/llm/wire/responses-first.js +16 -28
  168. package/dist/llm/wire/responses-first.js.map +1 -1
  169. package/dist/mcp/auth/provider.js +0 -1
  170. package/dist/mcp/auth/provider.js.map +1 -1
  171. package/dist/mcp/format.js +2 -0
  172. package/dist/mcp/format.js.map +1 -1
  173. package/dist/mcp/manager.d.ts +4 -0
  174. package/dist/mcp/manager.js +37 -19
  175. package/dist/mcp/manager.js.map +1 -1
  176. package/dist/mcp/runtime.d.ts +3 -0
  177. package/dist/mcp/runtime.js +50 -25
  178. package/dist/mcp/runtime.js.map +1 -1
  179. package/dist/mcp/schema-compact.d.ts +5 -0
  180. package/dist/mcp/schema-compact.js +157 -0
  181. package/dist/mcp/schema-compact.js.map +1 -0
  182. package/dist/mcp/types.d.ts +1 -1
  183. package/dist/noninteractive/blocks/tool-blocks.js +10 -5
  184. package/dist/noninteractive/blocks/tool-blocks.js.map +1 -1
  185. package/dist/prompts/embedded.js +1 -1
  186. package/dist/prompts/embedded.js.map +1 -1
  187. package/dist/prompts/system.agent.md +4 -6
  188. package/dist/safety/classifier.js +0 -8
  189. package/dist/safety/classifier.js.map +1 -1
  190. package/dist/safety/engagement-policy.js +0 -23
  191. package/dist/safety/engagement-policy.js.map +1 -1
  192. package/dist/safety/tool-classification.js +0 -15
  193. package/dist/safety/tool-classification.js.map +1 -1
  194. package/dist/session-runtime/binding.d.ts +1 -0
  195. package/dist/session-runtime/binding.js +7 -0
  196. package/dist/session-runtime/binding.js.map +1 -1
  197. package/dist/session-runtime/child-bridge.d.ts +1 -0
  198. package/dist/session-runtime/child-bridge.js +3 -0
  199. package/dist/session-runtime/child-bridge.js.map +1 -1
  200. package/dist/session-runtime/discovery.js +1 -0
  201. package/dist/session-runtime/discovery.js.map +1 -1
  202. package/dist/session-runtime/host.d.ts +1 -0
  203. package/dist/session-runtime/host.js +9 -3
  204. package/dist/session-runtime/host.js.map +1 -1
  205. package/dist/session-runtime/reaper.d.ts +1 -0
  206. package/dist/session-runtime/reaper.js +7 -2
  207. package/dist/session-runtime/reaper.js.map +1 -1
  208. package/dist/session-runtime/store.js +1 -0
  209. package/dist/session-runtime/store.js.map +1 -1
  210. package/dist/session-runtime/types.d.ts +3 -0
  211. package/dist/store/config.js +1 -0
  212. package/dist/store/config.js.map +1 -1
  213. package/dist/tools/capabilities.js +4 -16
  214. package/dist/tools/capabilities.js.map +1 -1
  215. package/dist/tools/definitions/aggregate.js +2 -6
  216. package/dist/tools/definitions/aggregate.js.map +1 -1
  217. package/dist/tools/definitions/define.js +0 -8
  218. package/dist/tools/definitions/define.js.map +1 -1
  219. package/dist/tools/definitions/files.js +6 -1
  220. package/dist/tools/definitions/files.js.map +1 -1
  221. package/dist/tools/definitions/network.d.ts +2 -0
  222. package/dist/tools/definitions/network.js +17 -0
  223. package/dist/tools/definitions/network.js.map +1 -0
  224. package/dist/tools/definitions/orchestration.js +1 -1
  225. package/dist/tools/definitions/selection.js +1 -4
  226. package/dist/tools/definitions/selection.js.map +1 -1
  227. package/dist/tools/fs/search.d.ts +21 -2
  228. package/dist/tools/fs/search.js +394 -93
  229. package/dist/tools/fs/search.js.map +1 -1
  230. package/dist/tools/handlers/files-1.js.map +1 -1
  231. package/dist/tools/handlers/network-3.js +0 -4
  232. package/dist/tools/handlers/network-3.js.map +1 -1
  233. package/dist/tools/handlers/shell-2.js +0 -18
  234. package/dist/tools/handlers/shell-2.js.map +1 -1
  235. package/dist/tools/net-ping-sweep.js +1 -1
  236. package/dist/tools/net-ping-sweep.js.map +1 -1
  237. package/dist/tools/policies/output-policy.js +0 -3
  238. package/dist/tools/policies/output-policy.js.map +1 -1
  239. package/dist/tools/registry.d.ts +0 -9
  240. package/dist/tools/registry.js +0 -24
  241. package/dist/tools/registry.js.map +1 -1
  242. package/dist/tools/shell/exec-attempt.js +15 -2
  243. package/dist/tools/shell/exec-attempt.js.map +1 -1
  244. package/dist/tui-v2/components/transcript/file-diff-card.d.ts +1 -0
  245. package/dist/tui-v2/components/transcript/file-diff-card.js +30 -10
  246. package/dist/tui-v2/components/transcript/file-diff-card.js.map +1 -1
  247. package/dist/tui-v2/components/transcript/tool-card.d.ts +1 -0
  248. package/dist/tui-v2/components/transcript/tool-card.js +4 -2
  249. package/dist/tui-v2/components/transcript/tool-card.js.map +1 -1
  250. package/dist/tui-v2/components/transcript/transcript-row.js +1 -1
  251. package/dist/tui-v2/components/transcript/transcript-row.js.map +1 -1
  252. package/dist/types.d.ts +2 -1
  253. package/dist/types.js +1 -0
  254. package/dist/types.js.map +1 -1
  255. package/dist/ui-core/bootstrap/composition-root.js +1 -1
  256. package/dist/ui-core/bootstrap/composition-root.js.map +1 -1
  257. package/dist/ui-core/commands/mcp-commands.js +41 -11
  258. package/dist/ui-core/commands/mcp-commands.js.map +1 -1
  259. package/dist/ui-core/plan/plan-lifecycle.js +1 -1
  260. package/dist/ui-core/plan/plan-lifecycle.js.map +1 -1
  261. package/dist/ui-core/rendering/file-diff-view.d.ts +9 -0
  262. package/dist/ui-core/rendering/file-diff-view.js +20 -1
  263. package/dist/ui-core/rendering/file-diff-view.js.map +1 -1
  264. package/dist/ui-core/rendering/syntax/clike.d.ts +1 -0
  265. package/dist/ui-core/rendering/syntax/clike.js.map +1 -1
  266. package/dist/ui-core/rendering/syntax/language-highlighters.d.ts +1 -0
  267. package/dist/ui-core/rendering/syntax/language-highlighters.js +256 -0
  268. package/dist/ui-core/rendering/syntax/language-highlighters.js.map +1 -1
  269. package/dist/ui-core/rendering/syntax-highlight.js +2 -2
  270. package/dist/ui-core/rendering/syntax-highlight.js.map +1 -1
  271. package/dist/ui-core/state/transcript/apply-app-event.js +3 -1
  272. package/dist/ui-core/state/transcript/apply-app-event.js.map +1 -1
  273. package/dist/version.generated.d.ts +2 -2
  274. package/dist/version.generated.js +2 -2
  275. package/package.json +1 -1
  276. package/dist/tools/definitions/network-1.d.ts +0 -2
  277. package/dist/tools/definitions/network-1.js +0 -72
  278. package/dist/tools/definitions/network-1.js.map +0 -1
  279. package/dist/tools/definitions/network-2.d.ts +0 -2
  280. package/dist/tools/definitions/network-2.js +0 -22
  281. package/dist/tools/definitions/network-2.js.map +0 -1
  282. package/dist/tools/definitions/pentest.d.ts +0 -2
  283. package/dist/tools/definitions/pentest.js +0 -91
  284. package/dist/tools/definitions/pentest.js.map +0 -1
  285. package/dist/tools/dns-native.d.ts +0 -3
  286. package/dist/tools/dns-native.js +0 -165
  287. package/dist/tools/dns-native.js.map +0 -1
  288. package/dist/tools/handlers/network-1.d.ts +0 -2
  289. package/dist/tools/handlers/network-1.js +0 -52
  290. package/dist/tools/handlers/network-1.js.map +0 -1
  291. package/dist/tools/handlers/network-2.d.ts +0 -2
  292. package/dist/tools/handlers/network-2.js +0 -32
  293. package/dist/tools/handlers/network-2.js.map +0 -1
  294. package/dist/tools/handlers/nmap-preparation.d.ts +0 -13
  295. package/dist/tools/handlers/nmap-preparation.js +0 -66
  296. package/dist/tools/handlers/nmap-preparation.js.map +0 -1
  297. package/dist/tools/handlers/pentest.d.ts +0 -2
  298. package/dist/tools/handlers/pentest.js +0 -208
  299. package/dist/tools/handlers/pentest.js.map +0 -1
  300. package/dist/tools/network-context.d.ts +0 -22
  301. package/dist/tools/network-context.js +0 -130
  302. package/dist/tools/network-context.js.map +0 -1
  303. package/dist/tools/nmap-runner.d.ts +0 -10
  304. package/dist/tools/nmap-runner.js +0 -240
  305. package/dist/tools/nmap-runner.js.map +0 -1
  306. package/dist/tools/pentest-workflows.d.ts +0 -8
  307. package/dist/tools/pentest-workflows.js +0 -175
  308. package/dist/tools/pentest-workflows.js.map +0 -1
  309. package/dist/tools/validate.d.ts +0 -26
  310. package/dist/tools/validate.js +0 -373
  311. package/dist/tools/validate.js.map +0 -1
  312. package/dist/tools/whois-native.d.ts +0 -2
  313. package/dist/tools/whois-native.js +0 -78
  314. package/dist/tools/whois-native.js.map +0 -1
@@ -1,208 +0,0 @@
1
- import { responderJobOptions } from "./responder-job-options.js";
2
- import { spawnArgv } from "../shell.js";
3
- import { parseHost, } from "../validate.js";
4
- import { jobManager } from "../jobs.js";
5
- import { runNmapScan } from "../nmap-runner.js";
6
- import { compareAuthorizationContexts, discoverWebSurface, enumerateApi, } from "../pentest-workflows.js";
7
- import { nativeDnsLookup } from "../dns-native.js";
8
- import { nativeWhoisLookup } from "../whois-native.js";
9
- import { optionalNumber, optionalString, requireString, } from "./args.js";
10
- import { buildPentestReconNmapArgv, prepareDurableNmapJob, } from "./nmap-preparation.js";
11
- import { estimateScanResources } from "../registry.js";
12
- export const toolRegistry_PENTEST = {
13
- async "pentest.recon"(args, options) {
14
- const host = parseHost(requireString(args, "target"));
15
- const wantWhois = args.whois !== false;
16
- const wantDns = args.dns !== false;
17
- const wantNmap = args.nmap !== false;
18
- const nmapArgv = buildPentestReconNmapArgv(args, host.value);
19
- const allSteps = [
20
- { key: "whois", command: "whois", argv: [host.value] },
21
- {
22
- key: "dns",
23
- command: "dig",
24
- argv: [host.value, "ANY", "+noall", "+answer"],
25
- },
26
- {
27
- key: "nmap",
28
- command: "nmap",
29
- argv: nmapArgv,
30
- },
31
- ];
32
- const steps = allSteps.filter((step) => {
33
- if (step.key === "whois")
34
- return wantWhois;
35
- if (step.key === "dns")
36
- return wantDns;
37
- if (step.key === "nmap")
38
- return wantNmap;
39
- return true;
40
- });
41
- if (steps.length === 0) {
42
- return {
43
- ok: false,
44
- output: "pentest.recon: no steps requested. Set at least one of whois|dns|nmap to true, or omit them all for a full sweep.",
45
- exitCode: 1,
46
- };
47
- }
48
- const { mkdir, writeFile } = await import("node:fs/promises");
49
- const { join } = await import("node:path");
50
- const { getArtifactDir } = await import("../../store/paths.js");
51
- const artifactDir = getArtifactDir();
52
- let artifactPath;
53
- try {
54
- await mkdir(artifactDir, { recursive: true, mode: 0o700 });
55
- const safeHost = host.value.replace(/[^a-z0-9_.-]+/gi, "-");
56
- artifactPath = join(artifactDir, `${new Date().toISOString().replace(/[:.]/g, "-")}-recon-${safeHost}.txt`);
57
- }
58
- catch {
59
- artifactPath = undefined;
60
- }
61
- const outputs = [];
62
- const transcript = [];
63
- let anyOk = false;
64
- const userAborted = () => Boolean(options?.signal?.aborted);
65
- const runStep = async (step) => {
66
- const display = `${step.command} ${step.argv.join(" ")}`;
67
- options?.onOutput?.(`\n$ ${display}\n`, "stdout");
68
- const beat = setInterval(() => {
69
- options?.onOutput?.(`[recon] ${step.key} still running…\n`, "stdout");
70
- }, 5_000);
71
- beat.unref?.();
72
- try {
73
- if (step.key === "nmap") {
74
- const estimate = estimateScanResources(step.argv);
75
- if (args.background === true || args.responder === true) {
76
- const prepared = await prepareDurableNmapJob(step.argv, options, "Enter your password for the durable nmap raw-socket scan. It is sent only to sudo stdin and is never stored. Esc cancels.");
77
- const result = prepared.prepared
78
- ? await jobManager.startJob(prepared.spec, {
79
- name: `recon-${estimate.profile}-${host.value}`,
80
- profile: estimate.profile,
81
- estimatedSeconds: estimate.estimatedSeconds,
82
- ...responderJobOptions(options),
83
- responder: args.responder === true,
84
- wakeOnCompletion: args.responder === true,
85
- ...(options?.engagementAuthorization
86
- ? { authorization: options.engagementAuthorization }
87
- : {}),
88
- })
89
- : prepared.result;
90
- return { key: step.key, display, result };
91
- }
92
- return {
93
- key: step.key,
94
- display,
95
- result: await runNmapScan(step.argv, options, optionalNumber(args, "timeoutMs")),
96
- };
97
- }
98
- if (step.key === "dns") {
99
- return {
100
- key: step.key,
101
- display: `native DNS ANY ${host.value}`,
102
- result: await nativeDnsLookup(host.value, "ANY"),
103
- };
104
- }
105
- if (step.key === "whois") {
106
- return {
107
- key: step.key,
108
- display: `native WHOIS ${host.value}`,
109
- result: await nativeWhoisLookup(host.value),
110
- };
111
- }
112
- const timeoutMs = step.key === "whois" ? 20_000 : 30_000;
113
- return {
114
- key: step.key,
115
- display,
116
- result: await spawnArgv({
117
- command: step.command,
118
- argv: step.argv,
119
- timeoutMs,
120
- signal: options?.signal,
121
- onOutput: options?.onOutput,
122
- }),
123
- };
124
- }
125
- catch (error) {
126
- return {
127
- key: step.key,
128
- display,
129
- result: {
130
- ok: false,
131
- output: `${step.key} error: ${error instanceof Error ? error.message : String(error)}`,
132
- exitCode: 1,
133
- },
134
- };
135
- }
136
- finally {
137
- clearInterval(beat);
138
- }
139
- };
140
- const completed = await Promise.all(steps.map(runStep));
141
- for (const { display, result } of completed) {
142
- transcript.push(`$ ${display}`, result.output);
143
- outputs.push(result.output);
144
- if (result.ok)
145
- anyOk = true;
146
- }
147
- if (artifactPath) {
148
- const body = transcript.join("\n\n");
149
- try {
150
- await writeFile(artifactPath, body, { encoding: "utf8", mode: 0o600 });
151
- }
152
- catch {
153
- artifactPath = undefined;
154
- }
155
- }
156
- const aborted = userAborted();
157
- const nmapResult = completed.find((entry) => entry.key === "nmap")?.result;
158
- const requestedScanFailed = wantNmap && Boolean(nmapResult && !nmapResult.ok);
159
- const backgroundJob = completed.find((entry) => entry.result.backgroundJob)
160
- ?.result.backgroundJob;
161
- const output = outputs.join("\n\n");
162
- return {
163
- ok: !aborted && anyOk && !requestedScanFailed,
164
- output: aborted
165
- ? `${output}\n\nCommand aborted.`.trim()
166
- : requestedScanFailed
167
- ? `${output}\n\nThe requested nmap scan failed or was not started; passive recon results above are partial only.`.trim()
168
- : output,
169
- exitCode: aborted ? 130 : anyOk && !requestedScanFailed ? 0 : 1,
170
- ...(artifactPath ? { outputPath: artifactPath } : {}),
171
- ...(backgroundJob ? { backgroundJob } : {}),
172
- };
173
- },
174
- async "pentest.webDiscover"(args, options) {
175
- const paths = Array.isArray(args.paths)
176
- ? args.paths.filter((value) => typeof value === "string")
177
- : [];
178
- return discoverWebSurface(requireString(args, "baseUrl"), paths, options);
179
- },
180
- async "pentest.apiEnumerate"(args, options) {
181
- return enumerateApi(requireString(args, "specUrl"), options);
182
- },
183
- async "pentest.authCompare"(args, options) {
184
- const contexts = Array.isArray(args.contexts)
185
- ? args.contexts.filter((value) => {
186
- if (!value || typeof value !== "object" || Array.isArray(value))
187
- return false;
188
- const candidate = value;
189
- return (typeof candidate.label === "string" &&
190
- Boolean(candidate.headers) &&
191
- typeof candidate.headers === "object" &&
192
- !Array.isArray(candidate.headers));
193
- })
194
- : [];
195
- return compareAuthorizationContexts(requireString(args, "url"), contexts, options);
196
- },
197
- async "pentest.scanStatus"(args) {
198
- const offset = optionalNumber(args, "offset");
199
- const bytes = optionalNumber(args, "bytes");
200
- const stream = optionalString(args, "stream");
201
- return jobManager.tailJob(requireString(args, "id"), {
202
- ...(offset !== undefined ? { offset } : {}),
203
- ...(bytes !== undefined ? { bytes } : {}),
204
- ...(stream !== undefined ? { stream } : {}),
205
- });
206
- },
207
- };
208
- //# sourceMappingURL=pentest.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"pentest.js","sourceRoot":"","sources":["../../../src/tools/handlers/pentest.ts"],"names":[],"mappings":"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"}
@@ -1,22 +0,0 @@
1
- import type { ToolResult } from "../types.js";
2
- export interface NetworkInterfaceInfo {
3
- name: string;
4
- address: string;
5
- family: "IPv4" | "IPv6";
6
- netmask?: string | undefined;
7
- cidr?: string | undefined;
8
- mac?: string | undefined;
9
- internal: boolean;
10
- defaultRoute?: boolean | undefined;
11
- gateway?: string | undefined;
12
- }
13
- export interface NetworkContextResult {
14
- hostname: string;
15
- platform: NodeJS.Platform;
16
- interfaces: NetworkInterfaceInfo[];
17
- candidates: NetworkInterfaceInfo[];
18
- selected?: NetworkInterfaceInfo | undefined;
19
- warnings?: string[] | undefined;
20
- }
21
- export declare function netmaskToCidr(netmask: string): number | undefined;
22
- export declare function getNetworkContext(): Promise<ToolResult>;
@@ -1,130 +0,0 @@
1
- import { networkInterfaces, hostname, platform } from "node:os";
2
- import { execSync } from "node:child_process";
3
- export function netmaskToCidr(netmask) {
4
- const parts = netmask.split(".");
5
- if (parts.length !== 4)
6
- return undefined;
7
- let bits = 0;
8
- for (const part of parts) {
9
- const n = Number(part);
10
- if (Number.isNaN(n) || n < 0 || n > 255)
11
- return undefined;
12
- bits += n.toString(2).split("1").length - 1;
13
- }
14
- return bits;
15
- }
16
- function isPrivateV4(address) {
17
- const parts = address.split(".").map(Number);
18
- const [a, b] = parts;
19
- if (a === 10)
20
- return true;
21
- if (a === 172 && b !== undefined && b >= 16 && b <= 31)
22
- return true;
23
- if (a === 192 && b === 168)
24
- return true;
25
- if (a === 169 && b === 254)
26
- return true;
27
- return false;
28
- }
29
- function detectGateway() {
30
- const os = platform();
31
- try {
32
- if (os === "darwin") {
33
- const out = execSync("route -n get default 2>/dev/null", {
34
- timeout: 5_000,
35
- encoding: "utf8",
36
- });
37
- const match = /gateway:\s+(\S+)/i.exec(out);
38
- return match?.[1];
39
- }
40
- if (os === "linux") {
41
- const out = execSync("ip route show default 2>/dev/null", {
42
- timeout: 5_000,
43
- encoding: "utf8",
44
- });
45
- const match = /via\s+(\S+)/i.exec(out);
46
- return match?.[1];
47
- }
48
- if (os === "win32") {
49
- const out = execSync('powershell -Command "(Get-NetRoute -DestinationPrefix 0.0.0.0/0 | Select-Object -First 1).NextHop"', { timeout: 5_000, encoding: "utf8" });
50
- const trimmed = out.trim();
51
- return trimmed || undefined;
52
- }
53
- }
54
- catch {
55
- }
56
- return undefined;
57
- }
58
- function sameSubnet(addr, gateway, prefix) {
59
- const toBits = (ip) => {
60
- const parts = ip.split(".").map(Number);
61
- return ((parts[0] << 24) | (parts[1] << 16) | (parts[2] << 8) | parts[3]) >>> 0;
62
- };
63
- const mask = prefix === 0 ? 0 : (~0 << (32 - prefix)) >>> 0;
64
- return (toBits(addr) & mask) === (toBits(gateway) & mask);
65
- }
66
- export async function getNetworkContext() {
67
- const ifaces = networkInterfaces();
68
- const all = [];
69
- const warnings = [];
70
- const gateway = detectGateway();
71
- for (const [name, addrs] of Object.entries(ifaces)) {
72
- if (!addrs)
73
- continue;
74
- for (const addr of addrs) {
75
- all.push({
76
- name,
77
- address: addr.address,
78
- family: addr.family,
79
- netmask: addr.netmask,
80
- cidr: addr.cidr ?? undefined,
81
- mac: addr.mac,
82
- internal: addr.internal,
83
- });
84
- }
85
- }
86
- const candidates = all.filter((iface) => iface.family === "IPv4" &&
87
- !iface.internal &&
88
- isPrivateV4(iface.address));
89
- let selected;
90
- if (gateway && candidates.length > 0) {
91
- for (const candidate of candidates) {
92
- const prefix = candidate.netmask
93
- ? netmaskToCidr(candidate.netmask)
94
- : undefined;
95
- if (prefix !== undefined && sameSubnet(candidate.address, gateway, prefix)) {
96
- selected = {
97
- ...candidate,
98
- defaultRoute: true,
99
- gateway,
100
- };
101
- break;
102
- }
103
- }
104
- if (!selected && candidates.length > 0) {
105
- selected = { ...candidates[0], gateway };
106
- }
107
- }
108
- else if (candidates.length === 1) {
109
- selected = candidates[0];
110
- }
111
- else if (candidates.length > 1) {
112
- warnings.push(`Multiple network interfaces found (${candidates.map((c) => `${c.name}:${c.address}`).join(", ")}). Could not determine default route.`);
113
- }
114
- else {
115
- warnings.push("No active private IPv4 interfaces detected.");
116
- }
117
- const result = {
118
- hostname: hostname(),
119
- platform: platform(),
120
- interfaces: all,
121
- candidates,
122
- selected,
123
- warnings: warnings.length > 0 ? warnings : undefined,
124
- };
125
- return {
126
- ok: candidates.length > 0,
127
- output: JSON.stringify(result, null, 2),
128
- };
129
- }
130
- //# sourceMappingURL=network-context.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"network-context.js","sourceRoot":"","sources":["../../src/tools/network-context.ts"],"names":[],"mappings":"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"}
@@ -1,10 +0,0 @@
1
- import type { ToolResult } from "../types.js";
2
- import type { ToolRunOptions } from "./tool-types.js";
3
- export type NmapScanDepth = "standard" | "deep" | "full";
4
- export interface NmapTimeoutPolicy {
5
- readonly depth: NmapScanDepth;
6
- readonly timeoutMs: number;
7
- readonly source: "profile" | "environment" | "call";
8
- }
9
- export declare function resolveNmapTimeoutPolicy(argv: readonly string[], env?: NodeJS.ProcessEnv): NmapTimeoutPolicy;
10
- export declare function runNmapScan(argv: string[], options?: ToolRunOptions, timeoutMsOverride?: number): Promise<ToolResult>;
@@ -1,240 +0,0 @@
1
- import { platform } from "node:os";
2
- import { commandAvailable } from "../os/pkgmgr.js";
3
- import { evictSudoSession, formatSudoStdinPassword, looksLikeSudoAuthError, obtainSudoPassword, } from "./sudo-session.js";
4
- import { getAllowInteractiveStdinInherit, spawnArgv, } from "./shell.js";
5
- import { isNmapSingleHostTarget, looksLikeNmapNoHostsUp, nmapArgvHasPn, nmapScanNeedsPrivilege, toConnectScanArgv, withNmapSkipDiscovery, } from "./validate.js";
6
- async function elevationPrefix() {
7
- if (process.getuid && process.getuid() === 0) {
8
- return { command: "", argv: [] };
9
- }
10
- if (platform() === "win32") {
11
- if (await commandAvailable("sudo"))
12
- return { command: "sudo", argv: [] };
13
- if (await commandAvailable("gsudo"))
14
- return { command: "gsudo", argv: [] };
15
- return undefined;
16
- }
17
- if (await commandAvailable("sudo")) {
18
- return { command: "sudo", argv: ["-p", "[clai] sudo password for nmap: "] };
19
- }
20
- if (await commandAvailable("doas"))
21
- return { command: "doas", argv: [] };
22
- return undefined;
23
- }
24
- function looksLikePrivilegeError(output) {
25
- return /(?:requires root privileges|you (?:requested|need) (?:a scan type|root)|operation not permitted|must (?:be|run as) root|raw sockets?|sudo: (?:a (?:password|terminal) is required|no askpass|3 incorrect)|incorrect password|authentication failure|permission denied|requires (?:administrator|elevation))/i.test(output);
26
- }
27
- function canInteractiveSudo() {
28
- return Boolean(process.stdin.isTTY);
29
- }
30
- const NMAP_TIMEOUTS_MS = {
31
- standard: 5 * 60_000,
32
- deep: 15 * 60_000,
33
- full: 45 * 60_000,
34
- };
35
- export function resolveNmapTimeoutPolicy(argv, env = process.env) {
36
- const configured = Number(env.CLAI_NMAP_TIMEOUT_MS);
37
- if (Number.isSafeInteger(configured) && configured >= 30_000) {
38
- return { depth: inferNmapScanDepth(argv), timeoutMs: configured, source: "environment" };
39
- }
40
- const depth = inferNmapScanDepth(argv);
41
- return { depth, timeoutMs: NMAP_TIMEOUTS_MS[depth], source: "profile" };
42
- }
43
- function inferNmapScanDepth(argv) {
44
- if (argv.includes("-p-"))
45
- return "full";
46
- const portsIndex = argv.findIndex((arg) => arg === "-p");
47
- const portSpec = portsIndex >= 0 ? argv[portsIndex + 1] ?? "" : "";
48
- if (/^(?:1-65535|1-65534|0-65535)$/.test(portSpec))
49
- return "full";
50
- const explicitPorts = portSpec ? portSpec.split(",").length : 0;
51
- const topPortsIndex = argv.findIndex((arg) => arg === "--top-ports");
52
- const topPorts = topPortsIndex >= 0 ? Number(argv[topPortsIndex + 1]) : 0;
53
- const hasDeepEnumeration = argv.some((arg) => arg === "-sV" || arg === "-sC" || arg === "-A" || arg.startsWith("--script"));
54
- if (topPorts > 1_000 || explicitPorts > 1_000 || hasDeepEnumeration)
55
- return "deep";
56
- return "standard";
57
- }
58
- export async function runNmapScan(argv, options, timeoutMsOverride) {
59
- let scanArgv = isNmapSingleHostTarget(argv) && !nmapArgvHasPn(argv)
60
- ? withNmapSkipDiscovery(argv)
61
- : [...argv];
62
- const needsPrivilege = nmapScanNeedsPrivilege(scanArgv);
63
- const prefix = needsPrivilege ? await elevationPrefix() : undefined;
64
- const attempts = [];
65
- if (needsPrivilege && prefix) {
66
- if (prefix.command === "sudo") {
67
- const useSecret = Boolean(options?.requestSecret);
68
- const useTty = !useSecret &&
69
- canInteractiveSudo() &&
70
- getAllowInteractiveStdinInherit();
71
- if (!useSecret && !useTty) {
72
- options?.onOutput?.("\nCannot prompt for sudo password in this UI without freezing it. Using an unprivileged TCP connect scan (-sT -Pn).\n", "stderr");
73
- }
74
- else {
75
- options?.onOutput?.(useSecret
76
- ? "\nAdministrator access is required for a stealth scan. Complete the secure password prompt below.\n"
77
- : "\nAdministrator access is required for a stealth scan. Enter your sudo password below; Ctrl+C cancels.\n", "stdout");
78
- if (useSecret && options?.requestSecret) {
79
- const auth = await obtainSudoPassword({
80
- requestSecret: options.requestSecret,
81
- title: "Administrator access",
82
- prompt: "Enter your password for sudo (nmap raw-socket scan). It is sent only to sudo, kept in memory for a few minutes so parallel privileged scans don't ask again, and never written to disk. Esc cancels.",
83
- ...(options.signal ? { signal: options.signal } : {}),
84
- ...(options.onOutput ? { onOutput: options.onOutput } : {}),
85
- });
86
- if (auth.status === "cancelled") {
87
- options?.onOutput?.("\nSudo cancelled — falling back to unprivileged TCP connect scan (-sT -Pn).\n", "stderr");
88
- }
89
- else if (auth.status === "failed") {
90
- const detail = auth.detail ? `\n${auth.detail}` : "";
91
- options?.onOutput?.(`\nSudo authentication failed; using an unprivileged TCP connect scan instead.${detail}\n`, "stderr");
92
- }
93
- else {
94
- attempts.push({
95
- command: "sudo",
96
- argv: ["-S", "-p", "", "nmap", ...scanArgv],
97
- stdinText: formatSudoStdinPassword(auth.password),
98
- interactiveStdin: false,
99
- note: "Administrator access confirmed. Starting stealth scan (ESC cancels).",
100
- });
101
- }
102
- }
103
- else {
104
- const auth = await spawnArgv({
105
- command: "sudo",
106
- argv: [...prefix.argv, "-v"],
107
- timeoutMs: 120_000,
108
- signal: options?.signal,
109
- onOutput: options?.onOutput,
110
- interactiveStdin: true,
111
- noArtifact: true,
112
- });
113
- if (options?.signal?.aborted)
114
- return auth;
115
- if (auth.exitCode === 130) {
116
- options?.onOutput?.("\nSudo authentication was cancelled; using an unprivileged TCP connect scan instead. Authentication will not be reopened automatically.\n", "stderr");
117
- }
118
- else if (auth.ok) {
119
- attempts.push({
120
- command: "sudo",
121
- argv: ["-n", "nmap", ...scanArgv],
122
- interactiveStdin: false,
123
- note: "Administrator access confirmed. Starting stealth scan (ESC cancels).",
124
- });
125
- }
126
- else {
127
- const detail = auth.output?.trim()
128
- ? `\n${auth.output.trim().slice(0, 400)}`
129
- : "";
130
- options?.onOutput?.(`\nSudo authentication failed or was not completed; using an unprivileged TCP connect scan instead.${detail}\n`, "stderr");
131
- }
132
- }
133
- }
134
- }
135
- else if (prefix.command) {
136
- if (getAllowInteractiveStdinInherit()) {
137
- attempts.push({
138
- command: prefix.command,
139
- argv: [...prefix.argv, "nmap", ...scanArgv],
140
- interactiveStdin: true,
141
- note: `Running a stealth scan with ${prefix.command} (you may be prompted for your password).`,
142
- });
143
- }
144
- else {
145
- options?.onOutput?.(`\n${prefix.command} would need a TTY password prompt (blocked in this UI). Using unprivileged TCP connect scan (-sT -Pn).\n`, "stderr");
146
- }
147
- }
148
- else {
149
- attempts.push({ command: "nmap", argv: scanArgv, interactiveStdin: false });
150
- }
151
- const connectArgv = withNmapSkipDiscovery(toConnectScanArgv(scanArgv));
152
- attempts.push({
153
- command: "nmap",
154
- argv: connectArgv,
155
- note: "Privileged scan unavailable — falling back to an unprivileged TCP connect scan (-sT -Pn).",
156
- });
157
- }
158
- else if (needsPrivilege && !prefix) {
159
- attempts.push({
160
- command: "nmap",
161
- argv: withNmapSkipDiscovery(toConnectScanArgv(scanArgv)),
162
- note: platform() === "win32"
163
- ? "No elevation helper found (sudo/gsudo). Run from an Administrator terminal with Npcap for a SYN scan; using a TCP connect scan (-sT -Pn) for now."
164
- : "No sudo/doas available for a raw-socket SYN scan — using an unprivileged TCP connect scan (-sT -Pn) instead.",
165
- });
166
- }
167
- else {
168
- attempts.push({ command: "nmap", argv: scanArgv });
169
- }
170
- const configuredPolicy = resolveNmapTimeoutPolicy(scanArgv);
171
- const timeoutPolicy = typeof timeoutMsOverride === "number" && Number.isFinite(timeoutMsOverride)
172
- ? {
173
- ...configuredPolicy,
174
- timeoutMs: Math.max(1_000, Math.min(30 * 60_000, Math.floor(timeoutMsOverride))),
175
- source: "call",
176
- }
177
- : configuredPolicy;
178
- options?.onOutput?.(`[nmap] ${timeoutPolicy.depth} scan timeout: ${Math.round(timeoutPolicy.timeoutMs / 60_000)}m (${timeoutPolicy.source})\n`, "stdout");
179
- let last;
180
- for (let i = 0; i < attempts.length; i += 1) {
181
- const attempt = attempts[i];
182
- if (options?.signal?.aborted) {
183
- return { ok: false, output: "Command aborted.", exitCode: 130 };
184
- }
185
- if (attempt.note)
186
- options?.onOutput?.(`\n${attempt.note}\n`, "stdout");
187
- let result = await spawnArgv({
188
- command: attempt.command,
189
- argv: attempt.argv,
190
- stdinText: attempt.stdinText,
191
- timeoutMs: timeoutPolicy.timeoutMs,
192
- signal: options?.signal,
193
- onOutput: options?.onOutput,
194
- ...(attempt.interactiveStdin !== undefined
195
- ? { interactiveStdin: attempt.interactiveStdin }
196
- : {}),
197
- });
198
- if (result.ok &&
199
- looksLikeNmapNoHostsUp(result.output) &&
200
- !nmapArgvHasPn(attempt.argv) &&
201
- isNmapSingleHostTarget(attempt.argv)) {
202
- options?.onOutput?.("\nHost discovery reported no hosts up — retrying once with -Pn (treat host as online).\n", "stdout");
203
- result = await spawnArgv({
204
- command: attempt.command,
205
- argv: withNmapSkipDiscovery(attempt.argv),
206
- stdinText: attempt.stdinText,
207
- timeoutMs: timeoutPolicy.timeoutMs,
208
- signal: options?.signal,
209
- onOutput: options?.onOutput,
210
- ...(attempt.interactiveStdin !== undefined
211
- ? { interactiveStdin: attempt.interactiveStdin }
212
- : {}),
213
- });
214
- }
215
- last = result;
216
- if (!result.ok &&
217
- attempt.stdinText !== undefined &&
218
- looksLikeSudoAuthError(result.output)) {
219
- evictSudoSession();
220
- }
221
- const isLastAttempt = i === attempts.length - 1;
222
- if (result.ok || isLastAttempt || !looksLikePrivilegeError(result.output)) {
223
- if (result.ok &&
224
- looksLikeNmapNoHostsUp(result.output) &&
225
- isNmapSingleHostTarget(attempt.argv)) {
226
- return {
227
- ...result,
228
- output: result.output +
229
- "\n\nNote: nmap still reported no live host/open ports after -Pn. " +
230
- "The target may be offline, firewalled, or blocking this host. " +
231
- "Do not retry the same net.scan args in a loop — try different ports, " +
232
- "confirm the IP with net.context / net.pingSweep, or use shell.exec for a custom nmap line.",
233
- };
234
- }
235
- return result;
236
- }
237
- }
238
- return last ?? { ok: false, output: "nmap produced no result.", exitCode: 1 };
239
- }
240
- //# sourceMappingURL=nmap-runner.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"nmap-runner.js","sourceRoot":"","sources":["../../src/tools/nmap-runner.ts"],"names":[],"mappings":"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"}