@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,626 @@
1
+ /**
2
+ * The shared GATE core — the pure pre-flight decision, decoupled from any I/O
3
+ * seam. A faithful port of Python `tooling/cse/gate.py`. Pin TOFU, derive the
4
+ * live contract hash, compare to the pin, and on drift VALIDATE -> DECIDE
5
+ * (benign auto-accept / behavioral-mandated INCONCLUSIVE / HOLD), then apply the
6
+ * per-server POSTURE. NO credential, NO transport, NO network: the Gate reads
7
+ * only the PUBLIC contract dict the caller observed.
8
+ */
9
+ import { Decision, hashTool, makeVerdict, utcNowIso, } from "./preflight.js";
10
+ import { ChangeKind, classifyChange, isSafetyRelevant } from "./schemaDiff.js";
11
+ import { assess, blastRank } from "./risk.js";
12
+ import { scanSchemaHasMarker } from "./scan.js";
13
+ import { mdText } from "./render.js";
14
+ import { redactGreenWords } from "./provenance.js";
15
+ import { Operation } from "./errors.js";
16
+ // ----------------------------------------------------------- behavioral mandate
17
+ const DEFAULT_BEHAVIORAL_MANDATED_KINDS = new Set([
18
+ ChangeKind.OUTPUT_SCHEMA_CHANGED,
19
+ ChangeKind.ANNOTATION_FLIP_TO_DESTRUCTIVE,
20
+ ]);
21
+ // --------------------------------------------------------------- benign allowlist
22
+ const BENIGN_AUTOACCEPT_KINDS = new Set([
23
+ ChangeKind.ADDED_OPTIONAL_PARAM,
24
+ ChangeKind.TOOL_ADDED,
25
+ ChangeKind.OUTPUT_SCHEMA_ADDED,
26
+ ]);
27
+ export var Posture;
28
+ (function (Posture) {
29
+ Posture["MONITOR"] = "monitor";
30
+ Posture["GUARD"] = "guard";
31
+ Posture["STRICT"] = "strict";
32
+ })(Posture || (Posture = {}));
33
+ // The change kinds GUARD treats as UNAMBIGUOUS-DANGEROUS (block even in the
34
+ // lenient default posture). The full genuinely-BREAKING set.
35
+ const GUARD_DANGEROUS_KINDS = new Set([
36
+ ChangeKind.ANNOTATION_FLIP_TO_DESTRUCTIVE,
37
+ ChangeKind.ADDED_REQUIRED_PARAM,
38
+ ChangeKind.REQUIRED_SET_EXPANDED,
39
+ ChangeKind.REMOVED_PARAM,
40
+ ChangeKind.TYPE_CHANGED,
41
+ ChangeKind.ENUM_VALUES_REMOVED,
42
+ ChangeKind.CONSTRAINT_NARROWED,
43
+ ChangeKind.TOOL_REMOVED,
44
+ ChangeKind.OUTPUT_SCHEMA_CHANGED,
45
+ ChangeKind.DEEP_SCHEMA_UNDIFFABLE,
46
+ ]);
47
+ const BREAKING_KIND_REASON = {
48
+ [ChangeKind.OUTPUT_SCHEMA_CHANGED]: "this tool's output format changed — code or agents parsing its result may break",
49
+ [ChangeKind.ANNOTATION_FLIP_TO_DESTRUCTIVE]: "this tool now declares itself able to modify or delete data (it did not before)",
50
+ [ChangeKind.ADDED_REQUIRED_PARAM]: "this tool now requires a new parameter — existing calls that omit it will fail",
51
+ [ChangeKind.REQUIRED_SET_EXPANDED]: "a parameter that used to be optional is now required — existing calls may fail",
52
+ [ChangeKind.REMOVED_PARAM]: "a parameter your calls may rely on was removed or renamed",
53
+ [ChangeKind.TYPE_CHANGED]: "a parameter's type changed — values your calls send may no longer be accepted",
54
+ [ChangeKind.ENUM_VALUES_REMOVED]: "an allowed value was removed — a value your calls send may now be rejected",
55
+ [ChangeKind.CONSTRAINT_NARROWED]: "an input rule was tightened — a value your calls send may now be rejected",
56
+ [ChangeKind.TOOL_REMOVED]: "this tool was removed from the server",
57
+ [ChangeKind.DEEP_SCHEMA_UNDIFFABLE]: "this tool's schema changed too deeply to verify automatically; held to be safe",
58
+ };
59
+ const DANGEROUS_REASON_MARKERS = [
60
+ "risk ESCALATED",
61
+ "injection/exfil marker",
62
+ "could not complete",
63
+ "DESCRIPTION changed",
64
+ "behavioral validation FAILED",
65
+ "behavioral validation UNAVAILABLE",
66
+ "behavioral validation DECLINED",
67
+ ];
68
+ const BRAND_MARK = "⬡ mcpindex";
69
+ export const HELD_PROVENANCE_UNAVAILABLE_BANNER = `${BRAND_MARK} — held a call before your agent ran it (provenance unavailable; no detail shown).`;
70
+ export const INTERNAL_ERROR_HELD_MESSAGE = `${BRAND_MARK} internal error — held this call for safety. [Override]`;
71
+ const INTERNAL_ERROR_REASON_HOLD = "mcpindex internal error — held for safety";
72
+ export function isInternalErrorVerdict(verdict) {
73
+ return verdict.reason === INTERNAL_ERROR_REASON_HOLD;
74
+ }
75
+ export function internalErrorHold(serverId, toolName) {
76
+ return makeVerdict({
77
+ serverId,
78
+ toolName,
79
+ decision: Decision.HOLD,
80
+ reason: INTERNAL_ERROR_REASON_HOLD,
81
+ isContractDiff: false,
82
+ });
83
+ }
84
+ export var Ownership;
85
+ (function (Ownership) {
86
+ Ownership["OSS"] = "oss";
87
+ Ownership["DEV_OWNED"] = "dev_owned";
88
+ Ownership["UNOWNED_THIRD_PARTY"] = "unowned_third_party";
89
+ })(Ownership || (Ownership = {}));
90
+ export var BehavioralMethod;
91
+ (function (BehavioralMethod) {
92
+ BehavioralMethod["SANDBOX_BATTERY"] = "sandbox_battery";
93
+ BehavioralMethod["READ_ONLY_PROBE"] = "read_only_probe";
94
+ BehavioralMethod["DECLINED"] = "declined";
95
+ })(BehavioralMethod || (BehavioralMethod = {}));
96
+ export function chooseBehavioralMethod(ownership) {
97
+ if (ownership === Ownership.OSS)
98
+ return BehavioralMethod.SANDBOX_BATTERY;
99
+ if (ownership === Ownership.DEV_OWNED)
100
+ return BehavioralMethod.READ_ONLY_PROBE;
101
+ return BehavioralMethod.DECLINED;
102
+ }
103
+ export var BehavioralOutcome;
104
+ (function (BehavioralOutcome) {
105
+ BehavioralOutcome["CLEARED"] = "cleared";
106
+ BehavioralOutcome["FAILED"] = "failed";
107
+ BehavioralOutcome["UNAVAILABLE"] = "unavailable";
108
+ BehavioralOutcome["DECLINED"] = "declined";
109
+ })(BehavioralOutcome || (BehavioralOutcome = {}));
110
+ /**
111
+ * True IFF the verifier ACTUALLY observed the tool's behaviour (CLEARED or FAILED).
112
+ * UNAVAILABLE / DECLINED / null (verifier never consulted) all mean behaviour did NOT run, so
113
+ * the evidence tier floors to STRUCTURAL_ONLY (0) — never a false BEHAVIORAL/3 stamp. This is
114
+ * the ONE place tier-3 eligibility is decided, keyed on the structured enum, never on a
115
+ * verifier-controlled reason string. Python mirror: `Gate._behaviour_observed`.
116
+ */
117
+ export function behaviourObserved(outcome) {
118
+ return outcome === BehavioralOutcome.CLEARED || outcome === BehavioralOutcome.FAILED;
119
+ }
120
+ // ---------------------------------------------------------- banner rendering
121
+ function ordinal(n) {
122
+ const mod100 = n % 100;
123
+ let suffix;
124
+ if (mod100 >= 10 && mod100 <= 20)
125
+ suffix = "th";
126
+ else
127
+ suffix = { 1: "st", 2: "nd", 3: "rd" }[n % 10] ?? "th";
128
+ return `${n}${suffix}`;
129
+ }
130
+ function friendlyBreakingClause(verdict) {
131
+ const present = new Set(verdict.drift.map((c) => c.kind));
132
+ for (const kind of [
133
+ ChangeKind.OUTPUT_SCHEMA_CHANGED,
134
+ ChangeKind.ANNOTATION_FLIP_TO_DESTRUCTIVE,
135
+ ChangeKind.ADDED_REQUIRED_PARAM,
136
+ ChangeKind.REQUIRED_SET_EXPANDED,
137
+ ChangeKind.REMOVED_PARAM,
138
+ ChangeKind.TYPE_CHANGED,
139
+ ChangeKind.ENUM_VALUES_REMOVED,
140
+ ChangeKind.CONSTRAINT_NARROWED,
141
+ ChangeKind.TOOL_REMOVED,
142
+ ChangeKind.DEEP_SCHEMA_UNDIFFABLE,
143
+ ]) {
144
+ if (present.has(kind))
145
+ return BREAKING_KIND_REASON[kind] ?? null;
146
+ }
147
+ return null;
148
+ }
149
+ function bannerWhatChanged(verdict) {
150
+ if (verdict.descBefore !== null || verdict.descAfter !== null) {
151
+ return "a tool's description changed (the agent-consumed channel)";
152
+ }
153
+ const friendly = friendlyBreakingClause(verdict);
154
+ if (friendly !== null)
155
+ return `${mdText(verdict.toolName)} — ${friendly}`;
156
+ const safety = verdict.drift.filter((c) => c.safetyRelevant);
157
+ if (safety.length > 0) {
158
+ const kinds = [...new Set(safety.map((c) => c.kind.toString()))].sort().join(", ");
159
+ return `${mdText(verdict.toolName)} contract drifted (${kinds})`;
160
+ }
161
+ if (verdict.drift.length > 0) {
162
+ const kinds = [...new Set(verdict.drift.map((c) => c.kind.toString()))].sort().join(", ");
163
+ return `${mdText(verdict.toolName)} contract drifted (${kinds})`;
164
+ }
165
+ return mdText(verdict.reason);
166
+ }
167
+ export function renderHoldBanner(verdict, monthlyCount = null) {
168
+ const what = bannerWhatChanged(verdict);
169
+ let line = `${BRAND_MARK} — caught a silent change: ${what}. Held before your agent ran it.`;
170
+ line += " [Review · Re-pin · Validate]";
171
+ if (monthlyCount !== null && monthlyCount > 0) {
172
+ line += ` · ${ordinal(monthlyCount)} silent change caught for you this month`;
173
+ }
174
+ // M3 (FIX 4): redact any green word — the only source is the attacker-derived
175
+ // tool_name / reason interpolated by `bannerWhatChanged` — so an attacker cannot
176
+ // smuggle banned reassurance (e.g. a tool named "all-clear-verified") into the HOLD
177
+ // banner. We redact the offending token, NOT refuse the whole HOLD (a refusal would
178
+ // let an attacker SUPPRESS a legitimate HOLD). Curated brand/action text carries none.
179
+ return redactGreenWords(line);
180
+ }
181
+ function descriptionOf(defn) {
182
+ if (defn === null || typeof defn !== "object")
183
+ return "";
184
+ const desc = defn["description"];
185
+ return desc !== undefined && desc !== null ? String(desc) : "";
186
+ }
187
+ export class Gate {
188
+ pin;
189
+ _serverId;
190
+ failOpen;
191
+ autoAcceptBenign;
192
+ now;
193
+ _ownership;
194
+ behavioralMandatedKinds;
195
+ _verifier;
196
+ _posture;
197
+ errors;
198
+ constructor(opts) {
199
+ this.pin = opts.pin;
200
+ this._serverId = opts.serverId;
201
+ this.failOpen = opts.failOpen ?? false;
202
+ this.autoAcceptBenign = opts.autoAcceptBenign ?? true;
203
+ this.now = opts.now ?? utcNowIso;
204
+ this._ownership = opts.ownership ?? Ownership.UNOWNED_THIRD_PARTY;
205
+ this.behavioralMandatedKinds = opts.behavioralMandatedKinds ?? DEFAULT_BEHAVIORAL_MANDATED_KINDS;
206
+ this._verifier = opts.verifier ?? null;
207
+ this._posture = opts.posture ?? Posture.GUARD;
208
+ this.errors = opts.errors ?? null;
209
+ }
210
+ get serverId() {
211
+ return this._serverId;
212
+ }
213
+ get posture() {
214
+ return this._posture;
215
+ }
216
+ get verifier() {
217
+ return this._verifier;
218
+ }
219
+ get ownership() {
220
+ return this._ownership;
221
+ }
222
+ pinFor(name) {
223
+ return this.pin.get(this._serverId, name);
224
+ }
225
+ /** TOFU-pin one observed tool if not already pinned. */
226
+ observe(name, defn) {
227
+ if (this.pin.get(this._serverId, name) === null) {
228
+ this.pin.put({
229
+ serverId: this._serverId,
230
+ toolName: name,
231
+ definitionHash: hashTool(defn),
232
+ pinnedAt: this.now(),
233
+ schema: defn,
234
+ });
235
+ }
236
+ }
237
+ repinOne(name, observed) {
238
+ const p = {
239
+ serverId: this._serverId,
240
+ toolName: name,
241
+ definitionHash: hashTool(observed),
242
+ pinnedAt: this.now(),
243
+ schema: observed,
244
+ };
245
+ this.pin.put(p);
246
+ return p;
247
+ }
248
+ // ---------------------------------------------------------------- evaluate
249
+ evaluate(name, observed) {
250
+ const pinned = this.pin.get(this._serverId, name);
251
+ if (pinned === null) {
252
+ return this.holdOrFailopen(name, "no pin for this tool on this session; observe it via list_tools before relying on it");
253
+ }
254
+ if (observed === null) {
255
+ return this.holdOrFailopen(name, "tool is pinned but ABSENT from the contracts observed this session; cannot verify the live contract");
256
+ }
257
+ let liveHash;
258
+ try {
259
+ liveHash = hashTool(observed);
260
+ }
261
+ catch {
262
+ return this.holdOrFailopen(name, "could not derive the current contract hash for this tool");
263
+ }
264
+ if (liveHash === pinned.definitionHash) {
265
+ const unhashed = this.mandatedUnhashedDrift(pinned, observed);
266
+ if (unhashed !== null)
267
+ return unhashed;
268
+ return makeVerdict({
269
+ serverId: this._serverId,
270
+ toolName: name,
271
+ decision: Decision.PROCEED,
272
+ reason: "contract matches your pin",
273
+ });
274
+ }
275
+ return this.validateDrift(name, pinned, observed);
276
+ }
277
+ classifyDrift(pinned, observed) {
278
+ if (pinned.schema !== null) {
279
+ return classifyChange(pinned.schema, observed);
280
+ }
281
+ return [
282
+ {
283
+ kind: ChangeKind.DEEP_SCHEMA_UNDIFFABLE,
284
+ path: "(tool)",
285
+ safetyRelevant: true,
286
+ detail: "definition_hash changed but no pinned schema to diff against; re-pin with schema capture to see what changed",
287
+ },
288
+ ];
289
+ }
290
+ mandatedUnhashedDrift(pinned, observed) {
291
+ // STEP 1 (fail-closed, H1 / FIX 2) — independent of the structural diff and load-
292
+ // bearing: scan the observed UNHASHED outputSchema for an injection/exfil marker
293
+ // BEFORE the mandated-kind check. outputSchema is unhashed (so it never flips the
294
+ // invocation hash) but agent-consumed and attacker-controllable, so a marker there
295
+ // must HOLD — on the hash-MATCH path it would otherwise slip through as "contract
296
+ // matches your pin". A scan THROW fails CLOSED to a HOLD. Mirrors `_unhashed_drift`.
297
+ const outSch = observed["outputSchema"];
298
+ if (outSch !== null && typeof outSch === "object" && !Array.isArray(outSch)) {
299
+ const obj = outSch;
300
+ if (Object.keys(obj).length > 0) {
301
+ let marked;
302
+ try {
303
+ marked = scanSchemaHasMarker(obj);
304
+ }
305
+ catch {
306
+ return this.driftHold(pinned.toolName, [], "outputSchema present but the content scan could not complete; fail-closed HOLD");
307
+ }
308
+ if (marked) {
309
+ return this.driftHold(pinned.toolName, [], "an injection/exfil marker is present in the tool's outputSchema (an unhashed, agent-consumed channel)");
310
+ }
311
+ }
312
+ }
313
+ if (pinned.schema === null)
314
+ return null;
315
+ let drift;
316
+ try {
317
+ drift = this.classifyDrift(pinned, observed);
318
+ }
319
+ catch {
320
+ return null;
321
+ }
322
+ const mandated = drift.filter((c) => this.behavioralMandatedKinds.has(c.kind)).map((c) => c.kind.toString());
323
+ if (mandated.length === 0)
324
+ return null;
325
+ return this.behavioralInconclusive(pinned.toolName, drift, mandated);
326
+ }
327
+ validateDrift(name, pinned, observed) {
328
+ let drift;
329
+ try {
330
+ drift = this.classifyDrift(pinned, observed);
331
+ }
332
+ catch {
333
+ return this.driftHold(name, [], "contract DRIFTED and validation could not complete; fail-closed HOLD");
334
+ }
335
+ // FIX 1 (fail-closed, H2): the canonical hash CHANGED (we only reach here on a hash
336
+ // mismatch), yet the classifier produced NO change — UN-EXPLAINABLE drift (an
337
+ // unmodeled inputSchema facet narrowed the contract and flipped the hash without
338
+ // yielding a Change). An empty change list would otherwise read as "every change is
339
+ // allowlisted" and clear as PROVEN BENIGN under ANY posture (incl STRICT) — a
340
+ // fail-OPEN. We cannot prove a drift benign when we cannot say WHAT drifted, so we
341
+ // fail CLOSED with a synthetic DEEP_SCHEMA_UNDIFFABLE. Mirrors gate.py FIX-1.
342
+ if (drift.length === 0) {
343
+ const synthetic = {
344
+ kind: ChangeKind.DEEP_SCHEMA_UNDIFFABLE,
345
+ path: "(tool)",
346
+ safetyRelevant: true,
347
+ detail: "contract hash DRIFTED but no structured change could be classified (an unmodeled schema facet narrowed the contract); cannot prove benign",
348
+ };
349
+ return this.driftHold(name, [synthetic], "contract hash DRIFTED but no structured change could be classified; cannot prove benign — fail-closed HOLD");
350
+ }
351
+ const mandated = drift.filter((c) => this.behavioralMandatedKinds.has(c.kind)).map((c) => c.kind.toString());
352
+ if (!this.autoAcceptBenign) {
353
+ if (mandated.length > 0)
354
+ return this.behavioralInconclusive(name, drift, mandated);
355
+ return this.driftHold(name, drift, "contract DRIFTED from your pin");
356
+ }
357
+ if (mandated.length > 0)
358
+ return this.behavioralInconclusive(name, drift, mandated);
359
+ const oldDesc = descriptionOf(pinned.schema);
360
+ const newDesc = descriptionOf(observed);
361
+ if (oldDesc !== newDesc) {
362
+ return this.descriptionHold(name, drift, oldDesc, newDesc);
363
+ }
364
+ const nonAllowlisted = [
365
+ ...new Set(drift.filter((c) => !BENIGN_AUTOACCEPT_KINDS.has(c.kind)).map((c) => c.kind.toString())),
366
+ ].sort();
367
+ if (nonAllowlisted.length > 0) {
368
+ return this.driftHold(name, drift, "contract DRIFTED; not in the benign allowlist (added-optional-param / tool-added with no description change): " +
369
+ nonAllowlisted.join(", "));
370
+ }
371
+ let escalation;
372
+ try {
373
+ escalation = this.riskEscalation(pinned, observed);
374
+ }
375
+ catch {
376
+ return this.driftHold(name, drift, "contract DRIFTED and the risk assessment could not complete; fail-closed HOLD");
377
+ }
378
+ if (escalation !== null) {
379
+ return this.driftHold(name, drift, "contract DRIFTED; risk ESCALATED on an otherwise-allowlisted change: " + escalation);
380
+ }
381
+ let hasMarker;
382
+ try {
383
+ hasMarker = this.markerIn(observed);
384
+ }
385
+ catch {
386
+ return this.driftHold(name, drift, "contract DRIFTED and the content scan could not complete; fail-closed HOLD");
387
+ }
388
+ if (hasMarker) {
389
+ return this.driftHold(name, drift, "contract DRIFTED; an injection/exfil marker is present in the new definition (input schema or description)");
390
+ }
391
+ this.repinOne(name, observed);
392
+ return makeVerdict({
393
+ serverId: this._serverId,
394
+ toolName: name,
395
+ decision: Decision.PROCEED,
396
+ reason: "contract DRIFTED but PROVEN BENIGN (every change is an added-optional-param / tool-added, the description is unchanged, risk did not escalate, and no marker is present); auto-accepted and re-pinned",
397
+ drift,
398
+ });
399
+ }
400
+ riskEscalation(pinned, observed) {
401
+ if (pinned.schema === null)
402
+ return "no pinned schema to compare risk against (fail-closed)";
403
+ const oldRisk = Gate.riskOf(pinned.schema);
404
+ const newRisk = Gate.riskOf(observed);
405
+ if (blastRank(newRisk.blastRadius) > blastRank(oldRisk.blastRadius)) {
406
+ return `blast radius escalated ${oldRisk.blastRadius} → ${newRisk.blastRadius}`;
407
+ }
408
+ if (newRisk.hasWritePayloadParam && !oldRisk.hasWritePayloadParam) {
409
+ return "gained a write/actionable payload parameter";
410
+ }
411
+ if (newRisk.requiresCredential && !oldRisk.requiresCredential) {
412
+ return "gained a credential-bearing parameter";
413
+ }
414
+ return null;
415
+ }
416
+ static riskOf(defn) {
417
+ return assess(String(defn["name"] ?? ""), String(defn["description"] ?? ""), defn["inputSchema"]);
418
+ }
419
+ static markerIn(defn) {
420
+ const d = defn;
421
+ const inSch = d["inputSchema"];
422
+ if (inSch !== null && typeof inSch === "object" && !Array.isArray(inSch)) {
423
+ const obj = inSch;
424
+ if (Object.keys(obj).length > 0 && scanSchemaHasMarker(obj))
425
+ return true;
426
+ }
427
+ // outputSchema is INCLUDED (H1 / FIX 2): its field description / default / title /
428
+ // pattern strings are attacker-controllable and agent-consumed, so the marker
429
+ // tripwire must cover it too — same scanner, same regexes. Mirrors `_marker_in`.
430
+ const outSch = d["outputSchema"];
431
+ if (outSch !== null && typeof outSch === "object" && !Array.isArray(outSch)) {
432
+ const obj = outSch;
433
+ if (Object.keys(obj).length > 0 && scanSchemaHasMarker(obj))
434
+ return true;
435
+ }
436
+ const desc = d["description"];
437
+ if (typeof desc === "string" && desc && scanSchemaHasMarker({ description: desc }))
438
+ return true;
439
+ return false;
440
+ }
441
+ markerIn(defn) {
442
+ return Gate.markerIn(defn);
443
+ }
444
+ // -------------------------------------------------------------- verdicts
445
+ descriptionHold(name, drift, oldDesc, newDesc) {
446
+ return makeVerdict({
447
+ serverId: this._serverId,
448
+ toolName: name,
449
+ decision: Decision.HOLD,
450
+ reason: "contract DRIFTED: the tool DESCRIPTION changed (the agent-consumed, attacker-controllable channel); review the before/after and re-pin if expected",
451
+ drift,
452
+ descBefore: oldDesc,
453
+ descAfter: newDesc,
454
+ });
455
+ }
456
+ driftHold(name, drift, reason) {
457
+ return makeVerdict({ serverId: this._serverId, toolName: name, decision: Decision.HOLD, reason, drift });
458
+ }
459
+ behavioralInconclusive(name, drift, mandatedKinds) {
460
+ const kinds = [...new Set(mandatedKinds)].sort().join(", ");
461
+ return makeVerdict({
462
+ serverId: this._serverId,
463
+ toolName: name,
464
+ decision: Decision.INCONCLUSIVE,
465
+ reason: `contract DRIFTED in a class the declared contract cannot clear or condemn (${kinds}); behavioral validation needed before use`,
466
+ drift,
467
+ });
468
+ }
469
+ holdOrFailopen(name, reason) {
470
+ if (this.failOpen) {
471
+ return makeVerdict({
472
+ serverId: this._serverId,
473
+ toolName: name,
474
+ decision: Decision.PROCEED,
475
+ reason,
476
+ failOpenWarning: true,
477
+ isContractDiff: false,
478
+ });
479
+ }
480
+ return makeVerdict({
481
+ serverId: this._serverId,
482
+ toolName: name,
483
+ decision: Decision.HOLD,
484
+ reason,
485
+ isContractDiff: false,
486
+ });
487
+ }
488
+ // ------------------------------------------------------------- posture layer
489
+ applyPosture(stat) {
490
+ if (stat.decision === Decision.PROCEED)
491
+ return stat;
492
+ if (this._posture === Posture.STRICT)
493
+ return stat;
494
+ if (this._posture === Posture.MONITOR)
495
+ return this.notifyOnly(stat);
496
+ // GUARD
497
+ if (!stat.isContractDiff)
498
+ return stat;
499
+ if (this.isUnambiguousDangerous(stat))
500
+ return stat;
501
+ return this.notifyOnly(stat);
502
+ }
503
+ decide(name, observed) {
504
+ try {
505
+ const stat = this.evaluate(name, observed);
506
+ const eff = this.applyPosture(stat);
507
+ return [stat, eff];
508
+ }
509
+ catch (exc) {
510
+ this.captureError(exc, Operation.GATE_DECISION, "gate.decide");
511
+ const verdict = this.internalErrorVerdict(name);
512
+ return [verdict, verdict];
513
+ }
514
+ }
515
+ internalErrorVerdict(name) {
516
+ return internalErrorHold(this._serverId, name);
517
+ }
518
+ captureError(exc, operation, ourCodeLocation) {
519
+ if (this.errors === null)
520
+ return;
521
+ try {
522
+ const className = exc instanceof Error ? exc.constructor.name : "Error";
523
+ this.errors.capture(className, operation, ourCodeLocation);
524
+ }
525
+ catch {
526
+ // capture must never break the graceful-fail path
527
+ }
528
+ }
529
+ isUnambiguousDangerous(verdict) {
530
+ if (verdict.drift.some((c) => GUARD_DANGEROUS_KINDS.has(c.kind)))
531
+ return true;
532
+ return DANGEROUS_REASON_MARKERS.some((m) => verdict.reason.includes(m));
533
+ }
534
+ notifyOnly(stat) {
535
+ return makeVerdict({
536
+ serverId: stat.serverId,
537
+ toolName: stat.toolName,
538
+ decision: Decision.PROCEED,
539
+ reason: `notify-only (${this._posture}): ${stat.reason}`,
540
+ drift: stat.drift,
541
+ isContractDiff: stat.isContractDiff,
542
+ descBefore: stat.descBefore,
543
+ descAfter: stat.descAfter,
544
+ });
545
+ }
546
+ // ----------------------------------------------------- behavioral validation
547
+ /**
548
+ * Verdict-only public wrapper. Callers that must DERIVE the evidence tier
549
+ * (`tierReached` / `verdictScope`) honestly use `runBehavioralOutcome`, which also surfaces
550
+ * the STRUCTURED `BehavioralOutcome` so the tier is keyed on the enum and NEVER on the
551
+ * verifier-controlled free-text reason string.
552
+ */
553
+ runBehavioral(toolName, observed, staticVerdict, verifier) {
554
+ return this.runBehavioralOutcome(toolName, observed, staticVerdict, verifier)[0];
555
+ }
556
+ /**
557
+ * Like `runBehavioral`, but ALSO returns the structured `BehavioralOutcome` the verifier
558
+ * produced (or `null` when the verifier was NEVER consulted — a missing observed contract or
559
+ * a verifier that errored). Callers key the evidence tier on this enum, never on the reason
560
+ * string: behaviour was OBSERVED iff the outcome is CLEARED or FAILED; UNAVAILABLE / DECLINED
561
+ * / null mean behaviour did NOT run (tier 0). Keying on the enum closes a provenance-honesty
562
+ * hole — the reason string embeds the verifier-controlled `result.reason`, so a verifier
563
+ * returning UNAVAILABLE with a reason that merely CONTAINS the literal "behavioral validation
564
+ * FAILED" must NOT forge a BEHAVIORAL/tier-3 stamp on a HOLD where behaviour was never seen.
565
+ * Python mirror: `Gate.run_behavioral_outcome`.
566
+ */
567
+ runBehavioralOutcome(toolName, observed, staticVerdict, verifier) {
568
+ const method = chooseBehavioralMethod(this._ownership);
569
+ if (method === BehavioralMethod.DECLINED) {
570
+ return [
571
+ this.holdOrFailopen(toolName, "behavioral validation DECLINED: a full behavioral battery is not permitted against an unowned third-party live server (no consent); stay HOLD"),
572
+ BehavioralOutcome.DECLINED,
573
+ ];
574
+ }
575
+ if (observed === null) {
576
+ return [
577
+ this.holdOrFailopen(toolName, "no observed contract to behaviorally validate; list_tools before validating"),
578
+ null,
579
+ ];
580
+ }
581
+ let result;
582
+ try {
583
+ result = verifier.verify(this._serverId, toolName, observed, this._ownership, method);
584
+ }
585
+ catch {
586
+ return [this.holdOrFailopen(toolName, "behavioral verifier errored; fail-closed HOLD"), null];
587
+ }
588
+ if (result.outcome === BehavioralOutcome.CLEARED) {
589
+ // Behaviour WAS observed (CLEARED) regardless of the description re-check outcome, so the
590
+ // outcome stays CLEARED even when description drift forces a HOLD — the tier honestly
591
+ // reflects that behaviour ran (tier 3), while the decision stays HOLD.
592
+ const pinned = this.pin.get(this._serverId, toolName);
593
+ if (pinned === null || pinned.schema === null) {
594
+ return [
595
+ this.holdOrFailopen(toolName, "behavioral validation CLEARED but the pinned description could not be compared (no pin/schema); fail-closed HOLD"),
596
+ BehavioralOutcome.CLEARED,
597
+ ];
598
+ }
599
+ const oldDesc = descriptionOf(pinned.schema);
600
+ const newDesc = descriptionOf(observed);
601
+ if (oldDesc !== newDesc) {
602
+ return [
603
+ this.descriptionHold(toolName, [...staticVerdict.drift], oldDesc, newDesc),
604
+ BehavioralOutcome.CLEARED,
605
+ ];
606
+ }
607
+ this.repinOne(toolName, observed);
608
+ return [
609
+ makeVerdict({
610
+ serverId: this._serverId,
611
+ toolName,
612
+ decision: Decision.PROCEED,
613
+ reason: `behavioral validation CLEARED (${method}); auto-accepted and re-pinned`,
614
+ }),
615
+ BehavioralOutcome.CLEARED,
616
+ ];
617
+ }
618
+ const suffix = result.reason || method;
619
+ const reason = result.outcome === BehavioralOutcome.FAILED
620
+ ? `behavioral validation FAILED (${suffix})`
621
+ : `behavioral validation UNAVAILABLE (${suffix}); stay HOLD`;
622
+ return [this.driftHold(toolName, [...staticVerdict.drift], reason), result.outcome];
623
+ }
624
+ }
625
+ export { isSafetyRelevant, DEFAULT_BEHAVIORAL_MANDATED_KINDS };
626
+ //# sourceMappingURL=gate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gate.js","sourceRoot":"","sources":["../../src/gate.ts"],"names":[],"mappings":"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"}