@orygn/opa-mcp 0.4.0 → 0.6.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 +583 -4
- package/README.md +144 -98
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +9 -3
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +14 -4
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +91 -19
- package/dist/config.js.map +1 -1
- package/dist/constants.d.ts +1 -6
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +17 -3
- package/dist/constants.js.map +1 -1
- package/dist/lib/bundle-signatures.d.ts +23 -0
- package/dist/lib/bundle-signatures.d.ts.map +1 -0
- package/dist/lib/bundle-signatures.js +152 -0
- package/dist/lib/bundle-signatures.js.map +1 -0
- package/dist/lib/child-env.d.ts +9 -2
- package/dist/lib/child-env.d.ts.map +1 -1
- package/dist/lib/child-env.js +38 -6
- package/dist/lib/child-env.js.map +1 -1
- package/dist/lib/conftest-cli.d.ts +25 -10
- package/dist/lib/conftest-cli.d.ts.map +1 -1
- package/dist/lib/conftest-cli.js +233 -50
- package/dist/lib/conftest-cli.js.map +1 -1
- package/dist/lib/errors.d.ts +4 -5
- package/dist/lib/errors.d.ts.map +1 -1
- package/dist/lib/errors.js +15 -3
- package/dist/lib/errors.js.map +1 -1
- package/dist/lib/inline-paths.d.ts +37 -0
- package/dist/lib/inline-paths.d.ts.map +1 -0
- package/dist/lib/inline-paths.js +162 -0
- package/dist/lib/inline-paths.js.map +1 -0
- package/dist/lib/install-id.d.ts.map +1 -1
- package/dist/lib/install-id.js +18 -3
- package/dist/lib/install-id.js.map +1 -1
- package/dist/lib/json-stream.d.ts +26 -0
- package/dist/lib/json-stream.d.ts.map +1 -0
- package/dist/lib/json-stream.js +69 -0
- package/dist/lib/json-stream.js.map +1 -0
- package/dist/lib/opa-cli.d.ts +74 -16
- package/dist/lib/opa-cli.d.ts.map +1 -1
- package/dist/lib/opa-cli.js +107 -30
- package/dist/lib/opa-cli.js.map +1 -1
- package/dist/lib/opa-client.d.ts +27 -1
- package/dist/lib/opa-client.d.ts.map +1 -1
- package/dist/lib/opa-client.js +98 -14
- package/dist/lib/opa-client.js.map +1 -1
- package/dist/lib/opa-paths.d.ts +34 -0
- package/dist/lib/opa-paths.d.ts.map +1 -0
- package/dist/lib/opa-paths.js +101 -0
- package/dist/lib/opa-paths.js.map +1 -0
- package/dist/lib/output.d.ts.map +1 -1
- package/dist/lib/output.js +83 -10
- package/dist/lib/output.js.map +1 -1
- package/dist/lib/regal-cli.d.ts +16 -1
- package/dist/lib/regal-cli.d.ts.map +1 -1
- package/dist/lib/regal-cli.js +40 -6
- package/dist/lib/regal-cli.js.map +1 -1
- package/dist/lib/rego-ast-walker.d.ts +0 -6
- package/dist/lib/rego-ast-walker.d.ts.map +1 -1
- package/dist/lib/rego-ast-walker.js +181 -55
- package/dist/lib/rego-ast-walker.js.map +1 -1
- package/dist/lib/rego-counterexample.d.ts +15 -2
- package/dist/lib/rego-counterexample.d.ts.map +1 -1
- package/dist/lib/rego-counterexample.js +63 -15
- package/dist/lib/rego-counterexample.js.map +1 -1
- package/dist/lib/rego-input-path.d.ts +20 -0
- package/dist/lib/rego-input-path.d.ts.map +1 -0
- package/dist/lib/rego-input-path.js +70 -0
- package/dist/lib/rego-input-path.js.map +1 -0
- package/dist/lib/rego-ir.d.ts +34 -3
- package/dist/lib/rego-ir.d.ts.map +1 -1
- package/dist/lib/rego-smt-encoder.d.ts +88 -5
- package/dist/lib/rego-smt-encoder.d.ts.map +1 -1
- package/dist/lib/rego-smt-encoder.js +270 -31
- package/dist/lib/rego-smt-encoder.js.map +1 -1
- package/dist/lib/rego-type-inferencer.d.ts +27 -2
- package/dist/lib/rego-type-inferencer.d.ts.map +1 -1
- package/dist/lib/rego-type-inferencer.js +71 -3
- package/dist/lib/rego-type-inferencer.js.map +1 -1
- package/dist/lib/rego-verify-engine.d.ts.map +1 -1
- package/dist/lib/rego-verify-engine.js +203 -90
- package/dist/lib/rego-verify-engine.js.map +1 -1
- package/dist/lib/rego-z3.d.ts +66 -0
- package/dist/lib/rego-z3.d.ts.map +1 -1
- package/dist/lib/rego-z3.js +312 -5
- package/dist/lib/rego-z3.js.map +1 -1
- package/dist/lib/security.d.ts +8 -0
- package/dist/lib/security.d.ts.map +1 -1
- package/dist/lib/security.js +130 -54
- package/dist/lib/security.js.map +1 -1
- package/dist/lib/subprocess.d.ts +13 -0
- package/dist/lib/subprocess.d.ts.map +1 -1
- package/dist/lib/subprocess.js +153 -18
- package/dist/lib/subprocess.js.map +1 -1
- package/dist/lib/tool-helpers.d.ts +12 -25
- package/dist/lib/tool-helpers.d.ts.map +1 -1
- package/dist/lib/tool-helpers.js +66 -40
- package/dist/lib/tool-helpers.js.map +1 -1
- package/dist/prompts/index.js +2 -2
- package/dist/resources/index.js +1 -1
- package/dist/resources/index.js.map +1 -1
- package/dist/resources/patterns.d.ts +1 -1
- package/dist/resources/patterns.d.ts.map +1 -1
- package/dist/resources/patterns.js +42 -15
- package/dist/resources/patterns.js.map +1 -1
- package/dist/server.d.ts +2 -2
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +50 -7
- package/dist/server.js.map +1 -1
- package/dist/tools/authoring/capabilities.d.ts +4 -0
- package/dist/tools/authoring/capabilities.d.ts.map +1 -1
- package/dist/tools/authoring/capabilities.js +41 -4
- package/dist/tools/authoring/capabilities.js.map +1 -1
- package/dist/tools/authoring/check-schema.d.ts +6 -0
- package/dist/tools/authoring/check-schema.d.ts.map +1 -1
- package/dist/tools/authoring/check-schema.js +56 -3
- package/dist/tools/authoring/check-schema.js.map +1 -1
- package/dist/tools/authoring/format.d.ts.map +1 -1
- package/dist/tools/authoring/format.js +2 -2
- package/dist/tools/authoring/format.js.map +1 -1
- package/dist/tools/authoring/lint.d.ts.map +1 -1
- package/dist/tools/authoring/lint.js +8 -6
- package/dist/tools/authoring/lint.js.map +1 -1
- package/dist/tools/authoring/migrate-v1.d.ts.map +1 -1
- package/dist/tools/authoring/migrate-v1.js +20 -4
- package/dist/tools/authoring/migrate-v1.js.map +1 -1
- package/dist/tools/authoring/parse.d.ts.map +1 -1
- package/dist/tools/authoring/parse.js +3 -3
- package/dist/tools/authoring/parse.js.map +1 -1
- package/dist/tools/bundles/build.d.ts.map +1 -1
- package/dist/tools/bundles/build.js +12 -4
- package/dist/tools/bundles/build.js.map +1 -1
- package/dist/tools/bundles/sign.d.ts +9 -2
- package/dist/tools/bundles/sign.d.ts.map +1 -1
- package/dist/tools/bundles/sign.js +125 -19
- package/dist/tools/bundles/sign.js.map +1 -1
- package/dist/tools/bundles/verify.d.ts +1 -1
- package/dist/tools/bundles/verify.d.ts.map +1 -1
- package/dist/tools/bundles/verify.js +58 -19
- package/dist/tools/bundles/verify.js.map +1 -1
- package/dist/tools/conftest/index.d.ts +5 -0
- package/dist/tools/conftest/index.d.ts.map +1 -1
- package/dist/tools/conftest/index.js.map +1 -1
- package/dist/tools/conftest/pull.d.ts.map +1 -1
- package/dist/tools/conftest/pull.js +24 -10
- package/dist/tools/conftest/pull.js.map +1 -1
- package/dist/tools/conftest/push.d.ts.map +1 -1
- package/dist/tools/conftest/push.js +17 -7
- package/dist/tools/conftest/push.js.map +1 -1
- package/dist/tools/conftest/test.d.ts +10 -6
- package/dist/tools/conftest/test.d.ts.map +1 -1
- package/dist/tools/conftest/test.js +61 -39
- package/dist/tools/conftest/test.js.map +1 -1
- package/dist/tools/conftest/verify.d.ts +10 -6
- package/dist/tools/conftest/verify.d.ts.map +1 -1
- package/dist/tools/conftest/verify.js +40 -32
- package/dist/tools/conftest/verify.js.map +1 -1
- package/dist/tools/evaluation/_shared.js +9 -12
- package/dist/tools/evaluation/_shared.js.map +1 -1
- package/dist/tools/evaluation/bench.d.ts +29 -2
- package/dist/tools/evaluation/bench.d.ts.map +1 -1
- package/dist/tools/evaluation/bench.js +53 -9
- package/dist/tools/evaluation/bench.js.map +1 -1
- package/dist/tools/evaluation/compile.js +4 -4
- package/dist/tools/evaluation/compile.js.map +1 -1
- package/dist/tools/evaluation/eval.d.ts.map +1 -1
- package/dist/tools/evaluation/eval.js +12 -16
- package/dist/tools/evaluation/eval.js.map +1 -1
- package/dist/tools/evaluation/exec.d.ts +16 -0
- package/dist/tools/evaluation/exec.d.ts.map +1 -1
- package/dist/tools/evaluation/exec.js +38 -6
- package/dist/tools/evaluation/exec.js.map +1 -1
- package/dist/tools/evaluation/test-multiroot.d.ts +6 -0
- package/dist/tools/evaluation/test-multiroot.d.ts.map +1 -1
- package/dist/tools/evaluation/test-multiroot.js +35 -8
- package/dist/tools/evaluation/test-multiroot.js.map +1 -1
- package/dist/tools/evaluation/test.d.ts +45 -0
- package/dist/tools/evaluation/test.d.ts.map +1 -1
- package/dist/tools/evaluation/test.js +153 -32
- package/dist/tools/evaluation/test.js.map +1 -1
- package/dist/tools/helpers/coverage-gaps.d.ts +11 -3
- package/dist/tools/helpers/coverage-gaps.d.ts.map +1 -1
- package/dist/tools/helpers/coverage-gaps.js +7 -7
- package/dist/tools/helpers/coverage-gaps.js.map +1 -1
- package/dist/tools/helpers/describe-policy.d.ts.map +1 -1
- package/dist/tools/helpers/describe-policy.js +2 -2
- package/dist/tools/helpers/describe-policy.js.map +1 -1
- package/dist/tools/helpers/explain-decision.d.ts.map +1 -1
- package/dist/tools/helpers/explain-decision.js +3 -4
- package/dist/tools/helpers/explain-decision.js.map +1 -1
- package/dist/tools/helpers/explain-undefined.d.ts +9 -3
- package/dist/tools/helpers/explain-undefined.d.ts.map +1 -1
- package/dist/tools/helpers/explain-undefined.js +214 -73
- package/dist/tools/helpers/explain-undefined.js.map +1 -1
- package/dist/tools/helpers/fix.d.ts +11 -5
- package/dist/tools/helpers/fix.d.ts.map +1 -1
- package/dist/tools/helpers/fix.js +88 -45
- package/dist/tools/helpers/fix.js.map +1 -1
- package/dist/tools/helpers/generate-test-skeleton.d.ts.map +1 -1
- package/dist/tools/helpers/generate-test-skeleton.js +105 -21
- package/dist/tools/helpers/generate-test-skeleton.js.map +1 -1
- package/dist/tools/helpers/playground-share.d.ts +4 -2
- package/dist/tools/helpers/playground-share.d.ts.map +1 -1
- package/dist/tools/helpers/playground-share.js +13 -3
- package/dist/tools/helpers/playground-share.js.map +1 -1
- package/dist/tools/helpers/policy-diff.d.ts.map +1 -1
- package/dist/tools/helpers/policy-diff.js +3 -4
- package/dist/tools/helpers/policy-diff.js.map +1 -1
- package/dist/tools/helpers/security-audit.d.ts.map +1 -1
- package/dist/tools/helpers/security-audit.js +19 -19
- package/dist/tools/helpers/security-audit.js.map +1 -1
- package/dist/tools/helpers/verify.d.ts.map +1 -1
- package/dist/tools/helpers/verify.js +5 -1
- package/dist/tools/helpers/verify.js.map +1 -1
- package/dist/tools/meta/index.d.ts +1 -1
- package/dist/tools/server-management/_shared.d.ts +15 -4
- package/dist/tools/server-management/_shared.d.ts.map +1 -1
- package/dist/tools/server-management/_shared.js +86 -13
- package/dist/tools/server-management/_shared.js.map +1 -1
- package/dist/tools/server-management/data.d.ts.map +1 -1
- package/dist/tools/server-management/data.js +88 -23
- package/dist/tools/server-management/data.js.map +1 -1
- package/dist/tools/server-management/decisions.d.ts.map +1 -1
- package/dist/tools/server-management/decisions.js +16 -3
- package/dist/tools/server-management/decisions.js.map +1 -1
- package/dist/tools/server-management/policies.d.ts.map +1 -1
- package/dist/tools/server-management/policies.js +44 -7
- package/dist/tools/server-management/policies.js.map +1 -1
- package/dist/tools/server-management/status.d.ts.map +1 -1
- package/dist/tools/server-management/status.js +80 -13
- package/dist/tools/server-management/status.js.map +1 -1
- package/dist/types.d.ts +10 -1
- package/dist/types.d.ts.map +1 -1
- package/package.json +2 -1
|
@@ -57,16 +57,11 @@ export async function runEval(opa, config, args, flags, signal) {
|
|
|
57
57
|
evalInput.paths = validation.resolved;
|
|
58
58
|
}
|
|
59
59
|
if (args.input !== undefined) {
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
catch {
|
|
66
|
-
// Not a JSON string -- pass as-is (intentional string input).
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
evalInput.input = resolvedInput;
|
|
60
|
+
// Passed through as given. A JSON object or array that arrived as a string
|
|
61
|
+
// is repaired at the opa-cli boundary by coerceJsonArg, the same way for
|
|
62
|
+
// every tool; parsing it here as well retyped a string such as "42" or
|
|
63
|
+
// "true" into a number or boolean, and the policy saw a different input.
|
|
64
|
+
evalInput.input = args.input;
|
|
70
65
|
}
|
|
71
66
|
else if (args.inputPath) {
|
|
72
67
|
const inputPathValidation = validatePaths([args.inputPath], config, { mustExist: true });
|
|
@@ -97,13 +92,15 @@ export async function runEval(opa, config, args, flags, signal) {
|
|
|
97
92
|
// (parse, type, runtime). Output JSON is on stdout.
|
|
98
93
|
const parsed = tryParseJson(result.stdout);
|
|
99
94
|
if (result.exitCode !== 0) {
|
|
95
|
+
// The diagnostics name the temp file the inline source was written to;
|
|
96
|
+
// the success path already hides it, and the failure path must too.
|
|
100
97
|
return err('EVAL_ERROR', 'opa eval exited with an error.', {
|
|
101
|
-
details: parsed ?? { stderr: result.stderr.trim(), stdout: result.stdout.trim() },
|
|
98
|
+
details: sanitizeInlinePathsDeep(parsed ?? { stderr: result.stderr.trim(), stdout: result.stdout.trim() }),
|
|
102
99
|
});
|
|
103
100
|
}
|
|
104
101
|
if (parsed === undefined) {
|
|
105
102
|
return err('UNKNOWN_ERROR', 'opa eval produced no parseable JSON output.', {
|
|
106
|
-
details: { stdout: result.stdout.trim() },
|
|
103
|
+
details: sanitizeInlinePathsDeep({ stdout: result.stdout.trim() }),
|
|
107
104
|
});
|
|
108
105
|
}
|
|
109
106
|
// OPA references the temp file it wrote inline source to in trace, coverage,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"_shared.js","sourceRoot":"","sources":["../../../src/tools/evaluation/_shared.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,MAAM,qBAAqB,CAAC;AAE9C,OAAO,EACL,oBAAoB,EACpB,uBAAuB,EACvB,YAAY,EACZ,aAAa,GACd,MAAM,2BAA2B,CAAC;AAGnC,oEAAoE;AACpE,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,oDAAoD,CAAC;IACvF,MAAM,EAAE,CAAC;SACN,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,6DAA6D,CAAC;IAC1E,KAAK,EAAE,CAAC;SACL,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;SACjB,QAAQ,EAAE;SACV,QAAQ,CAAC,6EAA6E,CAAC;IAC1F,KAAK,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,wBAAwB,CAAC;IAChE,SAAS,EAAE,CAAC;SACT,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,6DAA6D,CAAC;IAC1E,QAAQ,EAAE,CAAC;SACR,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;SACjB,QAAQ,EAAE;SACV,QAAQ,CAAC,qDAAqD,CAAC;IAClE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,qDAAqD,CAAC;IAC/F,mBAAmB,EAAE,CAAC;SACnB,OAAO,EAAE;SACT,QAAQ,EAAE;SACV,QAAQ,CAAC,+DAA+D,CAAC;CAC7E,CAAC;AA6BF;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,OAAO,CAC3B,GAAW,EACX,MAAc,EACd,IAAc,EACd,KAAgB,EAChB,MAAoB;IAEpB,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC;QACxC,OAAO,GAAG,CACR,eAAe,EACf,sEAAsE,CACvE,CAAC;IACJ,CAAC;IACD,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;QAC/C,OAAO,GAAG,CAAC,eAAe,EAAE,4DAA4D,CAAC,CAAC;IAC5F,CAAC;IAED,MAAM,SAAS,GAAc,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;IACnD,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS;QAAE,SAAS,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;IAE9D,IAAI,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC;QACvB,MAAM,UAAU,GAAG,aAAa,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1E,IAAI,CAAC,UAAU,CAAC,EAAE;YAAE,OAAO,UAAU,CAAC,KAAK,CAAC;QAC5C,SAAS,CAAC,KAAK,GAAG,UAAU,CAAC,QAAQ,CAAC;IACxC,CAAC;IAED,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAC7B,
|
|
1
|
+
{"version":3,"file":"_shared.js","sourceRoot":"","sources":["../../../src/tools/evaluation/_shared.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,36 @@
|
|
|
1
1
|
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
2
|
import type { Config } from '../../config.js';
|
|
3
|
+
/** One repetition as OPA reports it: Go's testing.BenchmarkResult. */
|
|
4
|
+
interface BenchRun {
|
|
5
|
+
/** Iterations run. */
|
|
6
|
+
N?: number;
|
|
7
|
+
/** Total nanoseconds across those iterations. */
|
|
8
|
+
T?: number;
|
|
9
|
+
MemAllocs?: number;
|
|
10
|
+
MemBytes?: number;
|
|
11
|
+
[key: string]: unknown;
|
|
12
|
+
}
|
|
3
13
|
export interface RegoBenchOutput {
|
|
14
|
+
/** Iterations opa ran, `N` in the document it prints. */
|
|
4
15
|
iterations?: number;
|
|
5
|
-
|
|
6
|
-
|
|
16
|
+
nsPerOp?: number;
|
|
17
|
+
allocsPerOp?: number;
|
|
18
|
+
bytesPerOp?: number;
|
|
19
|
+
/** The document as opa printed it; for a single run only, since with
|
|
20
|
+
* `count` above one it is `runs[fastest]`. */
|
|
21
|
+
raw?: BenchRun;
|
|
22
|
+
/**
|
|
23
|
+
* Every repetition, in the order OPA ran them, present only when `count` was
|
|
24
|
+
* above 1. The figures above come from the fastest of them by nanoseconds per
|
|
25
|
+
* iteration, which is the run least disturbed by whatever else the machine
|
|
26
|
+
* was doing.
|
|
27
|
+
*/
|
|
28
|
+
runs?: BenchRun[];
|
|
29
|
+
/** How many repetitions ran, present only when more than one did. */
|
|
30
|
+
repetitions?: number;
|
|
31
|
+
/** Index into `runs` of the repetition the figures above come from. */
|
|
32
|
+
fastest?: number;
|
|
7
33
|
}
|
|
8
34
|
export declare function registerRegoBench(server: McpServer, config: Config): void;
|
|
35
|
+
export {};
|
|
9
36
|
//# sourceMappingURL=bench.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bench.d.ts","sourceRoot":"","sources":["../../../src/tools/evaluation/bench.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"bench.d.ts","sourceRoot":"","sources":["../../../src/tools/evaluation/bench.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AA6B9C,sEAAsE;AACtE,UAAU,QAAQ;IAChB,sBAAsB;IACtB,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,iDAAiD;IACjD,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,eAAe;IAC9B,yDAAyD;IACzD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;kDAC8C;IAC9C,GAAG,CAAC,EAAE,QAAQ,CAAC;IACf;;;;;OAKG;IACH,IAAI,CAAC,EAAE,QAAQ,EAAE,CAAC;IAClB,qEAAqE;IACrE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,uEAAuE;IACvE,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AA0BD,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAuFzE"}
|
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
import { z } from 'zod';
|
|
8
8
|
import { OpaCli } from '../../lib/opa-cli.js';
|
|
9
9
|
import { err, ok } from '../../lib/errors.js';
|
|
10
|
+
import { parseJsonValues } from '../../lib/json-stream.js';
|
|
10
11
|
import { mapSubprocessFailure, tryParseJson, validatePaths, withToolEnvelope, } from '../../lib/tool-helpers.js';
|
|
11
12
|
const RegoBenchInput = {
|
|
12
13
|
query: z.string().min(1).describe('Rego query to benchmark.'),
|
|
@@ -21,8 +22,33 @@ const RegoBenchInput = {
|
|
|
21
22
|
.int()
|
|
22
23
|
.positive()
|
|
23
24
|
.optional()
|
|
24
|
-
.describe("Number of benchmark
|
|
25
|
+
.describe("Number of times to repeat the benchmark (`--count N`). Defaults to OPA's built-in default of one. Above one, every repetition is returned in `runs`, `fastest` indexes the one the top-level figures come from, and `raw` is omitted since that document is in `runs`."),
|
|
25
26
|
};
|
|
27
|
+
/** Nanoseconds per iteration, or Infinity when the run says nothing useful. */
|
|
28
|
+
function nsPerOp(run) {
|
|
29
|
+
const n = typeof run.N === 'number' ? run.N : 0;
|
|
30
|
+
const t = typeof run.T === 'number' ? run.T : 0;
|
|
31
|
+
return n > 0 ? t / n : Number.POSITIVE_INFINITY;
|
|
32
|
+
}
|
|
33
|
+
/** The per-iteration figures of one run, each present only when derivable. */
|
|
34
|
+
function summarize(run) {
|
|
35
|
+
const n = typeof run.N === 'number' && run.N > 0 ? run.N : undefined;
|
|
36
|
+
// Whole numbers, as Go's BenchmarkResult reports them.
|
|
37
|
+
const per = (total) => n !== undefined && typeof total === 'number' ? Math.floor(total / n) : undefined;
|
|
38
|
+
const out = { raw: run };
|
|
39
|
+
if (n !== undefined)
|
|
40
|
+
out.iterations = n;
|
|
41
|
+
const ns = per(run.T);
|
|
42
|
+
if (ns !== undefined)
|
|
43
|
+
out.nsPerOp = ns;
|
|
44
|
+
const allocs = per(run.MemAllocs);
|
|
45
|
+
if (allocs !== undefined)
|
|
46
|
+
out.allocsPerOp = allocs;
|
|
47
|
+
const bytes = per(run.MemBytes);
|
|
48
|
+
if (bytes !== undefined)
|
|
49
|
+
out.bytesPerOp = bytes;
|
|
50
|
+
return out;
|
|
51
|
+
}
|
|
26
52
|
export function registerRegoBench(server, config) {
|
|
27
53
|
const opa = new OpaCli(config);
|
|
28
54
|
server.registerTool('rego_bench', {
|
|
@@ -30,10 +56,9 @@ export function registerRegoBench(server, config) {
|
|
|
30
56
|
description: 'Benchmark a Rego query against a policy + input with `opa bench`. Returns statistical timing data: iterations, ns/op, and allocation counts. Use this to spot slow rules.',
|
|
31
57
|
inputSchema: RegoBenchInput,
|
|
32
58
|
annotations: {
|
|
33
|
-
readOnlyHint:
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
openWorldHint: false,
|
|
59
|
+
readOnlyHint: false,
|
|
60
|
+
// Runs Rego supplied by the caller; a policy can reach the network through http.send.
|
|
61
|
+
openWorldHint: true,
|
|
37
62
|
},
|
|
38
63
|
}, async ({ query, paths, input, inputPath, count }, { signal }) => {
|
|
39
64
|
return withToolEnvelope(config, async () => {
|
|
@@ -65,17 +90,36 @@ export function registerRegoBench(server, config) {
|
|
|
65
90
|
if (subprocessFailure)
|
|
66
91
|
return subprocessFailure;
|
|
67
92
|
if (result.exitCode !== 0) {
|
|
93
|
+
// `opa bench --format=json` writes its diagnostics to stdout as an
|
|
94
|
+
// `errors` array and leaves stderr empty, so reporting stderr alone
|
|
95
|
+
// handed back an error with nothing in it.
|
|
96
|
+
const diagnostics = tryParseJson(result.stdout);
|
|
68
97
|
return err('EVAL_ERROR', 'opa bench exited with an error.', {
|
|
69
|
-
details: {
|
|
98
|
+
details: {
|
|
99
|
+
...(diagnostics?.errors !== undefined
|
|
100
|
+
? { errors: diagnostics.errors }
|
|
101
|
+
: { stdout: result.stdout.trim() }),
|
|
102
|
+
stderr: result.stderr.trim(),
|
|
103
|
+
},
|
|
70
104
|
});
|
|
71
105
|
}
|
|
72
|
-
|
|
73
|
-
|
|
106
|
+
// With `--count N` OPA prints one JSON document per repetition, back to
|
|
107
|
+
// back, which `JSON.parse` rejects outright.
|
|
108
|
+
const runs = parseJsonValues(result.stdout).filter((v) => typeof v === 'object' && v !== null && !Array.isArray(v));
|
|
109
|
+
if (runs.length === 0) {
|
|
74
110
|
return err('UNKNOWN_ERROR', 'opa bench produced no parseable JSON output.', {
|
|
75
111
|
details: { stdout: result.stdout.trim() },
|
|
76
112
|
});
|
|
77
113
|
}
|
|
78
|
-
|
|
114
|
+
if (runs.length === 1)
|
|
115
|
+
return ok(summarize(runs[0]));
|
|
116
|
+
let fastest = 0;
|
|
117
|
+
for (let i = 1; i < runs.length; i++) {
|
|
118
|
+
if (nsPerOp(runs[i]) < nsPerOp(runs[fastest]))
|
|
119
|
+
fastest = i;
|
|
120
|
+
}
|
|
121
|
+
const { raw: _raw, ...figures } = summarize(runs[fastest]);
|
|
122
|
+
return ok({ ...figures, runs, repetitions: runs.length, fastest });
|
|
79
123
|
});
|
|
80
124
|
});
|
|
81
125
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bench.js","sourceRoot":"","sources":["../../../src/tools/evaluation/bench.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,MAAM,qBAAqB,CAAC;AAC9C,OAAO,EACL,oBAAoB,EACpB,YAAY,EACZ,aAAa,EACb,gBAAgB,GACjB,MAAM,2BAA2B,CAAC;AAEnC,MAAM,cAAc,GAAG;IACrB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,0BAA0B,CAAC;IAC7D,KAAK,EAAE,CAAC;SACL,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;SACjB,QAAQ,EAAE;SACV,QAAQ,CAAC,+DAA+D,CAAC;IAC5E,KAAK,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,wBAAwB,CAAC;IAChE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,4BAA4B,CAAC;IACvE,KAAK,EAAE,CAAC;SACL,MAAM,EAAE;SACR,GAAG,EAAE;SACL,QAAQ,EAAE;SACV,QAAQ,EAAE;SACV,QAAQ,CAAC,
|
|
1
|
+
{"version":3,"file":"bench.js","sourceRoot":"","sources":["../../../src/tools/evaluation/bench.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,10 +9,10 @@ export function registerRegoCompileQuery(server, config) {
|
|
|
9
9
|
description: 'Run partial evaluation on a query -- substitute known values and return the residual policy. Defaults `unknowns` to `["input"]` (treat input as unknown), so the residual encodes "given input X, this is what would have to be true." Use this for offline policy slicing or pre-computing decision sets.',
|
|
10
10
|
inputSchema: RegoCompileQueryInput,
|
|
11
11
|
annotations: {
|
|
12
|
-
readOnlyHint:
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
openWorldHint:
|
|
12
|
+
readOnlyHint: false,
|
|
13
|
+
// Partial evaluation saves http.send into the residual rather than calling it, but a
|
|
14
|
+
// residual is one step from an evaluation; open-world to be safe.
|
|
15
|
+
openWorldHint: true,
|
|
16
16
|
},
|
|
17
17
|
}, async (args, { signal }) => {
|
|
18
18
|
return withToolEnvelope(config, () => runEval(opa, config, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compile.js","sourceRoot":"","sources":["../../../src/tools/evaluation/compile.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,EAAE,OAAO,EAAE,eAAe,EAAuB,MAAM,cAAc,CAAC;AAE7E,MAAM,qBAAqB,GAAG,eAAe,CAAC;AAE9C,MAAM,UAAU,wBAAwB,CAAC,MAAiB,EAAE,MAAc;IACxE,MAAM,GAAG,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,CAAC;IAE/B,MAAM,CAAC,YAAY,CACjB,oBAAoB,EACpB;QACE,KAAK,EAAE,iCAAiC;QACxC,WAAW,EACT,4SAA4S;QAC9S,WAAW,EAAE,qBAAqB;QAClC,WAAW,EAAE;YACX,YAAY,EAAE,
|
|
1
|
+
{"version":3,"file":"compile.js","sourceRoot":"","sources":["../../../src/tools/evaluation/compile.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,EAAE,OAAO,EAAE,eAAe,EAAuB,MAAM,cAAc,CAAC;AAE7E,MAAM,qBAAqB,GAAG,eAAe,CAAC;AAE9C,MAAM,UAAU,wBAAwB,CAAC,MAAiB,EAAE,MAAc;IACxE,MAAM,GAAG,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,CAAC;IAE/B,MAAM,CAAC,YAAY,CACjB,oBAAoB,EACpB;QACE,KAAK,EAAE,iCAAiC;QACxC,WAAW,EACT,4SAA4S;QAC9S,WAAW,EAAE,qBAAqB;QAClC,WAAW,EAAE;YACX,YAAY,EAAE,KAAK;YACnB,qFAAqF;YACrF,kEAAkE;YAClE,aAAa,EAAE,IAAI;SACpB;KACF,EACD,KAAK,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;QACzB,OAAO,gBAAgB,CAAiB,MAAM,EAAE,GAAG,EAAE,CACnD,OAAO,CACL,GAAG,EACH,MAAM,EACN;YACE,GAAG,IAAI;YACP,OAAO,EAAE,IAAI;YACb,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;SAC5D,EACD,EAAE,EACF,MAAM,CACP,CACF,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"eval.d.ts","sourceRoot":"","sources":["../../../src/tools/evaluation/eval.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAK9C,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"eval.d.ts","sourceRoot":"","sources":["../../../src/tools/evaluation/eval.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAK9C,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAgFxE"}
|
|
@@ -8,10 +8,9 @@ export function registerRegoEval(server, config) {
|
|
|
8
8
|
description: 'Evaluate a Rego query against a policy and an input document using `opa eval`. Returns the standard `{result: [...]}` shape. The bread-and-butter authoring tool.',
|
|
9
9
|
inputSchema: SharedEvalInput,
|
|
10
10
|
annotations: {
|
|
11
|
-
readOnlyHint:
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
openWorldHint: false,
|
|
11
|
+
readOnlyHint: false,
|
|
12
|
+
// Runs Rego supplied by the caller; a policy can reach the network through http.send.
|
|
13
|
+
openWorldHint: true,
|
|
15
14
|
},
|
|
16
15
|
}, async (args, { signal }) => {
|
|
17
16
|
return withToolEnvelope(config, () => runEval(opa, config, args, {}, signal));
|
|
@@ -21,10 +20,9 @@ export function registerRegoEval(server, config) {
|
|
|
21
20
|
description: "Evaluate with `--explain=full` and return a structured trace alongside the result. Use this when an agent needs to see why a rule fired (or didn't) -- the trace is the basis for `rego_explain_decision`.",
|
|
22
21
|
inputSchema: SharedEvalInput,
|
|
23
22
|
annotations: {
|
|
24
|
-
readOnlyHint:
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
openWorldHint: false,
|
|
23
|
+
readOnlyHint: false,
|
|
24
|
+
// Runs Rego supplied by the caller; a policy can reach the network through http.send.
|
|
25
|
+
openWorldHint: true,
|
|
28
26
|
},
|
|
29
27
|
}, async (args, { signal }) => {
|
|
30
28
|
return withToolEnvelope(config, () => runEval(opa, config, args, { explain: 'full' }, signal));
|
|
@@ -34,10 +32,9 @@ export function registerRegoEval(server, config) {
|
|
|
34
32
|
description: 'Evaluate with `--profile` and return per-rule timing and evaluation counts. Use this to find hot rules in slow policies.',
|
|
35
33
|
inputSchema: SharedEvalInput,
|
|
36
34
|
annotations: {
|
|
37
|
-
readOnlyHint:
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
openWorldHint: false,
|
|
35
|
+
readOnlyHint: false,
|
|
36
|
+
// Runs Rego supplied by the caller; a policy can reach the network through http.send.
|
|
37
|
+
openWorldHint: true,
|
|
41
38
|
},
|
|
42
39
|
}, async (args, { signal }) => {
|
|
43
40
|
return withToolEnvelope(config, () => runEval(opa, config, args, { profile: true, metrics: true }, signal));
|
|
@@ -47,10 +44,9 @@ export function registerRegoEval(server, config) {
|
|
|
47
44
|
description: "Evaluate with `--coverage` and return per-line coverage data. Useful for verifying that tests actually exercise the rules they're meant to.",
|
|
48
45
|
inputSchema: SharedEvalInput,
|
|
49
46
|
annotations: {
|
|
50
|
-
readOnlyHint:
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
openWorldHint: false,
|
|
47
|
+
readOnlyHint: false,
|
|
48
|
+
// Runs Rego supplied by the caller; a policy can reach the network through http.send.
|
|
49
|
+
openWorldHint: true,
|
|
54
50
|
},
|
|
55
51
|
}, async (args, { signal }) => {
|
|
56
52
|
return withToolEnvelope(config, () => runEval(opa, config, args, { coverage: true }, signal));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"eval.js","sourceRoot":"","sources":["../../../src/tools/evaluation/eval.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,EAAE,OAAO,EAAE,eAAe,EAAuB,MAAM,cAAc,CAAC;AAE7E,MAAM,UAAU,gBAAgB,CAAC,MAAiB,EAAE,MAAc;IAChE,MAAM,GAAG,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,CAAC;IAE/B,MAAM,CAAC,YAAY,CACjB,WAAW,EACX;QACE,KAAK,EAAE,qBAAqB;QAC5B,WAAW,EACT,mKAAmK;QACrK,WAAW,EAAE,eAAe;QAC5B,WAAW,EAAE;YACX,YAAY,EAAE,
|
|
1
|
+
{"version":3,"file":"eval.js","sourceRoot":"","sources":["../../../src/tools/evaluation/eval.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,EAAE,OAAO,EAAE,eAAe,EAAuB,MAAM,cAAc,CAAC;AAE7E,MAAM,UAAU,gBAAgB,CAAC,MAAiB,EAAE,MAAc;IAChE,MAAM,GAAG,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,CAAC;IAE/B,MAAM,CAAC,YAAY,CACjB,WAAW,EACX;QACE,KAAK,EAAE,qBAAqB;QAC5B,WAAW,EACT,mKAAmK;QACrK,WAAW,EAAE,eAAe;QAC5B,WAAW,EAAE;YACX,YAAY,EAAE,KAAK;YACnB,sFAAsF;YACtF,aAAa,EAAE,IAAI;SACpB;KACF,EACD,KAAK,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;QACzB,OAAO,gBAAgB,CAAiB,MAAM,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC;IAChG,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,YAAY,CACjB,wBAAwB,EACxB;QACE,KAAK,EAAE,oCAAoC;QAC3C,WAAW,EACT,4MAA4M;QAC9M,WAAW,EAAE,eAAe;QAC5B,WAAW,EAAE;YACX,YAAY,EAAE,KAAK;YACnB,sFAAsF;YACtF,aAAa,EAAE,IAAI;SACpB;KACF,EACD,KAAK,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;QACzB,OAAO,gBAAgB,CAAiB,MAAM,EAAE,GAAG,EAAE,CACnD,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,MAAM,CAAC,CACxD,CAAC;IACJ,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,YAAY,CACjB,wBAAwB,EACxB;QACE,KAAK,EAAE,8BAA8B;QACrC,WAAW,EACT,0HAA0H;QAC5H,WAAW,EAAE,eAAe;QAC5B,WAAW,EAAE;YACX,YAAY,EAAE,KAAK;YACnB,sFAAsF;YACtF,aAAa,EAAE,IAAI;SACpB;KACF,EACD,KAAK,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;QACzB,OAAO,gBAAgB,CAAiB,MAAM,EAAE,GAAG,EAAE,CACnD,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,MAAM,CAAC,CACrE,CAAC;IACJ,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,YAAY,CACjB,yBAAyB,EACzB;QACE,KAAK,EAAE,6BAA6B;QACpC,WAAW,EACT,6IAA6I;QAC/I,WAAW,EAAE,eAAe;QAC5B,WAAW,EAAE;YACX,YAAY,EAAE,KAAK;YACnB,sFAAsF;YACtF,aAAa,EAAE,IAAI;SACpB;KACF,EACD,KAAK,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;QACzB,OAAO,gBAAgB,CAAiB,MAAM,EAAE,GAAG,EAAE,CACnD,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,MAAM,CAAC,CACvD,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -22,7 +22,23 @@ export interface OpaExecOutput {
|
|
|
22
22
|
* false when no gate flag is set.
|
|
23
23
|
*/
|
|
24
24
|
failed: boolean;
|
|
25
|
+
/**
|
|
26
|
+
* Present only when every input left the decision undefined. That happens
|
|
27
|
+
* both when no rule matched and when the decision names nothing at all, and
|
|
28
|
+
* the two are indistinguishable in the per-file results.
|
|
29
|
+
*/
|
|
30
|
+
hint?: string;
|
|
25
31
|
}
|
|
32
|
+
/**
|
|
33
|
+
* Convert a decision reference to the path `opa exec --decision` expects.
|
|
34
|
+
*
|
|
35
|
+
* `opa exec` names a decision by slash-separated path with no `data.` prefix.
|
|
36
|
+
* Every other spelling, including the `data.authz.allow` this tool used to
|
|
37
|
+
* document, is accepted by the flag and then resolves to nothing, so each input
|
|
38
|
+
* file comes back with `opa_undefined_error` and the call looks like a policy
|
|
39
|
+
* result rather than a mistake. Returns undefined when nothing is left to name.
|
|
40
|
+
*/
|
|
41
|
+
export declare function toDecisionPath(decision: string): string | undefined;
|
|
26
42
|
export declare function registerOpaExec(server: McpServer, config: Config): void;
|
|
27
43
|
export {};
|
|
28
44
|
//# sourceMappingURL=exec.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"exec.d.ts","sourceRoot":"","sources":["../../../src/tools/evaluation/exec.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAiE9C,UAAU,eAAe;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAC7C;AAMD,MAAM,WAAW,aAAa;IAC5B,mCAAmC;IACnC,OAAO,EAAE,eAAe,EAAE,CAAC;IAC3B,6CAA6C;IAC7C,KAAK,EAAE,MAAM,CAAC;IACd,4DAA4D;IAC5D,YAAY,EAAE,MAAM,CAAC;IACrB,yDAAyD;IACzD,UAAU,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,MAAM,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"exec.d.ts","sourceRoot":"","sources":["../../../src/tools/evaluation/exec.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAiE9C,UAAU,eAAe;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAC7C;AAMD,MAAM,WAAW,aAAa;IAC5B,mCAAmC;IACnC,OAAO,EAAE,eAAe,EAAE,CAAC;IAC3B,6CAA6C;IAC7C,KAAK,EAAE,MAAM,CAAC;IACd,4DAA4D;IAC5D,YAAY,EAAE,MAAM,CAAC;IACrB,yDAAyD;IACzD,UAAU,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,MAAM,EAAE,OAAO,CAAC;IAChB;;;;OAIG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAQnE;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAoJvE"}
|
|
@@ -20,7 +20,7 @@ const OpaExecInput = {
|
|
|
20
20
|
decision: z
|
|
21
21
|
.string()
|
|
22
22
|
.min(1)
|
|
23
|
-
.describe('The policy entrypoint to evaluate for each input, e.g. `"
|
|
23
|
+
.describe('The policy entrypoint to evaluate for each input, e.g. `"authz/allow"`. `opa exec` names a decision by slash-separated path with no `data.` prefix; the Rego reference forms (`data.authz.allow`, `authz.allow`) are accepted here and converted, because passing one straight through leaves every file undefined.'),
|
|
24
24
|
bundle: z
|
|
25
25
|
.string()
|
|
26
26
|
.optional()
|
|
@@ -50,6 +50,26 @@ const OpaExecInput = {
|
|
|
50
50
|
.optional()
|
|
51
51
|
.describe('Opt in to OPA v1.0-compatible behaviors (`--v1-compatible`).'),
|
|
52
52
|
};
|
|
53
|
+
/**
|
|
54
|
+
* Convert a decision reference to the path `opa exec --decision` expects.
|
|
55
|
+
*
|
|
56
|
+
* `opa exec` names a decision by slash-separated path with no `data.` prefix.
|
|
57
|
+
* Every other spelling, including the `data.authz.allow` this tool used to
|
|
58
|
+
* document, is accepted by the flag and then resolves to nothing, so each input
|
|
59
|
+
* file comes back with `opa_undefined_error` and the call looks like a policy
|
|
60
|
+
* result rather than a mistake. Returns undefined when nothing is left to name.
|
|
61
|
+
*/
|
|
62
|
+
export function toDecisionPath(decision) {
|
|
63
|
+
const trimmed = decision.trim().replace(/^[/]+/, '').replace(/[/]+$/, '');
|
|
64
|
+
// Drop a leading `data.` or `data/` root, but not a package named `database`.
|
|
65
|
+
const withoutRoot = trimmed.replace(/^data(?=$|[./])[./]?/, '');
|
|
66
|
+
if (withoutRoot.length === 0)
|
|
67
|
+
return undefined;
|
|
68
|
+
const segments = withoutRoot.includes('/') ? withoutRoot.split('/') : withoutRoot.split('.');
|
|
69
|
+
if (segments.some((seg) => seg.length === 0))
|
|
70
|
+
return undefined;
|
|
71
|
+
return segments.join('/');
|
|
72
|
+
}
|
|
53
73
|
export function registerOpaExec(server, config) {
|
|
54
74
|
const opa = new OpaCli(config);
|
|
55
75
|
server.registerTool('opa_exec', {
|
|
@@ -57,10 +77,9 @@ export function registerOpaExec(server, config) {
|
|
|
57
77
|
description: 'Evaluate a policy decision against one or more input files using `opa exec --format=json`. Unlike `rego_eval` (single input), `opa exec` processes every file independently and returns a per-file result -- ideal for CI pipelines that check many config files against a policy in one call. Supply `bundle` for bundle-based policies or `dataPaths` for raw policy files; these are mutually exclusive. Each file that fails evaluation appears in `results` with an `error` field rather than a `result` field. Set one of `fail`/`failDefined`/`failNonEmpty` to turn the call into a CI gate: the result then reports `failed: true` (instead of erroring) when the gate condition is met.',
|
|
58
78
|
inputSchema: OpaExecInput,
|
|
59
79
|
annotations: {
|
|
60
|
-
readOnlyHint:
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
openWorldHint: false,
|
|
80
|
+
readOnlyHint: false,
|
|
81
|
+
// Runs Rego supplied by the caller; a policy can reach the network through http.send.
|
|
82
|
+
openWorldHint: true,
|
|
64
83
|
},
|
|
65
84
|
}, async ({ inputPaths, decision, bundle, dataPaths, fail, failDefined, failNonEmpty, timeout, v1Compatible, }, { signal }) => {
|
|
66
85
|
return withToolEnvelope(config, async () => {
|
|
@@ -70,6 +89,10 @@ export function registerOpaExec(server, config) {
|
|
|
70
89
|
if ([fail, failDefined, failNonEmpty].filter(Boolean).length > 1) {
|
|
71
90
|
return err('INVALID_INPUT', 'opa_exec accepts at most one of `fail`, `failDefined`, or `failNonEmpty`.');
|
|
72
91
|
}
|
|
92
|
+
const decisionPath = toDecisionPath(decision);
|
|
93
|
+
if (decisionPath === undefined) {
|
|
94
|
+
return err('INVALID_INPUT', '`decision` must name a rule, for example "authz/allow" or "data.authz.allow".');
|
|
95
|
+
}
|
|
73
96
|
// Validate input file paths.
|
|
74
97
|
const inputValidation = validatePaths(inputPaths, config, { mustExist: true });
|
|
75
98
|
if (!inputValidation.ok)
|
|
@@ -92,7 +115,7 @@ export function registerOpaExec(server, config) {
|
|
|
92
115
|
}
|
|
93
116
|
const result = await opa.exec({
|
|
94
117
|
inputPaths: inputValidation.resolved,
|
|
95
|
-
decision,
|
|
118
|
+
decision: decisionPath,
|
|
96
119
|
bundle: resolvedBundle,
|
|
97
120
|
dataPaths: resolvedDataPaths,
|
|
98
121
|
fail,
|
|
@@ -136,12 +159,21 @@ export function registerOpaExec(server, config) {
|
|
|
136
159
|
const results = parsed.result ?? [];
|
|
137
160
|
const successCount = results.filter((r) => r.error === undefined).length;
|
|
138
161
|
const errorCount = results.filter((r) => r.error !== undefined).length;
|
|
162
|
+
// A decision naming nothing is reported per file as an undefined
|
|
163
|
+
// decision, indistinguishable from every input legitimately matching no
|
|
164
|
+
// rule. Both read as a pass under a `deny`-style policy, so say so.
|
|
165
|
+
const allUndefined = results.length > 0 && results.every((r) => r.error?.code === 'opa_undefined_error');
|
|
139
166
|
return ok({
|
|
140
167
|
results,
|
|
141
168
|
count: results.length,
|
|
142
169
|
successCount,
|
|
143
170
|
errorCount,
|
|
144
171
|
failed: result.exitCode !== 0,
|
|
172
|
+
...(allUndefined
|
|
173
|
+
? {
|
|
174
|
+
hint: `Every input left \`${decisionPath}\` undefined. That is the expected outcome when no rule matched any of them, and it is also what a decision naming nothing in the loaded policy looks like. Confirm the rule exists at that path before reading this as a pass.`,
|
|
175
|
+
}
|
|
176
|
+
: {}),
|
|
145
177
|
});
|
|
146
178
|
});
|
|
147
179
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"exec.js","sourceRoot":"","sources":["../../../src/tools/evaluation/exec.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,MAAM,qBAAqB,CAAC;AAC9C,OAAO,EACL,oBAAoB,EACpB,YAAY,EACZ,aAAa,EACb,gBAAgB,GACjB,MAAM,2BAA2B,CAAC;AAEnC,MAAM,YAAY,GAAG;IACnB,UAAU,EAAE,CAAC;SACV,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;SACjB,GAAG,CAAC,CAAC,CAAC;SACN,QAAQ,CACP,kKAAkK,CACnK;IACH,QAAQ,EAAE,CAAC;SACR,MAAM,EAAE;SACR,GAAG,CAAC,CAAC,CAAC;SACN,QAAQ,CACP,
|
|
1
|
+
{"version":3,"file":"exec.js","sourceRoot":"","sources":["../../../src/tools/evaluation/exec.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,11 +9,15 @@ export interface RootTestResult {
|
|
|
9
9
|
passed: number;
|
|
10
10
|
failed: number;
|
|
11
11
|
skipped: number;
|
|
12
|
+
/** Tests OPA could not evaluate. Neither passed nor failed. */
|
|
13
|
+
errored: number;
|
|
12
14
|
total: number;
|
|
13
15
|
results: TestRecord[];
|
|
14
16
|
coverage?: CoverageReport;
|
|
15
17
|
coveragePct?: number;
|
|
16
18
|
thresholdMet?: boolean;
|
|
19
|
+
/** Set when opa printed a coverage report but no test records for the root. */
|
|
20
|
+
note?: string;
|
|
17
21
|
error?: {
|
|
18
22
|
code: ToolErrorCode;
|
|
19
23
|
message: string;
|
|
@@ -26,6 +30,8 @@ export interface MultiRootTestOutput {
|
|
|
26
30
|
totalPassed: number;
|
|
27
31
|
totalFailed: number;
|
|
28
32
|
totalSkipped: number;
|
|
33
|
+
/** Tests OPA could not evaluate, across every root. */
|
|
34
|
+
totalErrored: number;
|
|
29
35
|
totalTests: number;
|
|
30
36
|
rootsRun: number;
|
|
31
37
|
rootsWithErrors: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"test-multiroot.d.ts","sourceRoot":"","sources":["../../../src/tools/evaluation/test-multiroot.ts"],"names":[],"mappings":"AAqBA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"test-multiroot.d.ts","sourceRoot":"","sources":["../../../src/tools/evaluation/test-multiroot.ts"],"names":[],"mappings":"AAqBA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAW9C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AA6B5D,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,+DAA+D;IAC/D,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,QAAQ,CAAC,EAAE,cAAc,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,+EAA+E;IAC/E,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE;QAAE,IAAI,EAAE,aAAa,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CACjE;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,UAAU,GAAG,MAAM,CAAC;IAC1B,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,uDAAuD;IACvD,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;IACxB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;CAC5B;AAqXD,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAsNjF"}
|