vaspera 2.14.0 → 2.15.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +45 -0
- package/README.md +15 -2
- package/dist/__tests__/certification/agent-certificate-e2e.test.d.ts +2 -0
- package/dist/__tests__/certification/agent-certificate-e2e.test.d.ts.map +1 -0
- package/dist/__tests__/certification/agent-certificate-e2e.test.js +90 -0
- package/dist/__tests__/certification/agent-certificate-e2e.test.js.map +1 -0
- package/dist/__tests__/certification/agent-certificate-map.test.d.ts +2 -0
- package/dist/__tests__/certification/agent-certificate-map.test.d.ts.map +1 -0
- package/dist/__tests__/certification/agent-certificate-map.test.js +107 -0
- package/dist/__tests__/certification/agent-certificate-map.test.js.map +1 -0
- package/dist/__tests__/certification/agent-certificate.test.d.ts +2 -0
- package/dist/__tests__/certification/agent-certificate.test.d.ts.map +1 -0
- package/dist/__tests__/certification/agent-certificate.test.js +78 -0
- package/dist/__tests__/certification/agent-certificate.test.js.map +1 -0
- package/dist/__tests__/certification/verify-endpoint.test.d.ts +2 -0
- package/dist/__tests__/certification/verify-endpoint.test.d.ts.map +1 -0
- package/dist/__tests__/certification/verify-endpoint.test.js +81 -0
- package/dist/__tests__/certification/verify-endpoint.test.js.map +1 -0
- package/dist/__tests__/compliance/ai-frameworks.test.d.ts +2 -0
- package/dist/__tests__/compliance/ai-frameworks.test.d.ts.map +1 -0
- package/dist/__tests__/compliance/ai-frameworks.test.js +87 -0
- package/dist/__tests__/compliance/ai-frameworks.test.js.map +1 -0
- package/dist/__tests__/eval/llm-analyzer.test.d.ts +2 -0
- package/dist/__tests__/eval/llm-analyzer.test.d.ts.map +1 -0
- package/dist/__tests__/eval/llm-analyzer.test.js +93 -0
- package/dist/__tests__/eval/llm-analyzer.test.js.map +1 -0
- package/dist/__tests__/eval/redteam-harness.test.d.ts +2 -0
- package/dist/__tests__/eval/redteam-harness.test.d.ts.map +1 -0
- package/dist/__tests__/eval/redteam-harness.test.js +136 -0
- package/dist/__tests__/eval/redteam-harness.test.js.map +1 -0
- package/dist/__tests__/evidence/evidence.test.d.ts +2 -0
- package/dist/__tests__/evidence/evidence.test.d.ts.map +1 -0
- package/dist/__tests__/evidence/evidence.test.js +240 -0
- package/dist/__tests__/evidence/evidence.test.js.map +1 -0
- package/dist/__tests__/history/decisions.test.d.ts +2 -0
- package/dist/__tests__/history/decisions.test.d.ts.map +1 -0
- package/dist/__tests__/history/decisions.test.js +54 -0
- package/dist/__tests__/history/decisions.test.js.map +1 -0
- package/dist/__tests__/http-auth.test.d.ts +2 -0
- package/dist/__tests__/http-auth.test.d.ts.map +1 -0
- package/dist/__tests__/http-auth.test.js +55 -0
- package/dist/__tests__/http-auth.test.js.map +1 -0
- package/dist/__tests__/http-policy.test.d.ts +2 -0
- package/dist/__tests__/http-policy.test.d.ts.map +1 -0
- package/dist/__tests__/http-policy.test.js +69 -0
- package/dist/__tests__/http-policy.test.js.map +1 -0
- package/dist/__tests__/http-server-transport.test.d.ts +2 -0
- package/dist/__tests__/http-server-transport.test.d.ts.map +1 -0
- package/dist/__tests__/http-server-transport.test.js +132 -0
- package/dist/__tests__/http-server-transport.test.js.map +1 -0
- package/dist/__tests__/integration/destructive-guards.test.d.ts +2 -0
- package/dist/__tests__/integration/destructive-guards.test.d.ts.map +1 -0
- package/dist/__tests__/integration/destructive-guards.test.js +49 -0
- package/dist/__tests__/integration/destructive-guards.test.js.map +1 -0
- package/dist/__tests__/logger-redaction.test.d.ts +2 -0
- package/dist/__tests__/logger-redaction.test.d.ts.map +1 -0
- package/dist/__tests__/logger-redaction.test.js +74 -0
- package/dist/__tests__/logger-redaction.test.js.map +1 -0
- package/dist/__tests__/manifest-schema.test.d.ts +2 -0
- package/dist/__tests__/manifest-schema.test.d.ts.map +1 -0
- package/dist/__tests__/manifest-schema.test.js +43 -0
- package/dist/__tests__/manifest-schema.test.js.map +1 -0
- package/dist/__tests__/scanners/builtin-rules.test.d.ts +2 -0
- package/dist/__tests__/scanners/builtin-rules.test.d.ts.map +1 -0
- package/dist/__tests__/scanners/builtin-rules.test.js +51 -0
- package/dist/__tests__/scanners/builtin-rules.test.js.map +1 -0
- package/dist/__tests__/scanners/runtime/golden-path-runner.test.js +13 -1
- package/dist/__tests__/scanners/runtime/golden-path-runner.test.js.map +1 -1
- package/dist/__tests__/tool-guard.test.d.ts +2 -0
- package/dist/__tests__/tool-guard.test.d.ts.map +1 -0
- package/dist/__tests__/tool-guard.test.js +97 -0
- package/dist/__tests__/tool-guard.test.js.map +1 -0
- package/dist/__tests__/util/contained-file.test.d.ts +2 -0
- package/dist/__tests__/util/contained-file.test.d.ts.map +1 -0
- package/dist/__tests__/util/contained-file.test.js +78 -0
- package/dist/__tests__/util/contained-file.test.js.map +1 -0
- package/dist/__tests__/util/subprocess.test.d.ts +2 -0
- package/dist/__tests__/util/subprocess.test.d.ts.map +1 -0
- package/dist/__tests__/util/subprocess.test.js +48 -0
- package/dist/__tests__/util/subprocess.test.js.map +1 -0
- package/dist/action/diff-mode.d.ts.map +1 -1
- package/dist/action/diff-mode.js +31 -12
- package/dist/action/diff-mode.js.map +1 -1
- package/dist/certification/agent-certificate-map.d.ts +51 -0
- package/dist/certification/agent-certificate-map.d.ts.map +1 -0
- package/dist/certification/agent-certificate-map.js +265 -0
- package/dist/certification/agent-certificate-map.js.map +1 -0
- package/dist/certification/agent-certificate-sample.d.ts +25 -0
- package/dist/certification/agent-certificate-sample.d.ts.map +1 -0
- package/dist/certification/agent-certificate-sample.js +207 -0
- package/dist/certification/agent-certificate-sample.js.map +1 -0
- package/dist/certification/agent-certificate.d.ts +1981 -0
- package/dist/certification/agent-certificate.d.ts.map +1 -0
- package/dist/certification/agent-certificate.js +309 -0
- package/dist/certification/agent-certificate.js.map +1 -0
- package/dist/certification/autofix.d.ts.map +1 -1
- package/dist/certification/autofix.js +5 -3
- package/dist/certification/autofix.js.map +1 -1
- package/dist/certification/store.d.ts.map +1 -1
- package/dist/certification/store.js +5 -2
- package/dist/certification/store.js.map +1 -1
- package/dist/certification/verify-endpoint.d.ts +48 -0
- package/dist/certification/verify-endpoint.d.ts.map +1 -0
- package/dist/certification/verify-endpoint.js +79 -0
- package/dist/certification/verify-endpoint.js.map +1 -0
- package/dist/compliance/index.d.ts +2 -0
- package/dist/compliance/index.d.ts.map +1 -1
- package/dist/compliance/index.js +4 -0
- package/dist/compliance/index.js.map +1 -1
- package/dist/compliance/iso42001.d.ts +21 -0
- package/dist/compliance/iso42001.d.ts.map +1 -0
- package/dist/compliance/iso42001.js +160 -0
- package/dist/compliance/iso42001.js.map +1 -0
- package/dist/compliance/mapper.d.ts.map +1 -1
- package/dist/compliance/mapper.js +12 -0
- package/dist/compliance/mapper.js.map +1 -1
- package/dist/compliance/nist-ai-rmf.d.ts +20 -0
- package/dist/compliance/nist-ai-rmf.d.ts.map +1 -0
- package/dist/compliance/nist-ai-rmf.js +140 -0
- package/dist/compliance/nist-ai-rmf.js.map +1 -0
- package/dist/config/flags.d.ts +4 -4
- package/dist/eval/fixtures.d.ts.map +1 -1
- package/dist/eval/fixtures.js +161 -119
- package/dist/eval/fixtures.js.map +1 -1
- package/dist/eval/fixtures.test.js +4 -2
- package/dist/eval/fixtures.test.js.map +1 -1
- package/dist/eval/llm-analyzer.d.ts +40 -0
- package/dist/eval/llm-analyzer.d.ts.map +1 -0
- package/dist/eval/llm-analyzer.js +154 -0
- package/dist/eval/llm-analyzer.js.map +1 -0
- package/dist/eval/redteam-harness.d.ts +95 -0
- package/dist/eval/redteam-harness.d.ts.map +1 -0
- package/dist/eval/redteam-harness.js +137 -0
- package/dist/eval/redteam-harness.js.map +1 -0
- package/dist/evidence/collector.d.ts.map +1 -1
- package/dist/evidence/collector.js +21 -1
- package/dist/evidence/collector.js.map +1 -1
- package/dist/evidence/store.d.ts.map +1 -1
- package/dist/evidence/store.js +29 -5
- package/dist/evidence/store.js.map +1 -1
- package/dist/evidence/types.d.ts +16 -9
- package/dist/evidence/types.d.ts.map +1 -1
- package/dist/history/decisions.d.ts +63 -0
- package/dist/history/decisions.d.ts.map +1 -0
- package/dist/history/decisions.js +60 -0
- package/dist/history/decisions.js.map +1 -0
- package/dist/history/index.d.ts +2 -0
- package/dist/history/index.d.ts.map +1 -1
- package/dist/history/index.js +2 -0
- package/dist/history/index.js.map +1 -1
- package/dist/history/types.d.ts +34 -5
- package/dist/history/types.d.ts.map +1 -1
- package/dist/history/types.js +2 -0
- package/dist/history/types.js.map +1 -1
- package/dist/http-auth.d.ts +22 -0
- package/dist/http-auth.d.ts.map +1 -0
- package/dist/http-auth.js +58 -0
- package/dist/http-auth.js.map +1 -0
- package/dist/http-policy.d.ts +30 -0
- package/dist/http-policy.d.ts.map +1 -0
- package/dist/http-policy.js +54 -0
- package/dist/http-policy.js.map +1 -0
- package/dist/http-server.js +195 -12
- package/dist/http-server.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +247 -15
- package/dist/index.js.map +1 -1
- package/dist/logger.d.ts.map +1 -1
- package/dist/logger.js +56 -2
- package/dist/logger.js.map +1 -1
- package/dist/plugins/types.d.ts +2 -2
- package/dist/scanners/agent/prompt-injection-fuzzer.d.ts.map +1 -1
- package/dist/scanners/agent/prompt-injection-fuzzer.js +26 -0
- package/dist/scanners/agent/prompt-injection-fuzzer.js.map +1 -1
- package/dist/scanners/agent/types.d.ts +10 -10
- package/dist/scanners/bandit.d.ts.map +1 -1
- package/dist/scanners/bandit.js +35 -29
- package/dist/scanners/bandit.js.map +1 -1
- package/dist/scanners/binary-analysis.d.ts.map +1 -1
- package/dist/scanners/binary-analysis.js +24 -49
- package/dist/scanners/binary-analysis.js.map +1 -1
- package/dist/scanners/brakeman.d.ts.map +1 -1
- package/dist/scanners/brakeman.js +19 -33
- package/dist/scanners/brakeman.js.map +1 -1
- package/dist/scanners/builtin-rules.d.ts +24 -0
- package/dist/scanners/builtin-rules.d.ts.map +1 -0
- package/dist/scanners/builtin-rules.js +175 -0
- package/dist/scanners/builtin-rules.js.map +1 -0
- package/dist/scanners/dast.d.ts.map +1 -1
- package/dist/scanners/dast.js +24 -34
- package/dist/scanners/dast.js.map +1 -1
- package/dist/scanners/deploy/types.d.ts +6 -6
- package/dist/scanners/eslint.d.ts.map +1 -1
- package/dist/scanners/eslint.js +15 -24
- package/dist/scanners/eslint.js.map +1 -1
- package/dist/scanners/gosec.d.ts.map +1 -1
- package/dist/scanners/gosec.js +14 -62
- package/dist/scanners/gosec.js.map +1 -1
- package/dist/scanners/index.d.ts.map +1 -1
- package/dist/scanners/index.js +38 -7
- package/dist/scanners/index.js.map +1 -1
- package/dist/scanners/memory-safety.d.ts.map +1 -1
- package/dist/scanners/memory-safety.js +27 -28
- package/dist/scanners/memory-safety.js.map +1 -1
- package/dist/scanners/openapi.d.ts.map +1 -1
- package/dist/scanners/openapi.js +14 -22
- package/dist/scanners/openapi.js.map +1 -1
- package/dist/scanners/race-condition.d.ts.map +1 -1
- package/dist/scanners/race-condition.js +17 -16
- package/dist/scanners/race-condition.js.map +1 -1
- package/dist/scanners/runtime/types.d.ts +4 -4
- package/dist/scanners/rust.d.ts.map +1 -1
- package/dist/scanners/rust.js +38 -37
- package/dist/scanners/rust.js.map +1 -1
- package/dist/scanners/scale/types.d.ts +16 -16
- package/dist/scanners/secrets.d.ts.map +1 -1
- package/dist/scanners/secrets.js +66 -78
- package/dist/scanners/secrets.js.map +1 -1
- package/dist/scanners/semgrep.d.ts +2 -0
- package/dist/scanners/semgrep.d.ts.map +1 -1
- package/dist/scanners/semgrep.js +12 -0
- package/dist/scanners/semgrep.js.map +1 -1
- package/dist/scanners/terraform.d.ts.map +1 -1
- package/dist/scanners/terraform.js +47 -40
- package/dist/scanners/terraform.js.map +1 -1
- package/dist/scanners/trivy.d.ts.map +1 -1
- package/dist/scanners/trivy.js +38 -30
- package/dist/scanners/trivy.js.map +1 -1
- package/dist/tool-guard.d.ts +40 -0
- package/dist/tool-guard.d.ts.map +1 -0
- package/dist/tool-guard.js +55 -0
- package/dist/tool-guard.js.map +1 -0
- package/dist/util/index.d.ts +2 -1
- package/dist/util/index.d.ts.map +1 -1
- package/dist/util/index.js +2 -1
- package/dist/util/index.js.map +1 -1
- package/dist/util/paths.d.ts +20 -3
- package/dist/util/paths.d.ts.map +1 -1
- package/dist/util/paths.js +84 -4
- package/dist/util/paths.js.map +1 -1
- package/dist/util/subprocess.d.ts +51 -0
- package/dist/util/subprocess.d.ts.map +1 -0
- package/dist/util/subprocess.js +77 -0
- package/dist/util/subprocess.js.map +1 -0
- package/package.json +12 -2
- package/dist/eval/fixtures/healthcare/audit-gaps.d.ts +0 -28
- package/dist/eval/fixtures/healthcare/audit-gaps.d.ts.map +0 -1
- package/dist/eval/fixtures/healthcare/audit-gaps.js +0 -90
- package/dist/eval/fixtures/healthcare/audit-gaps.js.map +0 -1
- package/dist/eval/fixtures/healthcare/consent-bypass.d.ts +0 -31
- package/dist/eval/fixtures/healthcare/consent-bypass.d.ts.map +0 -1
- package/dist/eval/fixtures/healthcare/consent-bypass.js +0 -61
- package/dist/eval/fixtures/healthcare/consent-bypass.js.map +0 -1
- package/dist/eval/fixtures/healthcare/phi-in-logs.d.ts +0 -24
- package/dist/eval/fixtures/healthcare/phi-in-logs.d.ts.map +0 -1
- package/dist/eval/fixtures/healthcare/phi-in-logs.js +0 -41
- package/dist/eval/fixtures/healthcare/phi-in-logs.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"terraform.js","sourceRoot":"","sources":["../../src/scanners/terraform.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;
|
|
1
|
+
{"version":3,"file":"terraform.js","sourceRoot":"","sources":["../../src/scanners/terraform.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"trivy.d.ts","sourceRoot":"","sources":["../../src/scanners/trivy.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,KAAK,EAAwB,aAAa,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"trivy.d.ts","sourceRoot":"","sources":["../../src/scanners/trivy.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,KAAK,EAAwB,aAAa,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AA2F3F;;GAEG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,mBAAmB,CAAC,CAexE;AASD;;GAEG;AACH,wBAAsB,QAAQ,CAC5B,WAAW,EAAE,MAAM,EACnB,OAAO,CAAC,EAAE;IACR,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,IAAI,GAAG,QAAQ,GAAG,MAAM,CAAC;IACpC,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB,GACA,OAAO,CAAC,aAAa,CAAC,CAsIxB;AAED;;GAEG;AACH,wBAAsB,SAAS,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CA+BrE"}
|
package/dist/scanners/trivy.js
CHANGED
|
@@ -5,31 +5,27 @@
|
|
|
5
5
|
*
|
|
6
6
|
* @module scanners/trivy
|
|
7
7
|
*/
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
8
|
+
import { runCommand, probeBinary } from "../util/subprocess.js";
|
|
9
|
+
import { parseJson } from "../util/json.js";
|
|
10
10
|
import { SEVERITY_MAPPINGS } from "./types.js";
|
|
11
|
-
const execAsync = promisify(exec);
|
|
12
11
|
/**
|
|
13
12
|
* Check if Trivy is available
|
|
14
13
|
*/
|
|
15
14
|
export async function checkTrivyAvailable() {
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
const match =
|
|
19
|
-
const version = match ? match[1] : stdout.trim().split("\n")[0];
|
|
15
|
+
const firstLine = await probeBinary("trivy");
|
|
16
|
+
if (firstLine !== null) {
|
|
17
|
+
const match = firstLine.match(/Version: ([\d.]+)/);
|
|
20
18
|
return {
|
|
21
19
|
scanner: "trivy",
|
|
22
20
|
available: true,
|
|
23
|
-
version,
|
|
24
|
-
};
|
|
25
|
-
}
|
|
26
|
-
catch (error) {
|
|
27
|
-
return {
|
|
28
|
-
scanner: "trivy",
|
|
29
|
-
available: false,
|
|
30
|
-
error: error instanceof Error ? error.message : "Trivy not found",
|
|
21
|
+
version: match ? match[1] : firstLine,
|
|
31
22
|
};
|
|
32
23
|
}
|
|
24
|
+
return {
|
|
25
|
+
scanner: "trivy",
|
|
26
|
+
available: false,
|
|
27
|
+
error: "Trivy not found",
|
|
28
|
+
};
|
|
33
29
|
}
|
|
34
30
|
/**
|
|
35
31
|
* Convert Trivy severity to vaspera severity
|
|
@@ -54,28 +50,20 @@ export async function runTrivy(projectPath, options) {
|
|
|
54
50
|
error: "Trivy is not installed. Install from: https://aquasecurity.github.io/trivy/",
|
|
55
51
|
};
|
|
56
52
|
}
|
|
57
|
-
// Build command
|
|
58
53
|
const scanType = options?.scanType || "fs";
|
|
59
|
-
|
|
54
|
+
const args = [scanType, "--format", "json"];
|
|
60
55
|
if (options?.ignoreUnfixed) {
|
|
61
|
-
|
|
56
|
+
args.push("--ignore-unfixed");
|
|
62
57
|
}
|
|
63
58
|
if (options?.severity && options.severity.length > 0) {
|
|
64
|
-
|
|
59
|
+
args.push("--severity", options.severity.join(","));
|
|
65
60
|
}
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
const { stdout, stderr } = await execAsync(command, {
|
|
61
|
+
args.push(projectPath);
|
|
62
|
+
const { stdout } = await runCommand("trivy", args, {
|
|
69
63
|
timeout: options?.timeout || 300000, // 5 minutes for Trivy
|
|
70
64
|
maxBuffer: 50 * 1024 * 1024, // 50MB
|
|
71
|
-
}).catch((error) => {
|
|
72
|
-
if (error.stdout) {
|
|
73
|
-
return { stdout: error.stdout, stderr: error.stderr || "" };
|
|
74
|
-
}
|
|
75
|
-
throw error;
|
|
76
65
|
});
|
|
77
|
-
|
|
78
|
-
const output = JSON.parse(stdout);
|
|
66
|
+
const output = parseJson(stdout, "trivy output");
|
|
79
67
|
// Convert to DeterministicFindings
|
|
80
68
|
const findings = [];
|
|
81
69
|
for (const result of output.Results) {
|
|
@@ -177,7 +165,27 @@ export async function runTrivy(projectPath, options) {
|
|
|
177
165
|
*/
|
|
178
166
|
export async function detectIaC(projectPath) {
|
|
179
167
|
try {
|
|
180
|
-
const { stdout } = await
|
|
168
|
+
const { stdout } = await runCommand("find", [
|
|
169
|
+
projectPath,
|
|
170
|
+
"-maxdepth",
|
|
171
|
+
"3",
|
|
172
|
+
"(",
|
|
173
|
+
"-name",
|
|
174
|
+
"Dockerfile*",
|
|
175
|
+
"-o",
|
|
176
|
+
"-name",
|
|
177
|
+
"*.tf",
|
|
178
|
+
"-o",
|
|
179
|
+
"-name",
|
|
180
|
+
"*.yaml",
|
|
181
|
+
"-name",
|
|
182
|
+
"*compose*.yml",
|
|
183
|
+
"-o",
|
|
184
|
+
"-name",
|
|
185
|
+
"kubernetes*.yaml",
|
|
186
|
+
")",
|
|
187
|
+
"-print",
|
|
188
|
+
], { timeout: 5000 });
|
|
181
189
|
return stdout.trim().length > 0;
|
|
182
190
|
}
|
|
183
191
|
catch {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"trivy.js","sourceRoot":"","sources":["../../src/scanners/trivy.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"trivy.js","sourceRoot":"","sources":["../../src/scanners/trivy.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AA0F/C;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB;IACvC,MAAM,SAAS,GAAG,MAAM,WAAW,CAAC,OAAO,CAAC,CAAC;IAC7C,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;QACvB,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;QACnD,OAAO;YACL,OAAO,EAAE,OAAO;YAChB,SAAS,EAAE,IAAI;YACf,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS;SACtC,CAAC;IACJ,CAAC;IACD,OAAO;QACL,OAAO,EAAE,OAAO;QAChB,SAAS,EAAE,KAAK;QAChB,KAAK,EAAE,iBAAiB;KACzB,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,WAAW,CAAC,QAA4D;IAC/E,OAAO,iBAAiB,CAAC,KAAK,CAAC,QAAQ,CAAoD,CAAC;AAC9F,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC5B,WAAmB,EACnB,OAKC;IAED,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAE7B,IAAI,CAAC;QACH,8BAA8B;QAC9B,MAAM,YAAY,GAAG,MAAM,mBAAmB,EAAE,CAAC;QACjD,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,CAAC;YAC5B,OAAO;gBACL,OAAO,EAAE,OAAO;gBAChB,QAAQ,EAAE,EAAE;gBACZ,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;gBAChC,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,6EAA6E;aACrF,CAAC;QACJ,CAAC;QAED,MAAM,QAAQ,GAAG,OAAO,EAAE,QAAQ,IAAI,IAAI,CAAC;QAC3C,MAAM,IAAI,GAAG,CAAC,QAAQ,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;QAE5C,IAAI,OAAO,EAAE,aAAa,EAAE,CAAC;YAC3B,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QAChC,CAAC;QAED,IAAI,OAAO,EAAE,QAAQ,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrD,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QACtD,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAEvB,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,UAAU,CAAC,OAAO,EAAE,IAAI,EAAE;YACjD,OAAO,EAAE,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,sBAAsB;YAC3D,SAAS,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI,EAAE,OAAO;SACrC,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,SAAS,CAAc,MAAM,EAAE,cAAc,CAAC,CAAC;QAE9D,mCAAmC;QACnC,MAAM,QAAQ,GAA2B,EAAE,CAAC;QAE5C,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACpC,0BAA0B;YAC1B,IAAI,MAAM,CAAC,eAAe,EAAE,CAAC;gBAC3B,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,eAAe,EAAE,CAAC;oBAC1C,QAAQ,CAAC,IAAI,CAAC;wBACZ,OAAO,EAAE,OAAgB;wBACzB,MAAM,EAAE,SAAS,IAAI,CAAC,eAAe,EAAE;wBACvC,IAAI,EAAE,MAAM,CAAC,MAAM;wBACnB,IAAI,EAAE,CAAC;wBACP,OAAO,EAAE,GAAG,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,gBAAgB,KAAK,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,cAAc,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;wBACxJ,QAAQ,EAAE,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC;wBACpC,UAAU,EAAE,GAAG;wBACf,MAAM,EAAE,IAAI,CAAC,MAAM;wBACnB,MAAM,EAAE,CAAC,IAAI,CAAC,eAAe,CAAC;wBAC9B,YAAY,EAAE,CAAC,CAAC,IAAI,CAAC,YAAY;wBACjC,GAAG,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,cAAc,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,SAAS;wBACtE,QAAQ,EAAE;4BACR,OAAO,EAAE,IAAI,CAAC,OAAO;4BACrB,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;4BACvC,YAAY,EAAE,IAAI,CAAC,YAAY;4BAC/B,UAAU,EAAE,IAAI,CAAC,UAAU;yBAC5B;qBACF,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;YAED,4BAA4B;YAC5B,IAAI,MAAM,CAAC,iBAAiB,EAAE,CAAC;gBAC7B,KAAK,MAAM,SAAS,IAAI,MAAM,CAAC,iBAAiB,EAAE,CAAC;oBACjD,MAAM,SAAS,GAAG,SAAS,CAAC,aAAa,EAAE,SAAS,IAAI,CAAC,CAAC;oBAC1D,QAAQ,CAAC,IAAI,CAAC;wBACZ,OAAO,EAAE,OAAgB;wBACzB,MAAM,EAAE,SAAS,SAAS,CAAC,EAAE,EAAE;wBAC/B,IAAI,EAAE,MAAM,CAAC,MAAM;wBACnB,IAAI,EAAE,SAAS;wBACf,OAAO,EAAE,SAAS,CAAC,aAAa,EAAE,OAAO;wBACzC,OAAO,EAAE,GAAG,SAAS,CAAC,KAAK,KAAK,SAAS,CAAC,OAAO,EAAE;wBACnD,QAAQ,EAAE,WAAW,CAAC,SAAS,CAAC,QAAQ,CAAC;wBACzC,UAAU,EAAE,GAAG;wBACf,GAAG,EAAE,SAAS,CAAC,UAAU;wBACzB,QAAQ,EAAE,SAAS,CAAC,aAAa,EAAE,IAAI,EAAE,KAAK;4BAC5C,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;6BACtB,IAAI,CAAC,IAAI,CAAC;wBACb,QAAQ,EAAE;4BACR,IAAI,EAAE,SAAS,CAAC,IAAI;4BACpB,SAAS,EAAE,SAAS,CAAC,SAAS;4BAC9B,QAAQ,EAAE,SAAS,CAAC,aAAa,EAAE,QAAQ;4BAC3C,QAAQ,EAAE,SAAS,CAAC,aAAa,EAAE,QAAQ;4BAC3C,OAAO,EAAE,SAAS,CAAC,aAAa,EAAE,OAAO;4BACzC,UAAU,EAAE,SAAS,CAAC,UAAU;yBACjC;qBACF,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;YAED,kBAAkB;YAClB,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBACnB,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;oBACpC,QAAQ,CAAC,IAAI,CAAC;wBACZ,OAAO,EAAE,OAAgB;wBACzB,MAAM,EAAE,SAAS,MAAM,CAAC,MAAM,EAAE;wBAChC,IAAI,EAAE,MAAM,CAAC,MAAM;wBACnB,IAAI,EAAE,MAAM,CAAC,SAAS;wBACtB,OAAO,EAAE,MAAM,CAAC,OAAO;wBACvB,OAAO,EAAE,GAAG,MAAM,CAAC,KAAK,KAAK,MAAM,CAAC,QAAQ,EAAE;wBAC9C,QAAQ,EAAE,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC;wBACtC,UAAU,EAAE,GAAG;wBACf,QAAQ,EAAE,MAAM,CAAC,IAAI,EAAE,KAAK;4BAC1B,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;6BACtB,IAAI,CAAC,IAAI,CAAC;wBACb,QAAQ,EAAE;4BACR,QAAQ,EAAE,MAAM,CAAC,QAAQ;4BACzB,KAAK,EAAE,MAAM,CAAC,KAAK;yBACpB;qBACF,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO;YACL,OAAO,EAAE,OAAO;YAChB,QAAQ;YACR,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;YAChC,OAAO,EAAE,IAAI;YACb,OAAO,EAAE,YAAY,CAAC,OAAO;SAC9B,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,OAAO,EAAE,OAAO;YAChB,QAAQ,EAAE,EAAE;YACZ,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;YAChC,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe;SAChE,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,WAAmB;IACjD,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,UAAU,CACjC,MAAM,EACN;YACE,WAAW;YACX,WAAW;YACX,GAAG;YACH,GAAG;YACH,OAAO;YACP,aAAa;YACb,IAAI;YACJ,OAAO;YACP,MAAM;YACN,IAAI;YACJ,OAAO;YACP,QAAQ;YACR,OAAO;YACP,eAAe;YACf,IAAI;YACJ,OAAO;YACP,kBAAkB;YAClB,GAAG;YACH,QAAQ;SACT,EACD,EAAE,OAAO,EAAE,IAAI,EAAE,CAClB,CAAC;QACF,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;IAClC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tool registration guard.
|
|
3
|
+
*
|
|
4
|
+
* Enforces CONSTITUTION rule 3 — "every project_path input goes through
|
|
5
|
+
* validateProjectPath()" — by construction rather than by convention:
|
|
6
|
+
* once applied, ANY registered tool whose arguments include a string
|
|
7
|
+
* `project_path` has it validated and canonicalised before the handler
|
|
8
|
+
* runs, so individual handlers cannot forget the check. Handlers always
|
|
9
|
+
* receive a resolved, existing directory path.
|
|
10
|
+
*
|
|
11
|
+
* @module tool-guard
|
|
12
|
+
*/
|
|
13
|
+
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
14
|
+
export interface ProjectPathGuardOptions {
|
|
15
|
+
/**
|
|
16
|
+
* When set, every project_path must resolve inside this directory
|
|
17
|
+
* (symlinks included). Wire to VASPERA_PATH_BOUNDARY for deployments
|
|
18
|
+
* that should never scan outside a workspace root.
|
|
19
|
+
*/
|
|
20
|
+
basePath?: string;
|
|
21
|
+
}
|
|
22
|
+
type ToolHandler = (...handlerArgs: unknown[]) => unknown;
|
|
23
|
+
export interface ToolAnnotationsSummary {
|
|
24
|
+
readOnlyHint?: boolean;
|
|
25
|
+
destructiveHint?: boolean;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Registry of every registered tool's annotations, populated as tools
|
|
29
|
+
* are registered. The HTTP transport uses it to decide which tools may
|
|
30
|
+
* be invoked remotely (read-only by default).
|
|
31
|
+
*/
|
|
32
|
+
export declare const toolAnnotations: Map<string, ToolAnnotationsSummary>;
|
|
33
|
+
/** Minimal structural view of McpServer used by the guard (method syntax
|
|
34
|
+
* keeps it bivariant so both real and fake servers are accepted). */
|
|
35
|
+
export interface ToolRegistrar {
|
|
36
|
+
registerTool(name: string, config: unknown, handler: ToolHandler): unknown;
|
|
37
|
+
}
|
|
38
|
+
export declare function applyProjectPathGuard(server: McpServer | ToolRegistrar, options?: ProjectPathGuardOptions): void;
|
|
39
|
+
export {};
|
|
40
|
+
//# sourceMappingURL=tool-guard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-guard.d.ts","sourceRoot":"","sources":["../src/tool-guard.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGzE,MAAM,WAAW,uBAAuB;IACtC;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,KAAK,WAAW,GAAG,CAAC,GAAG,WAAW,EAAE,OAAO,EAAE,KAAK,OAAO,CAAC;AAE1D,MAAM,WAAW,sBAAsB;IACrC,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED;;;;GAIG;AACH,eAAO,MAAM,eAAe,qCAA4C,CAAC;AAEzE;qEACqE;AACrE,MAAM,WAAW,aAAa;IAC5B,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC;CAC5E;AAED,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,SAAS,GAAG,aAAa,EACjC,OAAO,GAAE,uBAA4B,GACpC,IAAI,CAwCN"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tool registration guard.
|
|
3
|
+
*
|
|
4
|
+
* Enforces CONSTITUTION rule 3 — "every project_path input goes through
|
|
5
|
+
* validateProjectPath()" — by construction rather than by convention:
|
|
6
|
+
* once applied, ANY registered tool whose arguments include a string
|
|
7
|
+
* `project_path` has it validated and canonicalised before the handler
|
|
8
|
+
* runs, so individual handlers cannot forget the check. Handlers always
|
|
9
|
+
* receive a resolved, existing directory path.
|
|
10
|
+
*
|
|
11
|
+
* @module tool-guard
|
|
12
|
+
*/
|
|
13
|
+
import { validateProjectPath, PathValidationError } from "./util/paths.js";
|
|
14
|
+
/**
|
|
15
|
+
* Registry of every registered tool's annotations, populated as tools
|
|
16
|
+
* are registered. The HTTP transport uses it to decide which tools may
|
|
17
|
+
* be invoked remotely (read-only by default).
|
|
18
|
+
*/
|
|
19
|
+
export const toolAnnotations = new Map();
|
|
20
|
+
export function applyProjectPathGuard(server, options = {}) {
|
|
21
|
+
const registrar = server;
|
|
22
|
+
const original = registrar.registerTool.bind(registrar);
|
|
23
|
+
const patched = (name, config, handler) => {
|
|
24
|
+
const annotations = config
|
|
25
|
+
?.annotations;
|
|
26
|
+
toolAnnotations.set(name, {
|
|
27
|
+
readOnlyHint: annotations?.readOnlyHint,
|
|
28
|
+
destructiveHint: annotations?.destructiveHint,
|
|
29
|
+
});
|
|
30
|
+
const guarded = async (first, ...rest) => {
|
|
31
|
+
if (first &&
|
|
32
|
+
typeof first === "object" &&
|
|
33
|
+
typeof first.project_path === "string") {
|
|
34
|
+
const args = first;
|
|
35
|
+
try {
|
|
36
|
+
const validated = await validateProjectPath(args.project_path, options.basePath ? { basePath: options.basePath } : {});
|
|
37
|
+
first = { ...args, project_path: validated };
|
|
38
|
+
}
|
|
39
|
+
catch (error) {
|
|
40
|
+
if (error instanceof PathValidationError) {
|
|
41
|
+
return {
|
|
42
|
+
content: [{ type: "text", text: `Error: ${error.message}` }],
|
|
43
|
+
isError: true,
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
throw error;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
return handler(first, ...rest);
|
|
50
|
+
};
|
|
51
|
+
return original(name, config, guarded);
|
|
52
|
+
};
|
|
53
|
+
registrar.registerTool = patched;
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=tool-guard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-guard.js","sourceRoot":"","sources":["../src/tool-guard.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAkB3E;;;;GAIG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,GAAG,EAAkC,CAAC;AAQzE,MAAM,UAAU,qBAAqB,CACnC,MAAiC,EACjC,UAAmC,EAAE;IAErC,MAAM,SAAS,GAAG,MAAuB,CAAC;IAC1C,MAAM,QAAQ,GAAG,SAAS,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAExD,MAAM,OAAO,GAAG,CAAC,IAAY,EAAE,MAAe,EAAE,OAAoB,EAAE,EAAE;QACtE,MAAM,WAAW,GAAI,MAA0D;YAC7E,EAAE,WAAW,CAAC;QAChB,eAAe,CAAC,GAAG,CAAC,IAAI,EAAE;YACxB,YAAY,EAAE,WAAW,EAAE,YAAY;YACvC,eAAe,EAAE,WAAW,EAAE,eAAe;SAC9C,CAAC,CAAC;QACH,MAAM,OAAO,GAAG,KAAK,EAAE,KAAc,EAAE,GAAG,IAAe,EAAE,EAAE;YAC3D,IACE,KAAK;gBACL,OAAO,KAAK,KAAK,QAAQ;gBACzB,OAAQ,KAAiC,CAAC,YAAY,KAAK,QAAQ,EACnE,CAAC;gBACD,MAAM,IAAI,GAAG,KAAgC,CAAC;gBAC9C,IAAI,CAAC;oBACH,MAAM,SAAS,GAAG,MAAM,mBAAmB,CACzC,IAAI,CAAC,YAAsB,EAC3B,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CACvD,CAAC;oBACF,KAAK,GAAG,EAAE,GAAG,IAAI,EAAE,YAAY,EAAE,SAAS,EAAE,CAAC;gBAC/C,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,IAAI,KAAK,YAAY,mBAAmB,EAAE,CAAC;wBACzC,OAAO;4BACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,UAAU,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC;4BACrE,OAAO,EAAE,IAAI;yBACd,CAAC;oBACJ,CAAC;oBACD,MAAM,KAAK,CAAC;gBACd,CAAC;YACH,CAAC;YACD,OAAO,OAAO,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,CAAC;QACjC,CAAC,CAAC;QACF,OAAO,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,OAAsB,CAAC,CAAC;IACxD,CAAC,CAAC;IAED,SAAuC,CAAC,YAAY,GAAG,OAAO,CAAC;AAClE,CAAC"}
|
package/dist/util/index.d.ts
CHANGED
|
@@ -5,8 +5,9 @@
|
|
|
5
5
|
*
|
|
6
6
|
* @module util
|
|
7
7
|
*/
|
|
8
|
-
export { validateProjectPath, validateFilePath, isPathSafe, sanitizePathForLogging, PathValidationError, type ValidatePathOptions, } from "./paths.js";
|
|
8
|
+
export { validateProjectPath, validateFilePath, isPathSafe, resolveContainedFile, sanitizePathForLogging, PathValidationError, type ValidatePathOptions, } from "./paths.js";
|
|
9
9
|
export { parseJson, tryParseJson, parseJsonOrDefault, isValidJson, safeStringify, JsonParseError, type ParseJsonOptions, } from "./json.js";
|
|
10
10
|
export { withRetry, withRetryAndCircuitBreaker, createRetryWrapper, classifyError, CircuitBreaker, RetryError, CircuitOpenError, type RetryOptions, type CircuitBreakerOptions, type ErrorType, type CircuitState, } from "./retry.js";
|
|
11
|
+
export { runCommand, probeBinary, CommandError, type RunCommandOptions, type RunCommandResult, } from "./subprocess.js";
|
|
11
12
|
export { PromiseQueue, runConcurrent, runConcurrentValues, mapConcurrent, throttle, batchConcurrent, getConcurrencyLevel, DEFAULT_CONCURRENCY, type QueueOptions, type QueueTask, type TaskResult, type QueueStats, } from "./concurrency.js";
|
|
12
13
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/util/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/util/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACL,mBAAmB,EACnB,gBAAgB,EAChB,UAAU,EACV,sBAAsB,EACtB,mBAAmB,EACnB,KAAK,mBAAmB,GACzB,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,SAAS,EACT,YAAY,EACZ,kBAAkB,EAClB,WAAW,EACX,aAAa,EACb,cAAc,EACd,KAAK,gBAAgB,GACtB,MAAM,WAAW,CAAC;AAEnB,OAAO,EACL,SAAS,EACT,0BAA0B,EAC1B,kBAAkB,EAClB,aAAa,EACb,cAAc,EACd,UAAU,EACV,gBAAgB,EAChB,KAAK,YAAY,EACjB,KAAK,qBAAqB,EAC1B,KAAK,SAAS,EACd,KAAK,YAAY,GAClB,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,YAAY,EACZ,aAAa,EACb,mBAAmB,EACnB,aAAa,EACb,QAAQ,EACR,eAAe,EACf,mBAAmB,EACnB,mBAAmB,EACnB,KAAK,YAAY,EACjB,KAAK,SAAS,EACd,KAAK,UAAU,EACf,KAAK,UAAU,GAChB,MAAM,kBAAkB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/util/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACL,mBAAmB,EACnB,gBAAgB,EAChB,UAAU,EACV,oBAAoB,EACpB,sBAAsB,EACtB,mBAAmB,EACnB,KAAK,mBAAmB,GACzB,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,SAAS,EACT,YAAY,EACZ,kBAAkB,EAClB,WAAW,EACX,aAAa,EACb,cAAc,EACd,KAAK,gBAAgB,GACtB,MAAM,WAAW,CAAC;AAEnB,OAAO,EACL,SAAS,EACT,0BAA0B,EAC1B,kBAAkB,EAClB,aAAa,EACb,cAAc,EACd,UAAU,EACV,gBAAgB,EAChB,KAAK,YAAY,EACjB,KAAK,qBAAqB,EAC1B,KAAK,SAAS,EACd,KAAK,YAAY,GAClB,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,UAAU,EACV,WAAW,EACX,YAAY,EACZ,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,GACtB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACL,YAAY,EACZ,aAAa,EACb,mBAAmB,EACnB,aAAa,EACb,QAAQ,EACR,eAAe,EACf,mBAAmB,EACnB,mBAAmB,EACnB,KAAK,YAAY,EACjB,KAAK,SAAS,EACd,KAAK,UAAU,EACf,KAAK,UAAU,GAChB,MAAM,kBAAkB,CAAC"}
|
package/dist/util/index.js
CHANGED
|
@@ -5,8 +5,9 @@
|
|
|
5
5
|
*
|
|
6
6
|
* @module util
|
|
7
7
|
*/
|
|
8
|
-
export { validateProjectPath, validateFilePath, isPathSafe, sanitizePathForLogging, PathValidationError, } from "./paths.js";
|
|
8
|
+
export { validateProjectPath, validateFilePath, isPathSafe, resolveContainedFile, sanitizePathForLogging, PathValidationError, } from "./paths.js";
|
|
9
9
|
export { parseJson, tryParseJson, parseJsonOrDefault, isValidJson, safeStringify, JsonParseError, } from "./json.js";
|
|
10
10
|
export { withRetry, withRetryAndCircuitBreaker, createRetryWrapper, classifyError, CircuitBreaker, RetryError, CircuitOpenError, } from "./retry.js";
|
|
11
|
+
export { runCommand, probeBinary, CommandError, } from "./subprocess.js";
|
|
11
12
|
export { PromiseQueue, runConcurrent, runConcurrentValues, mapConcurrent, throttle, batchConcurrent, getConcurrencyLevel, DEFAULT_CONCURRENCY, } from "./concurrency.js";
|
|
12
13
|
//# sourceMappingURL=index.js.map
|
package/dist/util/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/util/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACL,mBAAmB,EACnB,gBAAgB,EAChB,UAAU,EACV,sBAAsB,EACtB,mBAAmB,GAEpB,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,SAAS,EACT,YAAY,EACZ,kBAAkB,EAClB,WAAW,EACX,aAAa,EACb,cAAc,GAEf,MAAM,WAAW,CAAC;AAEnB,OAAO,EACL,SAAS,EACT,0BAA0B,EAC1B,kBAAkB,EAClB,aAAa,EACb,cAAc,EACd,UAAU,EACV,gBAAgB,GAKjB,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,YAAY,EACZ,aAAa,EACb,mBAAmB,EACnB,aAAa,EACb,QAAQ,EACR,eAAe,EACf,mBAAmB,EACnB,mBAAmB,GAKpB,MAAM,kBAAkB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/util/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACL,mBAAmB,EACnB,gBAAgB,EAChB,UAAU,EACV,oBAAoB,EACpB,sBAAsB,EACtB,mBAAmB,GAEpB,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,SAAS,EACT,YAAY,EACZ,kBAAkB,EAClB,WAAW,EACX,aAAa,EACb,cAAc,GAEf,MAAM,WAAW,CAAC;AAEnB,OAAO,EACL,SAAS,EACT,0BAA0B,EAC1B,kBAAkB,EAClB,aAAa,EACb,cAAc,EACd,UAAU,EACV,gBAAgB,GAKjB,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,UAAU,EACV,WAAW,EACX,YAAY,GAGb,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACL,YAAY,EACZ,aAAa,EACb,mBAAmB,EACnB,aAAa,EACb,QAAQ,EACR,eAAe,EACf,mBAAmB,EACnB,mBAAmB,GAKpB,MAAM,kBAAkB,CAAC"}
|
package/dist/util/paths.d.ts
CHANGED
|
@@ -14,9 +14,6 @@ export declare class PathValidationError extends Error {
|
|
|
14
14
|
readonly reason: "not_found" | "not_directory" | "symlink_escape" | "path_traversal" | "invalid_path";
|
|
15
15
|
constructor(message: string, path: string, reason: "not_found" | "not_directory" | "symlink_escape" | "path_traversal" | "invalid_path");
|
|
16
16
|
}
|
|
17
|
-
/**
|
|
18
|
-
* Options for path validation
|
|
19
|
-
*/
|
|
20
17
|
export interface ValidatePathOptions {
|
|
21
18
|
/** Require the path to be a directory (default: true) */
|
|
22
19
|
requireDirectory?: boolean;
|
|
@@ -49,6 +46,26 @@ export declare function validateFilePath(filePath: string, options?: Omit<Valida
|
|
|
49
46
|
* Check if a path is safe (doesn't throw, returns boolean)
|
|
50
47
|
*/
|
|
51
48
|
export declare function isPathSafe(projectPath: string, options?: ValidatePathOptions): Promise<boolean>;
|
|
49
|
+
/**
|
|
50
|
+
* Resolve a relative file path inside a project tree, rejecting escapes.
|
|
51
|
+
* For paths that originate from untrusted sources (scanner output, agent
|
|
52
|
+
* findings): `../` sequences, absolute paths, and in-tree symlinks
|
|
53
|
+
* pointing outside the project are all refused.
|
|
54
|
+
*
|
|
55
|
+
* @returns The real (symlink-resolved) absolute path of the file
|
|
56
|
+
* @throws PathValidationError if the path escapes the project tree
|
|
57
|
+
*/
|
|
58
|
+
export declare function resolveContainedFile(projectPath: string, relFile: string): Promise<string>;
|
|
59
|
+
/**
|
|
60
|
+
* Resolve a relative *write* target inside a project tree, rejecting
|
|
61
|
+
* escapes — like resolveContainedFile but for a file that may not exist
|
|
62
|
+
* yet (the parent directory must exist and is symlink-resolved).
|
|
63
|
+
* For untrusted output paths (e.g. an `output_file` tool argument).
|
|
64
|
+
*
|
|
65
|
+
* @returns The absolute path to write to, contained within the tree
|
|
66
|
+
* @throws PathValidationError if the path escapes the project tree
|
|
67
|
+
*/
|
|
68
|
+
export declare function resolveContainedWritePath(projectPath: string, relFile: string): Promise<string>;
|
|
52
69
|
/**
|
|
53
70
|
* Sanitize a path for use in error messages (remove sensitive info)
|
|
54
71
|
*/
|
package/dist/util/paths.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../src/util/paths.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH;;GAEG;AACH,qBAAa,mBAAoB,SAAQ,KAAK;aAG1B,IAAI,EAAE,MAAM;aACZ,MAAM,EAClB,WAAW,GACX,eAAe,GACf,gBAAgB,GAChB,gBAAgB,GAChB,cAAc;gBAPlB,OAAO,EAAE,MAAM,EACC,IAAI,EAAE,MAAM,EACZ,MAAM,EAClB,WAAW,GACX,eAAe,GACf,gBAAgB,GAChB,gBAAgB,GAChB,cAAc;CAKrB;
|
|
1
|
+
{"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../src/util/paths.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH;;GAEG;AACH,qBAAa,mBAAoB,SAAQ,KAAK;aAG1B,IAAI,EAAE,MAAM;aACZ,MAAM,EAClB,WAAW,GACX,eAAe,GACf,gBAAgB,GAChB,gBAAgB,GAChB,cAAc;gBAPlB,OAAO,EAAE,MAAM,EACC,IAAI,EAAE,MAAM,EACZ,MAAM,EAClB,WAAW,GACX,eAAe,GACf,gBAAgB,GAChB,gBAAgB,GAChB,cAAc;CAKrB;AAUD,MAAM,WAAW,mBAAmB;IAClC,yDAAyD;IACzD,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,0EAA0E;IAC1E,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,6DAA6D;IAC7D,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,mBAAmB,CACvC,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,MAAM,CAAC,CAoGjB;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,IAAI,CAAC,mBAAmB,EAAE,kBAAkB,CAAM,GAC1D,OAAO,CAAC,MAAM,CAAC,CAEjB;AAED;;GAEG;AACH,wBAAsB,UAAU,CAC9B,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,OAAO,CAAC,CAOlB;AAED;;;;;;;;GAQG;AACH,wBAAsB,oBAAoB,CACxC,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,MAAM,CAAC,CAqBjB;AAED;;;;;;;;GAQG;AACH,wBAAsB,yBAAyB,CAC7C,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,MAAM,CAAC,CAoDjB;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAOhE"}
|
package/dist/util/paths.js
CHANGED
|
@@ -21,6 +21,13 @@ export class PathValidationError extends Error {
|
|
|
21
21
|
this.name = "PathValidationError";
|
|
22
22
|
}
|
|
23
23
|
}
|
|
24
|
+
/**
|
|
25
|
+
* Options for path validation
|
|
26
|
+
*/
|
|
27
|
+
/** Segment-aware containment: "/base" must not match "/base-evil". */
|
|
28
|
+
function isWithin(target, base) {
|
|
29
|
+
return target === base || target.startsWith(base + path.sep);
|
|
30
|
+
}
|
|
24
31
|
/**
|
|
25
32
|
* Validate a project path for security
|
|
26
33
|
*
|
|
@@ -59,7 +66,7 @@ export async function validateProjectPath(projectPath, options = {}) {
|
|
|
59
66
|
// If basePath is specified, ensure symlink target is within it
|
|
60
67
|
if (basePath) {
|
|
61
68
|
const resolvedBase = path.resolve(basePath);
|
|
62
|
-
if (!realPath
|
|
69
|
+
if (!isWithin(realPath, resolvedBase)) {
|
|
63
70
|
throw new PathValidationError(`Symlink escapes base directory: ${projectPath} -> ${realPath}`, projectPath, "symlink_escape");
|
|
64
71
|
}
|
|
65
72
|
}
|
|
@@ -75,10 +82,13 @@ export async function validateProjectPath(projectPath, options = {}) {
|
|
|
75
82
|
if (requireDirectory && !lstats.isDirectory()) {
|
|
76
83
|
throw new PathValidationError(`Path is not a directory: ${projectPath}`, projectPath, "not_directory");
|
|
77
84
|
}
|
|
78
|
-
// If basePath is specified, ensure the path is within it
|
|
85
|
+
// If basePath is specified, ensure the path is within it. Compare
|
|
86
|
+
// *real* paths so a symlinked ancestor (e.g. /base/link/sub where
|
|
87
|
+
// /base/link -> /etc) cannot escape via a lexical-only check.
|
|
79
88
|
if (basePath) {
|
|
80
|
-
const
|
|
81
|
-
|
|
89
|
+
const realBase = await realpath(path.resolve(basePath));
|
|
90
|
+
const realTarget = await realpath(resolvedPath);
|
|
91
|
+
if (!isWithin(realTarget, realBase)) {
|
|
82
92
|
throw new PathValidationError(`Path is outside base directory: ${projectPath}`, projectPath, "path_traversal");
|
|
83
93
|
}
|
|
84
94
|
}
|
|
@@ -114,6 +124,76 @@ export async function isPathSafe(projectPath, options = {}) {
|
|
|
114
124
|
return false;
|
|
115
125
|
}
|
|
116
126
|
}
|
|
127
|
+
/**
|
|
128
|
+
* Resolve a relative file path inside a project tree, rejecting escapes.
|
|
129
|
+
* For paths that originate from untrusted sources (scanner output, agent
|
|
130
|
+
* findings): `../` sequences, absolute paths, and in-tree symlinks
|
|
131
|
+
* pointing outside the project are all refused.
|
|
132
|
+
*
|
|
133
|
+
* @returns The real (symlink-resolved) absolute path of the file
|
|
134
|
+
* @throws PathValidationError if the path escapes the project tree
|
|
135
|
+
*/
|
|
136
|
+
export async function resolveContainedFile(projectPath, relFile) {
|
|
137
|
+
const root = await realpath(projectPath);
|
|
138
|
+
const contained = (p) => p === root || p.startsWith(root + path.sep);
|
|
139
|
+
const target = path.resolve(root, relFile);
|
|
140
|
+
if (!contained(target)) {
|
|
141
|
+
throw new PathValidationError(`File path escapes project tree: ${relFile}`, relFile, "path_traversal");
|
|
142
|
+
}
|
|
143
|
+
const real = await realpath(target);
|
|
144
|
+
if (!contained(real)) {
|
|
145
|
+
throw new PathValidationError(`Symlinked file escapes project tree: ${relFile}`, relFile, "symlink_escape");
|
|
146
|
+
}
|
|
147
|
+
return real;
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Resolve a relative *write* target inside a project tree, rejecting
|
|
151
|
+
* escapes — like resolveContainedFile but for a file that may not exist
|
|
152
|
+
* yet (the parent directory must exist and is symlink-resolved).
|
|
153
|
+
* For untrusted output paths (e.g. an `output_file` tool argument).
|
|
154
|
+
*
|
|
155
|
+
* @returns The absolute path to write to, contained within the tree
|
|
156
|
+
* @throws PathValidationError if the path escapes the project tree
|
|
157
|
+
*/
|
|
158
|
+
export async function resolveContainedWritePath(projectPath, relFile) {
|
|
159
|
+
const root = await realpath(projectPath);
|
|
160
|
+
const contained = (p) => p === root || p.startsWith(root + path.sep);
|
|
161
|
+
const target = path.resolve(root, relFile);
|
|
162
|
+
if (!contained(target)) {
|
|
163
|
+
throw new PathValidationError(`File path escapes project tree: ${relFile}`, relFile, "path_traversal");
|
|
164
|
+
}
|
|
165
|
+
// The leaf (and possibly intermediate dirs) may not exist yet. Resolve
|
|
166
|
+
// the nearest existing ancestor through symlinks so a symlinked
|
|
167
|
+
// directory inside the tree cannot redirect the write outside it, then
|
|
168
|
+
// re-attach the not-yet-existing remainder.
|
|
169
|
+
let ancestor = path.dirname(target);
|
|
170
|
+
while (true) {
|
|
171
|
+
try {
|
|
172
|
+
const realAncestor = await realpath(ancestor);
|
|
173
|
+
if (!contained(realAncestor)) {
|
|
174
|
+
throw new PathValidationError(`Symlinked directory escapes project tree: ${relFile}`, relFile, "symlink_escape");
|
|
175
|
+
}
|
|
176
|
+
const remainder = path.relative(ancestor, target);
|
|
177
|
+
const finalPath = path.join(realAncestor, remainder);
|
|
178
|
+
if (!contained(finalPath)) {
|
|
179
|
+
throw new PathValidationError(`File path escapes project tree: ${relFile}`, relFile, "path_traversal");
|
|
180
|
+
}
|
|
181
|
+
return finalPath;
|
|
182
|
+
}
|
|
183
|
+
catch (error) {
|
|
184
|
+
if (error instanceof PathValidationError)
|
|
185
|
+
throw error;
|
|
186
|
+
if (error.code !== "ENOENT")
|
|
187
|
+
throw error;
|
|
188
|
+
const parent = path.dirname(ancestor);
|
|
189
|
+
if (parent === ancestor) {
|
|
190
|
+
// Reached the filesystem root without an existing ancestor.
|
|
191
|
+
throw new PathValidationError(`Cannot resolve write path: ${relFile}`, relFile, "invalid_path");
|
|
192
|
+
}
|
|
193
|
+
ancestor = parent;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
}
|
|
117
197
|
/**
|
|
118
198
|
* Sanitize a path for use in error messages (remove sensitive info)
|
|
119
199
|
*/
|
package/dist/util/paths.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/util/paths.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB;;GAEG;AACH,MAAM,OAAO,mBAAoB,SAAQ,KAAK;IAG1B;IACA;IAHlB,YACE,OAAe,EACC,IAAY,EACZ,MAKE;QAElB,KAAK,CAAC,OAAO,CAAC,CAAC;QARC,SAAI,GAAJ,IAAI,CAAQ;QACZ,WAAM,GAAN,MAAM,CAKJ;QAGlB,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC;IACpC,CAAC;CACF;
|
|
1
|
+
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/util/paths.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Safe subprocess execution for scanner adapters.
|
|
3
|
+
*
|
|
4
|
+
* Wraps execFile (never a shell) so argument values — project paths,
|
|
5
|
+
* target URLs, config file paths — can never be interpreted as shell
|
|
6
|
+
* syntax. This is the only sanctioned way to invoke external scanner
|
|
7
|
+
* binaries (CONSTITUTION: "No string-concat shell commands").
|
|
8
|
+
*
|
|
9
|
+
* @module util/subprocess
|
|
10
|
+
*/
|
|
11
|
+
export declare class CommandError extends Error {
|
|
12
|
+
readonly binary: string;
|
|
13
|
+
readonly args: string[];
|
|
14
|
+
readonly exitCode: number | null;
|
|
15
|
+
readonly stdout: string;
|
|
16
|
+
readonly stderr: string;
|
|
17
|
+
readonly cause?: Error | undefined;
|
|
18
|
+
constructor(message: string, binary: string, args: string[], exitCode: number | null, stdout: string, stderr: string, cause?: Error | undefined);
|
|
19
|
+
}
|
|
20
|
+
export interface RunCommandOptions {
|
|
21
|
+
/** Milliseconds before the process is killed. Default 120000. */
|
|
22
|
+
timeout?: number;
|
|
23
|
+
/** Max bytes captured per stream. Default 10MB. */
|
|
24
|
+
maxBuffer?: number;
|
|
25
|
+
cwd?: string;
|
|
26
|
+
env?: NodeJS.ProcessEnv;
|
|
27
|
+
/**
|
|
28
|
+
* Scanners conventionally exit non-zero when findings exist (e.g.
|
|
29
|
+
* bandit/semgrep exit 1). When true (default), a non-zero exit that
|
|
30
|
+
* still produced stdout resolves normally instead of throwing —
|
|
31
|
+
* matching the historical execAsync `.catch(e => e.stdout)` pattern.
|
|
32
|
+
*/
|
|
33
|
+
tolerateExitWithOutput?: boolean;
|
|
34
|
+
}
|
|
35
|
+
export interface RunCommandResult {
|
|
36
|
+
stdout: string;
|
|
37
|
+
stderr: string;
|
|
38
|
+
exitCode: number;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Run a binary with discrete argv entries. No shell is ever invoked,
|
|
42
|
+
* so callers MUST NOT pre-quote values or pass shell syntax
|
|
43
|
+
* (pipes, redirects, `&&`) — restructure such logic in JS instead.
|
|
44
|
+
*/
|
|
45
|
+
export declare function runCommand(binary: string, args: string[], options?: RunCommandOptions): Promise<RunCommandResult>;
|
|
46
|
+
/**
|
|
47
|
+
* Probe for a scanner binary by running it with a version-style flag.
|
|
48
|
+
* Returns the first line of stdout (trimmed) or null when unavailable.
|
|
49
|
+
*/
|
|
50
|
+
export declare function probeBinary(binary: string, args?: string[], timeout?: number): Promise<string | null>;
|
|
51
|
+
//# sourceMappingURL=subprocess.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subprocess.d.ts","sourceRoot":"","sources":["../../src/util/subprocess.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,qBAAa,YAAa,SAAQ,KAAK;aAGnB,MAAM,EAAE,MAAM;aACd,IAAI,EAAE,MAAM,EAAE;aACd,QAAQ,EAAE,MAAM,GAAG,IAAI;aACvB,MAAM,EAAE,MAAM;aACd,MAAM,EAAE,MAAM;aACd,KAAK,CAAC,EAAE,KAAK;gBAN7B,OAAO,EAAE,MAAM,EACC,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EAAE,EACd,QAAQ,EAAE,MAAM,GAAG,IAAI,EACvB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,KAAK,CAAC,EAAE,KAAK,YAAA;CAKhC;AAED,MAAM,WAAW,iBAAiB;IAChC,iEAAiE;IACjE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,mDAAmD;IACnD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB;;;;;OAKG;IACH,sBAAsB,CAAC,EAAE,OAAO,CAAC;CAClC;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;;GAIG;AACH,wBAAsB,UAAU,CAC9B,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC,gBAAgB,CAAC,CAqD3B;AAED;;;GAGG;AACH,wBAAsB,WAAW,CAC/B,MAAM,EAAE,MAAM,EACd,IAAI,GAAE,MAAM,EAAkB,EAC9B,OAAO,SAAO,GACb,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAUxB"}
|