@intutic/mcp-governance-proxy 2.1.0 → 2.3.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 (148) hide show
  1. package/README.md +34 -18
  2. package/dist/agentTools.d.ts +68 -0
  3. package/dist/agentTools.d.ts.map +1 -0
  4. package/dist/agentTools.js +150 -0
  5. package/dist/agentTools.js.map +1 -0
  6. package/dist/anomaly/detectors.js +1 -1
  7. package/dist/anomaly/detectors.js.map +1 -1
  8. package/dist/anomaly/index.d.ts +2 -1
  9. package/dist/anomaly/index.d.ts.map +1 -1
  10. package/dist/anomaly/index.js.map +1 -1
  11. package/dist/approvalHold.d.ts +66 -0
  12. package/dist/approvalHold.d.ts.map +1 -0
  13. package/dist/approvalHold.js +143 -0
  14. package/dist/approvalHold.js.map +1 -0
  15. package/dist/budget.d.ts +133 -0
  16. package/dist/budget.d.ts.map +1 -0
  17. package/dist/budget.js +191 -0
  18. package/dist/budget.js.map +1 -0
  19. package/dist/config.d.ts +7 -2
  20. package/dist/config.d.ts.map +1 -1
  21. package/dist/config.js +2 -2
  22. package/dist/config.js.map +1 -1
  23. package/dist/daemon/healthMonitor.d.ts +2 -0
  24. package/dist/daemon/healthMonitor.d.ts.map +1 -1
  25. package/dist/daemon/healthMonitor.js +60 -27
  26. package/dist/daemon/healthMonitor.js.map +1 -1
  27. package/dist/daemon/index.d.ts +0 -2
  28. package/dist/daemon/index.d.ts.map +1 -1
  29. package/dist/daemon/index.js +0 -2
  30. package/dist/daemon/index.js.map +1 -1
  31. package/dist/daemon/instrumentation.d.ts +2 -2
  32. package/dist/daemon/instrumentation.js +2 -2
  33. package/dist/daemon/policyCache.d.ts +38 -3
  34. package/dist/daemon/policyCache.d.ts.map +1 -1
  35. package/dist/daemon/policyCache.js +64 -22
  36. package/dist/daemon/policyCache.js.map +1 -1
  37. package/dist/daemon/socketServer.d.ts +0 -1
  38. package/dist/daemon/socketServer.d.ts.map +1 -1
  39. package/dist/daemon/socketServer.js +0 -1
  40. package/dist/daemon/socketServer.js.map +1 -1
  41. package/dist/daemon/statusReporter.d.ts.map +1 -1
  42. package/dist/daemon/statusReporter.js +0 -1
  43. package/dist/daemon/statusReporter.js.map +1 -1
  44. package/dist/daemon/telemetryBatcher.d.ts.map +1 -1
  45. package/dist/daemon/telemetryBatcher.js +0 -1
  46. package/dist/daemon/telemetryBatcher.js.map +1 -1
  47. package/dist/daemonClient.d.ts.map +1 -1
  48. package/dist/daemonClient.js +0 -1
  49. package/dist/daemonClient.js.map +1 -1
  50. package/dist/dlp.d.ts +32 -3
  51. package/dist/dlp.d.ts.map +1 -1
  52. package/dist/dlp.js +116 -18
  53. package/dist/dlp.js.map +1 -1
  54. package/dist/dlpPii.d.ts +66 -0
  55. package/dist/dlpPii.d.ts.map +1 -0
  56. package/dist/dlpPii.js +235 -0
  57. package/dist/dlpPii.js.map +1 -0
  58. package/dist/emitter.d.ts +68 -10
  59. package/dist/emitter.d.ts.map +1 -1
  60. package/dist/emitter.js +29 -43
  61. package/dist/emitter.js.map +1 -1
  62. package/dist/guardedValkey.d.ts +40 -0
  63. package/dist/guardedValkey.d.ts.map +1 -0
  64. package/dist/guardedValkey.js +84 -0
  65. package/dist/guardedValkey.js.map +1 -0
  66. package/dist/httpJson.d.ts +19 -0
  67. package/dist/httpJson.d.ts.map +1 -0
  68. package/dist/httpJson.js +62 -0
  69. package/dist/httpJson.js.map +1 -0
  70. package/dist/identity.d.ts +27 -0
  71. package/dist/identity.d.ts.map +1 -0
  72. package/dist/identity.js +36 -0
  73. package/dist/identity.js.map +1 -0
  74. package/dist/injection.js +1 -1
  75. package/dist/interceptor.d.ts +135 -8
  76. package/dist/interceptor.d.ts.map +1 -1
  77. package/dist/interceptor.js +284 -45
  78. package/dist/interceptor.js.map +1 -1
  79. package/dist/policy.d.ts +105 -2
  80. package/dist/policy.d.ts.map +1 -1
  81. package/dist/policy.js +188 -40
  82. package/dist/policy.js.map +1 -1
  83. package/dist/proxy.d.ts +35 -11
  84. package/dist/proxy.d.ts.map +1 -1
  85. package/dist/proxy.js +183 -66
  86. package/dist/proxy.js.map +1 -1
  87. package/dist/refusals.d.ts +26 -0
  88. package/dist/refusals.d.ts.map +1 -0
  89. package/dist/refusals.js +43 -0
  90. package/dist/refusals.js.map +1 -0
  91. package/dist/registryObserver.d.ts +37 -0
  92. package/dist/registryObserver.d.ts.map +1 -0
  93. package/dist/registryObserver.js +70 -0
  94. package/dist/registryObserver.js.map +1 -0
  95. package/dist/session.d.ts +1 -1
  96. package/dist/session.js +1 -1
  97. package/dist/sessionScope.d.ts +1 -1
  98. package/dist/sessionScope.js +1 -1
  99. package/dist/sessionStore.d.ts +10 -23
  100. package/dist/sessionStore.d.ts.map +1 -1
  101. package/dist/sessionStore.js +17 -76
  102. package/dist/sessionStore.js.map +1 -1
  103. package/dist/version.d.ts +12 -0
  104. package/dist/version.d.ts.map +1 -0
  105. package/dist/version.js +13 -0
  106. package/dist/version.js.map +1 -0
  107. package/dist/wasm/context.d.ts +10 -0
  108. package/dist/wasm/context.d.ts.map +1 -1
  109. package/dist/wasm/context.js +27 -0
  110. package/dist/wasm/context.js.map +1 -1
  111. package/dist/wasm/hostImports.d.ts +3 -3
  112. package/dist/wasm/hostImports.d.ts.map +1 -1
  113. package/dist/wasm/hostImports.js +8 -7
  114. package/dist/wasm/hostImports.js.map +1 -1
  115. package/dist/wasm/loader.d.ts +8 -1
  116. package/dist/wasm/loader.d.ts.map +1 -1
  117. package/dist/wasm/loader.js +2 -0
  118. package/dist/wasm/loader.js.map +1 -1
  119. package/dist/wasm/referencedFiles.d.ts +29 -4
  120. package/dist/wasm/referencedFiles.d.ts.map +1 -1
  121. package/dist/wasm/referencedFiles.js +48 -21
  122. package/dist/wasm/referencedFiles.js.map +1 -1
  123. package/dist/wasm/runner.d.ts +106 -22
  124. package/dist/wasm/runner.d.ts.map +1 -1
  125. package/dist/wasm/runner.js +194 -74
  126. package/dist/wasm/runner.js.map +1 -1
  127. package/dist/wasm/watch.js +1 -1
  128. package/dist/wasm/worker.d.ts +10 -6
  129. package/dist/wasm/worker.d.ts.map +1 -1
  130. package/dist/wasm/worker.js +93 -9
  131. package/dist/wasm/worker.js.map +1 -1
  132. package/package.json +5 -4
  133. package/dist/toolPoison.d.ts +0 -32
  134. package/dist/toolPoison.d.ts.map +0 -1
  135. package/dist/toolPoison.js +0 -81
  136. package/dist/toolPoison.js.map +0 -1
  137. package/dist/wasm/fuel.d.ts +0 -35
  138. package/dist/wasm/fuel.d.ts.map +0 -1
  139. package/dist/wasm/fuel.js +0 -299
  140. package/dist/wasm/fuel.js.map +0 -1
  141. package/dist/wasm/memoryCap.d.ts +0 -21
  142. package/dist/wasm/memoryCap.d.ts.map +0 -1
  143. package/dist/wasm/memoryCap.js +0 -54
  144. package/dist/wasm/memoryCap.js.map +0 -1
  145. package/dist/wasm/wasmBinary.d.ts +0 -25
  146. package/dist/wasm/wasmBinary.d.ts.map +0 -1
  147. package/dist/wasm/wasmBinary.js +0 -100
  148. package/dist/wasm/wasmBinary.js.map +0 -1
@@ -0,0 +1,84 @@
1
+ /**
2
+ * guardedValkey.ts — the one Valkey connection a proxy process holds, and the
3
+ * guard every command on it goes through.
4
+ *
5
+ * Two things in a proxy read and write Valkey: the shared session window
6
+ * (sessionStore.ts) and the MCP call budgets (budget.ts). They share this
7
+ * connection, and they share its rule: a command runs only on a connected
8
+ * client, never waits longer than a short timeout, and any failure comes back
9
+ * as `undefined`. What `undefined` means is each caller's business — the
10
+ * session window falls back to its per-process copy; a budget follows the
11
+ * proxy's fail setting.
12
+ *
13
+ * @module
14
+ */
15
+ import { Redis } from 'ioredis';
16
+ import { createStderrLogger } from './stderrLog.js';
17
+ import { describeConnectionError } from './valkeyErrors.js';
18
+ const log = createStderrLogger('mcp-proxy.valkey');
19
+ /** A command that takes longer than this is treated as Valkey being unavailable. */
20
+ export const VALKEY_COMMAND_TIMEOUT_MS = 200;
21
+ export class GuardedValkey {
22
+ client;
23
+ timeoutMs;
24
+ warned = false;
25
+ constructor(url, opts = {}) {
26
+ this.timeoutMs = opts.timeoutMs ?? VALKEY_COMMAND_TIMEOUT_MS;
27
+ this.client = new Redis(url, {
28
+ lazyConnect: true,
29
+ // No offline queue: a command issued before the connection is up must
30
+ // fail now, not wait for a Valkey that may never answer.
31
+ enableOfflineQueue: false,
32
+ maxRetriesPerRequest: 1,
33
+ connectTimeout: 1000,
34
+ retryStrategy: (times) => Math.min(1000 * 2 ** Math.min(times, 5), 30_000),
35
+ });
36
+ this.client.on('error', (err) => this.warnOnce('Valkey unreachable', err));
37
+ void this.client.connect().catch((err) => this.warnOnce('Valkey connect failed', err));
38
+ }
39
+ /** Runs `op`, or answers `undefined` when Valkey is not connected, too slow, or fails. */
40
+ async run(op, opts = {}) {
41
+ let timer;
42
+ const timeout = new Promise((resolve) => {
43
+ timer = setTimeout(() => resolve(undefined), this.timeoutMs);
44
+ timer.unref();
45
+ });
46
+ try {
47
+ if (this.client.status !== 'ready') {
48
+ const settingUp = this.client.status === 'connecting' || this.client.status === 'connect';
49
+ if (!opts.awaitConnect || !settingUp)
50
+ return undefined;
51
+ const ready = new Promise((resolve) => this.client.once('ready', () => resolve(true)));
52
+ if ((await Promise.race([ready, timeout])) !== true)
53
+ return undefined;
54
+ }
55
+ return await Promise.race([op(this.client), timeout]);
56
+ }
57
+ catch (err) {
58
+ this.warnOnce('Valkey command failed', err);
59
+ return undefined;
60
+ }
61
+ finally {
62
+ if (timer)
63
+ clearTimeout(timer);
64
+ }
65
+ }
66
+ async close() {
67
+ try {
68
+ await this.client.quit();
69
+ }
70
+ catch {
71
+ this.client.disconnect();
72
+ }
73
+ }
74
+ warnOnce(msg, err) {
75
+ const detail = { err: describeConnectionError(err) };
76
+ if (this.warned) {
77
+ log.debug(detail, msg);
78
+ return;
79
+ }
80
+ this.warned = true;
81
+ log.warn(detail, `${msg} — the anomaly session window falls back to this process, and MCP call budgets follow the fail setting`);
82
+ }
83
+ }
84
+ //# sourceMappingURL=guardedValkey.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guardedValkey.js","sourceRoot":"","sources":["../src/guardedValkey.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * httpJson.ts — the one HTTP client this package uses to talk to the control
3
+ * plane (node:http/https; no fetch polyfill, no extra dependency).
4
+ *
5
+ * Rejects on a transport error, a timeout, or any status >= 400, with the
6
+ * status in the message — a wrong or removed endpoint must surface as a
7
+ * failure, never as an empty success.
8
+ *
9
+ * @module
10
+ */
11
+ /** A response with an error status, carrying the status for a caller that acts on it. */
12
+ export declare class HttpStatusError extends Error {
13
+ readonly status: number;
14
+ constructor(status: number, message: string);
15
+ }
16
+ export declare function httpRequest(method: 'GET' | 'POST', url: string, apiKey: string, body?: string, timeoutMs?: number): Promise<string>;
17
+ export declare function getJson(url: string, apiKey: string, timeoutMs?: number): Promise<unknown>;
18
+ export declare function postJson(url: string, apiKey: string, payload: unknown, timeoutMs?: number): Promise<unknown>;
19
+ //# sourceMappingURL=httpJson.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"httpJson.d.ts","sourceRoot":"","sources":["../src/httpJson.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAKH,yFAAyF;AACzF,qBAAa,eAAgB,SAAQ,KAAK;IAC5B,QAAQ,CAAC,MAAM,EAAE,MAAM;gBAAd,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;CAIrD;AAED,wBAAgB,WAAW,CACzB,MAAM,EAAE,KAAK,GAAG,MAAM,EACtB,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,EACd,IAAI,CAAC,EAAE,MAAM,EACb,SAAS,SAAO,GACf,OAAO,CAAC,MAAM,CAAC,CA6BjB;AAED,wBAAsB,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAE/F;AAED,wBAAsB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAGlH"}
@@ -0,0 +1,62 @@
1
+ /**
2
+ * httpJson.ts — the one HTTP client this package uses to talk to the control
3
+ * plane (node:http/https; no fetch polyfill, no extra dependency).
4
+ *
5
+ * Rejects on a transport error, a timeout, or any status >= 400, with the
6
+ * status in the message — a wrong or removed endpoint must surface as a
7
+ * failure, never as an empty success.
8
+ *
9
+ * @module
10
+ */
11
+ import * as node_https from 'node:https';
12
+ import * as node_http from 'node:http';
13
+ /** A response with an error status, carrying the status for a caller that acts on it. */
14
+ export class HttpStatusError extends Error {
15
+ status;
16
+ constructor(status, message) {
17
+ super(message);
18
+ this.status = status;
19
+ this.name = 'HttpStatusError';
20
+ }
21
+ }
22
+ export function httpRequest(method, url, apiKey, body, timeoutMs = 5000) {
23
+ return new Promise((resolve, reject) => {
24
+ const lib = new URL(url).protocol === 'https:' ? node_https : node_http;
25
+ const headers = {
26
+ Authorization: `Bearer ${apiKey}`,
27
+ Accept: 'application/json',
28
+ };
29
+ if (body !== undefined) {
30
+ headers['Content-Type'] = 'application/json';
31
+ headers['Content-Length'] = Buffer.byteLength(body);
32
+ }
33
+ const req = lib.request(url, { method, headers, timeout: timeoutMs }, (res) => {
34
+ const chunks = [];
35
+ res.on('data', (c) => chunks.push(c));
36
+ res.on('end', () => {
37
+ const text = Buffer.concat(chunks).toString('utf-8');
38
+ const status = res.statusCode ?? 0;
39
+ if (status >= 400)
40
+ reject(new HttpStatusError(status, `HTTP ${method} ${url} returned ${status}: ${text.slice(0, 200)}`));
41
+ else
42
+ resolve(text);
43
+ });
44
+ });
45
+ req.on('error', reject);
46
+ req.on('timeout', () => {
47
+ req.destroy();
48
+ reject(new Error(`HTTP ${method} ${url} timed out`));
49
+ });
50
+ if (body !== undefined)
51
+ req.write(body);
52
+ req.end();
53
+ });
54
+ }
55
+ export async function getJson(url, apiKey, timeoutMs) {
56
+ return JSON.parse(await httpRequest('GET', url, apiKey, undefined, timeoutMs));
57
+ }
58
+ export async function postJson(url, apiKey, payload, timeoutMs) {
59
+ const text = await httpRequest('POST', url, apiKey, JSON.stringify(payload), timeoutMs);
60
+ return text ? JSON.parse(text) : null;
61
+ }
62
+ //# sourceMappingURL=httpJson.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"httpJson.js","sourceRoot":"","sources":["../src/httpJson.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * identity.ts — who is calling, as far as this proxy process can tell.
3
+ *
4
+ * Carried on every governance event and hold record. Three of these fields are
5
+ * local observations the control plane records as reported, never as proof:
6
+ * the OS account the proxy runs under, the harness session it shares with its
7
+ * sibling proxies (sessionScope.ts), and the server it fronts. The fourth is
8
+ * the API key's prefix — the first 12 characters of a `vk_` key, which the
9
+ * control plane itself treats as a published identifier rather than a secret
10
+ * (`apiKeyAuth.ts` keys its lookup on it). The member the key belongs to is
11
+ * resolved by the control plane from the key itself, so it is not here: a
12
+ * proxy can claim an OS user, but not a member.
13
+ *
14
+ * @module
15
+ */
16
+ export interface CallerIdentity {
17
+ /** First 12 characters of the `vk_` API key; absent for any other credential. */
18
+ apiKeyPrefix?: string;
19
+ /** The OS account this proxy runs as. */
20
+ osUser?: string;
21
+ /** The harness session scope shared with sibling proxies, when one could be derived. */
22
+ session?: string;
23
+ /** The MCP server this proxy fronts (`--server-name`). */
24
+ serverName: string;
25
+ }
26
+ export declare function callerIdentity(apiKey: string, serverName: string, session: string | undefined): CallerIdentity;
27
+ //# sourceMappingURL=identity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"identity.d.ts","sourceRoot":"","sources":["../src/identity.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAIH,MAAM,WAAW,cAAc;IAC7B,iFAAiF;IACjF,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,yCAAyC;IACzC,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,wFAAwF;IACxF,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,0DAA0D;IAC1D,UAAU,EAAE,MAAM,CAAA;CACnB;AAcD,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,cAAc,CAO9G"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * identity.ts — who is calling, as far as this proxy process can tell.
3
+ *
4
+ * Carried on every governance event and hold record. Three of these fields are
5
+ * local observations the control plane records as reported, never as proof:
6
+ * the OS account the proxy runs under, the harness session it shares with its
7
+ * sibling proxies (sessionScope.ts), and the server it fronts. The fourth is
8
+ * the API key's prefix — the first 12 characters of a `vk_` key, which the
9
+ * control plane itself treats as a published identifier rather than a secret
10
+ * (`apiKeyAuth.ts` keys its lookup on it). The member the key belongs to is
11
+ * resolved by the control plane from the key itself, so it is not here: a
12
+ * proxy can claim an OS user, but not a member.
13
+ *
14
+ * @module
15
+ */
16
+ import * as node_os from 'node:os';
17
+ /** The same prefix length the control plane's key lookup uses. */
18
+ const KEY_PREFIX_LENGTH = 12;
19
+ function osUserName() {
20
+ try {
21
+ return node_os.userInfo().username || undefined;
22
+ }
23
+ catch {
24
+ // No passwd entry for the uid (some containers): there is no name to report.
25
+ return undefined;
26
+ }
27
+ }
28
+ export function callerIdentity(apiKey, serverName, session) {
29
+ return {
30
+ ...(apiKey.startsWith('vk_') ? { apiKeyPrefix: apiKey.slice(0, KEY_PREFIX_LENGTH) } : {}),
31
+ ...(osUserName() ? { osUser: osUserName() } : {}),
32
+ ...(session ? { session } : {}),
33
+ serverName,
34
+ };
35
+ }
36
+ //# sourceMappingURL=identity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"identity.js","sourceRoot":"","sources":["../src/identity.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,OAAO,MAAM,SAAS,CAAA;AAalC,kEAAkE;AAClE,MAAM,iBAAiB,GAAG,EAAE,CAAA;AAE5B,SAAS,UAAU;IACjB,IAAI,CAAC;QACH,OAAO,OAAO,CAAC,QAAQ,EAAE,CAAC,QAAQ,IAAI,SAAS,CAAA;IACjD,CAAC;IAAC,MAAM,CAAC;QACP,6EAA6E;QAC7E,OAAO,SAAS,CAAA;IAClB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,MAAc,EAAE,UAAkB,EAAE,OAA2B;IAC5F,OAAO;QACL,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,iBAAiB,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACzF,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACjD,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/B,UAAU;KACX,CAAA;AACH,CAAC"}
package/dist/injection.js CHANGED
@@ -65,7 +65,7 @@ const PATTERNS = [
65
65
  */
66
66
  const KILL_THRESHOLD = 2;
67
67
  /**
68
- * Workspace-supplied patterns, compiled (TD-436). Same contract as
68
+ * Workspace-supplied patterns, compiled. Same contract as
69
69
  * `dlp.ts`'s `setDynamicPatterns`: sources come from the control plane's
70
70
  * `mcpInjectionPatterns`, an invalid one is dropped and counted, and the
71
71
  * hardcoded floor above applies regardless — an unreachable control plane
@@ -2,8 +2,11 @@
2
2
  * interceptor.ts — tools/call decision engine.
3
3
  *
4
4
  * Given a tool name and arguments, evaluates:
5
+ * 0. The MCP server registry, server/tool allowlists and SSO group clearance
5
6
  * 1. DLP scan (credential / destructive pattern detection)
6
7
  * 2. SOP policy rules (fetched from control plane via PolicyClient)
8
+ * 3–5. Prompt injection, anomaly detectors, WASM rules
9
+ * 6. MCP call budgets — last, so only a call that would otherwise run is counted
7
10
  *
8
11
  * Returns an allow / block / redact decision.
9
12
  *
@@ -13,21 +16,50 @@ import type { AnomalyMode, Disposition } from './anomaly/index.js';
13
16
  import { SessionState } from './session.js';
14
17
  import type { WasmRunner } from './wasm/runner.js';
15
18
  import type { PolicyClient } from './policy.js';
16
- import type { GovernanceEmitter } from './emitter.js';
17
- export type Decision = {
18
- action: 'allow';
19
- } | {
19
+ import { type GovernanceEmitter } from './emitter.js';
20
+ import type { ApprovalHolds } from './approvalHold.js';
21
+ import { type McpBudgetEnforcer } from './budget.js';
22
+ import type { McpRefusalCode } from './refusals.js';
23
+ /**
24
+ * A refusal: what the agent reads (`reason`), and what a client reads — the
25
+ * stable `code`, the `ruleId` that decided, and any `detail` the code carries
26
+ * (refusals.ts). All three reach the JSON-RPC frame's `error.data`.
27
+ */
28
+ export interface Block {
20
29
  action: 'block';
21
30
  reason: string;
22
- } | {
31
+ code: Exclude<McpRefusalCode, 'HELD'>;
32
+ ruleId: string;
33
+ detail?: Record<string, unknown>;
34
+ }
35
+ export type Decision = {
36
+ action: 'allow';
37
+ } | Block | {
23
38
  action: 'redact';
24
39
  reason: string;
25
40
  redactedInput: unknown;
41
+ }
42
+ /**
43
+ * Refused for now, pending a person's approval (`require_approval`). Not a
44
+ * block: the agent is told the hold id and to retry once it is approved,
45
+ * which passes only while the workspace's review-hold bypass is on — see
46
+ * approvalHold.ts. `holdId` is empty when the hold could not be recorded.
47
+ */
48
+ | {
49
+ action: 'hold';
50
+ reason: string;
51
+ holdId: string;
52
+ ruleId: string;
26
53
  };
27
54
  export declare class ToolCallInterceptor {
28
55
  private readonly policy;
29
56
  private readonly emitter;
30
- private readonly failOpen;
57
+ /**
58
+ * The local fail setting (`INTUTIC_MCP_FAIL_OPEN`, config.ts). The
59
+ * workspace's `mcpProxyFailBehavior`, once a policy has delivered it,
60
+ * takes precedence — see {@link failOpen}.
61
+ */
62
+ private readonly localFailOpen;
31
63
  /**
32
64
  * The real MCP server this proxy process fronts, from `--server-name`
33
65
  * (config.ts, threaded since Phase D's `wrapWithProxy` but unconsumed
@@ -87,7 +119,27 @@ export declare class ToolCallInterceptor {
87
119
  * belongs to).
88
120
  */
89
121
  private readonly workspaceId;
90
- constructor(policy: PolicyClient, emitter: GovernanceEmitter, failOpen?: boolean,
122
+ /**
123
+ * Turns a `require_approval` rule into a hold through the control
124
+ * plane's decisions API. `undefined` (construction sites that predate
125
+ * holds) leaves such a call held with nothing recorded, which is still a
126
+ * refusal — never an allow.
127
+ */
128
+ private readonly holds;
129
+ /**
130
+ * Counts each call against the workspace's MCP call budgets (budget.ts).
131
+ * `undefined` (construction sites that predate budgets) skips them; the
132
+ * proxy always passes one, with no store when it has no Valkey, so a
133
+ * covered call then resolves through the fail setting.
134
+ */
135
+ private readonly budgets;
136
+ constructor(policy: PolicyClient, emitter: GovernanceEmitter,
137
+ /**
138
+ * The local fail setting (`INTUTIC_MCP_FAIL_OPEN`, config.ts). The
139
+ * workspace's `mcpProxyFailBehavior`, once a policy has delivered it,
140
+ * takes precedence — see {@link failOpen}.
141
+ */
142
+ localFailOpen?: boolean,
91
143
  /**
92
144
  * The real MCP server this proxy process fronts, from `--server-name`
93
145
  * (config.ts, threaded since Phase D's `wrapWithProxy` but unconsumed
@@ -146,7 +198,30 @@ export declare class ToolCallInterceptor {
146
198
  * identity: the MCP SERVER this process fronts, not the WORKSPACE it
147
199
  * belongs to).
148
200
  */
149
- workspaceId?: string);
201
+ workspaceId?: string,
202
+ /**
203
+ * Turns a `require_approval` rule into a hold through the control
204
+ * plane's decisions API. `undefined` (construction sites that predate
205
+ * holds) leaves such a call held with nothing recorded, which is still a
206
+ * refusal — never an allow.
207
+ */
208
+ holds?: ApprovalHolds | undefined,
209
+ /**
210
+ * Counts each call against the workspace's MCP call budgets (budget.ts).
211
+ * `undefined` (construction sites that predate budgets) skips them; the
212
+ * proxy always passes one, with no store when it has no Valkey, so a
213
+ * covered call then resolves through the fail setting.
214
+ */
215
+ budgets?: McpBudgetEnforcer | undefined);
216
+ /** Set once this process has said that budgets went unchecked under fail-open, so the log says it once. */
217
+ private budgetsUncheckedWarned;
218
+ /**
219
+ * Whether a governance check that cannot complete lets the call through:
220
+ * the workspace's `mcpProxyFailBehavior` when the control plane has sent
221
+ * it, the local `INTUTIC_MCP_FAIL_OPEN` until then (and for a workspace
222
+ * that never chose).
223
+ */
224
+ get failOpen(): boolean;
150
225
  /**
151
226
  * Applies the shared reask ladder (Phase 2 anomaly detectors AND Phase 3
152
227
  * WASM rules both use this): a session-lifetime attempt counter keyed by
@@ -156,6 +231,46 @@ export declare class ToolCallInterceptor {
156
231
  * it, exactly like every other new block reason in this package.
157
232
  */
158
233
  private applyReaskLadder;
234
+ /**
235
+ * A `require_approval` rule matched. Returns the hold decision, or `null`
236
+ * when an approved bypass for this exact call lets it continue. Every hold
237
+ * reason names the hold id, who may approve it and when a retry passes, in
238
+ * the words the hook gates print (`holdApprovalHint`), so a person reading
239
+ * the agent's transcript knows what to do.
240
+ */
241
+ private hold;
242
+ /**
243
+ * Refuses the call when the registry says this server — or this tool on it —
244
+ * may not be used. Returns `null` to let the call continue.
245
+ *
246
+ * A blocked server is refused under either default; under `deny`, so is any
247
+ * server not approved (a candidate, or one the registry has never seen);
248
+ * a disabled tool is refused within any server. All three are definite
249
+ * operator decisions and do not depend on `failOpen`.
250
+ *
251
+ * What does depend on it is a registry this process has never loaded — the
252
+ * control plane unreachable since start, or only the MCP daemon's snapshot
253
+ * seed so far. The last-known registry is kept for as long as the process
254
+ * runs, so this is only ever the never-loaded case. Fail-open lets the call continue
255
+ * unchecked against the registry, exactly as a workspace with no registry;
256
+ * fail-closed refuses it, because a `deny` workspace cannot be told apart
257
+ * from an `allow` one without the registry.
258
+ */
259
+ private checkRegistry;
260
+ /**
261
+ * The workspace's SSO group policy, applied to the member this proxy's API
262
+ * key resolves to, by `evaluateSsoGroupClearance` — the function the
263
+ * server-side hook gate (`resolveSsoGroupPrivilege`) and the policy snapshot
264
+ * use, so all of them answer alike. A tool matches by its bare MCP name or
265
+ * as `mcp__<server>__<tool>`, the name the harness hooks see for the same
266
+ * call. A tool on the `requireOboFor` list is refused: a proxy has no
267
+ * on-behalf-of token to present.
268
+ *
269
+ * With a policy but no resolved member the groups are unknown, and a
270
+ * high-risk tool is refused rather than allowed — unknown is never granted.
271
+ * Without a policy there is nothing to apply.
272
+ */
273
+ private checkSsoGroupClearance;
159
274
  /**
160
275
  * Evaluate a tools/call request and return a governance decision.
161
276
  *
@@ -164,5 +279,17 @@ export declare class ToolCallInterceptor {
164
279
  * @returns Decision: allow, block, or redact
165
280
  */
166
281
  decide(toolName: string, toolInput: unknown): Promise<Decision>;
282
+ /**
283
+ * Counts the call against every budget that covers it, or refuses it when
284
+ * one is used up. The threshold and exceeded events go out once per budget
285
+ * per period (the store claims them), each as a `budget_breach` finding; a
286
+ * refusal also sends `tool_blocked`, as every refusal does, carrying the
287
+ * budget — the control plane files one incident per budget per period from
288
+ * those and counts the rest on it.
289
+ *
290
+ * When the count cannot be checked, the fail setting decides, as for every
291
+ * other governance check that cannot complete.
292
+ */
293
+ private checkBudgets;
167
294
  }
168
295
  //# sourceMappingURL=interceptor.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"interceptor.d.ts","sourceRoot":"","sources":["../src/interceptor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAQH,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAC3C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAClD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAC/C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAA;AAIrD,MAAM,MAAM,QAAQ,GAChB;IAAE,MAAM,EAAE,OAAO,CAAA;CAAE,GACnB;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACnC;IAAE,MAAM,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,OAAO,CAAA;CAAE,CAAA;AAEhE,qBAAa,mBAAmB;IAE5B,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB;;;;;;OAMG;IACH,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B;;;;;;;OAOG;IACH,OAAO,CAAC,QAAQ,CAAC,sBAAsB;IACvC;;;;;;;;OAQG;IACH,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB;;;;;;;OAOG;IACH,OAAO,CAAC,QAAQ,CAAC,kBAAkB;IACnC;;;;;;OAMG;IACH,OAAO,CAAC,QAAQ,CAAC,uBAAuB;IACxC;;;;;OAKG;IACH,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B;;;;;;OAMG;IACH,OAAO,CAAC,QAAQ,CAAC,WAAW;gBA7DX,MAAM,EAAE,YAAY,EACpB,OAAO,EAAE,iBAAiB,EAC1B,QAAQ,GAAE,OAAc;IACzC;;;;;;OAMG;IACc,UAAU,GAAE,MAAkB;IAC/C;;;;;;;OAOG;IACc,sBAAsB,GAAE,MAAM,GAAG,OAAgB;IAClE;;;;;;;;OAQG;IACc,OAAO,GAAE,YAAiC;IAC3D;;;;;;;OAOG;IACc,kBAAkB,GAAE,WAAuB;IAC5D;;;;;;OAMG;IACc,uBAAuB,GAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,GAAG,KAAK,CAAC,CAAM;IAC5F;;;;;OAKG;IACc,UAAU,GAAE,UAAU,GAAG,SAAqB;IAC/D;;;;;;OAMG;IACc,WAAW,GAAE,MAAkB;IAGlD;;;;;;;OAOG;YACW,gBAAgB;IAmB9B;;;;;;OAMG;IACG,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC;CAiRtE"}
1
+ {"version":3,"file":"interceptor.d.ts","sourceRoot":"","sources":["../src/interceptor.ts"],"names":[],"mappings":"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"}