@orygn/opa-mcp 0.3.0 → 0.5.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 +396 -3
- package/README.md +132 -98
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +8 -3
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +15 -3
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +74 -14
- package/dist/config.js.map +1 -1
- package/dist/constants.d.ts +1 -1
- package/dist/constants.js +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 +41 -0
- package/dist/lib/child-env.d.ts.map +1 -0
- package/dist/lib/child-env.js +176 -0
- package/dist/lib/child-env.js.map +1 -0
- 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 +153 -33
- package/dist/lib/conftest-cli.js.map +1 -1
- 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 +64 -16
- package/dist/lib/opa-cli.d.ts.map +1 -1
- package/dist/lib/opa-cli.js +99 -28
- package/dist/lib/opa-cli.js.map +1 -1
- package/dist/lib/opa-paths.d.ts +24 -0
- package/dist/lib/opa-paths.d.ts.map +1 -0
- package/dist/lib/opa-paths.js +97 -0
- package/dist/lib/opa-paths.js.map +1 -0
- 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 +41 -6
- package/dist/lib/regal-cli.js.map +1 -1
- package/dist/lib/rego-ast-walker.d.ts.map +1 -1
- package/dist/lib/rego-ast-walker.js +141 -17
- package/dist/lib/rego-ast-walker.js.map +1 -1
- package/dist/lib/rego-counterexample.d.ts +1 -1
- package/dist/lib/rego-counterexample.d.ts.map +1 -1
- package/dist/lib/rego-counterexample.js +23 -5
- package/dist/lib/rego-counterexample.js.map +1 -1
- package/dist/lib/rego-ir.d.ts +32 -2
- package/dist/lib/rego-ir.d.ts.map +1 -1
- package/dist/lib/rego-smt-encoder.d.ts +53 -5
- package/dist/lib/rego-smt-encoder.d.ts.map +1 -1
- package/dist/lib/rego-smt-encoder.js +192 -26
- package/dist/lib/rego-smt-encoder.js.map +1 -1
- package/dist/lib/rego-type-inferencer.d.ts +1 -1
- package/dist/lib/rego-type-inferencer.d.ts.map +1 -1
- package/dist/lib/rego-type-inferencer.js +3 -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 +109 -77
- package/dist/lib/rego-verify-engine.js.map +1 -1
- package/dist/lib/rego-z3.d.ts +10 -0
- package/dist/lib/rego-z3.d.ts.map +1 -1
- package/dist/lib/rego-z3.js +38 -0
- 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 +36 -3
- package/dist/lib/subprocess.d.ts.map +1 -1
- package/dist/lib/subprocess.js +121 -20
- package/dist/lib/subprocess.js.map +1 -1
- package/dist/lib/tool-helpers.d.ts.map +1 -1
- package/dist/lib/tool-helpers.js +10 -0
- package/dist/lib/tool-helpers.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 +40 -12
- package/dist/resources/patterns.js.map +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +10 -2
- package/dist/server.js.map +1 -1
- package/dist/tools/authoring/check-schema.js +1 -1
- package/dist/tools/authoring/check-schema.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 +145 -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/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 +47 -24
- 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 +30 -18
- package/dist/tools/conftest/verify.js.map +1 -1
- package/dist/tools/evaluation/bench.d.ts +16 -0
- package/dist/tools/evaluation/bench.d.ts.map +1 -1
- package/dist/tools/evaluation/bench.js +30 -5
- package/dist/tools/evaluation/bench.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 +35 -2
- package/dist/tools/evaluation/exec.js.map +1 -1
- package/dist/tools/evaluation/test-multiroot.d.ts +4 -0
- package/dist/tools/evaluation/test-multiroot.d.ts.map +1 -1
- package/dist/tools/evaluation/test-multiroot.js +21 -14
- 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 +146 -27
- 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 +4 -3
- package/dist/tools/helpers/coverage-gaps.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 +83 -51
- package/dist/tools/helpers/explain-undefined.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/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 +73 -12
- 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
|
@@ -3,17 +3,26 @@
|
|
|
3
3
|
*/
|
|
4
4
|
import { z } from 'zod';
|
|
5
5
|
import { OpaClient } from '../../lib/opa-client.js';
|
|
6
|
-
import { ok } from '../../lib/errors.js';
|
|
6
|
+
import { err, ok } from '../../lib/errors.js';
|
|
7
7
|
import { coerceJsonArg } from '../../lib/json-coerce.js';
|
|
8
8
|
import { withToolEnvelope } from '../../lib/tool-helpers.js';
|
|
9
|
-
import { mapOpaClientError, parseOpaDataPath } from './_shared.js';
|
|
9
|
+
import { mapOpaClientError, OPA_DATA_ROOT, parseOpaDataPath } from './_shared.js';
|
|
10
10
|
export function registerDataTools(server, config) {
|
|
11
11
|
const opa = new OpaClient(config);
|
|
12
12
|
server.registerTool('opa_get_data', {
|
|
13
13
|
title: 'Read data from OPA',
|
|
14
|
-
description: "Read a path from OPA's data hierarchy.
|
|
14
|
+
description: "Read a path from OPA's data hierarchy. A `path` is read as dotted (`users.alice`) unless it contains a slash, in which case slash is the only separator (`users/alice`), so a key such as `example.com` is addressable as `hosts/example.com`. Pass `segments` instead when a key contains both.",
|
|
15
15
|
inputSchema: {
|
|
16
|
-
path: z
|
|
16
|
+
path: z
|
|
17
|
+
.string()
|
|
18
|
+
.min(1)
|
|
19
|
+
.optional()
|
|
20
|
+
.describe('Data path under `data.`, e.g. "users" or "users/alice".'),
|
|
21
|
+
segments: z
|
|
22
|
+
.array(z.string().min(1))
|
|
23
|
+
.min(1)
|
|
24
|
+
.optional()
|
|
25
|
+
.describe('Path as literal key segments, e.g. ["labels", "app.kubernetes.io/name"]. Use instead of `path` when a key contains a dot or a slash.'),
|
|
17
26
|
},
|
|
18
27
|
annotations: {
|
|
19
28
|
readOnlyHint: true,
|
|
@@ -21,9 +30,16 @@ export function registerDataTools(server, config) {
|
|
|
21
30
|
idempotentHint: true,
|
|
22
31
|
openWorldHint: true,
|
|
23
32
|
},
|
|
24
|
-
}, async ({ path }, { signal }) => {
|
|
33
|
+
}, async ({ path, segments }, { signal }) => {
|
|
25
34
|
return withToolEnvelope(config, async () => {
|
|
26
|
-
const
|
|
35
|
+
const target = segments ?? path;
|
|
36
|
+
if (target === undefined) {
|
|
37
|
+
return err('INVALID_INPUT', 'Supply either `path` or `segments`.');
|
|
38
|
+
}
|
|
39
|
+
if (path !== undefined && segments !== undefined) {
|
|
40
|
+
return err('INVALID_INPUT', 'Supply `path` or `segments`, not both.');
|
|
41
|
+
}
|
|
42
|
+
const parsed = parseOpaDataPath(target);
|
|
27
43
|
if (!parsed.ok)
|
|
28
44
|
return parsed.error;
|
|
29
45
|
try {
|
|
@@ -41,9 +57,14 @@ export function registerDataTools(server, config) {
|
|
|
41
57
|
});
|
|
42
58
|
server.registerTool('opa_put_data', {
|
|
43
59
|
title: 'Write data to OPA',
|
|
44
|
-
description: 'Write or replace a value at the given data path. Body is sent as JSON.',
|
|
60
|
+
description: 'Write or replace a value at the given data path. Body is sent as JSON. A `path` is read as dotted (`users.alice`) unless it contains a slash, in which case slash is the only separator (`users/alice`), so a key such as `example.com` is addressable as `hosts/example.com`. Pass `segments` instead when a key contains both.',
|
|
45
61
|
inputSchema: {
|
|
46
|
-
path: z.string().min(1).describe('Data path to write to.'),
|
|
62
|
+
path: z.string().min(1).optional().describe('Data path to write to.'),
|
|
63
|
+
segments: z
|
|
64
|
+
.array(z.string().min(1))
|
|
65
|
+
.min(1)
|
|
66
|
+
.optional()
|
|
67
|
+
.describe('Path as literal key segments, e.g. ["labels", "app.kubernetes.io/name"]. Use instead of `path` when a key contains a dot or a slash.'),
|
|
47
68
|
value: z.unknown().describe('JSON value to store at this path.'),
|
|
48
69
|
},
|
|
49
70
|
annotations: {
|
|
@@ -52,9 +73,16 @@ export function registerDataTools(server, config) {
|
|
|
52
73
|
idempotentHint: true,
|
|
53
74
|
openWorldHint: true,
|
|
54
75
|
},
|
|
55
|
-
}, async ({ path, value }, { signal }) => {
|
|
76
|
+
}, async ({ path, segments, value }, { signal }) => {
|
|
56
77
|
return withToolEnvelope(config, async () => {
|
|
57
|
-
const
|
|
78
|
+
const target = segments ?? path;
|
|
79
|
+
if (target === undefined) {
|
|
80
|
+
return err('INVALID_INPUT', 'Supply either `path` or `segments`.');
|
|
81
|
+
}
|
|
82
|
+
if (path !== undefined && segments !== undefined) {
|
|
83
|
+
return err('INVALID_INPUT', 'Supply `path` or `segments`, not both.');
|
|
84
|
+
}
|
|
85
|
+
const parsed = parseOpaDataPath(target);
|
|
58
86
|
if (!parsed.ok)
|
|
59
87
|
return parsed.error;
|
|
60
88
|
try {
|
|
@@ -64,7 +92,11 @@ export function registerDataTools(server, config) {
|
|
|
64
92
|
body: coerceJsonArg(value),
|
|
65
93
|
signal,
|
|
66
94
|
});
|
|
67
|
-
return ok({
|
|
95
|
+
return ok({
|
|
96
|
+
path: path ?? parsed.segments.join('/'),
|
|
97
|
+
segments: parsed.segments,
|
|
98
|
+
written: true,
|
|
99
|
+
});
|
|
68
100
|
}
|
|
69
101
|
catch (e) {
|
|
70
102
|
return mapOpaClientError(e);
|
|
@@ -73,9 +105,14 @@ export function registerDataTools(server, config) {
|
|
|
73
105
|
});
|
|
74
106
|
server.registerTool('opa_patch_data', {
|
|
75
107
|
title: 'Patch data on OPA',
|
|
76
|
-
description: 'Apply a JSON Patch (RFC 6902) to the data document. Each operation is `{ op, path, value? }`.',
|
|
108
|
+
description: 'Apply a JSON Patch (RFC 6902) to the data document. Each operation is `{ op, path, value? }`. Omit both `path` and `segments` to patch the root of the data hierarchy, which is how a whole new top-level document is added.',
|
|
77
109
|
inputSchema: {
|
|
78
|
-
path: z.string().min(1).describe('Data path the patch is applied to.
|
|
110
|
+
path: z.string().min(1).optional().describe('Data path the patch is applied to.'),
|
|
111
|
+
segments: z
|
|
112
|
+
.array(z.string().min(1))
|
|
113
|
+
.min(1)
|
|
114
|
+
.optional()
|
|
115
|
+
.describe('Path as literal key segments, e.g. ["labels", "app.kubernetes.io/name"]. Use instead of `path` when a key contains a dot or a slash.'),
|
|
79
116
|
operations: z
|
|
80
117
|
.array(z.object({
|
|
81
118
|
op: z.enum(['add', 'remove', 'replace']),
|
|
@@ -91,20 +128,31 @@ export function registerDataTools(server, config) {
|
|
|
91
128
|
idempotentHint: false,
|
|
92
129
|
openWorldHint: true,
|
|
93
130
|
},
|
|
94
|
-
}, async ({ path, operations }, { signal }) => {
|
|
131
|
+
}, async ({ path, segments, operations }, { signal }) => {
|
|
95
132
|
return withToolEnvelope(config, async () => {
|
|
96
|
-
const
|
|
97
|
-
if (
|
|
98
|
-
return
|
|
133
|
+
const target = segments ?? path;
|
|
134
|
+
if (path !== undefined && segments !== undefined) {
|
|
135
|
+
return err('INVALID_INPUT', 'Supply `path` or `segments`, not both.');
|
|
136
|
+
}
|
|
137
|
+
// Neither given addresses the root, which OPA accepts for PATCH alone.
|
|
138
|
+
let apiPath = OPA_DATA_ROOT;
|
|
139
|
+
let addressed = [];
|
|
140
|
+
if (target !== undefined) {
|
|
141
|
+
const parsed = parseOpaDataPath(target);
|
|
142
|
+
if (!parsed.ok)
|
|
143
|
+
return parsed.error;
|
|
144
|
+
apiPath = parsed.apiPath;
|
|
145
|
+
addressed = parsed.segments;
|
|
146
|
+
}
|
|
99
147
|
try {
|
|
100
148
|
await opa.request({
|
|
101
149
|
method: 'PATCH',
|
|
102
|
-
path:
|
|
150
|
+
path: apiPath,
|
|
103
151
|
body: operations.map((op) => op.value !== undefined ? { ...op, value: coerceJsonArg(op.value) } : op),
|
|
104
152
|
headers: { 'Content-Type': 'application/json-patch+json' },
|
|
105
153
|
signal,
|
|
106
154
|
});
|
|
107
|
-
return ok({ path, patched: true });
|
|
155
|
+
return ok({ path: path ?? addressed.join('/'), segments: addressed, patched: true });
|
|
108
156
|
}
|
|
109
157
|
catch (e) {
|
|
110
158
|
return mapOpaClientError(e, 'DATA_NOT_FOUND');
|
|
@@ -113,12 +161,18 @@ export function registerDataTools(server, config) {
|
|
|
113
161
|
});
|
|
114
162
|
server.registerTool('opa_delete_data', {
|
|
115
163
|
title: 'Delete a data document from OPA',
|
|
116
|
-
description: "Remove a document from OPA's data store at the given path.
|
|
164
|
+
description: "Remove a document from OPA's data store at the given path. A `path` is read as dotted (`users.alice`) unless it contains a slash, in which case slash is the only separator (`users/alice`), so a key such as `example.com` is addressable as `hosts/example.com`. Pass `segments` instead when a key contains both. OPA responds with 204 No Content on success; if no document exists at the path, OPA returns 404 which is mapped to `DATA_NOT_FOUND`. Root-path deletion (`/v1/data/` itself) is intentionally excluded -- supply at least one path segment.",
|
|
117
165
|
inputSchema: {
|
|
118
166
|
path: z
|
|
119
167
|
.string()
|
|
120
168
|
.min(1)
|
|
169
|
+
.optional()
|
|
121
170
|
.describe('Data path to delete, e.g. "users.alice" or "users/alice". Must be at least one segment deep.'),
|
|
171
|
+
segments: z
|
|
172
|
+
.array(z.string().min(1))
|
|
173
|
+
.min(1)
|
|
174
|
+
.optional()
|
|
175
|
+
.describe('Path as literal key segments, e.g. ["labels", "app.kubernetes.io/name"]. Use instead of `path` when a key contains a dot or a slash.'),
|
|
122
176
|
},
|
|
123
177
|
annotations: {
|
|
124
178
|
readOnlyHint: false,
|
|
@@ -126,9 +180,16 @@ export function registerDataTools(server, config) {
|
|
|
126
180
|
idempotentHint: false,
|
|
127
181
|
openWorldHint: true,
|
|
128
182
|
},
|
|
129
|
-
}, async ({ path }, { signal }) => {
|
|
183
|
+
}, async ({ path, segments }, { signal }) => {
|
|
130
184
|
return withToolEnvelope(config, async () => {
|
|
131
|
-
const
|
|
185
|
+
const target = segments ?? path;
|
|
186
|
+
if (target === undefined) {
|
|
187
|
+
return err('INVALID_INPUT', 'Supply either `path` or `segments`.');
|
|
188
|
+
}
|
|
189
|
+
if (path !== undefined && segments !== undefined) {
|
|
190
|
+
return err('INVALID_INPUT', 'Supply `path` or `segments`, not both.');
|
|
191
|
+
}
|
|
192
|
+
const parsed = parseOpaDataPath(target);
|
|
132
193
|
if (!parsed.ok)
|
|
133
194
|
return parsed.error;
|
|
134
195
|
try {
|
|
@@ -137,7 +198,11 @@ export function registerDataTools(server, config) {
|
|
|
137
198
|
path: parsed.apiPath,
|
|
138
199
|
signal,
|
|
139
200
|
});
|
|
140
|
-
return ok({
|
|
201
|
+
return ok({
|
|
202
|
+
path: path ?? parsed.segments.join('/'),
|
|
203
|
+
segments: parsed.segments,
|
|
204
|
+
deleted: true,
|
|
205
|
+
});
|
|
141
206
|
}
|
|
142
207
|
catch (e) {
|
|
143
208
|
return mapOpaClientError(e, 'DATA_NOT_FOUND');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data.js","sourceRoot":"","sources":["../../../src/tools/server-management/data.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACpD,OAAO,EAAE,EAAE,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"data.js","sourceRoot":"","sources":["../../../src/tools/server-management/data.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"decisions.d.ts","sourceRoot":"","sources":["../../../src/tools/server-management/decisions.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAO9C,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"decisions.d.ts","sourceRoot":"","sources":["../../../src/tools/server-management/decisions.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAO9C,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAqH7E"}
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import { z } from 'zod';
|
|
6
6
|
import { OpaClient } from '../../lib/opa-client.js';
|
|
7
|
-
import { ok } from '../../lib/errors.js';
|
|
7
|
+
import { err, ok } from '../../lib/errors.js';
|
|
8
8
|
import { coerceJsonArg } from '../../lib/json-coerce.js';
|
|
9
9
|
import { withToolEnvelope } from '../../lib/tool-helpers.js';
|
|
10
10
|
import { mapOpaClientError, parseOpaDataPath } from './_shared.js';
|
|
@@ -17,7 +17,13 @@ export function registerDecisionTools(server, config) {
|
|
|
17
17
|
path: z
|
|
18
18
|
.string()
|
|
19
19
|
.min(1)
|
|
20
|
+
.optional()
|
|
20
21
|
.describe('Decision path under `data.`, e.g. "rbac/allow" or "rbac.allow".'),
|
|
22
|
+
segments: z
|
|
23
|
+
.array(z.string().min(1))
|
|
24
|
+
.min(1)
|
|
25
|
+
.optional()
|
|
26
|
+
.describe('Path as literal key segments, e.g. ["labels", "app.kubernetes.io/name"]. Use instead of `path` when a key contains a dot or a slash.'),
|
|
21
27
|
input: z.unknown().optional().describe('Input document to evaluate against.'),
|
|
22
28
|
explain: z
|
|
23
29
|
.enum(['notes', 'fails', 'full', 'debug'])
|
|
@@ -31,9 +37,16 @@ export function registerDecisionTools(server, config) {
|
|
|
31
37
|
idempotentHint: true,
|
|
32
38
|
openWorldHint: true,
|
|
33
39
|
},
|
|
34
|
-
}, async ({ path, input, explain, metrics }, { signal }) => {
|
|
40
|
+
}, async ({ path, segments, input, explain, metrics }, { signal }) => {
|
|
35
41
|
return withToolEnvelope(config, async () => {
|
|
36
|
-
const
|
|
42
|
+
const target = segments ?? path;
|
|
43
|
+
if (target === undefined) {
|
|
44
|
+
return err('INVALID_INPUT', 'Supply either `path` or `segments`.');
|
|
45
|
+
}
|
|
46
|
+
if (path !== undefined && segments !== undefined) {
|
|
47
|
+
return err('INVALID_INPUT', 'Supply `path` or `segments`, not both.');
|
|
48
|
+
}
|
|
49
|
+
const parsed = parseOpaDataPath(target);
|
|
37
50
|
if (!parsed.ok)
|
|
38
51
|
return parsed.error;
|
|
39
52
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"decisions.js","sourceRoot":"","sources":["../../../src/tools/server-management/decisions.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACpD,OAAO,EAAE,EAAE,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"decisions.js","sourceRoot":"","sources":["../../../src/tools/server-management/decisions.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"policies.d.ts","sourceRoot":"","sources":["../../../src/tools/server-management/policies.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"policies.d.ts","sourceRoot":"","sources":["../../../src/tools/server-management/policies.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAgC9C,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CA2J3E"}
|
|
@@ -7,19 +7,46 @@ import { OpaClient } from '../../lib/opa-client.js';
|
|
|
7
7
|
import { ok } from '../../lib/errors.js';
|
|
8
8
|
import { withToolEnvelope } from '../../lib/tool-helpers.js';
|
|
9
9
|
import { mapOpaClientError } from './_shared.js';
|
|
10
|
+
/**
|
|
11
|
+
* Drop the parts of a policy record the caller did not ask for.
|
|
12
|
+
*
|
|
13
|
+
* OPA answers the policy endpoints with the parsed AST alongside the source,
|
|
14
|
+
* and the AST is far larger than the text it came from: a 477-byte policy comes
|
|
15
|
+
* back as a 19 KB response once the envelope is indented. Returning it by
|
|
16
|
+
* default pushed a list of any real size past the response cap, and the cap's
|
|
17
|
+
* advice to narrow the scope was unfollowable because the list tool takes no
|
|
18
|
+
* arguments.
|
|
19
|
+
*/
|
|
20
|
+
function trimPolicy(record, opts) {
|
|
21
|
+
const trimmed = { id: record.id };
|
|
22
|
+
if (opts.source && record.raw !== undefined)
|
|
23
|
+
trimmed.raw = record.raw;
|
|
24
|
+
if (opts.ast && record.ast !== undefined)
|
|
25
|
+
trimmed.ast = record.ast;
|
|
26
|
+
return trimmed;
|
|
27
|
+
}
|
|
10
28
|
export function registerPolicyTools(server, config) {
|
|
11
29
|
const opa = new OpaClient(config);
|
|
12
30
|
server.registerTool('opa_list_policies', {
|
|
13
31
|
title: 'List OPA policies',
|
|
14
|
-
description: 'List policies registered on the running OPA server. Returns
|
|
15
|
-
inputSchema: {
|
|
32
|
+
description: 'List policies registered on the running OPA server. Returns the policy IDs and a count. Set `includeSource` for the Rego text of every policy, or `includeAst` for the parsed AST of every policy; both are off by default because either one pushes a list of any real size past the response cap.',
|
|
33
|
+
inputSchema: {
|
|
34
|
+
includeSource: z
|
|
35
|
+
.boolean()
|
|
36
|
+
.optional()
|
|
37
|
+
.describe("Include each policy's Rego source. Off by default: fetch one policy with `opa_get_policy` rather than every policy at once."),
|
|
38
|
+
includeAst: z
|
|
39
|
+
.boolean()
|
|
40
|
+
.optional()
|
|
41
|
+
.describe("Include each policy's parsed AST. Off by default; it is roughly forty times the size of the source and will exceed the response cap on all but the smallest servers."),
|
|
42
|
+
},
|
|
16
43
|
annotations: {
|
|
17
44
|
readOnlyHint: true,
|
|
18
45
|
destructiveHint: false,
|
|
19
46
|
idempotentHint: true,
|
|
20
47
|
openWorldHint: true,
|
|
21
48
|
},
|
|
22
|
-
}, async (
|
|
49
|
+
}, async ({ includeSource, includeAst }, { signal }) => {
|
|
23
50
|
return withToolEnvelope(config, async () => {
|
|
24
51
|
try {
|
|
25
52
|
const data = await opa.request({
|
|
@@ -27,7 +54,11 @@ export function registerPolicyTools(server, config) {
|
|
|
27
54
|
path: '/v1/policies',
|
|
28
55
|
signal,
|
|
29
56
|
});
|
|
30
|
-
|
|
57
|
+
const records = data.result ?? [];
|
|
58
|
+
return ok({
|
|
59
|
+
policies: records.map((r) => trimPolicy(r, { source: includeSource === true, ast: includeAst === true })),
|
|
60
|
+
count: records.length,
|
|
61
|
+
});
|
|
31
62
|
}
|
|
32
63
|
catch (e) {
|
|
33
64
|
return mapOpaClientError(e);
|
|
@@ -36,9 +67,13 @@ export function registerPolicyTools(server, config) {
|
|
|
36
67
|
});
|
|
37
68
|
server.registerTool('opa_get_policy', {
|
|
38
69
|
title: 'Get OPA policy by ID',
|
|
39
|
-
description:
|
|
70
|
+
description: "Fetch a single policy by ID from the running OPA server. Returns the Rego source; the parsed AST is omitted unless asked for, since it is roughly forty times the size of the source it came from. Use `rego_parse_ast` on the source when an AST is what's wanted.",
|
|
40
71
|
inputSchema: {
|
|
41
72
|
id: z.string().min(1).describe('Policy ID, e.g. "rbac" or "policies/auth/main".'),
|
|
73
|
+
includeAst: z
|
|
74
|
+
.boolean()
|
|
75
|
+
.optional()
|
|
76
|
+
.describe("Include OPA's parsed AST alongside the source. Off by default."),
|
|
42
77
|
},
|
|
43
78
|
annotations: {
|
|
44
79
|
readOnlyHint: true,
|
|
@@ -46,7 +81,7 @@ export function registerPolicyTools(server, config) {
|
|
|
46
81
|
idempotentHint: true,
|
|
47
82
|
openWorldHint: true,
|
|
48
83
|
},
|
|
49
|
-
}, async ({ id }, { signal }) => {
|
|
84
|
+
}, async ({ id, includeAst }, { signal }) => {
|
|
50
85
|
return withToolEnvelope(config, async () => {
|
|
51
86
|
try {
|
|
52
87
|
const data = await opa.request({
|
|
@@ -54,7 +89,9 @@ export function registerPolicyTools(server, config) {
|
|
|
54
89
|
path: `/v1/policies/${encodeURIComponent(id)}`,
|
|
55
90
|
signal,
|
|
56
91
|
});
|
|
57
|
-
return ok({
|
|
92
|
+
return ok({
|
|
93
|
+
policy: trimPolicy(data.result, { source: true, ast: includeAst === true }),
|
|
94
|
+
});
|
|
58
95
|
}
|
|
59
96
|
catch (e) {
|
|
60
97
|
return mapOpaClientError(e, 'POLICY_NOT_FOUND');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"policies.js","sourceRoot":"","sources":["../../../src/tools/server-management/policies.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACpD,OAAO,EAAE,EAAE,EAAE,MAAM,qBAAqB,CAAC;AACzC,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAQjD,MAAM,UAAU,mBAAmB,CAAC,MAAiB,EAAE,MAAc;IACnE,MAAM,GAAG,GAAG,IAAI,SAAS,CAAC,MAAM,CAAC,CAAC;IAElC,MAAM,CAAC,YAAY,CACjB,mBAAmB,EACnB;QACE,KAAK,EAAE,mBAAmB;QAC1B,WAAW,EACT,
|
|
1
|
+
{"version":3,"file":"policies.js","sourceRoot":"","sources":["../../../src/tools/server-management/policies.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../src/tools/server-management/status.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../src/tools/server-management/status.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAuE9C,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAkH3E"}
|
|
@@ -2,15 +2,77 @@
|
|
|
2
2
|
* Server-status tools: opa_health, opa_status, opa_config.
|
|
3
3
|
*/
|
|
4
4
|
import { z } from 'zod';
|
|
5
|
-
import { OpaClient,
|
|
6
|
-
import {
|
|
5
|
+
import { OpaClient, OpaHttpError } from '../../lib/opa-client.js';
|
|
6
|
+
import { ok } from '../../lib/errors.js';
|
|
7
7
|
import { withToolEnvelope } from '../../lib/tool-helpers.js';
|
|
8
8
|
import { mapOpaClientError } from './_shared.js';
|
|
9
|
+
/** Stands in for a header value so the header is still visible as configured. */
|
|
10
|
+
const REDACTED = '<redacted by opa-mcp>';
|
|
11
|
+
/** OPA answers an unhealthy check with `{"error": "..."}`; surface that text. */
|
|
12
|
+
function healthReason(e) {
|
|
13
|
+
const body = e.body;
|
|
14
|
+
if (typeof body === 'string' && body.trim().length > 0) {
|
|
15
|
+
try {
|
|
16
|
+
const parsed = JSON.parse(body);
|
|
17
|
+
if (typeof parsed.error === 'string')
|
|
18
|
+
return parsed.error;
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
return body.trim();
|
|
22
|
+
}
|
|
23
|
+
return body.trim();
|
|
24
|
+
}
|
|
25
|
+
if (typeof body === 'object' && body !== null) {
|
|
26
|
+
const parsed = body;
|
|
27
|
+
if (typeof parsed.error === 'string')
|
|
28
|
+
return parsed.error;
|
|
29
|
+
}
|
|
30
|
+
return undefined;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Redact the values of `services.*.headers` in an OPA configuration document.
|
|
34
|
+
*
|
|
35
|
+
* OPA drops the `credentials` block from `GET /v1/config` but returns `headers`
|
|
36
|
+
* verbatim, and a header is the ordinary way to put an API key or a bearer token
|
|
37
|
+
* in an OPA config. Handing those to an agent, which is what these two tools do
|
|
38
|
+
* with the document, puts a live credential into a transcript. The header names
|
|
39
|
+
* survive, so the document still answers what the server is configured to send.
|
|
40
|
+
*/
|
|
41
|
+
function redactServiceHeaders(document) {
|
|
42
|
+
if (typeof document !== 'object' || document === null || Array.isArray(document)) {
|
|
43
|
+
return document;
|
|
44
|
+
}
|
|
45
|
+
const doc = document;
|
|
46
|
+
const services = doc['services'];
|
|
47
|
+
if (typeof services !== 'object' || services === null || Array.isArray(services)) {
|
|
48
|
+
return document;
|
|
49
|
+
}
|
|
50
|
+
let touched = false;
|
|
51
|
+
const redactedServices = {};
|
|
52
|
+
for (const [name, service] of Object.entries(services)) {
|
|
53
|
+
if (typeof service !== 'object' || service === null || Array.isArray(service)) {
|
|
54
|
+
redactedServices[name] = service;
|
|
55
|
+
continue;
|
|
56
|
+
}
|
|
57
|
+
const entry = service;
|
|
58
|
+
const headers = entry['headers'];
|
|
59
|
+
if (typeof headers !== 'object' || headers === null || Array.isArray(headers)) {
|
|
60
|
+
redactedServices[name] = service;
|
|
61
|
+
continue;
|
|
62
|
+
}
|
|
63
|
+
touched = true;
|
|
64
|
+
redactedServices[name] = {
|
|
65
|
+
...entry,
|
|
66
|
+
headers: Object.fromEntries(Object.keys(headers).map((k) => [k, REDACTED])),
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
return touched ? { ...doc, services: redactedServices } : document;
|
|
70
|
+
}
|
|
9
71
|
export function registerStatusTools(server, config) {
|
|
10
72
|
const opa = new OpaClient(config);
|
|
11
73
|
server.registerTool('opa_health', {
|
|
12
74
|
title: 'OPA health check',
|
|
13
|
-
description:
|
|
75
|
+
description: "Hit the OPA `/health` endpoint. A server that answers reports `{ healthy: true }` on 200 and `{ healthy: false }` with OPA's own reason otherwise, so an unactivated bundle is a health result rather than a tool error. `OPA_UNREACHABLE` means the server could not be reached at all. Supports `bundles` and `plugins` query flags to require those subsystems to also be healthy.",
|
|
14
76
|
inputSchema: {
|
|
15
77
|
bundles: z.boolean().optional().describe('Require bundle plugin to be healthy as well.'),
|
|
16
78
|
plugins: z.boolean().optional().describe('Require all plugins to be healthy.'),
|
|
@@ -38,13 +100,16 @@ export function registerStatusTools(server, config) {
|
|
|
38
100
|
return ok({ healthy: true });
|
|
39
101
|
}
|
|
40
102
|
catch (e) {
|
|
41
|
-
|
|
42
|
-
|
|
103
|
+
// A server that answered is reachable. Reporting an unactivated
|
|
104
|
+
// bundle as OPA_UNREACHABLE told the caller to go start a server that
|
|
105
|
+
// was already running, and buried OPA's own reason in a stringified
|
|
106
|
+
// error. Authentication is its own failure, not a health result, and
|
|
107
|
+
// so is a server that could not be reached or a cancelled request.
|
|
108
|
+
if (e instanceof OpaHttpError && e.status !== 401) {
|
|
109
|
+
const reason = healthReason(e);
|
|
110
|
+
return ok({ healthy: false, ...(reason !== undefined ? { reason } : {}) });
|
|
43
111
|
}
|
|
44
|
-
|
|
45
|
-
return err('OPA_UNREACHABLE', 'OPA reported unhealthy.', {
|
|
46
|
-
details: { error: e instanceof Error ? e.message : String(e) },
|
|
47
|
-
});
|
|
112
|
+
return mapOpaClientError(e);
|
|
48
113
|
}
|
|
49
114
|
});
|
|
50
115
|
});
|
|
@@ -54,7 +119,9 @@ export function registerStatusTools(server, config) {
|
|
|
54
119
|
'Returns the same underlying document as `opa_config` but presented under a `status` ' +
|
|
55
120
|
'key as a convenience for agents that want to check "what is running" rather than ' +
|
|
56
121
|
'"what was the server configured with". The response includes bundle settings, ' +
|
|
57
|
-
'decision-log settings, and plugin configuration as OPA reported them at startup.'
|
|
122
|
+
'decision-log settings, and plugin configuration as OPA reported them at startup. ' +
|
|
123
|
+
'Service header values are redacted, since OPA returns them verbatim and a header is ' +
|
|
124
|
+
'the ordinary place to put an API key.',
|
|
58
125
|
inputSchema: {},
|
|
59
126
|
annotations: {
|
|
60
127
|
readOnlyHint: true,
|
|
@@ -70,7 +137,7 @@ export function registerStatusTools(server, config) {
|
|
|
70
137
|
path: '/v1/config',
|
|
71
138
|
signal,
|
|
72
139
|
});
|
|
73
|
-
return ok({ status: data.result ?? data });
|
|
140
|
+
return ok({ status: redactServiceHeaders(data.result ?? data) });
|
|
74
141
|
}
|
|
75
142
|
catch (e) {
|
|
76
143
|
return mapOpaClientError(e);
|
|
@@ -79,7 +146,7 @@ export function registerStatusTools(server, config) {
|
|
|
79
146
|
});
|
|
80
147
|
server.registerTool('opa_config', {
|
|
81
148
|
title: 'OPA configuration',
|
|
82
|
-
description: 'Return the running OPA server configuration
|
|
149
|
+
description: 'Return the running OPA server configuration from `GET /v1/config`. OPA drops the `credentials` block but returns `services.*.headers` verbatim, which is the ordinary place to put an API key or a bearer token, so those values are redacted here and the header names kept.',
|
|
83
150
|
inputSchema: {},
|
|
84
151
|
annotations: {
|
|
85
152
|
readOnlyHint: true,
|
|
@@ -95,7 +162,7 @@ export function registerStatusTools(server, config) {
|
|
|
95
162
|
path: '/v1/config',
|
|
96
163
|
signal,
|
|
97
164
|
});
|
|
98
|
-
return ok({ config: data.result ?? data });
|
|
165
|
+
return ok({ config: redactServiceHeaders(data.result ?? data) });
|
|
99
166
|
}
|
|
100
167
|
catch (e) {
|
|
101
168
|
return mapOpaClientError(e);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../../src/tools/server-management/status.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB,OAAO,EAAE,SAAS,EAAE,
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../../src/tools/server-management/status.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -2,7 +2,16 @@
|
|
|
2
2
|
* Shared types used across tools, prompts, and resources.
|
|
3
3
|
*/
|
|
4
4
|
/** Standard error codes returned by tools. */
|
|
5
|
-
|
|
5
|
+
/**
|
|
6
|
+
* Codes a tool can return.
|
|
7
|
+
*
|
|
8
|
+
* Four names are reserved and currently unused: REGAL_VERSION_TOO_OLD (no
|
|
9
|
+
* minimum-version check exists), DEPENDENCY_CONFLICT, VERIFY_INCONCLUSIVE
|
|
10
|
+
* (rego_verify reports an inconclusive result as a verdict, not an error) and
|
|
11
|
+
* Z3_INIT_ERROR. They are kept so the union stays stable for consumers, and
|
|
12
|
+
* are no longer listed in the README as codes a caller can expect.
|
|
13
|
+
*/
|
|
14
|
+
export type ToolErrorCode = 'INVALID_INPUT' | 'OPA_BINARY_NOT_FOUND' | 'REGAL_NOT_FOUND' | 'REGAL_VERSION_TOO_OLD' | 'CONFTEST_NOT_FOUND' | 'INVALID_REGO' | 'INVALID_BUNDLE' | 'EVAL_ERROR' | 'PATH_NOT_ALLOWED' | 'PATH_NOT_FOUND' | 'OPA_UNREACHABLE' | 'OPA_AUTH_FAILED' | 'POLICY_NOT_FOUND' | 'DATA_NOT_FOUND' | 'DEPENDENCY_CONFLICT' | 'NO_TESTS_FOUND' | 'COVERAGE_BELOW_THRESHOLD' | 'OUTPUT_TOO_LARGE' | 'TIMEOUT' | 'CANCELLED' | 'VERIFY_INCONCLUSIVE' | 'Z3_INIT_ERROR' | 'OPA_VERSION_UNSUPPORTED' | 'GITHUB_TOKEN_MISSING' | 'GIST_CREATE_FAILED' | 'UNKNOWN_ERROR';
|
|
6
15
|
/** Structured error payload. */
|
|
7
16
|
export interface ToolError {
|
|
8
17
|
code: ToolErrorCode;
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,8CAA8C;AAC9C,MAAM,MAAM,aAAa,GACrB,eAAe,GACf,sBAAsB,GACtB,iBAAiB,GACjB,uBAAuB,GACvB,oBAAoB,GACpB,cAAc,GACd,gBAAgB,GAChB,YAAY,GACZ,kBAAkB,GAClB,gBAAgB,GAChB,iBAAiB,GACjB,iBAAiB,GACjB,kBAAkB,GAClB,gBAAgB,GAChB,qBAAqB,GACrB,gBAAgB,GAChB,0BAA0B,GAC1B,SAAS,GACT,WAAW,GACX,qBAAqB,GACrB,eAAe,GACf,yBAAyB,GACzB,sBAAsB,GACtB,oBAAoB,GACpB,eAAe,CAAC;AAEpB,gCAAgC;AAChC,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,aAAa,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;;GAGG;AACH,MAAM,WAAW,YAAY,CAAC,CAAC,GAAG,OAAO;IACvC,EAAE,EAAE,OAAO,CAAC;IACZ,IAAI,CAAC,EAAE,CAAC,CAAC;IACT,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,8CAA8C;AAC9C;;;;;;;;GAQG;AACH,MAAM,MAAM,aAAa,GACrB,eAAe,GACf,sBAAsB,GACtB,iBAAiB,GACjB,uBAAuB,GACvB,oBAAoB,GACpB,cAAc,GACd,gBAAgB,GAChB,YAAY,GACZ,kBAAkB,GAClB,gBAAgB,GAChB,iBAAiB,GACjB,iBAAiB,GACjB,kBAAkB,GAClB,gBAAgB,GAChB,qBAAqB,GACrB,gBAAgB,GAChB,0BAA0B,GAC1B,kBAAkB,GAClB,SAAS,GACT,WAAW,GACX,qBAAqB,GACrB,eAAe,GACf,yBAAyB,GACzB,sBAAsB,GACtB,oBAAoB,GACpB,eAAe,CAAC;AAEpB,gCAAgC;AAChC,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,aAAa,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;;GAGG;AACH,MAAM,WAAW,YAAY,CAAC,CAAC,GAAG,OAAO;IACvC,EAAE,EAAE,OAAO,CAAC;IACZ,IAAI,CAAC,EAAE,CAAC,CAAC;IACT,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB"}
|