@mcpjam/inspector 3.5.4 → 3.6.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.
@@ -37,7 +37,7 @@ function resolveEnvironment() {
37
37
  }
38
38
  return "dev";
39
39
  }
40
- var BAKED_VERSION = "3.5.4";
40
+ var BAKED_VERSION = "3.6.0";
41
41
  function blankToNull(value) {
42
42
  return value === void 0 || value.trim() === "" ? null : value;
43
43
  }
@@ -48,6 +48,30 @@ function resolveRelease() {
48
48
  return blankToNull(process.env.RAILWAY_GIT_COMMIT_SHA) ?? blankToNull(process.env.GIT_SHA) ?? resolveAppVersion();
49
49
  }
50
50
 
51
+ // shared/secret-shape-redaction.ts
52
+ var authHeaderLike = () => /\b(authorization["']?\s*:\s*)["']?[^\n\r"'`]+/gi;
53
+ var tokenLike = () => /\bBearer\s+[A-Za-z0-9._~\-+/=]+\b/gi;
54
+ var skKeyLike = () => /\bsk-(?:[A-Za-z0-9]+-)*[A-Za-z0-9]{16,}\b/g;
55
+ var jwtLike = () => /\beyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\b/g;
56
+ var secretParamLike = () => /\b((?:api[_-]?key|apikey|access[_-]?token|refresh[_-]?token|id[_-]?token|client[_-]?secret|authorization|secret|password|passwd|pwd|token|auth|key|sig|signature)\s*[=:]\s*["']?)[^&\s"'`]+/gi;
57
+ var urlBasicAuthLike = () => /(\/\/[^\s/:@]+:)[^\s@/]+@/g;
58
+ function redactSecretShapes(text, replacement = "[redacted]") {
59
+ if (!text) return text;
60
+ const parts = text.split(SECRET_PLACEHOLDER);
61
+ if (parts.length === 1) return redactSegment(text, replacement);
62
+ return parts.map(
63
+ (part, index) => (
64
+ // Odd segments are the captured names.
65
+ index % 2 === 1 ? `{{secret:${part}}}` : redactSegment(part, replacement)
66
+ )
67
+ ).join("");
68
+ }
69
+ var SECRET_PLACEHOLDER = /\{\{secret:([A-Z_][A-Z0-9_]*)\}\}/g;
70
+ function redactSegment(text, replacement) {
71
+ if (!text) return text;
72
+ return text.replace(authHeaderLike(), `$1${replacement}`).replace(tokenLike(), `Bearer ${replacement}`).replace(jwtLike(), replacement).replace(urlBasicAuthLike(), `$1${replacement}@`).replace(skKeyLike(), replacement).replace(secretParamLike(), `$1${replacement}`);
73
+ }
74
+
51
75
  // server/utils/log-scrubber.ts
52
76
  var FORBIDDEN_KEY_SUBSTRINGS = [
53
77
  "authorization",
@@ -69,13 +93,7 @@ var FORBIDDEN_KEY_SUBSTRINGS = [
69
93
  "x-mcpjam-harness-lease"
70
94
  ];
71
95
  var ALLOWLISTED_KEYS = /* @__PURE__ */ new Set(["emaildomain"]);
72
- var AUTH_HEADER_LIKE = /\b(authorization["']?\s*:\s*)["']?[^\n\r"'`]+/gi;
73
- var TOKEN_LIKE = /\bBearer\s+[A-Za-z0-9._\-+/=]+\b/gi;
74
96
  var EMAIL_LIKE = /\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}\b/gi;
75
- var SK_KEY_LIKE = /\bsk-[A-Za-z0-9]{16,}\b/g;
76
- var JWT_LIKE = /\beyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\b/g;
77
- var SECRET_PARAM_LIKE = /\b((?:api[_-]?key|apikey|access[_-]?token|refresh[_-]?token|id[_-]?token|client[_-]?secret|authorization|secret|password|passwd|pwd|token|auth|key|sig|signature)\s*[=:]\s*["']?)[^&\s"'`]+/gi;
78
- var URL_BASIC_AUTH_LIKE = /(\/\/[^\s/:@]+:)[^\s@/]+@/g;
79
97
  function isForbiddenKey(key) {
80
98
  const lower = key.toLowerCase();
81
99
  if (ALLOWLISTED_KEYS.has(lower)) return false;
@@ -83,7 +101,7 @@ function isForbiddenKey(key) {
83
101
  return FORBIDDEN_KEY_SUBSTRINGS.some((s) => lower.includes(s));
84
102
  }
85
103
  function scrubString(s) {
86
- return s.replace(AUTH_HEADER_LIKE, "$1[redacted]").replace(TOKEN_LIKE, "Bearer [redacted-token]").replace(JWT_LIKE, "[redacted-jwt]").replace(URL_BASIC_AUTH_LIKE, "$1[redacted]@").replace(EMAIL_LIKE, "[redacted-email]").replace(SK_KEY_LIKE, "[redacted-secret]").replace(SECRET_PARAM_LIKE, "$1[redacted]");
104
+ return s.replace(authHeaderLike(), "$1[redacted]").replace(tokenLike(), "Bearer [redacted-token]").replace(jwtLike(), "[redacted-jwt]").replace(urlBasicAuthLike(), "$1[redacted]@").replace(EMAIL_LIKE, "[redacted-email]").replace(skKeyLike(), "[redacted-secret]").replace(secretParamLike(), "$1[redacted]");
87
105
  }
88
106
  function scrubLogPayload(value) {
89
107
  return scrubValue(value, /* @__PURE__ */ new WeakSet());
@@ -2821,6 +2839,7 @@ export {
2821
2839
  resolveEnvironment,
2822
2840
  resolveAppVersion,
2823
2841
  resolveRelease,
2842
+ redactSecretShapes,
2824
2843
  markOriginCaptureHandled,
2825
2844
  ensureStampable,
2826
2845
  isOriginCaptureHandled,
@@ -2855,4 +2874,4 @@ export {
2855
2874
  installRuntimePack,
2856
2875
  reportLocalHarnessRuntimeStatusInBackground
2857
2876
  };
2858
- //# sourceMappingURL=chunk-O3BEWXAM.js.map
2877
+ //# sourceMappingURL=chunk-2WXL3DNI.js.map
@@ -0,0 +1,10 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __export = (target, all) => {
3
+ for (var name in all)
4
+ __defProp(target, name, { get: all[name], enumerable: true });
5
+ };
6
+
7
+ export {
8
+ __export
9
+ };
10
+ //# sourceMappingURL=chunk-PZ5AY32C.js.map
@@ -127,7 +127,7 @@ var consent = createDeviceConsent(
127
127
  );
128
128
  async function grantLocalBrowserConsent() {
129
129
  const grant = await consent.grant();
130
- const { invalidateBrowserConsentLifetimes: invalidateBrowserConsentLifetimes2 } = await import("./consent-lifetime-YBODZG23.js");
130
+ const { invalidateBrowserConsentLifetimes: invalidateBrowserConsentLifetimes2 } = await import("./consent-lifetime-RZJBI5QR.js");
131
131
  await invalidateBrowserConsentLifetimes2(await consent.fingerprint());
132
132
  return grant;
133
133
  }
@@ -136,7 +136,7 @@ var getBrowserConsentFingerprint = consent.fingerprint;
136
136
  var verifyAndFingerprintBrowserConsent = consent.verifyAndFingerprint;
137
137
  async function revokeLocalBrowserConsent(token) {
138
138
  await consent.revoke(token);
139
- const { invalidateBrowserConsentLifetimes: invalidateBrowserConsentLifetimes2 } = await import("./consent-lifetime-YBODZG23.js");
139
+ const { invalidateBrowserConsentLifetimes: invalidateBrowserConsentLifetimes2 } = await import("./consent-lifetime-RZJBI5QR.js");
140
140
  await invalidateBrowserConsentLifetimes2(await consent.fingerprint());
141
141
  }
142
142
  function watchBrowserConsentChanges(changed) {
@@ -184,6 +184,12 @@ function webmcpInspectorReachable(env = process.env) {
184
184
  function hostedBrowserEnabled(env = process.env) {
185
185
  return env.HOSTED_BROWSER_TOOLS_ENABLED === "1";
186
186
  }
187
+ function browserShapeRedactionEnabled(env = process.env) {
188
+ return env.MCPJAM_BROWSER_SHAPE_REDACTION !== "0";
189
+ }
190
+ function browserSecretPlaceholdersEnabled(env = process.env) {
191
+ return env.MCPJAM_BROWSER_SECRET_PLACEHOLDERS === "1";
192
+ }
187
193
  function webmcpPageToolsMode(env = process.env) {
188
194
  return env.MCPJAM_WEBMCP_PAGE_TOOLS === "verbs" ? "verbs" : "first_class";
189
195
  }
@@ -628,6 +634,8 @@ export {
628
634
  webmcpInspectorHostedEnabled,
629
635
  webmcpInspectorReachable,
630
636
  hostedBrowserEnabled,
637
+ browserShapeRedactionEnabled,
638
+ browserSecretPlaceholdersEnabled,
631
639
  webmcpPageToolsMode,
632
640
  EVAL_WIDGET_MODEL_CONTEXT,
633
641
  CORS_ORIGINS,
@@ -670,4 +678,4 @@ export {
670
678
  createBrowserConsentLifetime,
671
679
  invalidateBrowserConsentLifetimes
672
680
  };
673
- //# sourceMappingURL=chunk-RP4R2FQ5.js.map
681
+ //# sourceMappingURL=chunk-RRGPQWGQ.js.map
@@ -1,9 +1,10 @@
1
1
  import {
2
2
  createBrowserConsentLifetime,
3
3
  invalidateBrowserConsentLifetimes
4
- } from "./chunk-RP4R2FQ5.js";
4
+ } from "./chunk-RRGPQWGQ.js";
5
+ import "./chunk-PZ5AY32C.js";
5
6
  export {
6
7
  createBrowserConsentLifetime,
7
8
  invalidateBrowserConsentLifetimes
8
9
  };
9
- //# sourceMappingURL=consent-lifetime-YBODZG23.js.map
10
+ //# sourceMappingURL=consent-lifetime-RZJBI5QR.js.map
@@ -1,7 +1,8 @@
1
1
  import {
2
2
  installRuntimePack,
3
3
  readRuntimeInstallStatus
4
- } from "./chunk-O3BEWXAM.js";
4
+ } from "./chunk-2WXL3DNI.js";
5
+ import "./chunk-PZ5AY32C.js";
5
6
 
6
7
  // server/harness-install-cli.ts
7
8
  async function harnessStatus() {