@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.
Files changed (55) hide show
  1. package/LICENSE +133 -0
  2. package/README.md +49 -0
  3. package/dist/src/canonical.d.ts +42 -0
  4. package/dist/src/canonical.d.ts.map +1 -0
  5. package/dist/src/canonical.js +231 -0
  6. package/dist/src/canonical.js.map +1 -0
  7. package/dist/src/errors.d.ts +39 -0
  8. package/dist/src/errors.d.ts.map +1 -0
  9. package/dist/src/errors.js +79 -0
  10. package/dist/src/errors.js.map +1 -0
  11. package/dist/src/gate.d.ts +128 -0
  12. package/dist/src/gate.d.ts.map +1 -0
  13. package/dist/src/gate.js +626 -0
  14. package/dist/src/gate.js.map +1 -0
  15. package/dist/src/index.d.ts +26 -0
  16. package/dist/src/index.d.ts.map +1 -0
  17. package/dist/src/index.js +20 -0
  18. package/dist/src/index.js.map +1 -0
  19. package/dist/src/lexicon.d.ts +15 -0
  20. package/dist/src/lexicon.d.ts.map +1 -0
  21. package/dist/src/lexicon.js +70 -0
  22. package/dist/src/lexicon.js.map +1 -0
  23. package/dist/src/outcomes.d.ts +67 -0
  24. package/dist/src/outcomes.d.ts.map +1 -0
  25. package/dist/src/outcomes.js +159 -0
  26. package/dist/src/outcomes.js.map +1 -0
  27. package/dist/src/preflight.d.ts +54 -0
  28. package/dist/src/preflight.d.ts.map +1 -0
  29. package/dist/src/preflight.js +0 -0
  30. package/dist/src/preflight.js.map +1 -0
  31. package/dist/src/provenance.d.ts +95 -0
  32. package/dist/src/provenance.d.ts.map +1 -0
  33. package/dist/src/provenance.js +221 -0
  34. package/dist/src/provenance.js.map +1 -0
  35. package/dist/src/render.d.ts +10 -0
  36. package/dist/src/render.d.ts.map +1 -0
  37. package/dist/src/render.js +38 -0
  38. package/dist/src/render.js.map +1 -0
  39. package/dist/src/risk.d.ts +32 -0
  40. package/dist/src/risk.d.ts.map +1 -0
  41. package/dist/src/risk.js +179 -0
  42. package/dist/src/risk.js.map +1 -0
  43. package/dist/src/scan.d.ts +15 -0
  44. package/dist/src/scan.d.ts.map +1 -0
  45. package/dist/src/scan.js +88 -0
  46. package/dist/src/scan.js.map +1 -0
  47. package/dist/src/schemaDiff.d.ts +36 -0
  48. package/dist/src/schemaDiff.d.ts.map +1 -0
  49. package/dist/src/schemaDiff.js +448 -0
  50. package/dist/src/schemaDiff.js.map +1 -0
  51. package/dist/src/wrap.d.ts +77 -0
  52. package/dist/src/wrap.d.ts.map +1 -0
  53. package/dist/src/wrap.js +554 -0
  54. package/dist/src/wrap.js.map +1 -0
  55. 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":"AAAA;;;;;;GAMG;AAEH,MAAM,CAAN,IAAY,UAeX;AAfD,WAAY,UAAU;IACpB,2DAA6C,CAAA;IAC7C,2DAA6C,CAAA;IAC7C,6CAA+B,CAAA;IAC/B,2CAA6B,CAAA;IAC7B,yDAA2C,CAAA;IAC3C,yDAA2C,CAAA;IAC3C,6DAA+C,CAAA;IAC/C,+EAAiE,CAAA;IACjE,yDAA2C,CAAA;IAC3C,6DAA+C,CAAA;IAC/C,uCAAyB,CAAA;IACzB,2CAA6B,CAAA;IAC7B,mDAAqC,CAAA;IACrC,+DAAiD,CAAA;AACnD,CAAC,EAfW,UAAU,KAAV,UAAU,QAerB;AAED,MAAM,eAAe,GAA4B,IAAI,GAAG,CAAC;IACvD,UAAU,CAAC,oBAAoB;IAC/B,UAAU,CAAC,aAAa;IACxB,UAAU,CAAC,YAAY;IACvB,UAAU,CAAC,mBAAmB;IAC9B,UAAU,CAAC,mBAAmB;IAC9B,UAAU,CAAC,qBAAqB;IAChC,UAAU,CAAC,8BAA8B;IACzC,UAAU,CAAC,qBAAqB;IAChC,UAAU,CAAC,YAAY;IACvB,UAAU,CAAC,sBAAsB;CAClC,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,SAAS,GAAG,EAAE,CAAC;AAS5B,MAAM,UAAU,gBAAgB,CAAC,IAAgB;IAC/C,OAAO,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AACnC,CAAC;AAED,SAAS,EAAE,CAAC,IAAgB,EAAE,IAAY,EAAE,MAAc;IACxD,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,cAAc,EAAE,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;AAC3E,CAAC;AAID,SAAS,MAAM,CAAC,CAAU;IACxB,OAAO,CAAC,KAAK,IAAI,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AAClE,CAAC;AAED,SAAS,KAAK,CAAC,MAAY;IACzB,MAAM,CAAC,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC;IAC/B,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AAC5B,CAAC;AAED,MAAM,eAAe,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAU,CAAC;AAE7D,SAAS,QAAQ,CAAC,MAAY;IAC5B,2EAA2E;IAC3E,gFAAgF;IAChF,4EAA4E;IAC5E,kFAAkF;IAClF,oFAAoF;IACpF,0CAA0C;IAC1C,MAAM,GAAG,GAAG,IAAI,GAAG,EAAU,CAAC;IAC9B,MAAM,CAAC,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;IAC7B,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;QACrB,KAAK,MAAM,CAAC,IAAI,CAAC;YAAE,IAAI,OAAO,CAAC,KAAK,QAAQ;gBAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAC3D,CAAC;IACD,KAAK,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;QAClC,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QAC7B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC;YAAE,SAAS;QACvC,KAAK,MAAM,MAAM,IAAI,QAAQ,EAAE,CAAC;YAC9B,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;gBAAE,SAAS;YAC9B,MAAM,EAAE,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;YAC9B,IAAI,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC;gBACtB,KAAK,MAAM,CAAC,IAAI,EAAE;oBAAE,IAAI,OAAO,CAAC,KAAK,QAAQ;wBAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YAC5D,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;qDAGqD;AACrD,SAAS,eAAe,CAAC,MAAY;IACnC,MAAM,GAAG,GAAS,EAAE,CAAC;IACrB,KAAK,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;QAClC,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QAC7B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC;YAAE,SAAS;QACvC,KAAK,MAAM,MAAM,IAAI,QAAQ,EAAE,CAAC;YAC9B,IAAI,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;gBACnB,MAAM,EAAE,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC;gBAChC,IAAI,MAAM,CAAC,EAAE,CAAC;oBAAE,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YACzC,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;mDAEmD;AACnD,SAAS,aAAa,CAAC,MAAY;IACjC,OAAO,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC/D,CAAC;AAYD,SAAS,SAAS,CAAC,CAAU;IAC3B,uEAAuE;IACvE,gFAAgF;IAChF,yEAAyE;IACzE,wEAAwE;IACxE,iFAAiF;IACjF,+EAA+E;IAC/E,IAAI,CAAC,KAAK,IAAI;QAAE,OAAO,OAAO,CAAC;IAC/B,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;QACrB,IAAI,CAAC;YACH,OAAO,SAAS,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;QACtC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,SAAS,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9B,CAAC;IACH,CAAC;IACD,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC;IACrB,IAAI,GAAG,KAAK,QAAQ,EAAE,CAAC;QACrB,IAAI,CAAC;YACH,OAAO,UAAU,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;QACvC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,UAAU,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/B,CAAC;IACH,CAAC;IACD,OAAO,GAAG,GAAG,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;AAC/B,CAAC;AAED,SAAS,aAAa,CAAC,IAAa;IAClC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;IAChE,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;IAC1B,IAAI,CAA2B,CAAC;IAChC,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QACxB,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACxC,CAAC;SAAM,CAAC;QACN,CAAC,GAAG,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAE,IAAe,CAAC;IACnD,CAAC;IACD,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;IACvB,IAAI,OAAO,GAAgC,IAAI,CAAC;IAChD,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;QACrB,OAAO,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAqB,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACxE,CAAC;IACD,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC;IACjC,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC;AAC7B,CAAC;AAED,SAAS,SAAS,CAAC,CAA2B,EAAE,CAA2B;IACzE,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;QACzC,OAAO,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAChE,CAAC;IACD,OAAO,CAAC,KAAK,CAAC,CAAC;AACjB,CAAC;AAED,SAAS,QAAQ,CAAC,IAAa,EAAE,GAAW;IAC1C,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAC/B,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC;AAC3B,CAAC;AAED,SAAS,YAAY,CAAC,CAAU;IAC9B,OAAO,OAAO,CAAC,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;AACrD,CAAC;AAED,SAAS,uBAAuB,CAC9B,IAAY,EACZ,OAAgB,EAChB,OAAgB;IAEhB,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IAC5C,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IAC5C,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QACpD,OAAO,EAAE,CACP,UAAU,CAAC,mBAAmB,EAC9B,GAAG,IAAI,UAAU,EACjB,mCAAmC,MAAM,CAAC,MAAM,CAAC,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,CACzE,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC7D,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC7D,IAAI,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC;QACzB,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC;YAC1B,OAAO,EAAE,CAAC,UAAU,CAAC,mBAAmB,EAAE,GAAG,IAAI,YAAY,EAAE,oBAAoB,MAAM,EAAE,CAAC,CAAC;QAC/F,CAAC;QACD,IAAI,MAAM,GAAG,MAAM,EAAE,CAAC;YACpB,OAAO,EAAE,CACP,UAAU,CAAC,mBAAmB,EAC9B,GAAG,IAAI,YAAY,EACnB,wBAAwB,MAAM,OAAO,MAAM,EAAE,CAC9C,CAAC;QACJ,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC7D,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC7D,IAAI,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC;QACzB,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC;YAC1B,OAAO,EAAE,CAAC,UAAU,CAAC,mBAAmB,EAAE,GAAG,IAAI,YAAY,EAAE,oBAAoB,MAAM,EAAE,CAAC,CAAC;QAC/F,CAAC;QACD,IAAI,MAAM,GAAG,MAAM,EAAE,CAAC;YACpB,OAAO,EAAE,CACP,UAAU,CAAC,mBAAmB,EAC9B,GAAG,IAAI,YAAY,EACnB,wBAAwB,MAAM,OAAO,MAAM,EAAE,CAC9C,CAAC;QACJ,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAC3C,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAC3C,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QACpD,OAAO,EAAE,CACP,UAAU,CAAC,mBAAmB,EAC9B,GAAG,IAAI,SAAS,EAChB,gCAAgC,MAAM,CAAC,MAAM,CAAC,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,CACtE,CAAC;IACJ,CAAC;IAED,6EAA6E;IAC7E,mFAAmF;IACnF,qFAAqF;IACrF,iFAAiF;IACjF,mFAAmF;IACnF,+EAA+E;IAC/E,MAAM,OAAO,GAAG,yBAAyB,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IAClE,IAAI,OAAO,KAAK,IAAI;QAAE,OAAO,OAAO,CAAC;IACrC,MAAM,KAAK,GAAG,uBAAuB,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IAC9D,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAEjC,iFAAiF;IACjF,kFAAkF;IAClF,4EAA4E;IAC5E,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC5E,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC5E,IAAI,KAAK,KAAK,KAAK,IAAI,KAAK,KAAK,KAAK,EAAE,CAAC;QACvC,OAAO,EAAE,CACP,UAAU,CAAC,mBAAmB,EAC9B,GAAG,IAAI,uBAAuB,EAC9B,kCAAkC,MAAM,CAAC,KAAK,IAAI,IAAI,CAAC,iDAAiD,CACzG,CAAC;IACJ,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;kFACkF;AAClF,SAAS,QAAQ,CAAC,IAAa,EAAE,GAAW;IAC1C,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAC/B,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;IACpB,IAAI,OAAO,CAAC,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IACxC,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;QAAE,OAAO,CAAC,CAAC;IAC1D,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;sCAGsC;AACtC,SAAS,yBAAyB,CAAC,IAAY,EAAE,OAAgB,EAAE,OAAgB;IACjF,KAAK,MAAM,KAAK,IAAI,CAAC,SAAS,EAAE,kBAAkB,CAAC,EAAE,CAAC;QACpD,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QACtC,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QACtC,IAAI,IAAI,KAAK,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI,IAAI,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC;YACpD,OAAO,EAAE,CAAC,UAAU,CAAC,mBAAmB,EAAE,GAAG,IAAI,IAAI,KAAK,EAAE,EAAE,GAAG,KAAK,kBAAkB,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;QAC7H,CAAC;IACH,CAAC;IACD,KAAK,MAAM,KAAK,IAAI,CAAC,SAAS,EAAE,kBAAkB,CAAC,EAAE,CAAC;QACpD,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QACtC,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QACtC,IAAI,IAAI,KAAK,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI,IAAI,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC;YACpD,OAAO,EAAE,CAAC,UAAU,CAAC,mBAAmB,EAAE,GAAG,IAAI,IAAI,KAAK,EAAE,EAAE,GAAG,KAAK,mBAAmB,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;QAC9H,CAAC;IACH,CAAC;IACD,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;IAC/C,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;IAC/C,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QACzC,OAAO,EAAE,CAAC,UAAU,CAAC,mBAAmB,EAAE,GAAG,IAAI,aAAa,EAAE,6BAA6B,MAAM,CAAC,MAAM,IAAI,IAAI,CAAC,OAAO,MAAM,EAAE,CAAC,CAAC;IACtI,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;+EAC+E;AAC/E,SAAS,uBAAuB,CAAC,IAAY,EAAE,OAAgB,EAAE,OAAgB;IAC/E,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;IAC7C,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;IAC7C,IAAI,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI,IAAI,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC;QAC5D,OAAO,EAAE,CAAC,UAAU,CAAC,mBAAmB,EAAE,GAAG,IAAI,WAAW,EAAE,0BAA0B,MAAM,CAAC,MAAM,IAAI,IAAI,CAAC,OAAO,MAAM,EAAE,CAAC,CAAC;IACjI,CAAC;IACD,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;IAC7C,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;IAC7C,IAAI,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI,IAAI,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC;QAC5D,OAAO,EAAE,CAAC,UAAU,CAAC,mBAAmB,EAAE,GAAG,IAAI,WAAW,EAAE,2BAA2B,MAAM,CAAC,MAAM,IAAI,IAAI,CAAC,OAAO,MAAM,EAAE,CAAC,CAAC;IAClI,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;4EAC4E;AAC5E,SAAS,MAAM,CAAC,CAAU;IACxB,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,SAAS;QAAE,OAAO,MAAM,CAAC;IACjD,IAAI,OAAO,CAAC,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC,GAAG,CAAC;IAC3C,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC;AACnB,CAAC;AAED,SAAS,sBAAsB,CAC7B,IAAY,EACZ,OAAgB,EAChB,OAAgB;IAEhB,MAAM,MAAM,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;IACtC,MAAM,MAAM,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;IAEtC,IAAI,MAAM,CAAC,GAAG,KAAK,MAAM,CAAC,GAAG,EAAE,CAAC;QAC9B,OAAO,EAAE,CACP,UAAU,CAAC,YAAY,EACvB,GAAG,IAAI,OAAO,EACd,iBAAiB,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAC/D,CAAC;IACJ,CAAC;IAED,IAAI,MAAM,CAAC,OAAO,KAAK,IAAI,IAAI,MAAM,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;QACvD,gFAAgF;QAChF,kFAAkF;QAClF,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;QAC/B,MAAM,OAAO,GAAG,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;QACvF,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvB,OAAO,EAAE,CACP,UAAU,CAAC,mBAAmB,EAC9B,GAAG,IAAI,OAAO,EACd,wBAAwB,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,CACrE,CAAC;QACJ,CAAC;IACH,CAAC;IAED,IAAI,MAAM,CAAC,OAAO,KAAK,IAAI,IAAI,MAAM,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;QACvD,OAAO,EAAE,CAAC,UAAU,CAAC,YAAY,EAAE,IAAI,EAAE,6CAA6C,CAAC,CAAC;IAC1F,CAAC;IAED,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;QACnC,OAAO,EAAE,CACP,UAAU,CAAC,YAAY,EACvB,GAAG,IAAI,OAAO,EACd,iBAAiB,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAC3D,CAAC;IACJ,CAAC;IAED,OAAO,uBAAuB,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AACzD,CAAC;AAED,SAAS,SAAS,CAAC,CAAU,EAAE,CAAU;IACvC,IAAI,MAAM,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3B,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC1B,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC1B,IAAI,EAAE,CAAC,MAAM,KAAK,EAAE,CAAC,MAAM;YAAE,OAAO,KAAK,CAAC;QAC1C,MAAM,EAAE,GAAG,IAAI,GAAG,CAAC,EAAE,CAAC,CAAC;QACvB,KAAK,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;YACnB,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;gBAAE,OAAO,KAAK,CAAC;YAC7B,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;gBAAE,OAAO,KAAK,CAAC;QAC3C,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;QACzC,OAAO,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACxE,CAAC;IACD,OAAO,CAAC,KAAK,CAAC,CAAC;AACjB,CAAC;AAED,SAAS,iBAAiB,CAAC,IAAa,EAAE,IAAa,EAAE,IAAY;IACnE,IAAI,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC;QAAE,OAAO,EAAE,CAAC;IACrC,OAAO;QACL,EAAE,CACA,UAAU,CAAC,sBAAsB,EACjC,IAAI,EACJ,oCAAoC,SAAS,4BAA4B;YACvE,uDAAuD,CAC1D;KACF,CAAC;AACJ,CAAC;AAED,SAAS,gBAAgB,CACvB,SAAe,EACf,SAAe,EACf,IAAY,EACZ,KAAa;IAEb,IAAI,KAAK,GAAG,SAAS;QAAE,OAAO,iBAAiB,CAAC,SAAS,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;IAE5E,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,mFAAmF;IACnF,2EAA2E;IAC3E,MAAM,QAAQ,GAAS,EAAE,GAAG,eAAe,CAAC,SAAS,CAAC,EAAE,GAAG,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC;IAC9E,MAAM,QAAQ,GAAS,EAAE,GAAG,eAAe,CAAC,SAAS,CAAC,EAAE,GAAG,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC;IAC9E,MAAM,MAAM,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC;IACnC,MAAM,MAAM,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC;IACnC,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;IAChD,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;IAChD,iFAAiF;IACjF,8EAA8E;IAC9E,MAAM,gBAAgB,GAAG,aAAa,CAAC,SAAS,CAAC,CAAC;IAElD,KAAK,MAAM,IAAI,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;QACxE,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,aAAa,EAAE,GAAG,IAAI,IAAI,IAAI,EAAE,EAAE,qCAAqC,CAAC,CAAC,CAAC;IACvG,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;QACxE,IAAI,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YACrB,OAAO,CAAC,IAAI,CACV,EAAE,CAAC,UAAU,CAAC,oBAAoB,EAAE,GAAG,IAAI,IAAI,IAAI,EAAE,EAAE,kDAAkD,CAAC,CAC3G,CAAC;QACJ,CAAC;aAAM,IAAI,gBAAgB,EAAE,CAAC;YAC5B,OAAO,CAAC,IAAI,CACV,EAAE,CACA,UAAU,CAAC,oBAAoB,EAC/B,GAAG,IAAI,IAAI,IAAI,EAAE,EACjB,0IAA0I,CAC3I,CACF,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,oBAAoB,EAAE,GAAG,IAAI,IAAI,IAAI,EAAE,EAAE,wBAAwB,CAAC,CAAC,CAAC;QACjG,CAAC;IACH,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;QACvE,MAAM,SAAS,GAAG,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC;QACpC,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC5B,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC5B,MAAM,KAAK,GAAG,sBAAsB,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QAC5D,IAAI,KAAK,KAAK,IAAI;YAAE,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACxC,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;YACjC,OAAO,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;QAChE,CAAC;IACH,CAAC;IAED,MAAM,aAAa,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,MAAM,CACtC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAC5D,CAAC;IACF,KAAK,MAAM,IAAI,IAAI,aAAa,CAAC,IAAI,EAAE,EAAE,CAAC;QACxC,OAAO,CAAC,IAAI,CACV,EAAE,CAAC,UAAU,CAAC,qBAAqB,EAAE,GAAG,IAAI,IAAI,IAAI,WAAW,EAAE,6CAA6C,CAAC,CAChH,CAAC;IACJ,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,UAAU,CAAC,IAAU,EAAE,IAAU,EAAE,IAAY,EAAE,KAAa;IACrE,IAAI,KAAK,GAAG,SAAS;QAAE,OAAO,iBAAiB,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IAElE,MAAM,OAAO,GAAa,EAAE,CAAC;IAE7B,IAAI,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC;QAC7D,OAAO,CAAC,IAAI,CAAC,GAAG,gBAAgB,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,IAAI,aAAa,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;IACjF,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;IAC/B,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;IAC/B,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;QACzC,MAAM,QAAQ,GAAG,GAAG,IAAI,QAAQ,CAAC;QACjC,MAAM,KAAK,GAAG,sBAAsB,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;QACnE,IAAI,KAAK,KAAK,IAAI;YAAE,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACxC,OAAO,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;IACvE,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,cAAc,CAAC,MAAY,EAAE,MAAY;IAChD,MAAM,OAAO,GAAG,MAAM,CAAC,iBAAiB,CAAC,CAAC;IAC1C,MAAM,OAAO,GAAG,MAAM,CAAC,iBAAiB,CAAC,CAAC;IAC1C,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QACzC,OAAO,EAAE,CACP,UAAU,CAAC,8BAA8B,EACzC,6BAA6B,EAC7B,qDAAqD,CACtD,CAAC;IACJ,CAAC;IACD,MAAM,KAAK,GAAG,MAAM,CAAC,cAAc,CAAC,CAAC;IACrC,MAAM,KAAK,GAAG,MAAM,CAAC,cAAc,CAAC,CAAC;IACrC,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QACrC,OAAO,EAAE,CACP,UAAU,CAAC,8BAA8B,EACzC,0BAA0B,EAC1B,wDAAwD,CACzD,CAAC;IACJ,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,OAAO,CAAC,CAAU;IACzB,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AAC5B,CAAC;AAED;;oCAEoC;AACpC,MAAM,UAAU,cAAc,CAC5B,OAAgC,EAChC,OAAgC;IAEhC,MAAM,OAAO,GAAa,EAAE,CAAC;IAE7B,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC;IAC9C,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC;IAC9C,OAAO,CAAC,IAAI,CAAC,GAAG,gBAAgB,CAAC,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,CAAC;IAEjE,MAAM,GAAG,GAAG,cAAc,CAAC,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;IAC7F,IAAI,GAAG,KAAK,IAAI;QAAE,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAEpC,MAAM,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;IACvC,MAAM,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;IACvC,MAAM,aAAa,GAAG,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,IAAI,CAAC;IAC9D,MAAM,aAAa,GAAG,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,IAAI,CAAC;IAC9D,IAAI,CAAC,aAAa,IAAI,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,IAAI,IAAI,EAAE,MAAM,IAAI,IAAI,CAAC,EAAE,CAAC;QACnF,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,OAAO,CAAC,IAAI,CACV,EAAE,CACA,UAAU,CAAC,mBAAmB,EAC9B,cAAc,EACd,iGAAiG,CAClG,CACF,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,IAAI,CACV,EAAE,CACA,UAAU,CAAC,qBAAqB,EAChC,cAAc,EACd,4DAA4D,CAC7D,CACF,CAAC;QACJ,CAAC;IACH,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,MAAM,OAAO,GAAG,OAAO,CAAC,aAAa,CAAC,KAAK,SAAS,IAAI,OAAO,CAAC,aAAa,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC;QAC9H,MAAM,OAAO,GAAG,OAAO,CAAC,aAAa,CAAC,KAAK,SAAS,IAAI,OAAO,CAAC,aAAa,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC;QAC9H,IAAI,OAAO,KAAK,OAAO,EAAE,CAAC;YACxB,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,gBAAgB,EAAE,aAAa,EAAE,+CAA+C,CAAC,CAAC,CAAC;QAChH,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -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"}