@mcp-index/sdk 0.1.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/LICENSE +133 -0
- package/README.md +49 -0
- package/dist/src/canonical.d.ts +42 -0
- package/dist/src/canonical.d.ts.map +1 -0
- package/dist/src/canonical.js +231 -0
- package/dist/src/canonical.js.map +1 -0
- package/dist/src/errors.d.ts +39 -0
- package/dist/src/errors.d.ts.map +1 -0
- package/dist/src/errors.js +79 -0
- package/dist/src/errors.js.map +1 -0
- package/dist/src/gate.d.ts +128 -0
- package/dist/src/gate.d.ts.map +1 -0
- package/dist/src/gate.js +626 -0
- package/dist/src/gate.js.map +1 -0
- package/dist/src/index.d.ts +26 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +20 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/lexicon.d.ts +15 -0
- package/dist/src/lexicon.d.ts.map +1 -0
- package/dist/src/lexicon.js +70 -0
- package/dist/src/lexicon.js.map +1 -0
- package/dist/src/outcomes.d.ts +67 -0
- package/dist/src/outcomes.d.ts.map +1 -0
- package/dist/src/outcomes.js +159 -0
- package/dist/src/outcomes.js.map +1 -0
- package/dist/src/preflight.d.ts +54 -0
- package/dist/src/preflight.d.ts.map +1 -0
- package/dist/src/preflight.js +0 -0
- package/dist/src/preflight.js.map +1 -0
- package/dist/src/provenance.d.ts +95 -0
- package/dist/src/provenance.d.ts.map +1 -0
- package/dist/src/provenance.js +221 -0
- package/dist/src/provenance.js.map +1 -0
- package/dist/src/render.d.ts +10 -0
- package/dist/src/render.d.ts.map +1 -0
- package/dist/src/render.js +38 -0
- package/dist/src/render.js.map +1 -0
- package/dist/src/risk.d.ts +32 -0
- package/dist/src/risk.d.ts.map +1 -0
- package/dist/src/risk.js +179 -0
- package/dist/src/risk.js.map +1 -0
- package/dist/src/scan.d.ts +15 -0
- package/dist/src/scan.d.ts.map +1 -0
- package/dist/src/scan.js +88 -0
- package/dist/src/scan.js.map +1 -0
- package/dist/src/schemaDiff.d.ts +36 -0
- package/dist/src/schemaDiff.d.ts.map +1 -0
- package/dist/src/schemaDiff.js +448 -0
- package/dist/src/schemaDiff.js.map +1 -0
- package/dist/src/wrap.d.ts +77 -0
- package/dist/src/wrap.d.ts.map +1 -0
- package/dist/src/wrap.js +554 -0
- package/dist/src/wrap.js.map +1 -0
- package/package.json +44 -0
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Structured schema-object diff classifier — a faithful port of Python
|
|
3
|
+
* `tooling/cse/schema_diff.py`. Pure + deterministic + total: any structural
|
|
4
|
+
* surprise degrades to "no signal" rather than throwing (inputs are attacker-
|
|
5
|
+
* derived self-descriptions). The safety bit is DERIVED from the kind (single
|
|
6
|
+
* source of truth), so the two can never disagree.
|
|
7
|
+
*/
|
|
8
|
+
export declare enum ChangeKind {
|
|
9
|
+
ADDED_OPTIONAL_PARAM = "added-optional-param",
|
|
10
|
+
ADDED_REQUIRED_PARAM = "added-required-param",
|
|
11
|
+
REMOVED_PARAM = "removed-param",
|
|
12
|
+
TYPE_CHANGED = "type-changed",
|
|
13
|
+
ENUM_VALUES_REMOVED = "enum-values-removed",
|
|
14
|
+
CONSTRAINT_NARROWED = "constraint-narrowed",
|
|
15
|
+
REQUIRED_SET_EXPANDED = "required-set-expanded",
|
|
16
|
+
ANNOTATION_FLIP_TO_DESTRUCTIVE = "annotation-flip-to-destructive",
|
|
17
|
+
OUTPUT_SCHEMA_ADDED = "output-schema-added",
|
|
18
|
+
OUTPUT_SCHEMA_CHANGED = "output-schema-changed",
|
|
19
|
+
TOOL_ADDED = "tool-added",
|
|
20
|
+
TOOL_REMOVED = "tool-removed",
|
|
21
|
+
DESCRIPTION_ONLY = "description-only",
|
|
22
|
+
DEEP_SCHEMA_UNDIFFABLE = "deep-schema-undiffable"
|
|
23
|
+
}
|
|
24
|
+
export declare const MAX_DEPTH = 16;
|
|
25
|
+
export interface Change {
|
|
26
|
+
readonly kind: ChangeKind;
|
|
27
|
+
readonly path: string;
|
|
28
|
+
readonly safetyRelevant: boolean;
|
|
29
|
+
readonly detail: string;
|
|
30
|
+
}
|
|
31
|
+
export declare function isSafetyRelevant(kind: ChangeKind): boolean;
|
|
32
|
+
/** Classify every delta between two PUBLIC tool definitions into the taxonomy.
|
|
33
|
+
* Total: a structural surprise degrades to no-signal. Mirrors
|
|
34
|
+
* `schema_diff.classify_change`. */
|
|
35
|
+
export declare function classifyChange(oldTool: Record<string, unknown>, newTool: Record<string, unknown>): Change[];
|
|
36
|
+
//# sourceMappingURL=schemaDiff.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schemaDiff.d.ts","sourceRoot":"","sources":["../../src/schemaDiff.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,oBAAY,UAAU;IACpB,oBAAoB,yBAAyB;IAC7C,oBAAoB,yBAAyB;IAC7C,aAAa,kBAAkB;IAC/B,YAAY,iBAAiB;IAC7B,mBAAmB,wBAAwB;IAC3C,mBAAmB,wBAAwB;IAC3C,qBAAqB,0BAA0B;IAC/C,8BAA8B,mCAAmC;IACjE,mBAAmB,wBAAwB;IAC3C,qBAAqB,0BAA0B;IAC/C,UAAU,eAAe;IACzB,YAAY,iBAAiB;IAC7B,gBAAgB,qBAAqB;IACrC,sBAAsB,2BAA2B;CAClD;AAeD,eAAO,MAAM,SAAS,KAAK,CAAC;AAE5B,MAAM,WAAW,MAAM;IACrB,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC;IACjC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAE1D;AAwdD;;oCAEoC;AACpC,wBAAgB,cAAc,CAC5B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B,MAAM,EAAE,CA2CV"}
|
|
@@ -0,0 +1,448 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Structured schema-object diff classifier — a faithful port of Python
|
|
3
|
+
* `tooling/cse/schema_diff.py`. Pure + deterministic + total: any structural
|
|
4
|
+
* surprise degrades to "no signal" rather than throwing (inputs are attacker-
|
|
5
|
+
* derived self-descriptions). The safety bit is DERIVED from the kind (single
|
|
6
|
+
* source of truth), so the two can never disagree.
|
|
7
|
+
*/
|
|
8
|
+
export var ChangeKind;
|
|
9
|
+
(function (ChangeKind) {
|
|
10
|
+
ChangeKind["ADDED_OPTIONAL_PARAM"] = "added-optional-param";
|
|
11
|
+
ChangeKind["ADDED_REQUIRED_PARAM"] = "added-required-param";
|
|
12
|
+
ChangeKind["REMOVED_PARAM"] = "removed-param";
|
|
13
|
+
ChangeKind["TYPE_CHANGED"] = "type-changed";
|
|
14
|
+
ChangeKind["ENUM_VALUES_REMOVED"] = "enum-values-removed";
|
|
15
|
+
ChangeKind["CONSTRAINT_NARROWED"] = "constraint-narrowed";
|
|
16
|
+
ChangeKind["REQUIRED_SET_EXPANDED"] = "required-set-expanded";
|
|
17
|
+
ChangeKind["ANNOTATION_FLIP_TO_DESTRUCTIVE"] = "annotation-flip-to-destructive";
|
|
18
|
+
ChangeKind["OUTPUT_SCHEMA_ADDED"] = "output-schema-added";
|
|
19
|
+
ChangeKind["OUTPUT_SCHEMA_CHANGED"] = "output-schema-changed";
|
|
20
|
+
ChangeKind["TOOL_ADDED"] = "tool-added";
|
|
21
|
+
ChangeKind["TOOL_REMOVED"] = "tool-removed";
|
|
22
|
+
ChangeKind["DESCRIPTION_ONLY"] = "description-only";
|
|
23
|
+
ChangeKind["DEEP_SCHEMA_UNDIFFABLE"] = "deep-schema-undiffable";
|
|
24
|
+
})(ChangeKind || (ChangeKind = {}));
|
|
25
|
+
const SAFETY_RELEVANT = new Set([
|
|
26
|
+
ChangeKind.ADDED_REQUIRED_PARAM,
|
|
27
|
+
ChangeKind.REMOVED_PARAM,
|
|
28
|
+
ChangeKind.TYPE_CHANGED,
|
|
29
|
+
ChangeKind.ENUM_VALUES_REMOVED,
|
|
30
|
+
ChangeKind.CONSTRAINT_NARROWED,
|
|
31
|
+
ChangeKind.REQUIRED_SET_EXPANDED,
|
|
32
|
+
ChangeKind.ANNOTATION_FLIP_TO_DESTRUCTIVE,
|
|
33
|
+
ChangeKind.OUTPUT_SCHEMA_CHANGED,
|
|
34
|
+
ChangeKind.TOOL_REMOVED,
|
|
35
|
+
ChangeKind.DEEP_SCHEMA_UNDIFFABLE,
|
|
36
|
+
]);
|
|
37
|
+
export const MAX_DEPTH = 16;
|
|
38
|
+
export function isSafetyRelevant(kind) {
|
|
39
|
+
return SAFETY_RELEVANT.has(kind);
|
|
40
|
+
}
|
|
41
|
+
function mk(kind, path, detail) {
|
|
42
|
+
return { kind, path, safetyRelevant: SAFETY_RELEVANT.has(kind), detail };
|
|
43
|
+
}
|
|
44
|
+
function isDict(v) {
|
|
45
|
+
return v !== null && typeof v === "object" && !Array.isArray(v);
|
|
46
|
+
}
|
|
47
|
+
function props(schema) {
|
|
48
|
+
const p = schema["properties"];
|
|
49
|
+
return isDict(p) ? p : {};
|
|
50
|
+
}
|
|
51
|
+
const COMBINATOR_KEYS = ["allOf", "anyOf", "oneOf"];
|
|
52
|
+
function required(schema) {
|
|
53
|
+
// EFFECTIVE required set: the top-level `required` UNIONED with `required`
|
|
54
|
+
// collected from combinator branches (allOf/anyOf/oneOf). A param made required
|
|
55
|
+
// ONLY inside a branch is still required to call the tool; reading only the
|
|
56
|
+
// top-level `required` would misclassify a newly-added such param as OPTIONAL and
|
|
57
|
+
// auto-accept it (FIX 3). Fail SAFE: required in ANY branch -> treated as required.
|
|
58
|
+
// Mirrors Python `schema_diff._required`.
|
|
59
|
+
const out = new Set();
|
|
60
|
+
const r = schema["required"];
|
|
61
|
+
if (Array.isArray(r)) {
|
|
62
|
+
for (const x of r)
|
|
63
|
+
if (typeof x === "string")
|
|
64
|
+
out.add(x);
|
|
65
|
+
}
|
|
66
|
+
for (const key of COMBINATOR_KEYS) {
|
|
67
|
+
const branches = schema[key];
|
|
68
|
+
if (!Array.isArray(branches))
|
|
69
|
+
continue;
|
|
70
|
+
for (const branch of branches) {
|
|
71
|
+
if (!isDict(branch))
|
|
72
|
+
continue;
|
|
73
|
+
const br = branch["required"];
|
|
74
|
+
if (Array.isArray(br)) {
|
|
75
|
+
for (const x of br)
|
|
76
|
+
if (typeof x === "string")
|
|
77
|
+
out.add(x);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
return out;
|
|
82
|
+
}
|
|
83
|
+
/** Property schemas declared INSIDE a combinator branch (allOf/anyOf/oneOf), keyed
|
|
84
|
+
* by name, so a param introduced only by a branch is still SEEN by the object differ
|
|
85
|
+
* (FIX 3). Later branches win on a name clash (value unused for classification).
|
|
86
|
+
* Mirrors Python `schema_diff._combinator_props`. */
|
|
87
|
+
function combinatorProps(schema) {
|
|
88
|
+
const out = {};
|
|
89
|
+
for (const key of COMBINATOR_KEYS) {
|
|
90
|
+
const branches = schema[key];
|
|
91
|
+
if (!Array.isArray(branches))
|
|
92
|
+
continue;
|
|
93
|
+
for (const branch of branches) {
|
|
94
|
+
if (isDict(branch)) {
|
|
95
|
+
const bp = branch["properties"];
|
|
96
|
+
if (isDict(bp))
|
|
97
|
+
Object.assign(out, bp);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
return out;
|
|
102
|
+
}
|
|
103
|
+
/** True iff the object schema carries any allOf/anyOf/oneOf combinator the top-level
|
|
104
|
+
* property differ does not fully model — the signal to FAIL SAFE on an added param.
|
|
105
|
+
* Mirrors Python `schema_diff._has_combinator`. */
|
|
106
|
+
function hasCombinator(schema) {
|
|
107
|
+
return COMBINATOR_KEYS.some((k) => Array.isArray(schema[k]));
|
|
108
|
+
}
|
|
109
|
+
function reprValue(x) {
|
|
110
|
+
// A total, order-independent stringification of an enum member for set
|
|
111
|
+
// membership. TYPE-TAGGED so distinct-typed primitives never collapse: Python's
|
|
112
|
+
// `frozenset([1, "1"])` keeps `1` and `"1"` apart (hash by type), but JS
|
|
113
|
+
// `String(1) === "1"` would merge them — fixing toward FLAGGING (a real
|
|
114
|
+
// enum-narrowing on mixed-type enums is no longer masked as a no-op). The tag is
|
|
115
|
+
// the JS `typeof` (or "null"/"array"); objects/arrays use JSON of their value.
|
|
116
|
+
if (x === null)
|
|
117
|
+
return "null:";
|
|
118
|
+
if (Array.isArray(x)) {
|
|
119
|
+
try {
|
|
120
|
+
return `array:${JSON.stringify(x)}`;
|
|
121
|
+
}
|
|
122
|
+
catch {
|
|
123
|
+
return `array:${String(x)}`;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
const tag = typeof x;
|
|
127
|
+
if (tag === "object") {
|
|
128
|
+
try {
|
|
129
|
+
return `object:${JSON.stringify(x)}`;
|
|
130
|
+
}
|
|
131
|
+
catch {
|
|
132
|
+
return `object:${String(x)}`;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
return `${tag}:${String(x)}`;
|
|
136
|
+
}
|
|
137
|
+
function typeSignature(prop) {
|
|
138
|
+
if (!isDict(prop))
|
|
139
|
+
return { t: null, enumSet: null, ref: null };
|
|
140
|
+
const rawT = prop["type"];
|
|
141
|
+
let t;
|
|
142
|
+
if (Array.isArray(rawT)) {
|
|
143
|
+
t = rawT.map((x) => String(x)).sort();
|
|
144
|
+
}
|
|
145
|
+
else {
|
|
146
|
+
t = rawT === undefined ? null : rawT;
|
|
147
|
+
}
|
|
148
|
+
const e = prop["enum"];
|
|
149
|
+
let enumSet = null;
|
|
150
|
+
if (Array.isArray(e)) {
|
|
151
|
+
enumSet = new Map(e.map((x) => [reprValue(x), x]));
|
|
152
|
+
}
|
|
153
|
+
const ref = prop["$ref"] ?? null;
|
|
154
|
+
return { t, enumSet, ref };
|
|
155
|
+
}
|
|
156
|
+
function typeEqual(a, b) {
|
|
157
|
+
if (Array.isArray(a) && Array.isArray(b)) {
|
|
158
|
+
return a.length === b.length && a.every((v, i) => v === b[i]);
|
|
159
|
+
}
|
|
160
|
+
return a === b;
|
|
161
|
+
}
|
|
162
|
+
function strFacet(prop, key) {
|
|
163
|
+
if (!isDict(prop))
|
|
164
|
+
return null;
|
|
165
|
+
return prop[key] ?? null;
|
|
166
|
+
}
|
|
167
|
+
function isRealNumber(v) {
|
|
168
|
+
return typeof v === "number" && Number.isFinite(v);
|
|
169
|
+
}
|
|
170
|
+
function classifyConstraintDelta(path, oldProp, newProp) {
|
|
171
|
+
const oldPat = strFacet(oldProp, "pattern");
|
|
172
|
+
const newPat = strFacet(newProp, "pattern");
|
|
173
|
+
if (typeof newPat === "string" && newPat !== oldPat) {
|
|
174
|
+
return mk(ChangeKind.CONSTRAINT_NARROWED, `${path}.pattern`, `string pattern added/tightened: ${reprPy(oldPat)} -> ${reprPy(newPat)}`);
|
|
175
|
+
}
|
|
176
|
+
const oldMin = isDict(oldProp) ? oldProp["minLength"] : null;
|
|
177
|
+
const newMin = isDict(newProp) ? newProp["minLength"] : null;
|
|
178
|
+
if (isRealNumber(newMin)) {
|
|
179
|
+
if (!isRealNumber(oldMin)) {
|
|
180
|
+
return mk(ChangeKind.CONSTRAINT_NARROWED, `${path}.minLength`, `minLength added: ${newMin}`);
|
|
181
|
+
}
|
|
182
|
+
if (newMin > oldMin) {
|
|
183
|
+
return mk(ChangeKind.CONSTRAINT_NARROWED, `${path}.minLength`, `minLength increased: ${oldMin} -> ${newMin}`);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
const oldMax = isDict(oldProp) ? oldProp["maxLength"] : null;
|
|
187
|
+
const newMax = isDict(newProp) ? newProp["maxLength"] : null;
|
|
188
|
+
if (isRealNumber(newMax)) {
|
|
189
|
+
if (!isRealNumber(oldMax)) {
|
|
190
|
+
return mk(ChangeKind.CONSTRAINT_NARROWED, `${path}.maxLength`, `maxLength added: ${newMax}`);
|
|
191
|
+
}
|
|
192
|
+
if (newMax < oldMax) {
|
|
193
|
+
return mk(ChangeKind.CONSTRAINT_NARROWED, `${path}.maxLength`, `maxLength decreased: ${oldMax} -> ${newMax}`);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
const oldFmt = strFacet(oldProp, "format");
|
|
197
|
+
const newFmt = strFacet(newProp, "format");
|
|
198
|
+
if (typeof newFmt === "string" && newFmt !== oldFmt) {
|
|
199
|
+
return mk(ChangeKind.CONSTRAINT_NARROWED, `${path}.format`, `string format added/changed: ${reprPy(oldFmt)} -> ${reprPy(newFmt)}`);
|
|
200
|
+
}
|
|
201
|
+
// Numeric/array bound narrowing (FIX 1 defense-in-depth). The canonical hash
|
|
202
|
+
// already includes these facets, so narrowing one CHANGES the hash and reaches the
|
|
203
|
+
// gate — but if the differ does not MODEL the facet, classifyChange returns an EMPTY
|
|
204
|
+
// list and the gate (mis)reads "all allowlisted -> PROVEN BENIGN". Modeling them
|
|
205
|
+
// here makes the diff NON-EMPTY and explanatory; narrowing an input constraint can
|
|
206
|
+
// break existing callers -> CONSTRAINT_NARROWED (breaking, NOT auto-accepted).
|
|
207
|
+
const numeric = classifyNumericBoundDelta(path, oldProp, newProp);
|
|
208
|
+
if (numeric !== null)
|
|
209
|
+
return numeric;
|
|
210
|
+
const array = classifyArrayBoundDelta(path, oldProp, newProp);
|
|
211
|
+
if (array !== null)
|
|
212
|
+
return array;
|
|
213
|
+
// additionalProperties: true/absent -> false is a NARROWING (extra keys a caller
|
|
214
|
+
// used to be allowed to send are now rejected). false/dict -> true is a loosening
|
|
215
|
+
// (ignored). A dict additionalProperties is not modeled beyond true->false.
|
|
216
|
+
const oldAp = isDict(oldProp) ? oldProp["additionalProperties"] : undefined;
|
|
217
|
+
const newAp = isDict(newProp) ? newProp["additionalProperties"] : undefined;
|
|
218
|
+
if (newAp === false && oldAp !== false) {
|
|
219
|
+
return mk(ChangeKind.CONSTRAINT_NARROWED, `${path}.additionalProperties`, `additionalProperties narrowed: ${reprPy(oldAp ?? null)} -> False (extra properties no longer accepted)`);
|
|
220
|
+
}
|
|
221
|
+
return null;
|
|
222
|
+
}
|
|
223
|
+
/** A numeric facet of a property schema as a real number, or null when absent /
|
|
224
|
+
* non-numeric / boolean (a bool is not a numeric bound). Mirrors `_num_facet`. */
|
|
225
|
+
function numFacet(prop, key) {
|
|
226
|
+
if (!isDict(prop))
|
|
227
|
+
return null;
|
|
228
|
+
const v = prop[key];
|
|
229
|
+
if (typeof v === "boolean")
|
|
230
|
+
return null;
|
|
231
|
+
if (typeof v === "number" && Number.isFinite(v))
|
|
232
|
+
return v;
|
|
233
|
+
return null;
|
|
234
|
+
}
|
|
235
|
+
/** Numeric-bound NARROWING (FIX 1): `minimum`/`exclusiveMinimum` added or increased;
|
|
236
|
+
* `maximum`/`exclusiveMaximum` added or decreased; `multipleOf` added or changed.
|
|
237
|
+
* Loosening returns null. Returns the single most-severe narrowing. Mirrors
|
|
238
|
+
* `_classify_numeric_bound_delta`. */
|
|
239
|
+
function classifyNumericBoundDelta(path, oldProp, newProp) {
|
|
240
|
+
for (const facet of ["minimum", "exclusiveMinimum"]) {
|
|
241
|
+
const oldV = numFacet(oldProp, facet);
|
|
242
|
+
const newV = numFacet(newProp, facet);
|
|
243
|
+
if (newV !== null && (oldV === null || newV > oldV)) {
|
|
244
|
+
return mk(ChangeKind.CONSTRAINT_NARROWED, `${path}.${facet}`, `${facet} added/raised: ${reprPy(oldV ?? null)} -> ${newV}`);
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
for (const facet of ["maximum", "exclusiveMaximum"]) {
|
|
248
|
+
const oldV = numFacet(oldProp, facet);
|
|
249
|
+
const newV = numFacet(newProp, facet);
|
|
250
|
+
if (newV !== null && (oldV === null || newV < oldV)) {
|
|
251
|
+
return mk(ChangeKind.CONSTRAINT_NARROWED, `${path}.${facet}`, `${facet} added/lowered: ${reprPy(oldV ?? null)} -> ${newV}`);
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
const oldMul = numFacet(oldProp, "multipleOf");
|
|
255
|
+
const newMul = numFacet(newProp, "multipleOf");
|
|
256
|
+
if (newMul !== null && newMul !== oldMul) {
|
|
257
|
+
return mk(ChangeKind.CONSTRAINT_NARROWED, `${path}.multipleOf`, `multipleOf added/changed: ${reprPy(oldMul ?? null)} -> ${newMul}`);
|
|
258
|
+
}
|
|
259
|
+
return null;
|
|
260
|
+
}
|
|
261
|
+
/** Array-bound NARROWING (FIX 1): `minItems` added or increased; `maxItems` added or
|
|
262
|
+
* decreased. Loosening returns null. Mirrors `_classify_array_bound_delta`. */
|
|
263
|
+
function classifyArrayBoundDelta(path, oldProp, newProp) {
|
|
264
|
+
const oldMin = numFacet(oldProp, "minItems");
|
|
265
|
+
const newMin = numFacet(newProp, "minItems");
|
|
266
|
+
if (newMin !== null && (oldMin === null || newMin > oldMin)) {
|
|
267
|
+
return mk(ChangeKind.CONSTRAINT_NARROWED, `${path}.minItems`, `minItems added/raised: ${reprPy(oldMin ?? null)} -> ${newMin}`);
|
|
268
|
+
}
|
|
269
|
+
const oldMax = numFacet(oldProp, "maxItems");
|
|
270
|
+
const newMax = numFacet(newProp, "maxItems");
|
|
271
|
+
if (newMax !== null && (oldMax === null || newMax < oldMax)) {
|
|
272
|
+
return mk(ChangeKind.CONSTRAINT_NARROWED, `${path}.maxItems`, `maxItems added/lowered: ${reprPy(oldMax ?? null)} -> ${newMax}`);
|
|
273
|
+
}
|
|
274
|
+
return null;
|
|
275
|
+
}
|
|
276
|
+
/** A Python-`repr`-ish rendering for detail strings (so detail text matches the
|
|
277
|
+
* Python classifier's `!r` formatting closely enough for human reading). */
|
|
278
|
+
function reprPy(v) {
|
|
279
|
+
if (v === null || v === undefined)
|
|
280
|
+
return "None";
|
|
281
|
+
if (typeof v === "string")
|
|
282
|
+
return `'${v}'`;
|
|
283
|
+
return String(v);
|
|
284
|
+
}
|
|
285
|
+
function classifyParamTypeDelta(path, oldProp, newProp) {
|
|
286
|
+
const oldSig = typeSignature(oldProp);
|
|
287
|
+
const newSig = typeSignature(newProp);
|
|
288
|
+
if (oldSig.ref !== newSig.ref) {
|
|
289
|
+
return mk(ChangeKind.TYPE_CHANGED, `${path}.$ref`, `$ref changed: ${reprPy(oldSig.ref)} -> ${reprPy(newSig.ref)}`);
|
|
290
|
+
}
|
|
291
|
+
if (oldSig.enumSet !== null && newSig.enumSet !== null) {
|
|
292
|
+
// Membership compared by TYPE-TAGGED key (so `1` !== `"1"`); the detail renders
|
|
293
|
+
// the ORIGINAL value untagged (parity with Python's `sorted(map(str, removed))`).
|
|
294
|
+
const newKeys = newSig.enumSet;
|
|
295
|
+
const removed = [...oldSig.enumSet].filter(([k]) => !newKeys.has(k)).map(([, v]) => v);
|
|
296
|
+
if (removed.length > 0) {
|
|
297
|
+
return mk(ChangeKind.ENUM_VALUES_REMOVED, `${path}.enum`, `enum values removed: ${JSON.stringify(removed.map(String).sort())}`);
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
if (oldSig.enumSet === null && newSig.enumSet !== null) {
|
|
301
|
+
return mk(ChangeKind.TYPE_CHANGED, path, "narrowed: free value constrained to an enum");
|
|
302
|
+
}
|
|
303
|
+
if (!typeEqual(oldSig.t, newSig.t)) {
|
|
304
|
+
return mk(ChangeKind.TYPE_CHANGED, `${path}.type`, `type changed: ${reprPy(oldSig.t)} -> ${reprPy(newSig.t)}`);
|
|
305
|
+
}
|
|
306
|
+
return classifyConstraintDelta(path, oldProp, newProp);
|
|
307
|
+
}
|
|
308
|
+
function jsonEqual(a, b) {
|
|
309
|
+
if (isDict(a) && isDict(b)) {
|
|
310
|
+
const ak = Object.keys(a);
|
|
311
|
+
const bk = Object.keys(b);
|
|
312
|
+
if (ak.length !== bk.length)
|
|
313
|
+
return false;
|
|
314
|
+
const bs = new Set(bk);
|
|
315
|
+
for (const k of ak) {
|
|
316
|
+
if (!bs.has(k))
|
|
317
|
+
return false;
|
|
318
|
+
if (!jsonEqual(a[k], b[k]))
|
|
319
|
+
return false;
|
|
320
|
+
}
|
|
321
|
+
return true;
|
|
322
|
+
}
|
|
323
|
+
if (Array.isArray(a) && Array.isArray(b)) {
|
|
324
|
+
return a.length === b.length && a.every((x, i) => jsonEqual(x, b[i]));
|
|
325
|
+
}
|
|
326
|
+
return a === b;
|
|
327
|
+
}
|
|
328
|
+
function undiffableAtBound(oldV, newV, path) {
|
|
329
|
+
if (jsonEqual(oldV, newV))
|
|
330
|
+
return [];
|
|
331
|
+
return [
|
|
332
|
+
mk(ChangeKind.DEEP_SCHEMA_UNDIFFABLE, path, `schema nesting exceeds MAX_DEPTH=${MAX_DEPTH} and the subtrees differ; ` +
|
|
333
|
+
"deeper delta not classifiable, flagged conservatively"),
|
|
334
|
+
];
|
|
335
|
+
}
|
|
336
|
+
function diffObjectSchema(oldSchema, newSchema, path, depth) {
|
|
337
|
+
if (depth > MAX_DEPTH)
|
|
338
|
+
return undiffableAtBound(oldSchema, newSchema, path);
|
|
339
|
+
const changes = [];
|
|
340
|
+
// Combinator-scoped properties are folded into the name sets so a param introduced
|
|
341
|
+
// ONLY by an allOf/anyOf/oneOf branch is still SEEN by the differ (FIX 3).
|
|
342
|
+
const oldProps = { ...combinatorProps(oldSchema), ...props(oldSchema) };
|
|
343
|
+
const newProps = { ...combinatorProps(newSchema), ...props(newSchema) };
|
|
344
|
+
const oldReq = required(oldSchema);
|
|
345
|
+
const newReq = required(newSchema);
|
|
346
|
+
const oldNames = new Set(Object.keys(oldProps));
|
|
347
|
+
const newNames = new Set(Object.keys(newProps));
|
|
348
|
+
// FAIL-SAFE: the NEW schema uses a combinator the differ cannot fully model — an
|
|
349
|
+
// added param under it is classified REQUIRED (the safe over-classification).
|
|
350
|
+
const newHasCombinator = hasCombinator(newSchema);
|
|
351
|
+
for (const name of [...oldNames].filter((n) => !newNames.has(n)).sort()) {
|
|
352
|
+
changes.push(mk(ChangeKind.REMOVED_PARAM, `${path}.${name}`, "parameter removed (or renamed away)"));
|
|
353
|
+
}
|
|
354
|
+
for (const name of [...newNames].filter((n) => !oldNames.has(n)).sort()) {
|
|
355
|
+
if (newReq.has(name)) {
|
|
356
|
+
changes.push(mk(ChangeKind.ADDED_REQUIRED_PARAM, `${path}.${name}`, "new REQUIRED parameter; existing callers omit it"));
|
|
357
|
+
}
|
|
358
|
+
else if (newHasCombinator) {
|
|
359
|
+
changes.push(mk(ChangeKind.ADDED_REQUIRED_PARAM, `${path}.${name}`, "new parameter under an allOf/anyOf/oneOf combinator the differ cannot fully model; classified REQUIRED fail-safe (cannot prove optional)"));
|
|
360
|
+
}
|
|
361
|
+
else {
|
|
362
|
+
changes.push(mk(ChangeKind.ADDED_OPTIONAL_PARAM, `${path}.${name}`, "new optional parameter"));
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
for (const name of [...oldNames].filter((n) => newNames.has(n)).sort()) {
|
|
366
|
+
const childPath = `${path}.${name}`;
|
|
367
|
+
const oldP = oldProps[name];
|
|
368
|
+
const newP = newProps[name];
|
|
369
|
+
const delta = classifyParamTypeDelta(childPath, oldP, newP);
|
|
370
|
+
if (delta !== null)
|
|
371
|
+
changes.push(delta);
|
|
372
|
+
if (isDict(oldP) && isDict(newP)) {
|
|
373
|
+
changes.push(...diffNested(oldP, newP, childPath, depth + 1));
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
const newlyRequired = [...newReq].filter((n) => !oldReq.has(n) && oldNames.has(n) && newNames.has(n));
|
|
377
|
+
for (const name of newlyRequired.sort()) {
|
|
378
|
+
changes.push(mk(ChangeKind.REQUIRED_SET_EXPANDED, `${path}.${name}.required`, "existing optional parameter became required"));
|
|
379
|
+
}
|
|
380
|
+
return changes;
|
|
381
|
+
}
|
|
382
|
+
function diffNested(oldP, newP, path, depth) {
|
|
383
|
+
if (depth > MAX_DEPTH)
|
|
384
|
+
return undiffableAtBound(oldP, newP, path);
|
|
385
|
+
const changes = [];
|
|
386
|
+
if (isDict(oldP["properties"]) && isDict(newP["properties"])) {
|
|
387
|
+
changes.push(...diffObjectSchema(oldP, newP, `${path}.properties`, depth + 1));
|
|
388
|
+
}
|
|
389
|
+
const oldItems = oldP["items"];
|
|
390
|
+
const newItems = newP["items"];
|
|
391
|
+
if (isDict(oldItems) && isDict(newItems)) {
|
|
392
|
+
const itemPath = `${path}.items`;
|
|
393
|
+
const delta = classifyParamTypeDelta(itemPath, oldItems, newItems);
|
|
394
|
+
if (delta !== null)
|
|
395
|
+
changes.push(delta);
|
|
396
|
+
changes.push(...diffNested(oldItems, newItems, itemPath, depth + 1));
|
|
397
|
+
}
|
|
398
|
+
return changes;
|
|
399
|
+
}
|
|
400
|
+
function annotationFlip(oldAnn, newAnn) {
|
|
401
|
+
const oldDest = oldAnn["destructiveHint"];
|
|
402
|
+
const newDest = newAnn["destructiveHint"];
|
|
403
|
+
if (oldDest !== true && newDest === true) {
|
|
404
|
+
return mk(ChangeKind.ANNOTATION_FLIP_TO_DESTRUCTIVE, "annotations.destructiveHint", "destructiveHint gained true (was absent/None/False)");
|
|
405
|
+
}
|
|
406
|
+
const oldRo = oldAnn["readOnlyHint"];
|
|
407
|
+
const newRo = newAnn["readOnlyHint"];
|
|
408
|
+
if (oldRo === true && newRo !== true) {
|
|
409
|
+
return mk(ChangeKind.ANNOTATION_FLIP_TO_DESTRUCTIVE, "annotations.readOnlyHint", "readOnlyHint dropped (was true, now absent/None/False)");
|
|
410
|
+
}
|
|
411
|
+
return null;
|
|
412
|
+
}
|
|
413
|
+
function dictish(v) {
|
|
414
|
+
return isDict(v) ? v : {};
|
|
415
|
+
}
|
|
416
|
+
/** Classify every delta between two PUBLIC tool definitions into the taxonomy.
|
|
417
|
+
* Total: a structural surprise degrades to no-signal. Mirrors
|
|
418
|
+
* `schema_diff.classify_change`. */
|
|
419
|
+
export function classifyChange(oldTool, newTool) {
|
|
420
|
+
const changes = [];
|
|
421
|
+
const oldIn = dictish(oldTool["inputSchema"]);
|
|
422
|
+
const newIn = dictish(newTool["inputSchema"]);
|
|
423
|
+
changes.push(...diffObjectSchema(oldIn, newIn, "properties", 0));
|
|
424
|
+
const ann = annotationFlip(dictish(oldTool["annotations"]), dictish(newTool["annotations"]));
|
|
425
|
+
if (ann !== null)
|
|
426
|
+
changes.push(ann);
|
|
427
|
+
const oldOut = oldTool["outputSchema"];
|
|
428
|
+
const newOut = newTool["outputSchema"];
|
|
429
|
+
const oldOutPresent = oldOut !== undefined && oldOut !== null;
|
|
430
|
+
const newOutPresent = newOut !== undefined && newOut !== null;
|
|
431
|
+
if ((oldOutPresent || newOutPresent) && !jsonEqual(oldOut ?? null, newOut ?? null)) {
|
|
432
|
+
if (!oldOutPresent) {
|
|
433
|
+
changes.push(mk(ChangeKind.OUTPUT_SCHEMA_ADDED, "outputSchema", "result schema documented for the first time; additive, no prior shape for a parser to depend on"));
|
|
434
|
+
}
|
|
435
|
+
else {
|
|
436
|
+
changes.push(mk(ChangeKind.OUTPUT_SCHEMA_CHANGED, "outputSchema", "result schema changed; structured-output parsers may break"));
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
if (changes.length === 0) {
|
|
440
|
+
const oldDesc = oldTool["description"] === undefined || oldTool["description"] === null ? "" : String(oldTool["description"]);
|
|
441
|
+
const newDesc = newTool["description"] === undefined || newTool["description"] === null ? "" : String(newTool["description"]);
|
|
442
|
+
if (oldDesc !== newDesc) {
|
|
443
|
+
changes.push(mk(ChangeKind.DESCRIPTION_ONLY, "description", "description text changed; no structural delta"));
|
|
444
|
+
}
|
|
445
|
+
}
|
|
446
|
+
return changes;
|
|
447
|
+
}
|
|
448
|
+
//# sourceMappingURL=schemaDiff.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schemaDiff.js","sourceRoot":"","sources":["../../src/schemaDiff.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pre-flight drift INTERCEPTOR — the TypeScript SDK-wrapper surface, at parity
|
|
3
|
+
* with Python `tooling/cse/preflight_intercept.py`.
|
|
4
|
+
*
|
|
5
|
+
* `wrap(session)` returns a transparent JS `Proxy` over the real
|
|
6
|
+
* `@modelcontextprotocol/sdk` `Client`: every method/prop passes through the
|
|
7
|
+
* get-trap UNTOUCHED, EXCEPT the three gated seams:
|
|
8
|
+
* - `listTools` — TOFU-pin every observed tool's PUBLIC contract.
|
|
9
|
+
* - `callTool` — run the shared Gate before delegating; HOLD on drift.
|
|
10
|
+
* - `request` — the low-level RPC chokepoint (the TS analog of Python's
|
|
11
|
+
* `send_request`). `callTool` is sugar over `request({method:'tools/call'})`,
|
|
12
|
+
* so a caller can invoke any tool straight through `request`; we gate a
|
|
13
|
+
* `tools/call` there too, or the pre-flight check is a paper wall.
|
|
14
|
+
* - `requestStream` — the EXPERIMENTAL streaming chokepoint. The SDK's task
|
|
15
|
+
* surface (`client.experimental.tasks.callToolStream`) invokes a tool via
|
|
16
|
+
* `requestStream({method:'tools/call'})`, a SECOND RPC path that does NOT go
|
|
17
|
+
* through `request`. `requestStream` is also reachable directly on the
|
|
18
|
+
* session. We gate a `tools/call` on BOTH the session-level `requestStream`
|
|
19
|
+
* AND a wrapped `experimental` accessor (whose `tasks.callToolStream` /
|
|
20
|
+
* `tasks.requestStream` desugar to it), or the streaming surface is a hole
|
|
21
|
+
* in the wall. The gate runs PRE-FLIGHT: a HELD verdict yields a throwing
|
|
22
|
+
* async generator that NEVER touches the upstream stream (fail-closed).
|
|
23
|
+
*
|
|
24
|
+
* NO CREDENTIAL (structural): the wrapper holds NO token, NO auth, opens NO
|
|
25
|
+
* connection. It reuses the wrapped session's own authenticated transport. The
|
|
26
|
+
* shared Gate reads only the PUBLIC contract.
|
|
27
|
+
*/
|
|
28
|
+
import { Ownership, Posture } from "./gate.js";
|
|
29
|
+
import type { BehavioralVerifier } from "./gate.js";
|
|
30
|
+
import { PreflightPin } from "./preflight.js";
|
|
31
|
+
import type { PinnedTool, PreflightVerdict } from "./preflight.js";
|
|
32
|
+
import { ChangeKind } from "./schemaDiff.js";
|
|
33
|
+
import { ErrorStore } from "./errors.js";
|
|
34
|
+
import { LocalStats, OutcomeStore } from "./outcomes.js";
|
|
35
|
+
import type { Provenance } from "./provenance.js";
|
|
36
|
+
/** A HOLD raised before delegating to the wrapped session. Carries the structured
|
|
37
|
+
* verdict + (when a complete provenance backs the finding) the provenance. Honest
|
|
38
|
+
* voice: a HOLD is a CONTRACT DIFF, not a safety verdict. */
|
|
39
|
+
export declare class PreflightHold extends Error {
|
|
40
|
+
readonly verdict: PreflightVerdict;
|
|
41
|
+
readonly provenance: Provenance | null;
|
|
42
|
+
constructor(verdict: PreflightVerdict, provenance: Provenance | null, message: string);
|
|
43
|
+
}
|
|
44
|
+
export interface WrapOptions {
|
|
45
|
+
pin: PreflightPin;
|
|
46
|
+
serverId: string;
|
|
47
|
+
failOpen?: boolean;
|
|
48
|
+
autoAcceptBenign?: boolean;
|
|
49
|
+
onHold?: ((verdict: PreflightVerdict) => unknown) | null;
|
|
50
|
+
now?: () => string;
|
|
51
|
+
ownership?: Ownership;
|
|
52
|
+
behavioralMandatedKinds?: ReadonlySet<ChangeKind>;
|
|
53
|
+
verifier?: BehavioralVerifier | null;
|
|
54
|
+
autoValidateBehavior?: boolean;
|
|
55
|
+
posture?: Posture;
|
|
56
|
+
stats?: LocalStats | null;
|
|
57
|
+
outcomes?: OutcomeStore | null;
|
|
58
|
+
errors?: ErrorStore | null;
|
|
59
|
+
}
|
|
60
|
+
/** Wrap an already-authenticated MCP client session. Returns a TRANSPARENT
|
|
61
|
+
* drop-in `Proxy` with the same surface: `listTools` / `callTool` are gated and
|
|
62
|
+
* the low-level `request` chokepoint gates a `tools/call`; EVERY other method is
|
|
63
|
+
* delegated UNTOUCHED. NO credential is read, stored, or transmitted.
|
|
64
|
+
*
|
|
65
|
+
* `T` is the wrapped session type (e.g. the SDK `Client`); the return type adds
|
|
66
|
+
* the wrapper's management methods (`repin` / `validateBehaviorNow` /
|
|
67
|
+
* `holdBanner`). */
|
|
68
|
+
export type Wrapped<T> = T & {
|
|
69
|
+
repin(tool?: string): PinnedTool[];
|
|
70
|
+
validateBehaviorNow(toolName: string, verifier?: BehavioralVerifier): PreflightVerdict;
|
|
71
|
+
holdBanner(verdict: PreflightVerdict): string;
|
|
72
|
+
readonly __interceptor__: unknown;
|
|
73
|
+
};
|
|
74
|
+
export declare function wrap<T extends object>(session: T, opts: WrapOptions): Wrapped<T>;
|
|
75
|
+
/** Module-level convenience: re-pin observed contracts on a wrapped session. */
|
|
76
|
+
export declare function repin<T extends object>(wrapped: Wrapped<T>, tool?: string): PinnedTool[];
|
|
77
|
+
//# sourceMappingURL=wrap.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wrap.d.ts","sourceRoot":"","sources":["../../src/wrap.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,EAEL,SAAS,EACT,OAAO,EAMR,MAAM,WAAW,CAAC;AACnB,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AACpD,OAAO,EAAY,YAAY,EAAa,MAAM,gBAAgB,CAAC;AACnE,OAAO,KAAK,EAAE,UAAU,EAAE,gBAAgB,EAAW,MAAM,gBAAgB,CAAC;AAC5E,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAa,MAAM,aAAa,CAAC;AACpD,OAAO,EAAU,UAAU,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAEjE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAOlD;;6DAE6D;AAC7D,qBAAa,aAAc,SAAQ,KAAK;IACtC,QAAQ,CAAC,OAAO,EAAE,gBAAgB,CAAC;IACnC,QAAQ,CAAC,UAAU,EAAE,UAAU,GAAG,IAAI,CAAC;gBAE3B,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,UAAU,GAAG,IAAI,EAAE,OAAO,EAAE,MAAM;CAMtF;AAED,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,YAAY,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,MAAM,CAAC,EAAE,CAAC,CAAC,OAAO,EAAE,gBAAgB,KAAK,OAAO,CAAC,GAAG,IAAI,CAAC;IACzD,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,uBAAuB,CAAC,EAAE,WAAW,CAAC,UAAU,CAAC,CAAC;IAClD,QAAQ,CAAC,EAAE,kBAAkB,GAAG,IAAI,CAAC;IACrC,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,UAAU,GAAG,IAAI,CAAC;IAC1B,QAAQ,CAAC,EAAE,YAAY,GAAG,IAAI,CAAC;IAC/B,MAAM,CAAC,EAAE,UAAU,GAAG,IAAI,CAAC;CAC5B;AAidD;;;;;;;oBAOoB;AACpB,MAAM,MAAM,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG;IAC3B,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,UAAU,EAAE,CAAC;IACnC,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,kBAAkB,GAAG,gBAAgB,CAAC;IACvF,UAAU,CAAC,OAAO,EAAE,gBAAgB,GAAG,MAAM,CAAC;IAC9C,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAC;CACnC,CAAC;AAEF,wBAAgB,IAAI,CAAC,CAAC,SAAS,MAAM,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,CAAC,CAAC,CAqEhF;AAED,gFAAgF;AAChF,wBAAgB,KAAK,CAAC,CAAC,SAAS,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,UAAU,EAAE,CAExF"}
|