@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
package/dist/src/gate.js
ADDED
|
@@ -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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"}
|