@intutic/mcp-governance-proxy 2.2.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 (129) hide show
  1. package/README.md +7 -6
  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/approvalHold.d.ts +8 -7
  9. package/dist/approvalHold.d.ts.map +1 -1
  10. package/dist/approvalHold.js +7 -6
  11. package/dist/approvalHold.js.map +1 -1
  12. package/dist/budget.d.ts +133 -0
  13. package/dist/budget.d.ts.map +1 -0
  14. package/dist/budget.js +191 -0
  15. package/dist/budget.js.map +1 -0
  16. package/dist/config.d.ts +1 -1
  17. package/dist/config.js +1 -1
  18. package/dist/config.js.map +1 -1
  19. package/dist/daemon/healthMonitor.d.ts.map +1 -1
  20. package/dist/daemon/healthMonitor.js +0 -1
  21. package/dist/daemon/healthMonitor.js.map +1 -1
  22. package/dist/daemon/index.d.ts +0 -2
  23. package/dist/daemon/index.d.ts.map +1 -1
  24. package/dist/daemon/index.js +0 -2
  25. package/dist/daemon/index.js.map +1 -1
  26. package/dist/daemon/policyCache.d.ts +15 -3
  27. package/dist/daemon/policyCache.d.ts.map +1 -1
  28. package/dist/daemon/policyCache.js +36 -15
  29. package/dist/daemon/policyCache.js.map +1 -1
  30. package/dist/daemon/socketServer.d.ts +0 -1
  31. package/dist/daemon/socketServer.d.ts.map +1 -1
  32. package/dist/daemon/socketServer.js +0 -1
  33. package/dist/daemon/socketServer.js.map +1 -1
  34. package/dist/daemon/statusReporter.d.ts.map +1 -1
  35. package/dist/daemon/statusReporter.js +0 -1
  36. package/dist/daemon/statusReporter.js.map +1 -1
  37. package/dist/daemon/telemetryBatcher.d.ts.map +1 -1
  38. package/dist/daemon/telemetryBatcher.js +0 -1
  39. package/dist/daemon/telemetryBatcher.js.map +1 -1
  40. package/dist/daemonClient.d.ts.map +1 -1
  41. package/dist/daemonClient.js +0 -1
  42. package/dist/daemonClient.js.map +1 -1
  43. package/dist/dlp.d.ts +32 -3
  44. package/dist/dlp.d.ts.map +1 -1
  45. package/dist/dlp.js +116 -18
  46. package/dist/dlp.js.map +1 -1
  47. package/dist/dlpPii.d.ts +66 -0
  48. package/dist/dlpPii.d.ts.map +1 -0
  49. package/dist/dlpPii.js +235 -0
  50. package/dist/dlpPii.js.map +1 -0
  51. package/dist/emitter.d.ts +27 -3
  52. package/dist/emitter.d.ts.map +1 -1
  53. package/dist/emitter.js +7 -1
  54. package/dist/emitter.js.map +1 -1
  55. package/dist/guardedValkey.d.ts +40 -0
  56. package/dist/guardedValkey.d.ts.map +1 -0
  57. package/dist/guardedValkey.js +84 -0
  58. package/dist/guardedValkey.js.map +1 -0
  59. package/dist/injection.js +1 -1
  60. package/dist/interceptor.d.ts +53 -10
  61. package/dist/interceptor.d.ts.map +1 -1
  62. package/dist/interceptor.js +154 -65
  63. package/dist/interceptor.js.map +1 -1
  64. package/dist/policy.d.ts +21 -1
  65. package/dist/policy.d.ts.map +1 -1
  66. package/dist/policy.js +29 -2
  67. package/dist/policy.js.map +1 -1
  68. package/dist/proxy.d.ts +25 -6
  69. package/dist/proxy.d.ts.map +1 -1
  70. package/dist/proxy.js +113 -51
  71. package/dist/proxy.js.map +1 -1
  72. package/dist/refusals.d.ts +26 -0
  73. package/dist/refusals.d.ts.map +1 -0
  74. package/dist/refusals.js +43 -0
  75. package/dist/refusals.js.map +1 -0
  76. package/dist/registryObserver.d.ts +9 -5
  77. package/dist/registryObserver.d.ts.map +1 -1
  78. package/dist/registryObserver.js +19 -8
  79. package/dist/registryObserver.js.map +1 -1
  80. package/dist/session.d.ts +1 -1
  81. package/dist/session.js +1 -1
  82. package/dist/sessionScope.d.ts +1 -1
  83. package/dist/sessionScope.js +1 -1
  84. package/dist/sessionStore.d.ts +10 -23
  85. package/dist/sessionStore.d.ts.map +1 -1
  86. package/dist/sessionStore.js +17 -76
  87. package/dist/sessionStore.js.map +1 -1
  88. package/dist/wasm/context.d.ts +10 -0
  89. package/dist/wasm/context.d.ts.map +1 -1
  90. package/dist/wasm/context.js +27 -0
  91. package/dist/wasm/context.js.map +1 -1
  92. package/dist/wasm/hostImports.d.ts +3 -3
  93. package/dist/wasm/hostImports.d.ts.map +1 -1
  94. package/dist/wasm/hostImports.js +8 -7
  95. package/dist/wasm/hostImports.js.map +1 -1
  96. package/dist/wasm/loader.d.ts +8 -1
  97. package/dist/wasm/loader.d.ts.map +1 -1
  98. package/dist/wasm/loader.js +2 -0
  99. package/dist/wasm/loader.js.map +1 -1
  100. package/dist/wasm/referencedFiles.d.ts +29 -4
  101. package/dist/wasm/referencedFiles.d.ts.map +1 -1
  102. package/dist/wasm/referencedFiles.js +48 -21
  103. package/dist/wasm/referencedFiles.js.map +1 -1
  104. package/dist/wasm/runner.d.ts +106 -22
  105. package/dist/wasm/runner.d.ts.map +1 -1
  106. package/dist/wasm/runner.js +194 -74
  107. package/dist/wasm/runner.js.map +1 -1
  108. package/dist/wasm/watch.js +1 -1
  109. package/dist/wasm/worker.d.ts +10 -6
  110. package/dist/wasm/worker.d.ts.map +1 -1
  111. package/dist/wasm/worker.js +93 -9
  112. package/dist/wasm/worker.js.map +1 -1
  113. package/package.json +5 -4
  114. package/dist/toolPoison.d.ts +0 -32
  115. package/dist/toolPoison.d.ts.map +0 -1
  116. package/dist/toolPoison.js +0 -81
  117. package/dist/toolPoison.js.map +0 -1
  118. package/dist/wasm/fuel.d.ts +0 -35
  119. package/dist/wasm/fuel.d.ts.map +0 -1
  120. package/dist/wasm/fuel.js +0 -299
  121. package/dist/wasm/fuel.js.map +0 -1
  122. package/dist/wasm/memoryCap.d.ts +0 -21
  123. package/dist/wasm/memoryCap.d.ts.map +0 -1
  124. package/dist/wasm/memoryCap.js +0 -54
  125. package/dist/wasm/memoryCap.js.map +0 -1
  126. package/dist/wasm/wasmBinary.d.ts +0 -25
  127. package/dist/wasm/wasmBinary.d.ts.map +0 -1
  128. package/dist/wasm/wasmBinary.js +0 -100
  129. package/dist/wasm/wasmBinary.js.map +0 -1
package/dist/policy.js CHANGED
@@ -9,6 +9,7 @@
9
9
  import { createStderrLogger as createLogger } from './stderrLog.js';
10
10
  import { callDaemonSocket } from './daemonClient.js';
11
11
  import { HttpStatusError, httpRequest } from './httpJson.js';
12
+ import { parseMcpBudgetPolicy, parseWorkspacePiiDetectors, } from '@intutic/shared-types';
12
13
  const log = createLogger('mcp-proxy-policy');
13
14
  /**
14
15
  * Is this unvalidated object actually a policy rule?
@@ -51,6 +52,7 @@ export const UNRESTRICTED_REGISTRY = Object.freeze({
51
52
  defaultPolicy: 'allow',
52
53
  approvedServers: [],
53
54
  blockedServers: [],
55
+ heldServers: [],
54
56
  disabledTools: {},
55
57
  });
56
58
  function stringList(value) {
@@ -78,6 +80,7 @@ export function parseRegistry(value) {
78
80
  defaultPolicy: value['defaultPolicy'] === 'deny' ? 'deny' : 'allow',
79
81
  approvedServers: stringList(value['approvedServers']),
80
82
  blockedServers: stringList(value['blockedServers']),
83
+ heldServers: stringList(value['heldServers']),
81
84
  disabledTools,
82
85
  };
83
86
  }
@@ -116,7 +119,7 @@ export class PolicyClient {
116
119
  * wired to nothing.
117
120
  */
118
121
  dlpPatterns = [];
119
- /** Workspace injection-pattern sources (`mcpInjectionPatterns`, TD-436); empty = floor only. */
122
+ /** Workspace injection-pattern sources (`mcpInjectionPatterns`); empty = floor only. */
120
123
  injectionPatterns = [];
121
124
  /**
122
125
  * Additive tool scoping: when non-empty, ONLY these tools may be called
@@ -175,6 +178,15 @@ export class PolicyClient {
175
178
  */
176
179
  failOpen;
177
180
  ssoGroupPolicy;
181
+ /** The workspace's MCP call budgets (`mcpBudgets`); no budgets until a policy says otherwise. */
182
+ mcpBudgets = parseMcpBudgetPolicy(undefined);
183
+ /**
184
+ * The workspace's `piiDetectors` setting, read as the LLM proxy reads it
185
+ * from key-context (`parseWorkspacePiiDetectors`). `none` until a policy
186
+ * carries one. `unreadable` when the control plane says it could not read
187
+ * the stored value; the interceptor applies the fail setting to that.
188
+ */
189
+ piiDetectors = { kind: 'none' };
178
190
  /** The first refresh `start()` kicks off, so the first tool call can wait for it. */
179
191
  firstRefresh = null;
180
192
  lastRefreshAttemptAt = 0;
@@ -255,6 +267,14 @@ export class PolicyClient {
255
267
  getSsoGroupPolicy() {
256
268
  return this.ssoGroupPolicy;
257
269
  }
270
+ /** The workspace's MCP call budgets; an empty list means no limits. */
271
+ getMcpBudgets() {
272
+ return this.mcpBudgets;
273
+ }
274
+ /** The workspace's PII detector actions (see the field). */
275
+ getPiiDetectors() {
276
+ return this.piiDetectors;
277
+ }
258
278
  /** The workspace's fail-open choice, or `undefined` to fall back to the local setting (see the field). */
259
279
  getFailOpen() {
260
280
  return this.failOpen;
@@ -340,8 +360,13 @@ export class PolicyClient {
340
360
  }
341
361
  this.principal = parsePrincipal(source['principal']);
342
362
  this.ssoGroupPolicy = parseSsoGroupPolicy(source['ssoGroupPolicy']);
363
+ this.mcpBudgets = parseMcpBudgetPolicy(source['mcpBudgets']);
343
364
  const failBehavior = source['mcpProxyFailBehavior'];
344
365
  this.failOpen = failBehavior === 'open' ? true : failBehavior === 'closed' ? false : undefined;
366
+ this.piiDetectors = parseWorkspacePiiDetectors(source['piiDetectors']);
367
+ if (this.piiDetectors.kind === 'unreadable') {
368
+ log.warn({ action: 'pii_detectors_unreadable', reason: this.piiDetectors.reason }, 'Workspace PII detector actions unreadable');
369
+ }
345
370
  }
346
371
  /** Find the first matching rule for a given tool name + serialized args. */
347
372
  matchRule(toolName, toolInputJson) {
@@ -405,8 +430,10 @@ export class PolicyClient {
405
430
  }
406
431
  this.dlpPatterns = (policy.dlpPatterns ?? []).filter((p) => typeof p === 'string');
407
432
  this.absorbCuration(policy);
433
+ // Re-parsed, not trusted: a daemon on an older version, or an entry it
434
+ // cached before a field existed, can carry a registry without one.
408
435
  if (policy.mcpRegistry)
409
- this.registry = policy.mcpRegistry;
436
+ this.registry = parseRegistry(policy.mcpRegistry) ?? this.registry;
410
437
  if (!policy.fromSnapshot)
411
438
  this.loadedFromControlPlane = true;
412
439
  log.info({ action: 'policy_refreshed_from_daemon', ruleCount: this.rules.length }, 'SOP rules refreshed from daemon');
@@ -1 +1 @@
1
- {"version":3,"file":"policy.js","sourceRoot":"","sources":["../src/policy.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,kBAAkB,IAAI,YAAY,EAAE,MAAM,gBAAgB,CAAA;AACnE,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AACpD,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAG5D,MAAM,GAAG,GAAG,YAAY,CAAC,kBAAkB,CAAC,CAAA;AAc5C;;;;;;;;;;;;;GAaG;AACH;;;;;;GAMG;AACH,MAAM,UAAU,SAAS,CAAC,KAAc;IACtC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,KAAK,CAAA;IAC7D,MAAM,CAAC,GAAG,KAAgC,CAAA;IAC1C,OAAO,CACL,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,QAAQ;QAC3B,OAAO,CAAC,CAAC,aAAa,CAAC,KAAK,QAAQ;QACpC,OAAO,CAAC,CAAC,QAAQ,CAAC,KAAK,QAAQ;QAC/B,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK,SAAS,IAAI,OAAO,CAAC,CAAC,YAAY,CAAC,KAAK,QAAQ,CAAC;QACtE,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,OAAO,IAAI,CAAC,CAAC,QAAQ,CAAC,KAAK,MAAM,IAAI,CAAC,CAAC,QAAQ,CAAC,KAAK,kBAAkB,CAAC,CAC1F,CAAA;AACH,CAAC;AAmBD;;;;;GAKG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAsB,MAAM,CAAC,MAAM,CAAC;IACpE,aAAa,EAAE,OAAO;IACtB,eAAe,EAAE,EAAE;IACnB,cAAc,EAAE,EAAE;IAClB,aAAa,EAAE,EAAE;CAClB,CAAsB,CAAA;AAqBvB,SAAS,UAAU,CAAC,KAAc;IAChC,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;AAC5F,CAAC;AAED,SAAS,aAAa,CAAC,KAAc;IACnC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;AAC7E,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,KAAc;IAC1C,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC;QAAE,OAAO,SAAS,CAAA;IAC3C,MAAM,aAAa,GAA6B,EAAE,CAAA;IAClD,IAAI,aAAa,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,EAAE,CAAC;QAC1C,KAAK,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,EAAE,CAAC;YACrE,MAAM,IAAI,GAAG,UAAU,CAAC,KAAK,CAAC,CAAA;YAC9B,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;gBAAE,aAAa,CAAC,MAAM,CAAC,GAAG,IAAI,CAAA;QACnD,CAAC;IACH,CAAC;IACD,OAAO;QACL,aAAa,EAAE,KAAK,CAAC,eAAe,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO;QACnE,eAAe,EAAE,UAAU,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;QACrD,cAAc,EAAE,UAAU,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;QACnD,aAAa;KACd,CAAA;AACH,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,KAAc;IAC3C,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,OAAO,KAAK,CAAC,UAAU,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC;QAAE,OAAO,SAAS,CAAA;IAC1G,OAAO;QACL,QAAQ,EAAE,KAAK,CAAC,UAAU,CAAC;QAC3B,KAAK,EAAE,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE;QAC/D,IAAI,EAAE,OAAO,KAAK,CAAC,MAAM,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE;QAC5D,SAAS,EAAE,UAAU,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;KAC1C,CAAA;AACH,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,KAAc;IAChD,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC;QAAE,OAAO,SAAS,CAAA;IAC3C,OAAO;QACL,aAAa,EAAE,UAAU,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;QACjD,cAAc,EAAE,UAAU,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;QACnD,aAAa,EAAE,UAAU,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;KAClD,CAAA;AACH,CAAC;AAED,mFAAmF;AACnF,MAAM,yBAAyB,GAAG,KAAK,CAAA;AAEvC,MAAM,OAAO,YAAY;IA4EJ;IACA;IACA;IACA;IACA;IA/EX,KAAK,GAAc,EAAE,CAAA;IAC7B;;;;;OAKG;IACK,WAAW,GAAa,EAAE,CAAA;IAClC,gGAAgG;IACxF,iBAAiB,GAAa,EAAE,CAAA;IACxC;;;;;;OAMG;IACK,YAAY,GAAa,EAAE,CAAA;IACnC,2EAA2E;IACnE,wBAAwB,GAA2B,EAAE,CAAA;IAC7D;;;;;;OAMG;IACK,cAAc,GAAa,EAAE,CAAA;IACrC;;;;;;;OAOG;IACK,eAAe,CAA8B;IACrD;;;;OAIG;IACK,WAAW,CAAwC;IAC3D;;;;;;;OAOG;IACK,gBAAgB,GAAuD,EAAE,CAAA;IACjF;;;;;OAKG;IACK,QAAQ,CAA+B;IACvC,SAAS,CAA0B;IAC3C;;;;OAIG;IACK,QAAQ,CAAqB;IAC7B,cAAc,CAA4B;IAClD,qFAAqF;IAC7E,YAAY,GAAyB,IAAI,CAAA;IACzC,oBAAoB,GAAG,CAAC,CAAA;IAChC,6GAA6G;IACrG,sBAAsB,GAAG,KAAK,CAAA;IAC9B,YAAY,GAA0B,IAAI,CAAA;IAElD,YACmB,eAAuB,EACvB,MAAc,EACd,WAAmB,EACnB,QAAgB,MAAM,EACtB,eAAuB,aAAa;QAJpC,oBAAe,GAAf,eAAe,CAAQ;QACvB,WAAM,GAAN,MAAM,CAAQ;QACd,gBAAW,GAAX,WAAW,CAAQ;QACnB,UAAK,GAAL,KAAK,CAAiB;QACtB,iBAAY,GAAZ,YAAY,CAAwB;IACpD,CAAC;IAEJ;;;;;;;;;;OAUG;IACH,KAAK,CAAC,MAAmC;QACvC,IAAI,CAAC,YAAY,GAAG,WAAW,CAAC,GAAG,EAAE;YACnC,KAAK,IAAI,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE;gBAC7B,yCAAyC;YAC3C,CAAC,CAAC,CAAA;YACF,IAAI,MAAM;gBAAE,KAAK,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;QAC5D,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAA;QACd,yCAAyC;QACzC,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,CAAA;QAEzB,uEAAuE;QACvE,mDAAmD;QACnD,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;QAClD,IAAI,MAAM;YAAE,KAAK,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;IAC5D,CAAC;IAED,yCAAyC;IACzC,IAAI;QACF,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACtB,aAAa,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;YAChC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAA;QAC1B,CAAC;IACH,CAAC;IAED;;;;;;;;;;;OAWG;IACH,KAAK,CAAC,KAAK;QACT,IAAI,IAAI,CAAC,YAAY;YAAE,MAAM,IAAI,CAAC,YAAY,CAAA;QAC9C,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS;YAAE,OAAM;QACvC,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,oBAAoB,GAAG,yBAAyB;YAAE,OAAM;QAC9E,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;IACtC,CAAC;IAED,gFAAgF;IAChF,WAAW;QACT,OAAO,IAAI,CAAC,QAAQ,CAAA;IACtB,CAAC;IAED,4EAA4E;IAC5E,YAAY;QACV,OAAO,IAAI,CAAC,SAAS,CAAA;IACvB,CAAC;IAED,yDAAyD;IACzD,iBAAiB;QACf,OAAO,IAAI,CAAC,cAAc,CAAA;IAC5B,CAAC;IAED,0GAA0G;IAC1G,WAAW;QACT,OAAO,IAAI,CAAC,QAAQ,CAAA;IACtB,CAAC;IAED,0CAA0C;IAC1C,QAAQ;QACN,OAAO,IAAI,CAAC,KAAK,CAAA;IACnB,CAAC;IAED,oEAAoE;IACpE,gGAAgG;IAChG,oBAAoB;QAClB,OAAO,IAAI,CAAC,iBAAiB,CAAA;IAC/B,CAAC;IAED,cAAc;QACZ,OAAO,IAAI,CAAC,WAAW,CAAA;IACzB,CAAC;IAED,6DAA6D;IAC7D,eAAe;QACb,OAAO,IAAI,CAAC,YAAY,CAAA;IAC1B,CAAC;IAED,mEAAmE;IACnE,iBAAiB;QACf,OAAO,IAAI,CAAC,cAAc,CAAA;IAC5B,CAAC;IAED,8DAA8D;IAC9D,2BAA2B;QACzB,OAAO,IAAI,CAAC,wBAAwB,CAAA;IACtC,CAAC;IAED;;;;;;;OAOG;IACH,kBAAkB;QAChB,OAAO,IAAI,CAAC,eAAe,CAAA;IAC7B,CAAC;IAED,yFAAyF;IACzF,cAAc;QACZ,OAAO,IAAI,CAAC,WAAW,CAAA;IACzB,CAAC;IAED,8EAA8E;IAC9E,mBAAmB;QACjB,OAAO,IAAI,CAAC,gBAAgB,CAAA;IAC9B,CAAC;IAED,uEAAuE;IAC/D,cAAc,CAAC,MAA+B;QACpD,MAAM,OAAO,GAAG,MAAM,CAAC,cAAc,CAAC,IAAI,MAAM,CAAC,iBAAiB,CAAC,CAAA;QACnE,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;YACxC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC;YAC3D,CAAC,CAAC,EAAE,CAAA;QACN,MAAM,SAAS,GAAG,MAAM,CAAC,0BAA0B,CAAC,IAAI,MAAM,CAAC,6BAA6B,CAAC,CAAA;QAC7F,IAAI,CAAC,wBAAwB,GAAG,EAAE,CAAA;QAClC,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,SAAS,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;YACrF,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAoC,CAAC,EAAE,CAAC;gBAC1E,IAAI,OAAO,CAAC,KAAK,QAAQ;oBAAE,IAAI,CAAC,wBAAwB,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;YACjE,CAAC;QACH,CAAC;QACD,MAAM,cAAc,GAAG,MAAM,CAAC,gBAAgB,CAAC,IAAI,MAAM,CAAC,mBAAmB,CAAC,CAAA;QAC9E,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC,OAAO,CAAC,cAAc,CAAC;YACjD,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC;YAClE,CAAC,CAAC,EAAE,CAAA;QACN,MAAM,iBAAiB,GAAG,MAAM,CAAC,sBAAsB,CAAC,CAAA;QACxD,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC,OAAO,CAAC,iBAAiB,CAAC;YACvD,CAAC,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC;YACrE,CAAC,CAAC,EAAE,CAAA;QACN,MAAM,eAAe,GAAG,MAAM,CAAC,oBAAoB,CAAC,CAAA;QACpD,IAAI,CAAC,eAAe;YAClB,eAAe,KAAK,MAAM,IAAI,eAAe,KAAK,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,SAAS,CAAA;QACzF,MAAM,WAAW,GAAG,MAAM,CAAC,gBAAgB,CAAC,CAAA;QAC5C,IAAI,CAAC,WAAW;YACd,WAAW,KAAK,SAAS,IAAI,WAAW,KAAK,MAAM,IAAI,WAAW,KAAK,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAA;QACxG,MAAM,gBAAgB,GAAG,MAAM,CAAC,qBAAqB,CAAC,CAAA;QACtD,IAAI,CAAC,gBAAgB,GAAG,EAAE,CAAA;QAC1B,IAAI,OAAO,gBAAgB,KAAK,QAAQ,IAAI,gBAAgB,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,gBAAgB,CAAC,EAAE,CAAC;YAC1G,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,gBAA2C,CAAC,EAAE,CAAC;gBACjF,IAAI,CAAC,KAAK,OAAO,IAAI,CAAC,KAAK,OAAO,IAAI,CAAC,KAAK,MAAM,IAAI,CAAC,KAAK,KAAK;oBAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;YACjG,CAAC;QACH,CAAC;QACD,IAAI,CAAC,SAAS,GAAG,cAAc,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAA;QACpD,IAAI,CAAC,cAAc,GAAG,mBAAmB,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,CAAA;QACnE,MAAM,YAAY,GAAG,MAAM,CAAC,sBAAsB,CAAC,CAAA;QACnD,IAAI,CAAC,QAAQ,GAAG,YAAY,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAA;IAChG,CAAC;IAED,4EAA4E;IAC5E,SAAS,CAAC,QAAgB,EAAE,aAAqB;QAC/C,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAC9B,IAAI,CAAC;gBACH,MAAM,SAAS,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;gBAC9C,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC;oBAAE,SAAQ;gBACvC,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;oBACpB,MAAM,QAAQ,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;oBAC5C,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC;wBAAE,SAAQ;gBAC7C,CAAC;gBACD,OAAO,IAAI,CAAA;YACb,CAAC;YAAC,MAAM,CAAC;gBACP,0CAA0C;YAC5C,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAA;IACb,CAAC;IAED,gDAAgD;IAChD,KAAK,CAAC,OAAO;QACX,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;QACtC,IAAI,IAAI,CAAC,YAAY,KAAK,QAAQ,EAAE,CAAC;YACnC,IAAI,CAAC;gBACH,mEAAmE;gBACnE,0EAA0E;gBAC1E,yEAAyE;gBACzE,uDAAuD;gBACvD,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAwB,YAAY,EAAE;oBACzE,WAAW,EAAE,IAAI,CAAC,WAAW;iBAC9B,CAAC,CAAA;gBACF,IAAI,MAAM,EAAE,CAAC;oBACX,MAAM,UAAU,GAAG,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAA;oBACxC,qEAAqE;oBACrE,uEAAuE;oBACvE,mEAAmE;oBACnE,MAAM,QAAQ,GAAc,EAAE,CAAA;oBAC9B,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;wBACnC,IAAI,SAAS,CAAC,SAAS,CAAC;4BAAE,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;oBACpD,CAAC;oBACD,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAA;oBACrB,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAA;oBACnD,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;wBAChB,GAAG,CAAC,IAAI,CACN,EAAE,MAAM,EAAE,wBAAwB,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,EACtE,uEAAuE,CACxE,CAAA;oBACH,CAAC;oBACD,mEAAmE;oBACnE,qEAAqE;oBACrE,iEAAiE;oBACjE,oEAAoE;oBACpE,oEAAoE;oBACpE,qEAAqE;oBACrE,+DAA+D;oBAC/D,kEAAkE;oBAClE,mBAAmB;oBACnB,IAAI,MAAM,CAAC,YAAY,IAAI,IAAI,CAAC,sBAAsB,EAAE,CAAC;wBACvD,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,4BAA4B,EAAE,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,6DAA6D,CAAC,CAAA;wBAC/I,OAAM;oBACR,CAAC;oBACD,IAAI,CAAC,WAAW,GAAG,CAAC,MAAM,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,MAAM,CAClD,CAAC,CAAC,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAC1C,CAAA;oBACD,IAAI,CAAC,cAAc,CAAC,MAA4C,CAAC,CAAA;oBACjE,IAAI,MAAM,CAAC,WAAW;wBAAE,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,WAAW,CAAA;oBAC1D,IAAI,CAAC,MAAM,CAAC,YAAY;wBAAE,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAA;oBAC5D,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,8BAA8B,EAAE,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,iCAAiC,CAAC,CAAA;oBACrH,OAAM;gBACR,CAAC;YACH,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,GAAG,CAAC,IAAI,CACN;oBACE,MAAM,EAAE,sBAAsB;oBAC9B,GAAG,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;iBACtD,EACD,oEAAoE,CACrE,CAAA;YACH,CAAC;QACH,CAAC;QAED,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,eAAe,iCAAiC,kBAAkB,CAAC,IAAI,CAAC,WAAW,CAAC,cAAc,CAAA;QACtH,GAAG,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,gBAAgB,EAAE,GAAG,EAAE,EAAE,uCAAuC,CAAC,CAAA;QAErF,IAAI,IAAY,CAAA;QAChB,IAAI,CAAC;YACH,IAAI,GAAG,MAAM,WAAW,CAAC,KAAK,EAAE,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,CAAA;QACnD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,qEAAqE;YACrE,uEAAuE;YACvE,uEAAuE;YACvE,sEAAsE;YACtE,IAAI,GAAG,YAAY,eAAe,IAAI,CAAC,GAAG,CAAC,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,CAAC;gBAAE,IAAI,CAAC,SAAS,GAAG,SAAS,CAAA;YAC5G,MAAM,GAAG,CAAA;QACX,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAA+C,CAAA;QAC7E,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAA;QAC7D,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA;QAClB,MAAM,GAAG,GAAG,MAAM,CAAC,aAAa,CAAC,CAAA;QACjC,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;YACnC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC;YACvD,CAAC,CAAC,EAAE,CAAA;QACN,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAA;QAC3B,8EAA8E;QAC9E,IAAI,CAAC,QAAQ,GAAG,aAAa,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,IAAI,qBAAqB,CAAA;QAC7E,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAA;QAClC,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,kBAAkB,EAAE,SAAS,EAAE,KAAK,CAAC,MAAM,EAAE,EAAE,qBAAqB,CAAC,CAAA;IAC1F,CAAC;CACF"}
1
+ {"version":3,"file":"policy.js","sourceRoot":"","sources":["../src/policy.ts"],"names":[],"mappings":"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"}
package/dist/proxy.d.ts CHANGED
@@ -7,7 +7,8 @@
7
7
  *
8
8
  * Architecture (standalone mode — the `intutic` harness entry):
9
9
  * Harness ↔ [McpGovernanceProxy as MCP Server] ↔ Control Plane REST API
10
- * Exposes governance tools: intutic_governance_status, intutic_list_sops, intutic_list_incidents.
10
+ * Exposes governance tools: intutic_governance_status, intutic_list_sops, intutic_list_incidents,
11
+ * intutic_hold_status, intutic_mcp_registry_status, intutic_mcp_budget_remaining.
11
12
  *
12
13
  * Architecture (remote bridge mode — `--remote-url`, see remoteBridge.ts):
13
14
  * Harness stdin → [McpGovernanceProxy] → remote MCP server (HTTP/SSE)
@@ -31,6 +32,14 @@ import { ToolCallInterceptor } from './interceptor.js';
31
32
  import { type InjectionSource } from './injection.js';
32
33
  import { type AnomalyFinding } from './anomaly/index.js';
33
34
  import { SessionState } from './session.js';
35
+ import { type CallerIdentity } from './identity.js';
36
+ import { type McpToolDefinition } from '@intutic/shared-types';
37
+ /**
38
+ * Who a per-member MCP budget counts when the control plane has not named the
39
+ * member behind this proxy's key: the key's prefix, else the OS user. Callers
40
+ * with neither share one allowance.
41
+ */
42
+ export declare function fallbackBudgetCaller(identity: CallerIdentity): string;
34
43
  /** What the harness asked for under a given request id, awaiting its response. */
35
44
  export interface PendingRequest {
36
45
  method: 'tools/call' | 'tools/list' | 'resources/read';
@@ -56,8 +65,12 @@ export interface ServerLineOutcome {
56
65
  * other line.
57
66
  */
58
67
  toolsListTools?: Array<Record<string, unknown>>;
59
- /** Every tool name the upstream server declared, before curation. Set alongside `toolsListTools`. */
60
- toolsListUpstreamNames?: string[];
68
+ /**
69
+ * Every tool the upstream server declared, as it declared them — before
70
+ * curation hid any or an override rewrote a description. Set alongside
71
+ * `toolsListTools`; the registry gets these.
72
+ */
73
+ toolsListUpstream?: McpToolDefinition[];
61
74
  /** The JSON-RPC id of the `tools/list` response, needed to build a block
62
75
  * frame in the caller if TOFU refuses it. Set alongside `toolsListTools`. */
63
76
  toolsListMsgId?: string | number | null;
@@ -160,12 +173,18 @@ export declare class McpGovernanceProxy {
160
173
  * (for detection + reask counting), `handleHarnessLine` (for post-decision
161
174
  * recording), and this class's own `handleServerLine` (for caching the
162
175
  * post-curation tools/list the tool_poisoning detector reads). Since Wave
163
- * 5.3 (TD-437) it is also shared ACROSS the session's sibling proxy
176
+ * 5.3 it is also shared ACROSS the session's sibling proxy
164
177
  * processes through `sessionStore` when a Valkey URL is configured — see
165
178
  * session.ts's module doc.
166
179
  */
167
180
  private readonly session;
168
- /** The Valkey-backed shared window, when `config.valkeyUrl` is set and this is not the standalone entry. */
181
+ /**
182
+ * The process's one Valkey connection, when `config.valkeyUrl` is set and
183
+ * this is not the standalone entry: the shared session window and the MCP
184
+ * call budgets both use it.
185
+ */
186
+ private readonly valkey;
187
+ /** The Valkey-backed shared window, on {@link valkey}. */
169
188
  private readonly sessionStore;
170
189
  /**
171
190
  * Phase 3's WASM custom-rule runner — owns the one dedicated
@@ -202,7 +221,7 @@ export declare class McpGovernanceProxy {
202
221
  startPolicy(): void;
203
222
  private wasmWatch;
204
223
  /**
205
- * Hot reload for `~/.intutic/wasm/` (TD-442): a directory watcher, not a
224
+ * Hot reload for `~/.intutic/wasm/`: a directory watcher, not a
206
225
  * second timer, so a dropped-in rule takes effect within a second instead
207
226
  * of at the next 60-second tick. Re-armed on every tick because the
208
227
  * directory may not exist when the proxy starts.
@@ -1 +1 @@
1
- {"version":3,"file":"proxy.d.ts","sourceRoot":"","sources":["../src/proxy.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"proxy.d.ts","sourceRoot":"","sources":["../src/proxy.ts"],"names":[],"mappings":"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"}
package/dist/proxy.js CHANGED
@@ -7,7 +7,8 @@
7
7
  *
8
8
  * Architecture (standalone mode — the `intutic` harness entry):
9
9
  * Harness ↔ [McpGovernanceProxy as MCP Server] ↔ Control Plane REST API
10
- * Exposes governance tools: intutic_governance_status, intutic_list_sops, intutic_list_incidents.
10
+ * Exposes governance tools: intutic_governance_status, intutic_list_sops, intutic_list_incidents,
11
+ * intutic_hold_status, intutic_mcp_registry_status, intutic_mcp_budget_remaining.
11
12
  *
12
13
  * Architecture (remote bridge mode — `--remote-url`, see remoteBridge.ts):
13
14
  * Harness stdin → [McpGovernanceProxy] → remote MCP server (HTTP/SSE)
@@ -32,16 +33,20 @@ import { createStderrLogger as createLogger } from './stderrLog.js';
32
33
  import { PolicyClient } from './policy.js';
33
34
  import { GovernanceEmitter, detectionFinding } from './emitter.js';
34
35
  import { ToolCallInterceptor } from './interceptor.js';
35
- import { redactText as redactMcpText } from './dlp.js';
36
+ import { budgetRemaining, describeFailure, holdStatus, readControlPlane, registryStatus } from './agentTools.js';
37
+ import { redactText as redactMcpText, setWorkspacePii } from './dlp.js';
36
38
  import { scanText, injectionSeverity, setDynamicInjectionPatterns } from './injection.js';
37
39
  import { toolPoisoning, dlpEscalation } from './anomaly/index.js';
38
40
  import { SessionState } from './session.js';
39
41
  import { ValkeySessionStore } from './sessionStore.js';
42
+ import { GuardedValkey } from './guardedValkey.js';
43
+ import { McpBudgetEnforcer, ValkeyBudgetStore } from './budget.js';
40
44
  import { WasmRunner } from './wasm/runner.js';
41
45
  import { checkTofu, decideTofuAction } from './tofu.js';
42
46
  import { RegistryObserver } from './registryObserver.js';
43
47
  import { ApprovalHolds } from './approvalHold.js';
44
48
  import { callerIdentity } from './identity.js';
49
+ import { normalizeToolDefinition } from '@intutic/shared-types';
45
50
  import { PACKAGE_VERSION } from './version.js';
46
51
  import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
47
52
  import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
@@ -49,34 +54,53 @@ import { z } from 'zod';
49
54
  import { watchWasmDir } from './wasm/watch.js';
50
55
  const log = createLogger('mcp-governance-proxy');
51
56
  /**
52
- * Build a JSON-RPC 2.0 error response for a blocked tool call.
57
+ * Build a JSON-RPC 2.0 error response for a blocked tool call. `data` names
58
+ * the refusal for a client that reads it programmatically (refusals.ts).
53
59
  */
54
- function buildBlockResponse(id, reason) {
60
+ function buildBlockResponse(id, reason, data) {
55
61
  return {
56
62
  jsonrpc: '2.0',
57
63
  id,
58
64
  error: {
59
65
  code: -32603, // Internal error (closest standard code to "blocked")
60
66
  message: `[Intutic Governance] Tool call blocked: ${reason}`,
67
+ data,
61
68
  },
62
69
  };
63
70
  }
71
+ /** The `error.data` of a block decision: its code, rule id and detail. */
72
+ function blockData(decision) {
73
+ return { code: decision.code, ruleId: decision.ruleId, ...decision.detail };
74
+ }
64
75
  /**
65
76
  * The JSON-RPC error for a call held for approval. Same code as a block (the
66
77
  * call did not run), a message that says "held" rather than "blocked", and
67
- * the hold id in `data` for a client that reads it programmatically.
78
+ * the hold id in `data` for a client that reads it programmatically — empty
79
+ * when the hold could not be recorded, so there is nothing to approve yet.
68
80
  */
69
- function buildHoldResponse(id, reason, holdId) {
81
+ function buildHoldResponse(id, reason, holdId, ruleId) {
70
82
  return {
71
83
  jsonrpc: '2.0',
72
84
  id,
73
85
  error: {
74
86
  code: -32603,
75
87
  message: `[Intutic Governance] Tool call ${reason}`,
76
- data: { status: 'pending_approval', holdId },
88
+ data: { code: 'HELD', ruleId, status: 'pending_approval', holdId },
77
89
  },
78
90
  };
79
91
  }
92
+ /**
93
+ * Who a per-member MCP budget counts when the control plane has not named the
94
+ * member behind this proxy's key: the key's prefix, else the OS user. Callers
95
+ * with neither share one allowance.
96
+ */
97
+ export function fallbackBudgetCaller(identity) {
98
+ if (identity.apiKeyPrefix)
99
+ return `key:${identity.apiKeyPrefix}`;
100
+ if (identity.osUser)
101
+ return `os:${identity.osUser}`;
102
+ return 'unknown';
103
+ }
80
104
  /**
81
105
  * Write a JSON-RPC frame to stdout (the ONLY valid place to write in a stdio MCP proxy).
82
106
  */
@@ -111,7 +135,7 @@ function writeFrame(frame) {
111
135
  * change; the override controls what the agent actually reads.
112
136
  */
113
137
  export function processServerLine(raw, pending, allowedTools, overrides, injectionAction = 'warn', injectionPatterns = [], disabledTools = []) {
114
- // Workspace-supplied injection patterns (TD-436), on top of the floor.
138
+ // Workspace-supplied injection patterns, on top of the floor.
115
139
  // Idempotent when the list has not changed, so this is cheap per line.
116
140
  setDynamicInjectionPatterns(injectionPatterns);
117
141
  const trimmed = raw.trim();
@@ -161,6 +185,7 @@ export function processServerLine(raw, pending, allowedTools, overrides, injecti
161
185
  message: `[Intutic Governance] Result withheld: it contained sensitive data ` +
162
186
  `whose redaction did not survive re-parsing. The tool ran; its output ` +
163
187
  `was not delivered. (${findings.map((f) => f.description).join('; ')})`,
188
+ data: { code: 'RESULT_WITHHELD_DLP', ruleId: `dlp.${findings[0]?.pattern ?? 'output'}` },
164
189
  },
165
190
  };
166
191
  return { line: JSON.stringify(withheld), redactedTool, redactions };
@@ -187,6 +212,7 @@ export function processServerLine(raw, pending, allowedTools, overrides, injecti
187
212
  message: `[Intutic Governance] Result withheld: it triggered prompt-injection ` +
188
213
  `pattern(s) (${injectionPatterns.join(', ')}). The tool call already ran; ` +
189
214
  `its output was not delivered.`,
215
+ data: { code: 'RESULT_WITHHELD_INJECTION', ruleId: 'injection.tool_result' },
190
216
  },
191
217
  };
192
218
  return {
@@ -221,9 +247,10 @@ export function processServerLine(raw, pending, allowedTools, overrides, injecti
221
247
  return { line: raw };
222
248
  let hidden = 0;
223
249
  let overridden = 0;
224
- const upstreamNames = tools
225
- .map((t) => t['name'])
226
- .filter((n) => typeof n === 'string');
250
+ // Copied before the overrides below rewrite descriptions in place.
251
+ const upstream = tools
252
+ .map(normalizeToolDefinition)
253
+ .filter((t) => t !== null);
227
254
  let kept = tools;
228
255
  if (allowedTools.length > 0 || disabledTools.length > 0) {
229
256
  kept = kept.filter((t) => {
@@ -277,7 +304,7 @@ export function processServerLine(raw, pending, allowedTools, overrides, injecti
277
304
  return {
278
305
  line: raw,
279
306
  toolsListTools: kept,
280
- toolsListUpstreamNames: upstreamNames,
307
+ toolsListUpstream: upstream,
281
308
  toolsListMsgId: msg.id,
282
309
  injectionFindings,
283
310
  toolPoisoning: toolPoisoningFinding ?? undefined,
@@ -288,7 +315,7 @@ export function processServerLine(raw, pending, allowedTools, overrides, injecti
288
315
  line: JSON.stringify(msg),
289
316
  curated: { hidden, overridden },
290
317
  toolsListTools: kept,
291
- toolsListUpstreamNames: upstreamNames,
318
+ toolsListUpstream: upstream,
292
319
  toolsListMsgId: msg.id,
293
320
  injectionFindings,
294
321
  toolPoisoning: toolPoisoningFinding ?? undefined,
@@ -343,10 +370,10 @@ export function handleHarnessLine(line, pending, interceptor, forward, session)
343
370
  interceptor.decide(toolName, toolInput).then((decision) => {
344
371
  if (decision.action === 'block') {
345
372
  log.warn({ action: 'tool_blocked', toolName, reason: decision.reason }, 'Tool call blocked by governance proxy');
346
- writeFrame(buildBlockResponse(msg.id, decision.reason));
373
+ writeFrame(buildBlockResponse(msg.id, decision.reason, blockData(decision)));
347
374
  }
348
375
  else if (decision.action === 'hold') {
349
- writeFrame(buildHoldResponse(msg.id, decision.reason, decision.holdId));
376
+ writeFrame(buildHoldResponse(msg.id, decision.reason, decision.holdId, decision.ruleId));
350
377
  }
351
378
  else {
352
379
  // Allow: the response now needs inspecting on the way back —
@@ -385,12 +412,18 @@ export class McpGovernanceProxy {
385
412
  * (for detection + reask counting), `handleHarnessLine` (for post-decision
386
413
  * recording), and this class's own `handleServerLine` (for caching the
387
414
  * post-curation tools/list the tool_poisoning detector reads). Since Wave
388
- * 5.3 (TD-437) it is also shared ACROSS the session's sibling proxy
415
+ * 5.3 it is also shared ACROSS the session's sibling proxy
389
416
  * processes through `sessionStore` when a Valkey URL is configured — see
390
417
  * session.ts's module doc.
391
418
  */
392
419
  session;
393
- /** The Valkey-backed shared window, when `config.valkeyUrl` is set and this is not the standalone entry. */
420
+ /**
421
+ * The process's one Valkey connection, when `config.valkeyUrl` is set and
422
+ * this is not the standalone entry: the shared session window and the MCP
423
+ * call budgets both use it.
424
+ */
425
+ valkey;
426
+ /** The Valkey-backed shared window, on {@link valkey}. */
394
427
  sessionStore;
395
428
  /**
396
429
  * Phase 3's WASM custom-rule runner — owns the one dedicated
@@ -407,10 +440,12 @@ export class McpGovernanceProxy {
407
440
  this.policy = new PolicyClient(config.controlPlaneUrl, config.apiKey, config.workspaceId, config.policyTtlMs, config.mcpProxyMode);
408
441
  const identity = callerIdentity(config.apiKey, config.serverName, config.sessionScope);
409
442
  this.emitter = new GovernanceEmitter(config.controlPlaneUrl, config.apiKey, config.eventsFilePath, config.workspaceId, config.mcpProxyMode, identity);
443
+ this.valkey = config.valkeyUrl ? new GuardedValkey(config.valkeyUrl) : undefined;
410
444
  // The standalone `intutic` entry fronts no real server and records no
411
- // calls worth sharing; every wrapped server gets the shared window.
412
- this.sessionStore =
413
- config.valkeyUrl && !config.standalone ? new ValkeySessionStore(config.valkeyUrl) : undefined;
445
+ // calls worth sharing; it reads Valkey only for the budget counters its
446
+ // `intutic_mcp_budget_remaining` tool reports. Every wrapped server gets
447
+ // the shared window.
448
+ this.sessionStore = this.valkey && !config.standalone ? new ValkeySessionStore(this.valkey) : undefined;
414
449
  this.session = new SessionState({ scope: config.sessionScope, store: this.sessionStore });
415
450
  log.info({ action: 'session_scope', scope: config.sessionScope ?? null, shared: Boolean(this.sessionStore && config.sessionScope) }, this.sessionStore && config.sessionScope
416
451
  ? 'Anomaly session window shared with sibling proxies through Valkey'
@@ -419,7 +454,7 @@ export class McpGovernanceProxy {
419
454
  this.registryObserver = config.standalone
420
455
  ? undefined
421
456
  : new RegistryObserver(config.controlPlaneUrl, config.apiKey, config.serverName, config.remoteTransport ?? 'stdio');
422
- this.interceptor = new ToolCallInterceptor(this.policy, this.emitter, config.failOpen, config.serverName, config.mcpInjectionAction, this.session, config.mcpAnomalyMode, config.mcpAnomalyOverrides, this.wasmRunner, config.workspaceId, new ApprovalHolds(config.controlPlaneUrl, config.apiKey, config.workspaceId, config.serverName, identity));
457
+ this.interceptor = new ToolCallInterceptor(this.policy, this.emitter, config.failOpen, config.serverName, config.mcpInjectionAction, this.session, config.mcpAnomalyMode, config.mcpAnomalyOverrides, this.wasmRunner, config.workspaceId, new ApprovalHolds(config.controlPlaneUrl, config.apiKey, config.workspaceId, config.serverName, identity), new McpBudgetEnforcer(this.valkey ? new ValkeyBudgetStore(this.valkey) : undefined, config.workspaceId, config.serverName, fallbackBudgetCaller(identity)));
423
458
  }
424
459
  /**
425
460
  * The tools/call decision engine — exposed so `remoteBridge.ts` can drive
@@ -455,7 +490,7 @@ export class McpGovernanceProxy {
455
490
  }
456
491
  wasmWatch = null;
457
492
  /**
458
- * Hot reload for `~/.intutic/wasm/` (TD-442): a directory watcher, not a
493
+ * Hot reload for `~/.intutic/wasm/`: a directory watcher, not a
459
494
  * second timer, so a dropped-in rule takes effect within a second instead
460
495
  * of at the next 60-second tick. Re-armed on every tick because the
461
496
  * directory may not exist when the proxy starts.
@@ -474,7 +509,7 @@ export class McpGovernanceProxy {
474
509
  this.wasmWatch?.close();
475
510
  this.wasmWatch = null;
476
511
  void this.wasmRunner.shutdown();
477
- void this.sessionStore?.close();
512
+ void this.valkey?.close();
478
513
  }
479
514
  /**
480
515
  * Start the proxy. Dispatches to standalone or proxy mode based on config.
@@ -500,31 +535,7 @@ export class McpGovernanceProxy {
500
535
  const cpUrl = this.config.controlPlaneUrl;
501
536
  const apiKey = this.config.apiKey;
502
537
  const workspaceId = this.config.workspaceId;
503
- async function callControlPlane(path) {
504
- try {
505
- const res = await fetch(`${cpUrl}${path}`, {
506
- headers: {
507
- 'Authorization': `Bearer ${apiKey}`,
508
- 'x-workspace-id': workspaceId,
509
- },
510
- signal: AbortSignal.timeout(5000),
511
- });
512
- if (res.status === 403)
513
- return { ok: false, reason: 'forbidden' };
514
- if (!res.ok)
515
- return { ok: false, reason: 'unreachable' };
516
- return { ok: true, data: await res.json() };
517
- }
518
- catch {
519
- return { ok: false, reason: 'unreachable' };
520
- }
521
- }
522
- /** Renders a failed call as text for the agent, naming the actual cause. */
523
- function describeFailure(result, what) {
524
- return result.reason === 'forbidden'
525
- ? `Your Intutic role is not permitted to ${what}. This needs the OWNER, ADMIN or EM role.`
526
- : `Could not reach control plane to ${what}.`;
527
- }
538
+ const callControlPlane = (path) => readControlPlane(cpUrl, apiKey, workspaceId, path);
528
539
  // Tool: intutic_governance_status
529
540
  server.tool('intutic_governance_status', 'Returns the current governance status and health of the Intutic control plane for this workspace.', {}, async () => {
530
541
  const health = await callControlPlane('/healthz');
@@ -562,6 +573,54 @@ export class McpGovernanceProxy {
562
573
  content: [{ type: 'text', text }],
563
574
  };
564
575
  });
576
+ // Tool: intutic_hold_status
577
+ server.tool('intutic_hold_status', 'Reports whether a held tool call (a refusal with code HELD and a hold id) has been approved or rejected, ' +
578
+ 'and whether retrying the identical call will now pass. Pass the hold id the refusal gave (hold_…).', { holdId: z.string().min(1).max(128).describe('The hold id from the refusal, hold_…') }, async ({ holdId }) => {
579
+ const decision = await callControlPlane(`/api/v1/decisions/${encodeURIComponent(holdId)}`);
580
+ let text;
581
+ if (!decision.ok) {
582
+ text =
583
+ decision.reason === 'not_found'
584
+ ? `No hold ${holdId} was found in this workspace. Check the id the refusal gave; a hold that could not be recorded has none.`
585
+ : describeFailure(decision, `report hold ${holdId}`);
586
+ }
587
+ else {
588
+ // Only an approval needs the bypasses, to say whether a retry passes.
589
+ const status = decision.data.status;
590
+ const bypasses = status === 'APPROVED' ? await callControlPlane('/api/v1/decisions/approved-bypasses') : null;
591
+ text = JSON.stringify(holdStatus(holdId, decision.data, bypasses?.ok ? bypasses.data : null), null, 2);
592
+ }
593
+ return { content: [{ type: 'text', text }] };
594
+ });
595
+ // Tool: intutic_mcp_registry_status
596
+ server.tool('intutic_mcp_registry_status', "Reports what this workspace's MCP server registry says about each server: whether calls to it are allowed " +
597
+ 'or refused (blocked, held after a risky tool change, or not approved under a deny default), and which of its ' +
598
+ 'tools are switched off.', { server: z.string().min(1).max(256).optional().describe('One server name; every server when omitted') }, async ({ server: name }) => {
599
+ const result = await callControlPlane('/api/v1/mcp/servers');
600
+ const text = result.ok
601
+ ? JSON.stringify(registryStatus(result.data, name), null, 2)
602
+ : describeFailure(result, 'read the MCP server registry');
603
+ return { content: [{ type: 'text', text }] };
604
+ });
605
+ // Tool: intutic_mcp_budget_remaining
606
+ server.tool('intutic_mcp_budget_remaining', "Lists this workspace's MCP call budgets that count your calls, with how many calls each has left this " +
607
+ 'period and when it resets. Counts are read from the Valkey the MCP proxies on this machine count in.', {}, async () => {
608
+ await this.policy.ready();
609
+ const identity = callerIdentity(apiKey, 'intutic', this.config.sessionScope);
610
+ const store = this.valkey ? new ValkeyBudgetStore(this.valkey) : undefined;
611
+ const budgets = await budgetRemaining(this.policy.getMcpBudgets(), workspaceId, { memberId: this.policy.getPrincipal()?.memberId ?? null, fallback: fallbackBudgetCaller(identity) }, async (keys) => store?.used(keys));
612
+ const unread = budgets.some((b) => b.used === null);
613
+ const text = JSON.stringify({
614
+ budgets,
615
+ ...(unread
616
+ ? {
617
+ note: 'Used counts are null: this server has no Valkey to read them from (INTUTIC_VALKEY_URL), or it ' +
618
+ 'did not answer. The limits still apply.',
619
+ }
620
+ : {}),
621
+ }, null, 2);
622
+ return { content: [{ type: 'text', text }] };
623
+ });
565
624
  const transport = new StdioServerTransport();
566
625
  await server.connect(transport);
567
626
  log.info({ action: 'standalone_ready' }, 'Intutic MCP server ready');
@@ -596,6 +655,9 @@ export class McpGovernanceProxy {
596
655
  */
597
656
  async handleServerLine(rawLine, pending) {
598
657
  const injectionAction = this.policy.getInjectionAction() ?? this.config.mcpInjectionAction;
658
+ // Results are redacted with the workspace's PII detector actions too —
659
+ // a resources/read answer can arrive before any tools/call set them.
660
+ setWorkspacePii(this.policy.getPiiDetectors());
599
661
  const outcome = processServerLine(rawLine, pending, this.policy.getAllowedTools(), this.policy.getToolDescriptionOverrides(), injectionAction, this.policy.getInjectionPatterns(), this.policy.getRegistry()?.disabledTools[this.config.serverName] ?? []);
600
662
  if (outcome.injectionFindings) {
601
663
  for (const finding of outcome.injectionFindings) {
@@ -659,7 +721,7 @@ export class McpGovernanceProxy {
659
721
  if (outcome.toolsListTools) {
660
722
  // The registry gets the server's own tool names, before curation:
661
723
  // per-tool toggles must be able to re-enable a tool curation hid.
662
- void this.registryObserver?.observe(outcome.toolsListUpstreamNames ?? []);
724
+ void this.registryObserver?.observe(outcome.toolsListUpstream ?? []);
663
725
  // Cache the post-curation tools/list for Phase 2's tool_poisoning
664
726
  // detector (already applied above, from this same outcome) and for
665
727
  // Phase 3's WASM rule context (`tools` field) once that lands.
@@ -683,7 +745,7 @@ export class McpGovernanceProxy {
683
745
  if (!this.interceptor.failOpen) {
684
746
  writeFrame(buildBlockResponse(outcome.toolsListMsgId ?? null, `TOFU pin check for MCP server "${serverName}" failed (could not read/write ` +
685
747
  `~/.intutic/mcp-pins/). Blocked by workspace policy (fail-closed mode). ` +
686
- `Contact your administrator or update mcpProxyFailBehavior to open.`));
748
+ `Contact your administrator or update mcpProxyFailBehavior to open.`, { code: 'TOFU_UNAVAILABLE', ruleId: 'mcpProxyFailBehavior' }));
687
749
  return;
688
750
  }
689
751
  process.stdout.write(outcome.line + '\n');
@@ -715,7 +777,7 @@ export class McpGovernanceProxy {
715
777
  }, reason);
716
778
  this.emitter.emit('mcp_server_definition_changed', serverName, undefined, reason);
717
779
  if (action.block) {
718
- writeFrame(buildBlockResponse(outcome.toolsListMsgId ?? null, reason));
780
+ writeFrame(buildBlockResponse(outcome.toolsListMsgId ?? null, reason, { code: 'TOOL_DEFINITIONS_CHANGED', ruleId: `tofu.${serverName}` }));
719
781
  return;
720
782
  }
721
783
  }