@integsec/agentic-pentest-proxy 0.2.5 → 0.2.6

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 (146) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +250 -54
  3. package/dist/bin/integsec-agentic-pentest-manifest.d.ts +3 -0
  4. package/dist/bin/integsec-agentic-pentest-manifest.d.ts.map +1 -0
  5. package/dist/bin/integsec-agentic-pentest-manifest.js +180 -0
  6. package/dist/bin/integsec-agentic-pentest-manifest.js.map +1 -0
  7. package/dist/bin/integsec-agentic-pentest-proxy.d.ts +1 -1
  8. package/dist/bin/integsec-agentic-pentest-proxy.d.ts.map +1 -1
  9. package/dist/bin/integsec-agentic-pentest-proxy.js +8 -4
  10. package/dist/bin/integsec-agentic-pentest-proxy.js.map +1 -1
  11. package/dist/src/audit/azure-monitor.d.ts +2 -2
  12. package/dist/src/audit/azure-monitor.d.ts.map +1 -1
  13. package/dist/src/audit/azure-monitor.js +8 -5
  14. package/dist/src/audit/azure-monitor.js.map +1 -1
  15. package/dist/src/audit/cloudwatch.d.ts.map +1 -1
  16. package/dist/src/audit/cloudwatch.js.map +1 -1
  17. package/dist/src/audit/gcp-logging.d.ts.map +1 -1
  18. package/dist/src/audit/gcp-logging.js +4 -6
  19. package/dist/src/audit/gcp-logging.js.map +1 -1
  20. package/dist/src/audit/index.d.ts +7 -0
  21. package/dist/src/audit/index.d.ts.map +1 -1
  22. package/dist/src/audit/index.js +11 -1
  23. package/dist/src/audit/index.js.map +1 -1
  24. package/dist/src/audit/local.d.ts.map +1 -1
  25. package/dist/src/audit/local.js +2 -1
  26. package/dist/src/audit/local.js.map +1 -1
  27. package/dist/src/builder/dry-run.d.ts +12 -0
  28. package/dist/src/builder/dry-run.d.ts.map +1 -0
  29. package/dist/src/builder/dry-run.js +103 -0
  30. package/dist/src/builder/dry-run.js.map +1 -0
  31. package/dist/src/builder/manifest-writer.d.ts +7 -0
  32. package/dist/src/builder/manifest-writer.d.ts.map +1 -0
  33. package/dist/src/builder/manifest-writer.js +17 -0
  34. package/dist/src/builder/manifest-writer.js.map +1 -0
  35. package/dist/src/builder/review-display.d.ts +10 -0
  36. package/dist/src/builder/review-display.d.ts.map +1 -0
  37. package/dist/src/builder/review-display.js +55 -0
  38. package/dist/src/builder/review-display.js.map +1 -0
  39. package/dist/src/builder/smart-validator.d.ts +39 -0
  40. package/dist/src/builder/smart-validator.d.ts.map +1 -0
  41. package/dist/src/builder/smart-validator.js +157 -0
  42. package/dist/src/builder/smart-validator.js.map +1 -0
  43. package/dist/src/builder/steps/domains.d.ts +10 -0
  44. package/dist/src/builder/steps/domains.d.ts.map +1 -0
  45. package/dist/src/builder/steps/domains.js +71 -0
  46. package/dist/src/builder/steps/domains.js.map +1 -0
  47. package/dist/src/builder/steps/engagement-info.d.ts +17 -0
  48. package/dist/src/builder/steps/engagement-info.d.ts.map +1 -0
  49. package/dist/src/builder/steps/engagement-info.js +49 -0
  50. package/dist/src/builder/steps/engagement-info.js.map +1 -0
  51. package/dist/src/builder/steps/engagement-window.d.ts +15 -0
  52. package/dist/src/builder/steps/engagement-window.d.ts.map +1 -0
  53. package/dist/src/builder/steps/engagement-window.js +57 -0
  54. package/dist/src/builder/steps/engagement-window.js.map +1 -0
  55. package/dist/src/builder/steps/exclusions.d.ts +13 -0
  56. package/dist/src/builder/steps/exclusions.d.ts.map +1 -0
  57. package/dist/src/builder/steps/exclusions.js +57 -0
  58. package/dist/src/builder/steps/exclusions.js.map +1 -0
  59. package/dist/src/builder/steps/ip-ranges.d.ts +10 -0
  60. package/dist/src/builder/steps/ip-ranges.d.ts.map +1 -0
  61. package/dist/src/builder/steps/ip-ranges.js +64 -0
  62. package/dist/src/builder/steps/ip-ranges.js.map +1 -0
  63. package/dist/src/builder/steps/review.d.ts +10 -0
  64. package/dist/src/builder/steps/review.d.ts.map +1 -0
  65. package/dist/src/builder/steps/review.js +29 -0
  66. package/dist/src/builder/steps/review.js.map +1 -0
  67. package/dist/src/builder/steps/techniques.d.ts +13 -0
  68. package/dist/src/builder/steps/techniques.d.ts.map +1 -0
  69. package/dist/src/builder/steps/techniques.js +68 -0
  70. package/dist/src/builder/steps/techniques.js.map +1 -0
  71. package/dist/src/builder/steps/urls-and-cloud.d.ts +15 -0
  72. package/dist/src/builder/steps/urls-and-cloud.d.ts.map +1 -0
  73. package/dist/src/builder/steps/urls-and-cloud.js +53 -0
  74. package/dist/src/builder/steps/urls-and-cloud.js.map +1 -0
  75. package/dist/src/builder/web/api.d.ts +9 -0
  76. package/dist/src/builder/web/api.d.ts.map +1 -0
  77. package/dist/src/builder/web/api.js +40 -0
  78. package/dist/src/builder/web/api.js.map +1 -0
  79. package/dist/src/builder/web/client-form.html +222 -0
  80. package/dist/src/builder/web/server.d.ts +14 -0
  81. package/dist/src/builder/web/server.d.ts.map +1 -0
  82. package/dist/src/builder/web/server.js +85 -0
  83. package/dist/src/builder/web/server.js.map +1 -0
  84. package/dist/src/builder/wizard.d.ts +9 -0
  85. package/dist/src/builder/wizard.d.ts.map +1 -0
  86. package/dist/src/builder/wizard.js +49 -0
  87. package/dist/src/builder/wizard.js.map +1 -0
  88. package/dist/src/config.d.ts +11 -1
  89. package/dist/src/config.d.ts.map +1 -1
  90. package/dist/src/config.js +15 -2
  91. package/dist/src/config.js.map +1 -1
  92. package/dist/src/dns-resolver.d.ts +10 -1
  93. package/dist/src/dns-resolver.d.ts.map +1 -1
  94. package/dist/src/dns-resolver.js +41 -3
  95. package/dist/src/dns-resolver.js.map +1 -1
  96. package/dist/src/extractor.d.ts +12 -0
  97. package/dist/src/extractor.d.ts.map +1 -1
  98. package/dist/src/extractor.js +386 -0
  99. package/dist/src/extractor.js.map +1 -1
  100. package/dist/src/index.d.ts +1 -1
  101. package/dist/src/index.js +1 -1
  102. package/dist/src/ip-matcher.d.ts +23 -0
  103. package/dist/src/ip-matcher.d.ts.map +1 -1
  104. package/dist/src/ip-matcher.js +96 -23
  105. package/dist/src/ip-matcher.js.map +1 -1
  106. package/dist/src/manifest-schema.d.ts +12 -62
  107. package/dist/src/manifest-schema.d.ts.map +1 -1
  108. package/dist/src/manifest.d.ts +6 -0
  109. package/dist/src/manifest.d.ts.map +1 -1
  110. package/dist/src/manifest.js +21 -6
  111. package/dist/src/manifest.js.map +1 -1
  112. package/dist/src/proxy.d.ts +19 -4
  113. package/dist/src/proxy.d.ts.map +1 -1
  114. package/dist/src/proxy.js +111 -33
  115. package/dist/src/proxy.js.map +1 -1
  116. package/dist/src/safe-filename.d.ts +3 -0
  117. package/dist/src/safe-filename.d.ts.map +1 -0
  118. package/dist/src/safe-filename.js +8 -0
  119. package/dist/src/safe-filename.js.map +1 -0
  120. package/dist/src/sanitizer.d.ts.map +1 -1
  121. package/dist/src/sanitizer.js +36 -10
  122. package/dist/src/sanitizer.js.map +1 -1
  123. package/dist/src/technique-checker.d.ts +14 -0
  124. package/dist/src/technique-checker.d.ts.map +1 -1
  125. package/dist/src/technique-checker.js +123 -2
  126. package/dist/src/technique-checker.js.map +1 -1
  127. package/dist/src/transports/http.d.ts +6 -2
  128. package/dist/src/transports/http.d.ts.map +1 -1
  129. package/dist/src/transports/http.js +101 -13
  130. package/dist/src/transports/http.js.map +1 -1
  131. package/dist/src/transports/sse.d.ts +1 -1
  132. package/dist/src/transports/sse.d.ts.map +1 -1
  133. package/dist/src/transports/sse.js +28 -18
  134. package/dist/src/transports/sse.js.map +1 -1
  135. package/dist/src/transports/stdio.d.ts +2 -2
  136. package/dist/src/transports/stdio.d.ts.map +1 -1
  137. package/dist/src/transports/stdio.js +77 -48
  138. package/dist/src/transports/stdio.js.map +1 -1
  139. package/dist/src/types.d.ts +1 -1
  140. package/dist/src/types.d.ts.map +1 -1
  141. package/dist/src/validator.d.ts +19 -28
  142. package/dist/src/validator.d.ts.map +1 -1
  143. package/dist/src/validator.js +315 -113
  144. package/dist/src/validator.js.map +1 -1
  145. package/examples/claude-desktop-burp-config.json +6 -6
  146. package/package.json +21 -11
@@ -0,0 +1,57 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useState } from "react";
3
+ import { Box, Text, useInput } from "ink";
4
+ import { checkOrphanedExclusion } from "../smart-validator.js";
5
+ const SUGGESTED_EXCLUSIONS = [
6
+ { target: "169.254.169.254", reason: "AWS/Azure/GCP metadata endpoint" },
7
+ { target: "127.0.0.1", reason: "localhost" },
8
+ ];
9
+ export function ExclusionsStep({ initial, authorized, onComplete, onBack }) {
10
+ const [excluded, setExcluded] = useState(initial ?? []);
11
+ const [input, setInput] = useState("");
12
+ const [messages, setMessages] = useState([]);
13
+ const [showSuggestions, setShowSuggestions] = useState(true);
14
+ useInput((ch, key) => {
15
+ if (key.escape) {
16
+ if (input === "" && onBack) {
17
+ onBack();
18
+ }
19
+ else {
20
+ setInput("");
21
+ setMessages([]);
22
+ }
23
+ return;
24
+ }
25
+ if (ch === "d" && key.ctrl) {
26
+ onComplete(excluded);
27
+ return;
28
+ }
29
+ if (key.return) {
30
+ if (input.trim() === "") {
31
+ onComplete(excluded);
32
+ return;
33
+ }
34
+ const items = input.split(",").map((s) => s.trim()).filter(Boolean);
35
+ const allMsgs = [];
36
+ for (const item of items) {
37
+ allMsgs.push(...checkOrphanedExclusion(item, authorized));
38
+ }
39
+ setExcluded((prev) => [...prev, ...items]);
40
+ setMessages(allMsgs);
41
+ setInput("");
42
+ setShowSuggestions(false);
43
+ return;
44
+ }
45
+ if (key.backspace || key.delete) {
46
+ setInput((prev) => prev.slice(0, -1));
47
+ return;
48
+ }
49
+ if (ch && !key.ctrl && !key.meta) {
50
+ setInput((prev) => prev + ch);
51
+ setShowSuggestions(false);
52
+ }
53
+ });
54
+ const activeSuggestions = SUGGESTED_EXCLUSIONS.filter((s) => !excluded.includes(s.target));
55
+ return (_jsxs(Box, { flexDirection: "column", padding: 1, children: [_jsx(Text, { bold: true, color: "cyan", children: "Step 6: Excluded Targets" }), _jsx(Text, { dimColor: true, children: "Targets that are in scope but must NOT be tested. Empty enter or Ctrl+D when done." }), _jsx(Box, { marginTop: 1 }), showSuggestions && activeSuggestions.length > 0 && (_jsxs(Box, { flexDirection: "column", marginBottom: 1, children: [_jsx(Text, { dimColor: true, children: "Suggested exclusions:" }), activeSuggestions.map((s, i) => (_jsxs(Text, { dimColor: true, children: [" \u2022 ", s.target, " (", s.reason, ")"] }, i)))] })), excluded.map((e, i) => (_jsxs(Text, { color: "red", children: [" \u2717 ", e] }, i))), _jsxs(Box, { children: [_jsx(Text, { children: "\u203A " }), _jsxs(Text, { children: [input, _jsx(Text, { dimColor: true, children: "\u2502" })] })] }), messages.map((msg, i) => (_jsx(Box, { marginTop: i === 0 ? 1 : 0, children: _jsxs(Text, { color: msg.level === "warning" ? "yellow" : "blue", children: [msg.level === "warning" ? "⚠" : "ℹ", " ", msg.message] }) }, i))), _jsx(Box, { marginTop: 1, children: _jsxs(Text, { dimColor: true, children: [excluded.length, " exclusion(s) added"] }) })] }));
56
+ }
57
+ //# sourceMappingURL=exclusions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exclusions.js","sourceRoot":"","sources":["../../../../src/builder/steps/exclusions.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import React from "react";
2
+ interface Props {
3
+ initial?: string[];
4
+ resolvedDomainIps?: string[];
5
+ onComplete: (ranges: string[]) => void;
6
+ onBack?: () => void;
7
+ }
8
+ export declare function IpRangesStep({ initial, resolvedDomainIps, onComplete, onBack }: Props): React.ReactElement;
9
+ export {};
10
+ //# sourceMappingURL=ip-ranges.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ip-ranges.d.ts","sourceRoot":"","sources":["../../../../src/builder/steps/ip-ranges.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmB,MAAM,OAAO,CAAC;AAIxC,UAAU,KAAK;IACb,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC7B,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IACvC,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,wBAAgB,YAAY,CAAC,EAAE,OAAO,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,KAAK,GAAG,KAAK,CAAC,YAAY,CAoD1G"}
@@ -0,0 +1,64 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useState } from "react";
3
+ import { Box, Text, useInput } from "ink";
4
+ import { validateCidr, checkOverlap } from "../smart-validator.js";
5
+ export function IpRangesStep({ initial, resolvedDomainIps, onComplete, onBack }) {
6
+ const [ranges, setRanges] = useState(initial ?? []);
7
+ const [input, setInput] = useState("");
8
+ const [messages, setMessages] = useState([]);
9
+ useInput((ch, key) => {
10
+ if (key.escape) {
11
+ if (input === "" && onBack) {
12
+ onBack();
13
+ }
14
+ else {
15
+ setInput("");
16
+ setMessages([]);
17
+ }
18
+ return;
19
+ }
20
+ if (ch === "d" && key.ctrl) {
21
+ onComplete(ranges);
22
+ return;
23
+ }
24
+ if (key.return) {
25
+ if (input.trim() === "") {
26
+ onComplete(ranges);
27
+ return;
28
+ }
29
+ const newRanges = input.split(",").map((r) => r.trim()).filter(Boolean);
30
+ const allMsgs = [];
31
+ const validRanges = [];
32
+ for (const range of newRanges) {
33
+ const cidrMsgs = validateCidr(range);
34
+ if (cidrMsgs.some((m) => m.level === "error")) {
35
+ allMsgs.push(...cidrMsgs);
36
+ }
37
+ else {
38
+ validRanges.push(range);
39
+ allMsgs.push(...cidrMsgs);
40
+ if (resolvedDomainIps) {
41
+ allMsgs.push(...checkOverlap(resolvedDomainIps, [range]));
42
+ }
43
+ }
44
+ }
45
+ if (allMsgs.some((m) => m.level === "error")) {
46
+ setMessages(allMsgs);
47
+ return;
48
+ }
49
+ setRanges((prev) => [...prev, ...validRanges]);
50
+ setMessages(allMsgs);
51
+ setInput("");
52
+ return;
53
+ }
54
+ if (key.backspace || key.delete) {
55
+ setInput((prev) => prev.slice(0, -1));
56
+ return;
57
+ }
58
+ if (ch && !key.ctrl && !key.meta) {
59
+ setInput((prev) => prev + ch);
60
+ }
61
+ });
62
+ return (_jsxs(Box, { flexDirection: "column", padding: 1, children: [_jsx(Text, { bold: true, color: "cyan", children: "Step 4: Authorized IP Ranges" }), _jsx(Text, { dimColor: true, children: "Enter CIDR ranges (e.g. 10.10.10.0/24). Empty enter or Ctrl+D when done. Esc to go back." }), _jsx(Box, { marginTop: 1 }), ranges.map((r, i) => (_jsxs(Text, { color: "green", children: [" \u2713 ", r] }, i))), _jsxs(Box, { children: [_jsx(Text, { children: "\u203A " }), _jsxs(Text, { children: [input, _jsx(Text, { dimColor: true, children: "\u2502" })] })] }), messages.map((msg, i) => (_jsx(Box, { marginTop: i === 0 ? 1 : 0, children: _jsxs(Text, { color: msg.level === "error" ? "red" : msg.level === "warning" ? "yellow" : "blue", children: [msg.level === "error" ? "✗" : msg.level === "warning" ? "⚠" : "ℹ", " ", msg.message] }) }, i))), _jsx(Box, { marginTop: 1, children: _jsxs(Text, { dimColor: true, children: [ranges.length, " range(s) added"] }) })] }));
63
+ }
64
+ //# sourceMappingURL=ip-ranges.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ip-ranges.js","sourceRoot":"","sources":["../../../../src/builder/steps/ip-ranges.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import React from "react";
2
+ import type { ScopeManifest } from "../../types.js";
3
+ interface Props {
4
+ manifest: ScopeManifest;
5
+ onConfirm: () => void;
6
+ onBack?: () => void;
7
+ }
8
+ export declare function ReviewStep({ manifest, onConfirm, onBack }: Props): React.ReactElement;
9
+ export {};
10
+ //# sourceMappingURL=review.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review.d.ts","sourceRoot":"","sources":["../../../../src/builder/steps/review.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA8B,MAAM,OAAO,CAAC;AAGnD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAGpD,UAAU,KAAK;IACb,QAAQ,EAAE,aAAa,CAAC;IACxB,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,wBAAgB,UAAU,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,KAAK,GAAG,KAAK,CAAC,YAAY,CAkErF"}
@@ -0,0 +1,29 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useState, useEffect } from "react";
3
+ import { Box, Text, useInput } from "ink";
4
+ import Spinner from "ink-spinner";
5
+ import { runDryRun } from "../dry-run.js";
6
+ export function ReviewStep({ manifest, onConfirm, onBack }) {
7
+ const [dryRunResults, setDryRunResults] = useState(null);
8
+ const [dryRunError, setDryRunError] = useState(null);
9
+ const [confirmed, setConfirmed] = useState(false);
10
+ useEffect(() => {
11
+ runDryRun(manifest)
12
+ .then(setDryRunResults)
13
+ .catch((err) => setDryRunError(err.message));
14
+ }, []);
15
+ useInput((ch, key) => {
16
+ if (key.escape && onBack) {
17
+ onBack();
18
+ return;
19
+ }
20
+ if (key.return && dryRunResults !== null) {
21
+ setConfirmed(true);
22
+ onConfirm();
23
+ return;
24
+ }
25
+ });
26
+ const { authorized_targets: at, excluded_targets: et } = manifest;
27
+ return (_jsxs(Box, { flexDirection: "column", padding: 1, children: [_jsx(Text, { bold: true, color: "cyan", children: "Step 8: Review & Dry-Run" }), _jsx(Box, { marginTop: 1 }), _jsx(Text, { bold: true, children: "Engagement:" }), _jsxs(Text, { children: [" ID: ", manifest.engagement_id] }), _jsxs(Text, { children: [" Client: ", manifest.client] }), _jsxs(Text, { children: [" Operator: ", manifest.operator] }), _jsxs(Text, { children: [" Window: ", manifest.engagement_window.start, " \u2192 ", manifest.engagement_window.end] }), _jsx(Box, { marginTop: 1 }), _jsx(Text, { bold: true, children: "Authorized Targets:" }), _jsxs(Text, { children: [" Domains (", at.domains.length, "): ", at.domains.join(", ") || "none"] }), _jsxs(Text, { children: [" IP Ranges (", at.ip_ranges.length, "): ", at.ip_ranges.join(", ") || "none"] }), _jsxs(Text, { children: [" URLs (", at.urls.length, "): ", at.urls.join(", ") || "none"] }), _jsxs(Text, { children: [" Cloud (", at.cloud_accounts.length, "): ", at.cloud_accounts.join(", ") || "none"] }), _jsx(Box, { marginTop: 1 }), _jsxs(Text, { bold: true, children: ["Exclusions (", et.length, "):"] }), et.length > 0 ? et.map((e, i) => _jsxs(Text, { color: "red", children: [" \u2717 ", e] }, i)) : _jsx(Text, { dimColor: true, children: " none" }), _jsx(Box, { marginTop: 1 }), _jsx(Text, { bold: true, children: "Techniques:" }), _jsxs(Text, { color: "green", children: [" Authorized: ", manifest.authorized_techniques.join(", ") || "none"] }), _jsxs(Text, { color: "red", children: [" Excluded: ", manifest.excluded_techniques.join(", ") || "none"] }), _jsx(Box, { marginTop: 1 }), _jsx(Text, { bold: true, children: "Dry-Run Preview:" }), dryRunError && _jsxs(Text, { color: "red", children: [" Error: ", dryRunError] }), dryRunResults === null && !dryRunError && (_jsxs(Text, { children: [" ", _jsx(Spinner, { type: "dots" }), " Running dry-run..."] })), dryRunResults !== null && (_jsxs(Box, { flexDirection: "column", children: [dryRunResults.map((r, i) => (_jsxs(Text, { color: r.pass ? "green" : "red", children: [" ", r.pass ? "✓" : "✗", " ", r.tool, " \u2192 ", r.target, ": ", r.actual, !r.pass ? ` (expected ${r.expected})` : ""] }, i))), _jsx(Box, { marginTop: 1 }), dryRunResults.some((r) => !r.pass) ? (_jsx(Text, { color: "red", bold: true, children: "\u26A0 Some dry-run checks did not match expectations. Review above." })) : (_jsx(Text, { color: "green", bold: true, children: "\u2713 All dry-run checks passed." }))] })), _jsx(Box, { marginTop: 1 }), dryRunResults !== null && !confirmed && (_jsx(Text, { dimColor: true, children: "Press Enter to confirm and write manifest, Esc to go back." }))] }));
28
+ }
29
+ //# sourceMappingURL=review.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review.js","sourceRoot":"","sources":["../../../../src/builder/steps/review.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import React from "react";
2
+ interface Props {
3
+ initialAuthorized?: string[];
4
+ initialExcluded?: string[];
5
+ onComplete: (data: {
6
+ authorized: string[];
7
+ excluded: string[];
8
+ }) => void;
9
+ onBack?: () => void;
10
+ }
11
+ export declare function TechniquesStep({ initialAuthorized, initialExcluded, onComplete, onBack }: Props): React.ReactElement;
12
+ export {};
13
+ //# sourceMappingURL=techniques.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"techniques.d.ts","sourceRoot":"","sources":["../../../../src/builder/steps/techniques.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmB,MAAM,OAAO,CAAC;AAGxC,UAAU,KAAK;IACb,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC7B,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,UAAU,EAAE,CAAC,IAAI,EAAE;QAAE,UAAU,EAAE,MAAM,EAAE,CAAC;QAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;KAAE,KAAK,IAAI,CAAC;IACzE,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;CACrB;AAkBD,wBAAgB,cAAc,CAAC,EAAE,iBAAiB,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,KAAK,GAAG,KAAK,CAAC,YAAY,CA+DpH"}
@@ -0,0 +1,68 @@
1
+ import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
2
+ import { useState } from "react";
3
+ import { Box, Text, useInput } from "ink";
4
+ // Must mirror the categories in src/technique-checker.ts — the proxy enforces
5
+ // authorized_techniques against exactly these names.
6
+ const KNOWN_CATEGORIES = [
7
+ { name: "recon", description: "Reconnaissance and scanning", tools: "nmap, amass, subfinder, httpx, sslscan" },
8
+ { name: "web_app", description: "Web application testing", tools: "burp, zap, nikto, sqlmap, nuclei" },
9
+ { name: "exploitation", description: "Exploitation and credential attacks", tools: "metasploit, hydra, hashcat, crackmapexec" },
10
+ { name: "cloud_audit", description: "Cloud configuration auditing", tools: "prowler, scoutsuite" },
11
+ { name: "dos", description: "Denial of service", tools: "hping3, slowloris, synflood" },
12
+ { name: "destructive", description: "Destructive operations", tools: "disk_wiper, *destroy*, *wipe*" },
13
+ { name: "social_engineering", description: "Social engineering", tools: "gophish, setoolkit, evilginx" },
14
+ ];
15
+ const DEFAULT_EXCLUDED = ["dos", "destructive", "social_engineering"];
16
+ export function TechniquesStep({ initialAuthorized, initialExcluded, onComplete, onBack }) {
17
+ const [phase, setPhase] = useState("authorized");
18
+ const [cursor, setCursor] = useState(0);
19
+ const [authorized, setAuthorized] = useState(new Set(initialAuthorized ?? ["recon", "web_app"]));
20
+ const [excluded, setExcluded] = useState(new Set(initialExcluded ?? DEFAULT_EXCLUDED));
21
+ useInput((ch, key) => {
22
+ if (key.escape && onBack) {
23
+ if (phase === "excluded") {
24
+ setPhase("authorized");
25
+ setCursor(0);
26
+ }
27
+ else {
28
+ onBack();
29
+ }
30
+ return;
31
+ }
32
+ if (key.upArrow) {
33
+ setCursor((prev) => Math.max(0, prev - 1));
34
+ return;
35
+ }
36
+ if (key.downArrow) {
37
+ setCursor((prev) => Math.min(KNOWN_CATEGORIES.length - 1, prev + 1));
38
+ return;
39
+ }
40
+ if (ch === " ") {
41
+ const category = KNOWN_CATEGORIES[cursor].name;
42
+ if (phase === "authorized") {
43
+ setAuthorized((prev) => { const next = new Set(prev); next.has(category) ? next.delete(category) : next.add(category); return next; });
44
+ }
45
+ else {
46
+ setExcluded((prev) => { const next = new Set(prev); next.has(category) ? next.delete(category) : next.add(category); return next; });
47
+ }
48
+ return;
49
+ }
50
+ if (key.return) {
51
+ if (phase === "authorized") {
52
+ setPhase("excluded");
53
+ setCursor(0);
54
+ }
55
+ else {
56
+ onComplete({ authorized: Array.from(authorized), excluded: Array.from(excluded) });
57
+ }
58
+ return;
59
+ }
60
+ });
61
+ const currentSet = phase === "authorized" ? authorized : excluded;
62
+ const title = phase === "authorized" ? "Authorized Techniques" : "Excluded Techniques";
63
+ const color = phase === "authorized" ? "green" : "red";
64
+ return (_jsxs(Box, { flexDirection: "column", padding: 1, children: [_jsxs(Text, { bold: true, color: "cyan", children: ["Step 7: ", title] }), _jsx(Text, { dimColor: true, children: "Space to toggle, Enter to confirm, \u2191/\u2193 to navigate." }), _jsx(Box, { marginTop: 1 }), KNOWN_CATEGORIES.map((cat, i) => (_jsxs(Box, { children: [_jsxs(Text, { color: i === cursor ? "white" : undefined, dimColor: i !== cursor, children: [i === cursor ? "›" : " ", " [", currentSet.has(cat.name) ? "×" : " ", "]", " "] }), _jsx(Text, { color: currentSet.has(cat.name) ? color : undefined, bold: i === cursor, children: cat.name }), _jsxs(Text, { dimColor: true, children: [" \u2014 ", cat.description, " (", cat.tools, ")"] })] }, cat.name))), _jsx(Box, { marginTop: 1, children: _jsx(Text, { dimColor: true, children: phase === "authorized"
65
+ ? `${authorized.size} authorized. Press Enter to configure excluded techniques.`
66
+ : `${excluded.size} excluded. Press Enter to finish.` }) })] }));
67
+ }
68
+ //# sourceMappingURL=techniques.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"techniques.js","sourceRoot":"","sources":["../../../../src/builder/steps/techniques.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import React from "react";
2
+ interface Props {
3
+ initial?: {
4
+ urls?: string[];
5
+ cloud_accounts?: string[];
6
+ };
7
+ onComplete: (data: {
8
+ urls: string[];
9
+ cloud_accounts: string[];
10
+ }) => void;
11
+ onBack?: () => void;
12
+ }
13
+ export declare function UrlsAndCloudStep({ initial, onComplete, onBack }: Props): React.ReactElement;
14
+ export {};
15
+ //# sourceMappingURL=urls-and-cloud.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"urls-and-cloud.d.ts","sourceRoot":"","sources":["../../../../src/builder/steps/urls-and-cloud.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmB,MAAM,OAAO,CAAC;AAGxC,UAAU,KAAK;IACb,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;QAAC,cAAc,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IACzD,UAAU,EAAE,CAAC,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,EAAE,CAAC;QAAC,cAAc,EAAE,MAAM,EAAE,CAAA;KAAE,KAAK,IAAI,CAAC;IACzE,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;CACrB;AAID,wBAAgB,gBAAgB,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,KAAK,GAAG,KAAK,CAAC,YAAY,CAyC3F"}
@@ -0,0 +1,53 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useState } from "react";
3
+ import { Box, Text, useInput } from "ink";
4
+ export function UrlsAndCloudStep({ initial, onComplete, onBack }) {
5
+ const [section, setSection] = useState("urls");
6
+ const [urls, setUrls] = useState(initial?.urls ?? []);
7
+ const [cloudAccounts, setCloudAccounts] = useState(initial?.cloud_accounts ?? []);
8
+ const [input, setInput] = useState("");
9
+ useInput((ch, key) => {
10
+ if (key.escape) {
11
+ if (input === "" && section === "urls" && onBack) {
12
+ onBack();
13
+ }
14
+ else {
15
+ setInput("");
16
+ }
17
+ return;
18
+ }
19
+ if (ch === "d" && key.ctrl) {
20
+ onComplete({ urls, cloud_accounts: cloudAccounts });
21
+ return;
22
+ }
23
+ if (key.return) {
24
+ if (input.trim() === "") {
25
+ if (section === "urls") {
26
+ setSection("cloud_accounts");
27
+ }
28
+ else {
29
+ onComplete({ urls, cloud_accounts: cloudAccounts });
30
+ }
31
+ return;
32
+ }
33
+ const items = input.split(",").map((s) => s.trim()).filter(Boolean);
34
+ if (section === "urls") {
35
+ setUrls((prev) => [...prev, ...items]);
36
+ }
37
+ else {
38
+ setCloudAccounts((prev) => [...prev, ...items]);
39
+ }
40
+ setInput("");
41
+ return;
42
+ }
43
+ if (key.backspace || key.delete) {
44
+ setInput((prev) => prev.slice(0, -1));
45
+ return;
46
+ }
47
+ if (ch && !key.ctrl && !key.meta) {
48
+ setInput((prev) => prev + ch);
49
+ }
50
+ });
51
+ return (_jsxs(Box, { flexDirection: "column", padding: 1, children: [_jsx(Text, { bold: true, color: "cyan", children: "Step 5: URLs & Cloud Accounts (optional)" }), _jsx(Text, { dimColor: true, children: "Enter items or press Enter to skip. Ctrl+D to finish step." }), _jsx(Box, { marginTop: 1 }), _jsx(Text, { bold: true, children: section === "urls" ? "› URLs:" : "URLs:" }), urls.map((u, i) => _jsxs(Text, { color: "green", children: [" \u2713 ", u] }, i)), section === "urls" && (_jsxs(Box, { children: [_jsx(Text, { children: " \u203A " }), _jsxs(Text, { children: [input, _jsx(Text, { dimColor: true, children: "\u2502" })] })] })), _jsx(Box, { marginTop: 1 }), _jsx(Text, { bold: true, children: section === "cloud_accounts" ? "› Cloud Accounts:" : "Cloud Accounts:" }), cloudAccounts.map((c, i) => _jsxs(Text, { color: "green", children: [" \u2713 ", c] }, i)), section === "cloud_accounts" && (_jsxs(Box, { children: [_jsx(Text, { children: " \u203A " }), _jsxs(Text, { children: [input, _jsx(Text, { dimColor: true, children: "\u2502" })] })] }))] }));
52
+ }
53
+ //# sourceMappingURL=urls-and-cloud.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"urls-and-cloud.js","sourceRoot":"","sources":["../../../../src/builder/steps/urls-and-cloud.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { ScopeManifest } from "../../types.js";
2
+ export interface ApiResponse {
3
+ status: number;
4
+ body: string;
5
+ contentType: string;
6
+ }
7
+ export declare function handleGetTemplate(template: Partial<ScopeManifest> | undefined): ApiResponse;
8
+ export declare function handlePostSubmit(rawBody: string, outputDir: string): ApiResponse;
9
+ //# sourceMappingURL=api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../../../src/builder/web/api.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAGpD,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,SAAS,GAAG,WAAW,CAM3F;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,WAAW,CA2BhF"}
@@ -0,0 +1,40 @@
1
+ import fs from "fs";
2
+ import path from "path";
3
+ import { ScopeManifestSchema } from "../../manifest-schema.js";
4
+ import { engagementFileStem } from "../../safe-filename.js";
5
+ export function handleGetTemplate(template) {
6
+ return {
7
+ status: 200,
8
+ body: JSON.stringify(template ?? {}),
9
+ contentType: "application/json",
10
+ };
11
+ }
12
+ export function handlePostSubmit(rawBody, outputDir) {
13
+ let data;
14
+ try {
15
+ data = JSON.parse(rawBody);
16
+ }
17
+ catch {
18
+ return { status: 400, body: JSON.stringify({ success: false, error: "Invalid JSON" }), contentType: "application/json" };
19
+ }
20
+ const parseResult = ScopeManifestSchema.safeParse(data);
21
+ if (!parseResult.success) {
22
+ return {
23
+ status: 400,
24
+ body: JSON.stringify({
25
+ success: false,
26
+ error: "Schema validation failed",
27
+ details: parseResult.error.issues.map((i) => i.message),
28
+ }),
29
+ contentType: "application/json",
30
+ };
31
+ }
32
+ if (!fs.existsSync(outputDir)) {
33
+ fs.mkdirSync(outputDir, { recursive: true });
34
+ }
35
+ const filename = `${engagementFileStem(parseResult.data.engagement_id)}-${Date.now()}.pending.json`;
36
+ const filePath = path.join(outputDir, filename);
37
+ fs.writeFileSync(filePath, JSON.stringify(parseResult.data, null, 2) + "\n", "utf-8");
38
+ return { status: 200, body: JSON.stringify({ success: true, file: filename }), contentType: "application/json" };
39
+ }
40
+ //# sourceMappingURL=api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../../../../src/builder/web/api.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAE/D,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAQ5D,MAAM,UAAU,iBAAiB,CAAC,QAA4C;IAC5E,OAAO;QACL,MAAM,EAAE,GAAG;QACX,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,IAAI,EAAE,CAAC;QACpC,WAAW,EAAE,kBAAkB;KAChC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,OAAe,EAAE,SAAiB;IACjE,IAAI,IAAa,CAAC;IAClB,IAAI,CAAC;QAAC,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAAC,CAAC;IACnC,MAAM,CAAC;QACL,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC,EAAE,WAAW,EAAE,kBAAkB,EAAE,CAAC;IAC3H,CAAC;IAED,MAAM,WAAW,GAAG,mBAAmB,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IACxD,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;QACzB,OAAO;YACL,MAAM,EAAE,GAAG;YACX,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,0BAA0B;gBACjC,OAAO,EAAE,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;aACxD,CAAC;YACF,WAAW,EAAE,kBAAkB;SAChC,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAAC,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAAC,CAAC;IAEhF,MAAM,QAAQ,GAAG,GAAG,kBAAkB,CAAC,WAAW,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,IAAI,CAAC,GAAG,EAAE,eAAe,CAAC;IACpG,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAChD,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC;IAEtF,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAE,WAAW,EAAE,kBAAkB,EAAE,CAAC;AACnH,CAAC"}