@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
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Making load paths safe to hand to the `opa` binary.
|
|
3
|
+
*
|
|
4
|
+
* OPA's loader reads every load path as an optional `prefix:path` pair and
|
|
5
|
+
* splits on the FIRST colon, mounting the document under `data.<prefix>`.
|
|
6
|
+
* Every absolute Windows path begins with one:
|
|
7
|
+
*
|
|
8
|
+
* opa eval -d "C:\policies\data.json" data
|
|
9
|
+
* -> {"C": {...}} the document is at data.C, not where it belongs
|
|
10
|
+
*
|
|
11
|
+
* Forward slashes do not help, since `C:/policies` still has the colon, and
|
|
12
|
+
* there is no escape syntax; the `\\?\` prefix is rejected outright. The only
|
|
13
|
+
* spelling OPA reads correctly is a relative one, so load paths are rewritten
|
|
14
|
+
* relative to a directory the child is then started in.
|
|
15
|
+
*
|
|
16
|
+
* Two things narrow this. Only paths OPA MOUNTS are affected: a `--input`,
|
|
17
|
+
* `--signing-key` or `--capabilities` file is opened directly and works fine
|
|
18
|
+
* absolute, so callers pass only their genuine load paths. And a `.rego`
|
|
19
|
+
* module mounts at its own `package` whatever path it arrived by, so only data
|
|
20
|
+
* documents and the directories holding them are respelled. That is why this
|
|
21
|
+
* stayed invisible: policies loaded correctly and their data silently did not.
|
|
22
|
+
*
|
|
23
|
+
* A module is still opened by the remainder after the colon, which is a
|
|
24
|
+
* root-relative path OPA resolves against the drive the child is running on.
|
|
25
|
+
* That works only when the working directory is on the module's drive, which
|
|
26
|
+
* on a developer machine it usually is and on a CI runner that keeps its
|
|
27
|
+
* workspace and its temp directory on different drives it is not. So every
|
|
28
|
+
* load path, module or not, takes part in choosing the working directory;
|
|
29
|
+
* only the non-module ones are respelled.
|
|
30
|
+
*/
|
|
31
|
+
import { existsSync } from 'node:fs';
|
|
32
|
+
import { dirname, extname, isAbsolute, parse, relative, sep } from 'node:path';
|
|
33
|
+
/** A path OPA would split: a drive letter followed by a separator. */
|
|
34
|
+
const DRIVE_PATH = /^[A-Za-z]:[\\/]/;
|
|
35
|
+
/**
|
|
36
|
+
* Would loading this path by an absolute spelling put its contents in the
|
|
37
|
+
* wrong place?
|
|
38
|
+
*
|
|
39
|
+
* A `.rego` module mounts at its own `package` whatever path it arrived by,
|
|
40
|
+
* verified against OPA 1.19: an absolute `p.rego` lands at `data.p` while an
|
|
41
|
+
* absolute `d.json` lands at `data.C`. Modules are therefore not respelled,
|
|
42
|
+
* which also keeps the rewrite away from the temp file this server writes for
|
|
43
|
+
* inline source, whose absolute path is matched afterwards to redact it from
|
|
44
|
+
* output. They still count toward the working directory: see `rewriteLoadPaths`.
|
|
45
|
+
*/
|
|
46
|
+
function needsRewrite(path) {
|
|
47
|
+
return extname(path).toLowerCase() !== '.rego';
|
|
48
|
+
}
|
|
49
|
+
/** Longest directory containing every one of `paths`. */
|
|
50
|
+
function commonAncestor(paths) {
|
|
51
|
+
const split = paths.map((p) => p.split(/[\\/]+/));
|
|
52
|
+
const first = split[0];
|
|
53
|
+
if (!first)
|
|
54
|
+
return undefined;
|
|
55
|
+
const shared = [];
|
|
56
|
+
for (let i = 0; i < first.length; i++) {
|
|
57
|
+
const segment = first[i];
|
|
58
|
+
// Windows compares path segments without regard to case.
|
|
59
|
+
if (!split.every((parts) => parts[i]?.toLowerCase() === segment.toLowerCase()))
|
|
60
|
+
break;
|
|
61
|
+
shared.push(segment);
|
|
62
|
+
}
|
|
63
|
+
if (shared.length === 0)
|
|
64
|
+
return undefined;
|
|
65
|
+
const joined = shared.join(sep);
|
|
66
|
+
// A drive root keeps its separator: "C:" alone is drive-relative, not root.
|
|
67
|
+
return shared.length === 1 ? joined + sep : joined;
|
|
68
|
+
}
|
|
69
|
+
export function rewriteLoadPaths(args, loadPaths, options = {}) {
|
|
70
|
+
// Every drive-letter load path anchors the working directory, modules
|
|
71
|
+
// included, since a module is opened relative to the child's drive even
|
|
72
|
+
// though it mounts by package. Only the non-module ones are respelled.
|
|
73
|
+
const anchors = [...new Set(loadPaths.filter((p) => DRIVE_PATH.test(p) && existsSync(p)))];
|
|
74
|
+
if (anchors.length === 0)
|
|
75
|
+
return { args };
|
|
76
|
+
const drives = [...new Set(anchors.map((p) => parse(p).root.toLowerCase()))];
|
|
77
|
+
if (drives.length > 1)
|
|
78
|
+
return { args, conflict: { drives } };
|
|
79
|
+
// The ancestor is taken over the containing directories, never the paths
|
|
80
|
+
// themselves: the ancestor of a single file would be that file, and a file
|
|
81
|
+
// cannot be a working directory.
|
|
82
|
+
const cwd = commonAncestor(anchors.map(dirname));
|
|
83
|
+
if (cwd === undefined || !existsSync(cwd))
|
|
84
|
+
return { args };
|
|
85
|
+
if (options.respell === false)
|
|
86
|
+
return { args, cwd };
|
|
87
|
+
const targets = anchors.filter(needsRewrite);
|
|
88
|
+
const rewritten = args.map((a) => {
|
|
89
|
+
if (!targets.includes(a))
|
|
90
|
+
return a;
|
|
91
|
+
const rel = relative(cwd, a);
|
|
92
|
+
// A load path that IS the working directory.
|
|
93
|
+
if (rel === '')
|
|
94
|
+
return '.';
|
|
95
|
+
// Defensive: a result that is still absolute, or climbs out of the
|
|
96
|
+
// working directory, would not help, so the original is kept.
|
|
97
|
+
return isAbsolute(rel) || rel.startsWith('..') ? a : rel;
|
|
98
|
+
});
|
|
99
|
+
return { args: rewritten, cwd };
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=opa-paths.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"opa-paths.js","sourceRoot":"","sources":["../../src/lib/opa-paths.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/output.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../../src/lib/output.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,YAAY,
|
|
1
|
+
{"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../../src/lib/output.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,YAAY,EAAa,MAAM,aAAa,CAAC;AAE3D,MAAM,WAAW,aAAa;IAC5B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IACvB,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/C,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAoCD,wBAAgB,cAAc,CAAC,CAAC,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,aAAa,CAiF5F"}
|
package/dist/lib/output.js
CHANGED
|
@@ -1,17 +1,90 @@
|
|
|
1
|
+
const bytes = (s) => Buffer.byteLength(s, 'utf8');
|
|
2
|
+
const WARNINGS_DROPPED = '[warnings dropped: response exceeded maxResponseBytes]';
|
|
3
|
+
const DETAILS_DROPPED = {
|
|
4
|
+
__truncated: true,
|
|
5
|
+
message: 'Error details exceeded maxResponseBytes and were dropped.',
|
|
6
|
+
};
|
|
7
|
+
/**
|
|
8
|
+
* Cut `text` so that `measure(text)` stays within `budget`, measured after
|
|
9
|
+
* serialisation, since JSON escaping can more than double a string of
|
|
10
|
+
* newlines or control characters. A binary search on the byte length, so the
|
|
11
|
+
* cost is logarithmic in the message size.
|
|
12
|
+
*/
|
|
13
|
+
function cutToFit(text, measure, budget) {
|
|
14
|
+
const suffix = ' [truncated]';
|
|
15
|
+
const raw = Buffer.from(text, 'utf8');
|
|
16
|
+
let lo = 0;
|
|
17
|
+
let hi = raw.length;
|
|
18
|
+
let best = '';
|
|
19
|
+
while (lo <= hi) {
|
|
20
|
+
const mid = Math.floor((lo + hi) / 2);
|
|
21
|
+
const candidate = raw.subarray(0, mid).toString('utf8') + suffix;
|
|
22
|
+
if (measure(candidate) <= budget) {
|
|
23
|
+
best = candidate;
|
|
24
|
+
lo = mid + 1;
|
|
25
|
+
}
|
|
26
|
+
else {
|
|
27
|
+
hi = mid - 1;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
return best;
|
|
31
|
+
}
|
|
1
32
|
export function formatEnvelope(envelope, maxBytes) {
|
|
2
33
|
let serialized = JSON.stringify(envelope, null, 2);
|
|
3
|
-
if (
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
34
|
+
if (bytes(serialized) > maxBytes) {
|
|
35
|
+
// The cap is measured on the serialised text, since JSON escaping can
|
|
36
|
+
// double a message of newlines. Shrink the least useful field first and
|
|
37
|
+
// only as far as needed: a success's data, an error's details, then the
|
|
38
|
+
// warnings, then the hint, and the message last. A field is replaced
|
|
39
|
+
// only when the replacement is actually smaller.
|
|
40
|
+
const t = { ...envelope, truncated: true };
|
|
41
|
+
const size = () => bytes(JSON.stringify(t, null, 2));
|
|
42
|
+
const fits = () => size() <= maxBytes;
|
|
43
|
+
const replaceIfSmaller = (apply, revert) => {
|
|
44
|
+
const before = size();
|
|
45
|
+
apply();
|
|
46
|
+
if (size() >= before)
|
|
47
|
+
revert();
|
|
7
48
|
};
|
|
8
|
-
if (
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
49
|
+
if (t.ok && t.data !== undefined) {
|
|
50
|
+
const kept = t.data;
|
|
51
|
+
replaceIfSmaller(() => {
|
|
52
|
+
t.data = {
|
|
53
|
+
__truncated: true,
|
|
54
|
+
message: 'Response exceeded maxResponseBytes. Re-run with narrower scope, or write the output to a file path you specify.',
|
|
55
|
+
};
|
|
56
|
+
}, () => {
|
|
57
|
+
t.data = kept;
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
const error = !t.ok && t.error !== undefined ? { ...t.error } : undefined;
|
|
61
|
+
if (error !== undefined)
|
|
62
|
+
t.error = error;
|
|
63
|
+
if (error !== undefined && !fits() && error.details !== undefined) {
|
|
64
|
+
const kept = error.details;
|
|
65
|
+
replaceIfSmaller(() => {
|
|
66
|
+
error.details = DETAILS_DROPPED;
|
|
67
|
+
}, () => {
|
|
68
|
+
error.details = kept;
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
if (!fits() && t.warnings !== undefined) {
|
|
72
|
+
const kept = t.warnings;
|
|
73
|
+
replaceIfSmaller(() => {
|
|
74
|
+
t.warnings = [WARNINGS_DROPPED];
|
|
75
|
+
}, () => {
|
|
76
|
+
t.warnings = kept;
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
if (error !== undefined && !fits() && error.hint !== undefined) {
|
|
80
|
+
const others = () => bytes(JSON.stringify({ ...t, error: { ...error, hint: '' } }, null, 2));
|
|
81
|
+
error.hint = cutToFit(error.hint, (c) => others() + bytes(JSON.stringify(c)) - 2, maxBytes);
|
|
82
|
+
}
|
|
83
|
+
if (error !== undefined && !fits()) {
|
|
84
|
+
const others = () => bytes(JSON.stringify({ ...t, error: { ...error, message: '' } }, null, 2));
|
|
85
|
+
error.message = cutToFit(error.message, (c) => others() + bytes(JSON.stringify(c)) - 2, maxBytes);
|
|
13
86
|
}
|
|
14
|
-
serialized = JSON.stringify(
|
|
87
|
+
serialized = JSON.stringify(t, null, 2);
|
|
15
88
|
}
|
|
16
89
|
return {
|
|
17
90
|
content: [{ type: 'text', text: serialized }],
|
package/dist/lib/output.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/lib/output.ts"],"names":[],"mappings":"AAcA,MAAM,UAAU,cAAc,CAAI,QAAyB,EAAE,QAAgB;IAC3E,IAAI,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAEnD,IAAI,
|
|
1
|
+
{"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/lib/output.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/regal-cli.d.ts
CHANGED
|
@@ -72,6 +72,21 @@ export interface LintInput {
|
|
|
72
72
|
export declare class RegalCli {
|
|
73
73
|
private readonly config;
|
|
74
74
|
constructor(config: Config);
|
|
75
|
+
/**
|
|
76
|
+
* The directory regal should run in for a given set of targets.
|
|
77
|
+
*
|
|
78
|
+
* Regal finds `.regal/config.yaml` by walking up from its own working
|
|
79
|
+
* directory, never from the files it is asked to lint. Spawned without one
|
|
80
|
+
* it inherited this server's, which for a stdio server is wherever the
|
|
81
|
+
* client happened to launch it: a project's own configuration was ignored,
|
|
82
|
+
* and any configuration above the server's directory was applied to every
|
|
83
|
+
* call, including inline source. Running in the target's directory is what
|
|
84
|
+
* a person typing `regal lint` in their project gets.
|
|
85
|
+
*
|
|
86
|
+
* Undefined when the targets do not share a directory, in which case regal
|
|
87
|
+
* keeps the inherited one and behaves as it did before.
|
|
88
|
+
*/
|
|
89
|
+
private configDiscoveryDir;
|
|
75
90
|
/**
|
|
76
91
|
* Verify the binary is present and report its version. Returns null
|
|
77
92
|
* if the binary is unreachable or output is malformed.
|
|
@@ -106,7 +121,7 @@ export declare class RegalCli {
|
|
|
106
121
|
* Run `regal` with the given argv. Tools should prefer the typed
|
|
107
122
|
* methods above; this is the escape hatch.
|
|
108
123
|
*/
|
|
109
|
-
run(args: string[], signal?: AbortSignal): Promise<SpawnResult>;
|
|
124
|
+
run(args: string[], signal?: AbortSignal, cwd?: string): Promise<SpawnResult>;
|
|
110
125
|
private withTempSource;
|
|
111
126
|
}
|
|
112
127
|
//# sourceMappingURL=regal-cli.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"regal-cli.d.ts","sourceRoot":"","sources":["../../src/lib/regal-cli.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"regal-cli.d.ts","sourceRoot":"","sources":["../../src/lib/regal-cli.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAa,KAAK,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAE9D;;;;;;GAMG;AACH,eAAO,MAAM,kCAAkC,yCAA0C,CAAC;AAE1F,6BAA6B;AAC7B,MAAM,WAAW,QAAQ;IACvB,0CAA0C;IAC1C,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,0FAA0F;IAC1F,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB;;;;OAIG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,mCAAmC;IACnC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,oCAAoC;IACpC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,mCAAmC;IACnC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,sCAAsC;IACtC,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,qCAAqC;IACrC,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,6BAA6B;IAC7B,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,8BAA8B;AAC9B,MAAM,WAAW,SAAS;IACxB,2DAA2D;IAC3D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,kDAAkD;IAClD,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,mCAAmC;IACnC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iEAAiE;IACjE,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,kEAAkE;IAClE,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,mCAAmC;IACnC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,qCAAqC;IACrC,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,wDAAwD;IACxD,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,qDAAqD;IACrD,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,6BAA6B;IAC7B,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB;;;OAGG;IACH,SAAS,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CACjC;AAED;;;;;;;GAOG;AACH,qBAAa,QAAQ;IACP,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,EAAE,MAAM;IAE3C;;;;;;;;;;;;;OAaG;IACH,OAAO,CAAC,kBAAkB;IAY1B;;;OAGG;IACG,OAAO,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAQ3D;;;;;;;;;;;;;;;OAeG;IACG,IAAI,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;IAsCxE;;;;;;OAMG;IACG,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;IAiBtE;;;OAGG;IACG,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,MAAM,CAAC,EAAE,WAAW,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;YAgBrE,cAAc;CAU7B"}
|
package/dist/lib/regal-cli.js
CHANGED
|
@@ -5,9 +5,10 @@
|
|
|
5
5
|
* tools work without Regal installed. If absent, `rego_lint` returns a
|
|
6
6
|
* structured `REGAL_NOT_FOUND` error with an install hint.
|
|
7
7
|
*/
|
|
8
|
+
import { statSync } from 'node:fs';
|
|
8
9
|
import { mkdtemp, rm, writeFile } from 'node:fs/promises';
|
|
9
10
|
import { tmpdir } from 'node:os';
|
|
10
|
-
import { join } from 'node:path';
|
|
11
|
+
import { dirname, join } from 'node:path';
|
|
11
12
|
import { runBinary } from './subprocess.js';
|
|
12
13
|
/**
|
|
13
14
|
* Rules whose verdict depends on the on-disk path of the file being
|
|
@@ -30,6 +31,32 @@ export class RegalCli {
|
|
|
30
31
|
constructor(config) {
|
|
31
32
|
this.config = config;
|
|
32
33
|
}
|
|
34
|
+
/**
|
|
35
|
+
* The directory regal should run in for a given set of targets.
|
|
36
|
+
*
|
|
37
|
+
* Regal finds `.regal/config.yaml` by walking up from its own working
|
|
38
|
+
* directory, never from the files it is asked to lint. Spawned without one
|
|
39
|
+
* it inherited this server's, which for a stdio server is wherever the
|
|
40
|
+
* client happened to launch it: a project's own configuration was ignored,
|
|
41
|
+
* and any configuration above the server's directory was applied to every
|
|
42
|
+
* call, including inline source. Running in the target's directory is what
|
|
43
|
+
* a person typing `regal lint` in their project gets.
|
|
44
|
+
*
|
|
45
|
+
* Undefined when the targets do not share a directory, in which case regal
|
|
46
|
+
* keeps the inherited one and behaves as it did before.
|
|
47
|
+
*/
|
|
48
|
+
configDiscoveryDir(targets) {
|
|
49
|
+
const dirs = new Set();
|
|
50
|
+
for (const target of targets) {
|
|
51
|
+
try {
|
|
52
|
+
dirs.add(statSync(target).isDirectory() ? target : dirname(target));
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
return undefined;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
return dirs.size === 1 ? [...dirs][0] : undefined;
|
|
59
|
+
}
|
|
33
60
|
/**
|
|
34
61
|
* Verify the binary is present and report its version. Returns null
|
|
35
62
|
* if the binary is unreachable or output is malformed.
|
|
@@ -90,10 +117,14 @@ export class RegalCli {
|
|
|
90
117
|
for (const pattern of input.ignoreFiles ?? [])
|
|
91
118
|
args.push('--ignore-files', pattern);
|
|
92
119
|
if (input.source !== undefined) {
|
|
93
|
-
|
|
120
|
+
// Inline source has no project, so regal runs in its private temp
|
|
121
|
+
// directory: config discovery walks up from there and finds nothing,
|
|
122
|
+
// rather than picking up whatever sits above the server's directory.
|
|
123
|
+
return this.withTempSource(input.source, (path) => this.run([...args, path], signal, dirname(path)));
|
|
94
124
|
}
|
|
95
|
-
|
|
96
|
-
|
|
125
|
+
const paths = input.paths ?? [];
|
|
126
|
+
args.push(...paths);
|
|
127
|
+
return this.run(args, signal, this.configDiscoveryDir(paths));
|
|
97
128
|
}
|
|
98
129
|
/**
|
|
99
130
|
* Auto-fix Rego violations for rules that support mechanical fixes.
|
|
@@ -124,13 +155,13 @@ export class RegalCli {
|
|
|
124
155
|
for (const pattern of input.ignoreFiles ?? [])
|
|
125
156
|
args.push('--ignore-files', pattern);
|
|
126
157
|
args.push(...input.paths);
|
|
127
|
-
return this.run(args, signal);
|
|
158
|
+
return this.run(args, signal, this.configDiscoveryDir(input.paths));
|
|
128
159
|
}
|
|
129
160
|
/**
|
|
130
161
|
* Run `regal` with the given argv. Tools should prefer the typed
|
|
131
162
|
* methods above; this is the escape hatch.
|
|
132
163
|
*/
|
|
133
|
-
async run(args, signal) {
|
|
164
|
+
async run(args, signal, cwd) {
|
|
134
165
|
const opts = {
|
|
135
166
|
args,
|
|
136
167
|
timeoutMs: this.config.subprocessTimeoutMs,
|
|
@@ -138,6 +169,9 @@ export class RegalCli {
|
|
|
138
169
|
};
|
|
139
170
|
if (signal !== undefined)
|
|
140
171
|
opts.signal = signal;
|
|
172
|
+
// Regal discovers its configuration by walking up from here.
|
|
173
|
+
if (cwd !== undefined)
|
|
174
|
+
opts.cwd = cwd;
|
|
141
175
|
return runBinary(this.config.regalBinary, opts);
|
|
142
176
|
}
|
|
143
177
|
// ─── Internal: temp file management ──────────────────────────────────
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"regal-cli.js","sourceRoot":"","sources":["../../src/lib/regal-cli.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"regal-cli.js","sourceRoot":"","sources":["../../src/lib/regal-cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -12,10 +12,4 @@
|
|
|
12
12
|
import type { OpaModule } from './rego-ast-types.js';
|
|
13
13
|
import type { VerifyWalkResult } from './rego-ir.js';
|
|
14
14
|
export declare function walkModule(ast: OpaModule): VerifyWalkResult;
|
|
15
|
-
/**
|
|
16
|
-
* Collect all input.* paths recursively from a raw OPA AST value.
|
|
17
|
-
* Used for deep scans of comprehension bodies (Phase 2), but exported
|
|
18
|
-
* here for reuse in the engine's path-discovery pass.
|
|
19
|
-
*/
|
|
20
|
-
export declare function collectAllInputPaths(node: unknown, out: Map<string, string[]>): void;
|
|
21
15
|
//# sourceMappingURL=rego-ast-walker.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rego-ast-walker.d.ts","sourceRoot":"","sources":["../../src/lib/rego-ast-walker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,KAAK,EAAiB,SAAS,EAAoB,MAAM,qBAAqB,CAAC;AACtF,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"rego-ast-walker.d.ts","sourceRoot":"","sources":["../../src/lib/rego-ast-walker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,KAAK,EAAiB,SAAS,EAAoB,MAAM,qBAAqB,CAAC;AACtF,OAAO,KAAK,EAAsC,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAsBzF,wBAAgB,UAAU,CAAC,GAAG,EAAE,SAAS,GAAG,gBAAgB,CAkB3D"}
|