@orygn/opa-mcp 0.1.11 → 0.1.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +89 -1
- package/README.md +18 -17
- package/dist/constants.d.ts +1 -1
- package/dist/constants.js +1 -1
- package/dist/lib/opa-cli.d.ts +14 -1
- package/dist/lib/opa-cli.d.ts.map +1 -1
- package/dist/lib/opa-cli.js +4 -0
- package/dist/lib/opa-cli.js.map +1 -1
- package/dist/lib/rego-ast-types.d.ts +81 -0
- package/dist/lib/rego-ast-types.d.ts.map +1 -0
- package/dist/lib/rego-ast-types.js +9 -0
- package/dist/lib/rego-ast-types.js.map +1 -0
- package/dist/lib/rego-ast-walker.d.ts +21 -0
- package/dist/lib/rego-ast-walker.d.ts.map +1 -0
- package/dist/lib/rego-ast-walker.js +491 -0
- package/dist/lib/rego-ast-walker.js.map +1 -0
- package/dist/lib/rego-counterexample.d.ts +32 -0
- package/dist/lib/rego-counterexample.d.ts.map +1 -0
- package/dist/lib/rego-counterexample.js +75 -0
- package/dist/lib/rego-counterexample.js.map +1 -0
- package/dist/lib/rego-ir.d.ts +117 -0
- package/dist/lib/rego-ir.d.ts.map +1 -0
- package/dist/lib/rego-ir.js +7 -0
- package/dist/lib/rego-ir.js.map +1 -0
- package/dist/lib/rego-property-parser.d.ts +34 -0
- package/dist/lib/rego-property-parser.d.ts.map +1 -0
- package/dist/lib/rego-property-parser.js +60 -0
- package/dist/lib/rego-property-parser.js.map +1 -0
- package/dist/lib/rego-smt-encoder.d.ts +57 -0
- package/dist/lib/rego-smt-encoder.d.ts.map +1 -0
- package/dist/lib/rego-smt-encoder.js +499 -0
- package/dist/lib/rego-smt-encoder.js.map +1 -0
- package/dist/lib/rego-type-inferencer.d.ts +26 -0
- package/dist/lib/rego-type-inferencer.d.ts.map +1 -0
- package/dist/lib/rego-type-inferencer.js +138 -0
- package/dist/lib/rego-type-inferencer.js.map +1 -0
- package/dist/lib/rego-verify-engine.d.ts +37 -0
- package/dist/lib/rego-verify-engine.d.ts.map +1 -0
- package/dist/lib/rego-verify-engine.js +236 -0
- package/dist/lib/rego-verify-engine.js.map +1 -0
- package/dist/lib/rego-z3.d.ts +13 -0
- package/dist/lib/rego-z3.d.ts.map +1 -0
- package/dist/lib/rego-z3.js +29 -0
- package/dist/lib/rego-z3.js.map +1 -0
- package/dist/server.js +1 -1
- package/dist/server.js.map +1 -1
- package/dist/tools/evaluation/test.d.ts +36 -1
- package/dist/tools/evaluation/test.d.ts.map +1 -1
- package/dist/tools/evaluation/test.js +124 -37
- package/dist/tools/evaluation/test.js.map +1 -1
- package/dist/tools/helpers/generate-test-skeleton.d.ts.map +1 -1
- package/dist/tools/helpers/generate-test-skeleton.js +43 -3
- package/dist/tools/helpers/generate-test-skeleton.js.map +1 -1
- package/dist/tools/helpers/index.d.ts.map +1 -1
- package/dist/tools/helpers/index.js +2 -0
- package/dist/tools/helpers/index.js.map +1 -1
- package/dist/tools/helpers/verify.d.ts +4 -0
- package/dist/tools/helpers/verify.d.ts.map +1 -0
- package/dist/tools/helpers/verify.js +75 -0
- package/dist/tools/helpers/verify.js.map +1 -0
- package/dist/tools/index.d.ts +4 -3
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/server-management/_shared.js +1 -1
- package/dist/tools/server-management/_shared.js.map +1 -1
- package/dist/types.d.ts +1 -1
- package/dist/types.d.ts.map +1 -1
- package/package.json +7 -5
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
export function inferTypes(clauses, inputPaths) {
|
|
2
|
+
// Pass 1: collect every local-variable assignment as a raw VerifyValue.
|
|
3
|
+
// This covers both direct (x := input.age) and chained (x := y; y := input.age)
|
|
4
|
+
// assignments. resolveToInputPath follows chains transitively.
|
|
5
|
+
const localAssignments = new Map(); // local_var_name → assigned VerifyValue
|
|
6
|
+
for (const ruleClauses of clauses) {
|
|
7
|
+
for (const clause of ruleClauses) {
|
|
8
|
+
for (const expr of clause.expressions) {
|
|
9
|
+
if (expr.kind === 'assign') {
|
|
10
|
+
localAssignments.set(expr.local, expr.value);
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
// Initialize evidence sets from all known paths.
|
|
16
|
+
const evidence = new Map();
|
|
17
|
+
for (const path of inputPaths.keys()) {
|
|
18
|
+
evidence.set(path, new Set());
|
|
19
|
+
}
|
|
20
|
+
// Pass 2: collect sort evidence from all expressions, resolving locals via the
|
|
21
|
+
// assignment map (transitively, so x := y; y := input.age propagates correctly).
|
|
22
|
+
for (const ruleClauses of clauses) {
|
|
23
|
+
for (const clause of ruleClauses) {
|
|
24
|
+
for (const expr of clause.expressions) {
|
|
25
|
+
collectEvidence(expr, evidence, localAssignments);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
const sorts = new Map();
|
|
30
|
+
const conflicts = [];
|
|
31
|
+
for (const [path, ev] of evidence) {
|
|
32
|
+
if (ev.size === 0) {
|
|
33
|
+
sorts.set(path, 'string');
|
|
34
|
+
}
|
|
35
|
+
else if (ev.size === 1) {
|
|
36
|
+
const only = [...ev][0];
|
|
37
|
+
sorts.set(path, only);
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
conflicts.push({
|
|
41
|
+
path,
|
|
42
|
+
reason: `Path '${path}' used as both ${[...ev].join(' and ')}; using uninterpreted sort (equality only).`,
|
|
43
|
+
});
|
|
44
|
+
sorts.set(path, 'uninterpreted');
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return { sorts, conflicts };
|
|
48
|
+
}
|
|
49
|
+
function collectEvidence(expr, evidence, localAssignments) {
|
|
50
|
+
switch (expr.kind) {
|
|
51
|
+
case 'eq':
|
|
52
|
+
case 'neq':
|
|
53
|
+
addLiteralEvidence(expr.left, expr.right, evidence, localAssignments);
|
|
54
|
+
addLiteralEvidence(expr.right, expr.left, evidence, localAssignments);
|
|
55
|
+
break;
|
|
56
|
+
case 'assign':
|
|
57
|
+
// The local variable itself is not an input path; evidence flows via localAssignments.
|
|
58
|
+
break;
|
|
59
|
+
case 'gt':
|
|
60
|
+
case 'gte':
|
|
61
|
+
case 'lt':
|
|
62
|
+
case 'lte':
|
|
63
|
+
addSortEvidence(expr.left, 'int', evidence, localAssignments);
|
|
64
|
+
addSortEvidence(expr.right, 'int', evidence, localAssignments);
|
|
65
|
+
break;
|
|
66
|
+
case 'startswith':
|
|
67
|
+
case 'endswith':
|
|
68
|
+
addSortEvidence(expr.str, 'string', evidence, localAssignments);
|
|
69
|
+
break;
|
|
70
|
+
case 'contains':
|
|
71
|
+
addSortEvidence(expr.str, 'string', evidence, localAssignments);
|
|
72
|
+
break;
|
|
73
|
+
case 'regex_match':
|
|
74
|
+
addSortEvidence(expr.str, 'string', evidence, localAssignments);
|
|
75
|
+
break;
|
|
76
|
+
case 'bool_check':
|
|
77
|
+
addSortEvidence(expr.ref, 'bool', evidence, localAssignments);
|
|
78
|
+
break;
|
|
79
|
+
default:
|
|
80
|
+
break;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Follow an assignment chain from a VerifyValue back to an input path.
|
|
85
|
+
*
|
|
86
|
+
* Handles transitive local-variable chains:
|
|
87
|
+
* x := y; y := input.age → resolveToInputPath(x) = 'input.age'
|
|
88
|
+
*
|
|
89
|
+
* Returns undefined when the chain terminates at a literal, an unaliased
|
|
90
|
+
* local, a data ref, or a cycle.
|
|
91
|
+
*/
|
|
92
|
+
function resolveToInputPath(value, localAssignments) {
|
|
93
|
+
const visited = new Set();
|
|
94
|
+
let current = value;
|
|
95
|
+
while (true) {
|
|
96
|
+
if (current.kind === 'input_ref')
|
|
97
|
+
return current.path;
|
|
98
|
+
if (current.kind !== 'local_var')
|
|
99
|
+
return undefined; // literal or unsupported
|
|
100
|
+
if (visited.has(current.name))
|
|
101
|
+
return undefined; // cycle guard
|
|
102
|
+
visited.add(current.name);
|
|
103
|
+
const next = localAssignments.get(current.name);
|
|
104
|
+
if (next === undefined)
|
|
105
|
+
return undefined; // unassigned local
|
|
106
|
+
current = next;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
function addLiteralEvidence(subject, comparand, evidence, localAssignments) {
|
|
110
|
+
const path = resolveToInputPath(subject, localAssignments);
|
|
111
|
+
if (path === undefined)
|
|
112
|
+
return;
|
|
113
|
+
switch (comparand.kind) {
|
|
114
|
+
case 'literal_string':
|
|
115
|
+
addPathEvidence(path, 'string', evidence);
|
|
116
|
+
break;
|
|
117
|
+
case 'literal_number':
|
|
118
|
+
addPathEvidence(path, 'int', evidence);
|
|
119
|
+
break;
|
|
120
|
+
case 'literal_bool':
|
|
121
|
+
addPathEvidence(path, 'bool', evidence);
|
|
122
|
+
break;
|
|
123
|
+
default:
|
|
124
|
+
break;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
function addSortEvidence(value, sort, evidence, localAssignments) {
|
|
128
|
+
const path = resolveToInputPath(value, localAssignments);
|
|
129
|
+
if (path === undefined)
|
|
130
|
+
return;
|
|
131
|
+
addPathEvidence(path, sort, evidence);
|
|
132
|
+
}
|
|
133
|
+
function addPathEvidence(path, sort, evidence) {
|
|
134
|
+
const ev = evidence.get(path);
|
|
135
|
+
if (ev !== undefined)
|
|
136
|
+
ev.add(sort);
|
|
137
|
+
}
|
|
138
|
+
//# sourceMappingURL=rego-type-inferencer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rego-type-inferencer.js","sourceRoot":"","sources":["../../src/lib/rego-type-inferencer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* rego_verify engine - orchestrates the full verification pipeline:
|
|
3
|
+
*
|
|
4
|
+
* Rego source
|
|
5
|
+
* → opa parse (JSON AST)
|
|
6
|
+
* → walkModule (IR)
|
|
7
|
+
* → inferTypes (Z3 sorts)
|
|
8
|
+
* → createInputVars (Z3 constants)
|
|
9
|
+
* → encodeRule (Z3 Bool formula)
|
|
10
|
+
* → negate / check property
|
|
11
|
+
* → solver.check() → sat | unsat | unknown
|
|
12
|
+
* → extractCounterexample (on sat)
|
|
13
|
+
* → VerifyResult
|
|
14
|
+
*/
|
|
15
|
+
import type { OpaModule } from './rego-ast-types.js';
|
|
16
|
+
import { type CounterexampleInput } from './rego-counterexample.js';
|
|
17
|
+
import { type VerifyProperty } from './rego-property-parser.js';
|
|
18
|
+
export type VerifyVerdict = 'proven' | 'counterexample' | 'inconclusive' | 'unsatisfiable';
|
|
19
|
+
export interface VerifyResult {
|
|
20
|
+
verdict: VerifyVerdict;
|
|
21
|
+
property: string;
|
|
22
|
+
rule: string;
|
|
23
|
+
counterexample?: CounterexampleInput;
|
|
24
|
+
counterexampleFormatted?: string;
|
|
25
|
+
unsupportedConstructs: Array<{
|
|
26
|
+
constructType: string;
|
|
27
|
+
description: string;
|
|
28
|
+
}>;
|
|
29
|
+
warnings: string[];
|
|
30
|
+
message: string;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Run formal verification on a pre-parsed OPA module.
|
|
34
|
+
* The caller must pass the JSON-parsed result of `opa parse --format=json`.
|
|
35
|
+
*/
|
|
36
|
+
export declare function runVerify(ast: OpaModule, property: VerifyProperty, signal?: AbortSignal): Promise<VerifyResult>;
|
|
37
|
+
//# sourceMappingURL=rego-verify-engine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rego-verify-engine.d.ts","sourceRoot":"","sources":["../../src/lib/rego-verify-engine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAIrD,OAAO,EAGL,KAAK,mBAAmB,EACzB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAoB,KAAK,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAUlF,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,gBAAgB,GAAG,cAAc,GAAG,eAAe,CAAC;AAE3F,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,aAAa,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,CAAC,EAAE,mBAAmB,CAAC;IACrC,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,qBAAqB,EAAE,KAAK,CAAC;QAAE,aAAa,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC7E,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CACjB;AAKD;;;GAGG;AACH,wBAAsB,SAAS,CAC7B,GAAG,EAAE,SAAS,EACd,QAAQ,EAAE,cAAc,EACxB,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,YAAY,CAAC,CAuKvB"}
|
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
import { walkModule } from './rego-ast-walker.js';
|
|
2
|
+
import { inferTypes } from './rego-type-inferencer.js';
|
|
3
|
+
import { createInputVars, encodeRule } from './rego-smt-encoder.js';
|
|
4
|
+
import { extractCounterexample, formatCounterexample, } from './rego-counterexample.js';
|
|
5
|
+
import { describeProperty } from './rego-property-parser.js';
|
|
6
|
+
import { getZ3 } from './rego-z3.js';
|
|
7
|
+
// Monotonically increasing counter used to generate a unique prefix for all
|
|
8
|
+
// Z3 constant names within each runVerify call. This prevents sort conflicts
|
|
9
|
+
// when the same input path is inferred with different sorts across calls
|
|
10
|
+
// (e.g. two policies using input.x as string vs int) within the shared Z3
|
|
11
|
+
// singleton context.
|
|
12
|
+
let _verifyCallCounter = 0;
|
|
13
|
+
/** Timeout for Z3 solver in milliseconds. */
|
|
14
|
+
const SOLVER_TIMEOUT_MS = 10_000;
|
|
15
|
+
/**
|
|
16
|
+
* Run formal verification on a pre-parsed OPA module.
|
|
17
|
+
* The caller must pass the JSON-parsed result of `opa parse --format=json`.
|
|
18
|
+
*/
|
|
19
|
+
export async function runVerify(ast, property, signal) {
|
|
20
|
+
const walked = walkModule(ast);
|
|
21
|
+
const warnings = [];
|
|
22
|
+
const targetClauses = walked.rules.get(property.ruleName);
|
|
23
|
+
// Collect only the construct types that actually appear in the target rule's
|
|
24
|
+
// clause expressions. This prevents unsupported constructs from OTHER rules
|
|
25
|
+
// in the same module (e.g. a "deny" rule with NAF) from being reported when
|
|
26
|
+
// verifying an unrelated "allow" rule that is fully encodable.
|
|
27
|
+
const unsupportedTypesInTarget = new Set();
|
|
28
|
+
for (const clause of targetClauses ?? []) {
|
|
29
|
+
for (const expr of clause.expressions) {
|
|
30
|
+
if (expr.kind === 'unsupported')
|
|
31
|
+
unsupportedTypesInTarget.add(expr.constructType);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
const unsupportedInRule = walked.unsupported.filter((u) => unsupportedTypesInTarget.has(u.constructType));
|
|
35
|
+
if (targetClauses === undefined || targetClauses.length === 0) {
|
|
36
|
+
// A default-only rule (e.g. "default allow = false") has no clauses but a known
|
|
37
|
+
// constant value -- derive the correct verdict without running Z3.
|
|
38
|
+
const defaultValue = walked.defaults.get(property.ruleName);
|
|
39
|
+
if (typeof defaultValue === 'boolean') {
|
|
40
|
+
return solveDefaultOnlyRule(property, defaultValue, unsupportedInRule, warnings);
|
|
41
|
+
}
|
|
42
|
+
return inconclusive(property, `Rule "${property.ruleName}" not found in the provided policy.`, unsupportedInRule, warnings);
|
|
43
|
+
}
|
|
44
|
+
// Any clause with an unsupported expression makes verification incomplete.
|
|
45
|
+
const hasUnsupportedInClauses = targetClauses.some((c) => c.expressions.some((e) => e.kind === 'unsupported'));
|
|
46
|
+
if (hasUnsupportedInClauses) {
|
|
47
|
+
return inconclusive(property, `Rule "${property.ruleName}" contains constructs that cannot be encoded in Z3 (e.g. negation-as-failure, comprehensions, built-ins beyond string/comparison ops). Verification is inconclusive.`, unsupportedInRule, warnings);
|
|
48
|
+
}
|
|
49
|
+
// Type inference + Z3 setup
|
|
50
|
+
const typeResult = inferTypes([...walked.rules.values()], walked.inputPaths);
|
|
51
|
+
for (const conflict of typeResult.conflicts) {
|
|
52
|
+
warnings.push(conflict.reason);
|
|
53
|
+
}
|
|
54
|
+
signal?.throwIfAborted();
|
|
55
|
+
const Z3 = await getZ3();
|
|
56
|
+
signal?.throwIfAborted();
|
|
57
|
+
const callId = `v${_verifyCallCounter++}`;
|
|
58
|
+
const inputVars = createInputVars(Z3, walked.inputPaths, typeResult.sorts, callId);
|
|
59
|
+
const ctx = { Z3, inputVars, sorts: typeResult.sorts, callId };
|
|
60
|
+
const encoded = encodeRule(targetClauses, ctx);
|
|
61
|
+
warnings.push(...encoded.warnings);
|
|
62
|
+
// Z3's high-level Solver and Model objects use FinalizationRegistry internally
|
|
63
|
+
// (solver_dec_ref / model_dec_ref) so they are cleaned up when GC'd.
|
|
64
|
+
// We avoid holding a reference to the Model beyond extractCounterexample so
|
|
65
|
+
// it becomes eligible for GC as soon as the call returns, reducing WASM heap
|
|
66
|
+
// pressure under high call volume.
|
|
67
|
+
const solver = new Z3.Solver();
|
|
68
|
+
// Set timeout to prevent hanging on complex policies
|
|
69
|
+
solver.set('timeout', SOLVER_TIMEOUT_MS);
|
|
70
|
+
switch (property.kind) {
|
|
71
|
+
case 'always_true':
|
|
72
|
+
// Prove rule is always true: check if NOT(rule) is satisfiable.
|
|
73
|
+
// SAT → counterexample (input where rule is false)
|
|
74
|
+
// UNSAT → proven always true
|
|
75
|
+
solver.add(Z3.Not(encoded.formula));
|
|
76
|
+
break;
|
|
77
|
+
case 'never_true':
|
|
78
|
+
// Prove rule is never true: check if rule IS satisfiable.
|
|
79
|
+
// SAT → counterexample (input where rule fires, violating "never")
|
|
80
|
+
// UNSAT → proven never true
|
|
81
|
+
solver.add(encoded.formula);
|
|
82
|
+
break;
|
|
83
|
+
case 'satisfiable':
|
|
84
|
+
// Check if any input satisfies the rule.
|
|
85
|
+
// SAT → witness found (not a bug, just a satisfying input)
|
|
86
|
+
// UNSAT → rule is vacuously false / dead code
|
|
87
|
+
solver.add(encoded.formula);
|
|
88
|
+
break;
|
|
89
|
+
}
|
|
90
|
+
signal?.throwIfAborted();
|
|
91
|
+
const solverResult = await solver.check();
|
|
92
|
+
if (solverResult === 'unknown') {
|
|
93
|
+
return inconclusive(property, `Z3 solver returned "unknown" (timeout or resource limit reached after ${SOLVER_TIMEOUT_MS}ms). The policy may be too complex for automated verification.`, unsupportedInRule, warnings);
|
|
94
|
+
}
|
|
95
|
+
if (solverResult === 'unsat') {
|
|
96
|
+
if (property.kind === 'satisfiable') {
|
|
97
|
+
// No satisfying input exists -- rule is dead code or has contradictory conditions.
|
|
98
|
+
return {
|
|
99
|
+
verdict: 'unsatisfiable',
|
|
100
|
+
property: describeProperty(property),
|
|
101
|
+
rule: property.ruleName,
|
|
102
|
+
unsupportedConstructs: unsupportedInRule,
|
|
103
|
+
warnings,
|
|
104
|
+
message: `UNSATISFIABLE: No input can make "${property.ruleName}" true. The rule may be dead code or have contradictory conditions.`,
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
// For always_true / never_true: UNSAT on the negation = property proven
|
|
108
|
+
return {
|
|
109
|
+
verdict: 'proven',
|
|
110
|
+
property: describeProperty(property),
|
|
111
|
+
rule: property.ruleName,
|
|
112
|
+
unsupportedConstructs: unsupportedInRule,
|
|
113
|
+
warnings,
|
|
114
|
+
message: `PROVEN: ${describeProperty(property)}.`,
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
// SAT: pass solver.model() inline so the Model object is not kept alive
|
|
118
|
+
// beyond extractCounterexample -- it becomes GC-eligible immediately after.
|
|
119
|
+
const ce = extractCounterexample(solver.model(), inputVars, typeResult.sorts);
|
|
120
|
+
const ceFormatted = formatCounterexample(ce);
|
|
121
|
+
if (property.kind === 'satisfiable') {
|
|
122
|
+
return {
|
|
123
|
+
verdict: 'proven',
|
|
124
|
+
property: describeProperty(property),
|
|
125
|
+
rule: property.ruleName,
|
|
126
|
+
counterexample: ce,
|
|
127
|
+
counterexampleFormatted: ceFormatted,
|
|
128
|
+
unsupportedConstructs: unsupportedInRule,
|
|
129
|
+
warnings,
|
|
130
|
+
message: `SATISFIABLE: Found an input that makes "${property.ruleName}" true.\n\nWitness input:\n${ceFormatted}`,
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
// always_true / never_true: SAT means we found a violation
|
|
134
|
+
const ceLabel = property.kind === 'always_true'
|
|
135
|
+
? 'input where rule is FALSE'
|
|
136
|
+
: 'input where rule is TRUE (violates "never")';
|
|
137
|
+
return {
|
|
138
|
+
verdict: 'counterexample',
|
|
139
|
+
property: describeProperty(property),
|
|
140
|
+
rule: property.ruleName,
|
|
141
|
+
counterexample: ce,
|
|
142
|
+
counterexampleFormatted: ceFormatted,
|
|
143
|
+
unsupportedConstructs: unsupportedInRule,
|
|
144
|
+
warnings,
|
|
145
|
+
message: `COUNTEREXAMPLE: Property does NOT hold. Found ${ceLabel}:\n\n${ceFormatted}`,
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
function inconclusive(property, reason, unsupportedConstructs, warnings) {
|
|
149
|
+
return {
|
|
150
|
+
verdict: 'inconclusive',
|
|
151
|
+
property: describeProperty(property),
|
|
152
|
+
rule: property.ruleName,
|
|
153
|
+
unsupportedConstructs,
|
|
154
|
+
warnings,
|
|
155
|
+
message: `INCONCLUSIVE: ${reason}`,
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Return the correct verdict for a rule that has no non-default clauses
|
|
160
|
+
* (e.g. "default allow = false"). The rule always evaluates to its constant
|
|
161
|
+
* default value, so no Z3 solving is needed.
|
|
162
|
+
*/
|
|
163
|
+
function solveDefaultOnlyRule(property, defaultValue, unsupportedConstructs, warnings) {
|
|
164
|
+
// An empty input object is a valid witness/counterexample since the rule
|
|
165
|
+
// fires (or doesn't) unconditionally regardless of input.
|
|
166
|
+
const emptyWitness = {};
|
|
167
|
+
const emptyFormatted = formatCounterexample(emptyWitness);
|
|
168
|
+
const prop = describeProperty(property);
|
|
169
|
+
const name = property.ruleName;
|
|
170
|
+
switch (property.kind) {
|
|
171
|
+
case 'always_true':
|
|
172
|
+
if (defaultValue) {
|
|
173
|
+
return {
|
|
174
|
+
verdict: 'proven',
|
|
175
|
+
property: prop,
|
|
176
|
+
rule: name,
|
|
177
|
+
unsupportedConstructs,
|
|
178
|
+
warnings,
|
|
179
|
+
message: `PROVEN: ${prop}. Rule "${name}" is defined only as "default = true" and is always true.`,
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
return {
|
|
183
|
+
verdict: 'counterexample',
|
|
184
|
+
property: prop,
|
|
185
|
+
rule: name,
|
|
186
|
+
counterexample: emptyWitness,
|
|
187
|
+
counterexampleFormatted: emptyFormatted,
|
|
188
|
+
unsupportedConstructs,
|
|
189
|
+
warnings,
|
|
190
|
+
message: `COUNTEREXAMPLE: Rule "${name}" is defined only as "default = false" and is never true. Any input is a counterexample to "always true".`,
|
|
191
|
+
};
|
|
192
|
+
case 'never_true':
|
|
193
|
+
if (!defaultValue) {
|
|
194
|
+
return {
|
|
195
|
+
verdict: 'proven',
|
|
196
|
+
property: prop,
|
|
197
|
+
rule: name,
|
|
198
|
+
unsupportedConstructs,
|
|
199
|
+
warnings,
|
|
200
|
+
message: `PROVEN: ${prop}. Rule "${name}" is defined only as "default = false" and is never true.`,
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
return {
|
|
204
|
+
verdict: 'counterexample',
|
|
205
|
+
property: prop,
|
|
206
|
+
rule: name,
|
|
207
|
+
counterexample: emptyWitness,
|
|
208
|
+
counterexampleFormatted: emptyFormatted,
|
|
209
|
+
unsupportedConstructs,
|
|
210
|
+
warnings,
|
|
211
|
+
message: `COUNTEREXAMPLE: Rule "${name}" is defined only as "default = true" and is always true. Any input is a counterexample to "never true".`,
|
|
212
|
+
};
|
|
213
|
+
case 'satisfiable':
|
|
214
|
+
if (defaultValue) {
|
|
215
|
+
return {
|
|
216
|
+
verdict: 'proven',
|
|
217
|
+
property: prop,
|
|
218
|
+
rule: name,
|
|
219
|
+
counterexample: emptyWitness,
|
|
220
|
+
counterexampleFormatted: emptyFormatted,
|
|
221
|
+
unsupportedConstructs,
|
|
222
|
+
warnings,
|
|
223
|
+
message: `SATISFIABLE: Rule "${name}" is defined only as "default = true" -- any input satisfies it.`,
|
|
224
|
+
};
|
|
225
|
+
}
|
|
226
|
+
return {
|
|
227
|
+
verdict: 'unsatisfiable',
|
|
228
|
+
property: prop,
|
|
229
|
+
rule: name,
|
|
230
|
+
unsupportedConstructs,
|
|
231
|
+
warnings,
|
|
232
|
+
message: `UNSATISFIABLE: Rule "${name}" is defined only as "default = false" -- no input can make it true.`,
|
|
233
|
+
};
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
//# sourceMappingURL=rego-verify-engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rego-verify-engine.js","sourceRoot":"","sources":["../../src/lib/rego-verify-engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { init as Z3Init } from 'z3-solver';
|
|
2
|
+
export type Z3Context = ReturnType<Awaited<ReturnType<typeof Z3Init>>['Context']>;
|
|
3
|
+
/**
|
|
4
|
+
* Return the shared Z3 Context, initializing WASM on first call.
|
|
5
|
+
* Safe to call from concurrent async paths.
|
|
6
|
+
*/
|
|
7
|
+
export declare function getZ3(): Promise<Z3Context>;
|
|
8
|
+
/**
|
|
9
|
+
* Reset the singleton - intended for test teardown only.
|
|
10
|
+
* Do NOT call in production paths; re-init is expensive.
|
|
11
|
+
*/
|
|
12
|
+
export declare function resetZ3ForTesting(): void;
|
|
13
|
+
//# sourceMappingURL=rego-z3.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rego-z3.d.ts","sourceRoot":"","sources":["../../src/lib/rego-z3.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,IAAI,IAAI,MAAM,EAAE,MAAM,WAAW,CAAC;AAKhD,MAAM,MAAM,SAAS,GAAG,UAAU,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;AAKlF;;;GAGG;AACH,wBAAsB,KAAK,IAAI,OAAO,CAAC,SAAS,CAAC,CAKhD;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,IAAI,IAAI,CAExC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Z3 singleton initialization.
|
|
3
|
+
*
|
|
4
|
+
* The z3-solver WASM module takes ~500ms to load and must only be
|
|
5
|
+
* initialized once per process. Concurrent calls safely await the
|
|
6
|
+
* same promise. Each verification call creates its own fresh Solver
|
|
7
|
+
* from the shared Context, so contexts never accumulate stale state.
|
|
8
|
+
*/
|
|
9
|
+
import { init } from 'z3-solver';
|
|
10
|
+
// Module-level singleton
|
|
11
|
+
let z3InitPromise = null;
|
|
12
|
+
/**
|
|
13
|
+
* Return the shared Z3 Context, initializing WASM on first call.
|
|
14
|
+
* Safe to call from concurrent async paths.
|
|
15
|
+
*/
|
|
16
|
+
export async function getZ3() {
|
|
17
|
+
if (z3InitPromise === null) {
|
|
18
|
+
z3InitPromise = init().then(({ Context }) => Context('main'));
|
|
19
|
+
}
|
|
20
|
+
return z3InitPromise;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Reset the singleton - intended for test teardown only.
|
|
24
|
+
* Do NOT call in production paths; re-init is expensive.
|
|
25
|
+
*/
|
|
26
|
+
export function resetZ3ForTesting() {
|
|
27
|
+
z3InitPromise = null;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=rego-z3.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rego-z3.js","sourceRoot":"","sources":["../../src/lib/rego-z3.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAQjC,yBAAyB;AACzB,IAAI,aAAa,GAA4B,IAAI,CAAC;AAElD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,KAAK;IACzB,IAAI,aAAa,KAAK,IAAI,EAAE,CAAC;QAC3B,aAAa,GAAG,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;IAChE,CAAC;IACD,OAAO,aAAmC,CAAC;AAC7C,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB;IAC/B,aAAa,GAAG,IAAI,CAAC;AACvB,CAAC"}
|
package/dist/server.js
CHANGED
|
@@ -36,7 +36,7 @@ export function buildServer(config) {
|
|
|
36
36
|
regalBinary: config.regalBinary,
|
|
37
37
|
});
|
|
38
38
|
const server = new McpServer({ name: SERVER_NAME, version: SERVER_VERSION }, {
|
|
39
|
-
instructions: '
|
|
39
|
+
instructions: '49 tools split into seven categories. rego_* authoring/analysis tools use the local opa binary (OPA_BINARY) -- no running OPA server required. rego_lint, rego_security_audit, and rego_fix additionally require regal (REGAL_BINARY). rego_verify does formal SMT-based verification using Z3 (bundled as WASM -- no extra install). opa_* server-management tools talk to a live OPA REST server via OPA_URL; start one locally with `opa run --server` or point at a deployed instance; set OPA_TOKEN if bearer-token auth is required. conftest_* tools use the local conftest binary (CONFTEST_BINARY) to test Kubernetes, Terraform, Helm, and Dockerfile configs against Rego policies. File-based tools require paths inside OPA_MCP_ALLOWED_PATHS; inline-source tools work without it. If a tool returns OPA_BINARY_NOT_FOUND, REGAL_NOT_FOUND, or CONFTEST_NOT_FOUND, tell the user which binary is missing and how to install it. Start with rego_check + rego_lint for policy authoring, rego_verify to prove correctness, conftest_test for config validation, mcp_server_info to confirm which binaries are reachable.',
|
|
40
40
|
});
|
|
41
41
|
registerTools(server, config);
|
|
42
42
|
registerPrompts(server, config);
|
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":";AACA;;;;;;;;GAQG;AACH,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AAGjF,OAAO,EAAE,UAAU,EAAE,mBAAmB,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAExF,OAAO,EAAE,UAAU,EAAe,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEjD,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,CAAC;AAEvC;;;;GAIG;AACH,MAAM,UAAU,WAAW,CAAC,MAAc;IACxC,UAAU,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;IAE5C,MAAM,CAAC,IAAI,CAAC,wBAAwB,EAAE;QACpC,OAAO,EAAE,cAAc;QACvB,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,WAAW,EAAE,MAAM,CAAC,WAAW;KAChC,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,IAAI,SAAS,CAC1B,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,cAAc,EAAE,EAC9C;QACE,YAAY,EACV,
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -15,13 +15,48 @@ interface TestRecord {
|
|
|
15
15
|
trace?: unknown;
|
|
16
16
|
output?: string;
|
|
17
17
|
}
|
|
18
|
+
interface CoverageRange {
|
|
19
|
+
start: {
|
|
20
|
+
row: number;
|
|
21
|
+
};
|
|
22
|
+
end: {
|
|
23
|
+
row: number;
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
interface CoverageFileSummary {
|
|
27
|
+
covered?: CoverageRange[];
|
|
28
|
+
not_covered?: CoverageRange[];
|
|
29
|
+
covered_lines?: number;
|
|
30
|
+
not_covered_lines?: number;
|
|
31
|
+
coverage?: number;
|
|
32
|
+
}
|
|
33
|
+
export interface CoverageReport {
|
|
34
|
+
files?: Record<string, CoverageFileSummary>;
|
|
35
|
+
covered_lines?: number;
|
|
36
|
+
not_covered_lines?: number;
|
|
37
|
+
/** Overall coverage percentage (0–100). */
|
|
38
|
+
coverage?: number;
|
|
39
|
+
}
|
|
18
40
|
export interface RegoTestOutput {
|
|
41
|
+
/**
|
|
42
|
+
* Number of passing tests. Always 0 in coverage mode (OPA does not emit
|
|
43
|
+
* test records when coverage output is active).
|
|
44
|
+
*/
|
|
19
45
|
passed: number;
|
|
46
|
+
/** Number of failing tests. Always 0 in coverage mode (failures are returned as errors). */
|
|
20
47
|
failed: number;
|
|
48
|
+
/** Number of skipped (todo_*) tests. Always 0 in coverage mode. */
|
|
21
49
|
skipped: number;
|
|
50
|
+
/** Total test records. Always 0 in coverage mode. */
|
|
22
51
|
total: number;
|
|
52
|
+
/** Per-test records. Empty in coverage mode. */
|
|
23
53
|
results: TestRecord[];
|
|
24
|
-
coverage
|
|
54
|
+
/** Per-file coverage report. Present when `coverage: true` or `threshold` is set and threshold is met. */
|
|
55
|
+
coverage?: CoverageReport;
|
|
56
|
+
/** Overall coverage percentage (convenience alias for `coverage.coverage`). */
|
|
57
|
+
coveragePct?: number;
|
|
58
|
+
/** Present when `threshold` is set and the threshold was met. */
|
|
59
|
+
thresholdMet?: boolean;
|
|
25
60
|
}
|
|
26
61
|
export declare function registerRegoTest(server: McpServer, config: Config): void;
|
|
27
62
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"test.d.ts","sourceRoot":"","sources":["../../../src/tools/evaluation/test.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"test.d.ts","sourceRoot":"","sources":["../../../src/tools/evaluation/test.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AA4C9C,UAAU,UAAU;IAClB,QAAQ,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACzD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,UAAU,aAAa;IACrB,KAAK,EAAE;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;IACvB,GAAG,EAAE;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;CACtB;AAED,UAAU,mBAAmB;IAC3B,OAAO,CAAC,EAAE,aAAa,EAAE,CAAC;IAC1B,WAAW,CAAC,EAAE,aAAa,EAAE,CAAC;IAC9B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;IAC5C,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,2CAA2C;IAC3C,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,cAAc;IAC7B;;;OAGG;IACH,MAAM,EAAE,MAAM,CAAC;IACf,4FAA4F;IAC5F,MAAM,EAAE,MAAM,CAAC;IACf,mEAAmE;IACnE,OAAO,EAAE,MAAM,CAAC;IAChB,qDAAqD;IACrD,KAAK,EAAE,MAAM,CAAC;IACd,gDAAgD;IAChD,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,0GAA0G;IAC1G,QAAQ,CAAC,EAAE,cAAc,CAAC;IAC1B,+EAA+E;IAC/E,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iEAAiE;IACjE,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAiDxE"}
|