@mcpjam/inspector 3.12.4 → 3.12.5

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 (37) hide show
  1. package/README.md +29 -21
  2. package/bin/access-link.mjs +53 -0
  3. package/bin/start.js +47 -14
  4. package/dist/client/assets/OAuthDesktopReturnNotice-B_x9xTE-.css +2 -0
  5. package/dist/client/assets/OAuthDesktopReturnNotice-LlC451lX.js +11 -0
  6. package/dist/client/assets/{app-bootstrap-B7TKDg4p.js → app-bootstrap-2jatN7gw.js} +363 -361
  7. package/dist/client/assets/{button-BgMj96d7.js → button-B2OH2ei2.js} +2 -2
  8. package/dist/client/assets/{chunk-YOKDWASO-DiKLTu3U.js → chunk-YOKDWASO-uJ3KOQV7.js} +5 -5
  9. package/dist/client/assets/{dead-clicks-autocapture-B2D_6BXS.js → dead-clicks-autocapture-D055GjVp.js} +2 -2
  10. package/dist/client/assets/{error-reporting-6uZvG5HZ.js → error-reporting-DGP36KLx.js} +57 -57
  11. package/dist/client/assets/{error-reporting-xR8v_8my.js → error-reporting-FWZKbZxG.js} +1 -1
  12. package/dist/client/assets/{exception-autocapture-Xx2wbAOf.js → exception-autocapture-103gdJjL.js} +2 -2
  13. package/dist/client/assets/{failed-request-tracker-BH4w1sBR.js → failed-request-tracker-Cp9_VFMm.js} +2 -2
  14. package/dist/client/assets/{highlighted-body-KPVGNVTW-DIgOE9D7.js → highlighted-body-KPVGNVTW-Dx70h1nm.js} +2 -2
  15. package/dist/client/assets/index-rskHnM3O.js +4 -0
  16. package/dist/client/assets/{jszip.min-C24J_3Y_.js → jszip.min-CwJyI5tb.js} +2 -2
  17. package/dist/client/assets/{mermaid-HWGCJPDP-BTzLBCkg.js → mermaid-HWGCJPDP-Ck3prJKl.js} +1 -1
  18. package/dist/client/assets/{posthog-recorder-CEtP2mh8.js → posthog-recorder-tKuMFijV.js} +2 -2
  19. package/dist/client/assets/{preload-helper-Cfn3cu1N.js → preload-helper-DrcoTQ49.js} +2 -2
  20. package/dist/client/assets/{rolldown-runtime-BPNN4GNu.js → rolldown-runtime-7FnpGOz6.js} +1 -1
  21. package/dist/client/assets/{surveys-CWniVjxJ.js → surveys-BsZYxM6N.js} +2 -2
  22. package/dist/client/assets/{trace-timeline-D-nhBNaR.js → trace-timeline-BOZvHcOG.js} +1 -1
  23. package/dist/client/assets/{trace-timeline-D9qZRjVv.js → trace-timeline-Bf9Oai70.js} +8 -8
  24. package/dist/client/assets/{web-vitals-zTwn9Gi6.js → web-vitals-DdzaVN3H.js} +2 -2
  25. package/dist/client/index.html +7 -7
  26. package/dist/server/chunk-3EDQFXTF.js +4801 -0
  27. package/dist/server/{chunk-5RE7KJ2M.js → chunk-4PYR7GMQ.js} +16 -197
  28. package/dist/server/{chunk-5T6DFO27.js → chunk-QA6VJT6A.js} +961 -963
  29. package/dist/server/chunk-SH24KJBI.js +194 -0
  30. package/dist/server/{consent-lifetime-PTGAZQSU.js → consent-lifetime-M7PS6RUU.js} +3 -2
  31. package/dist/server/harness-install-cli.js +1 -1
  32. package/dist/server/index.js +14093 -15925
  33. package/dist/server/local-turn-XXOSZHMT.js +12 -0
  34. package/package.json +14 -11
  35. package/dist/client/assets/OAuthDesktopReturnNotice-B2D5moE-.css +0 -2
  36. package/dist/client/assets/OAuthDesktopReturnNotice-CTGRhDuo.js +0 -11
  37. package/dist/client/assets/index-Cu4ySOft.js +0 -4
@@ -1,3 +1,13 @@
1
+ import {
2
+ SERVER_HOSTNAME,
3
+ SERVER_PORT,
4
+ capabilityFingerprint,
5
+ capabilityMatches,
6
+ createCapabilityMutationLock,
7
+ mintCapabilityToken,
8
+ persistCapabilityState
9
+ } from "./chunk-SH24KJBI.js";
10
+
1
11
  // server/utils/computers/browser-consent.ts
2
12
  import { watch } from "fs";
3
13
  import { homedir } from "os";
@@ -5,53 +15,14 @@ import { join } from "path";
5
15
 
6
16
  // server/utils/device-consent.ts
7
17
  import { lock } from "proper-lockfile";
8
- import { mkdir as mkdir2 } from "fs/promises";
9
- import { dirname as dirname2 } from "path";
10
- import { readFile, unlink } from "fs/promises";
11
-
12
- // server/utils/local-capability.ts
13
- import { createHash, randomBytes, timingSafeEqual } from "crypto";
14
- import { mkdir, writeFile, rename, chmod } from "fs/promises";
18
+ import { mkdir } from "fs/promises";
15
19
  import { dirname } from "path";
16
- function mintCapabilityToken() {
17
- return randomBytes(32).toString("base64url");
18
- }
19
- function capabilityFingerprint(token) {
20
- return createHash("sha256").update(token, "utf8").digest("hex");
21
- }
22
- function capabilityMatches(token, hash) {
23
- if (typeof token !== "string" || token.length < 16 || token.length > 256 || !/^[0-9a-f]{64}$/.test(hash))
24
- return false;
25
- return timingSafeEqual(
26
- Buffer.from(capabilityFingerprint(token), "hex"),
27
- Buffer.from(hash, "hex")
28
- );
29
- }
30
- function createCapabilityMutationLock() {
31
- let chain = Promise.resolve();
32
- return function withLock(op) {
33
- const run = chain.then(op, op);
34
- chain = run.then(
35
- () => void 0,
36
- () => void 0
37
- );
38
- return run;
39
- };
40
- }
41
- async function persistCapabilityState(file, state) {
42
- await mkdir(dirname(file), { recursive: true, mode: 448 });
43
- const tmp = `${file}.tmp`;
44
- await writeFile(tmp, JSON.stringify(state), { mode: 384 });
45
- await chmod(tmp, 384);
46
- await rename(tmp, file);
47
- }
48
-
49
- // server/utils/device-consent.ts
20
+ import { readFile, unlink } from "fs/promises";
50
21
  function createDeviceConsent(consentFilePath) {
51
22
  const serialize = createCapabilityMutationLock();
52
23
  const withConsentMutationLock = (operation) => serialize(async () => {
53
24
  const file = consentFilePath();
54
- await mkdir2(dirname2(file), { recursive: true, mode: 448 });
25
+ await mkdir(dirname(file), { recursive: true, mode: 448 });
55
26
  const release = await lock(file, {
56
27
  realpath: false,
57
28
  retries: { retries: 40, minTimeout: 25, maxTimeout: 100 },
@@ -127,7 +98,7 @@ var consent = createDeviceConsent(
127
98
  );
128
99
  async function grantLocalBrowserConsent() {
129
100
  const grant = await consent.grant();
130
- const { invalidateBrowserConsentLifetimes: invalidateBrowserConsentLifetimes2 } = await import("./consent-lifetime-PTGAZQSU.js");
101
+ const { invalidateBrowserConsentLifetimes: invalidateBrowserConsentLifetimes2 } = await import("./consent-lifetime-M7PS6RUU.js");
131
102
  await invalidateBrowserConsentLifetimes2(await consent.fingerprint());
132
103
  return grant;
133
104
  }
@@ -136,7 +107,7 @@ var getBrowserConsentFingerprint = consent.fingerprint;
136
107
  var verifyAndFingerprintBrowserConsent = consent.verifyAndFingerprint;
137
108
  async function revokeLocalBrowserConsent(token) {
138
109
  await consent.revoke(token);
139
- const { invalidateBrowserConsentLifetimes: invalidateBrowserConsentLifetimes2 } = await import("./consent-lifetime-PTGAZQSU.js");
110
+ const { invalidateBrowserConsentLifetimes: invalidateBrowserConsentLifetimes2 } = await import("./consent-lifetime-M7PS6RUU.js");
140
111
  await invalidateBrowserConsentLifetimes2(await consent.fingerprint());
141
112
  }
142
113
  function watchBrowserConsentChanges(changed) {
@@ -159,111 +130,6 @@ import { networkInterfaces } from "os";
159
130
  import { isIP } from "net";
160
131
  import { lookup } from "dns/promises";
161
132
 
162
- // shared/hosted-web-timeouts.ts
163
- var WEB_CONNECT_TIMEOUT_MS = 1e4;
164
- var WEB_CALL_TIMEOUT_MS = 3e4;
165
- var WEB_STREAM_TIMEOUT_MS = 12e4;
166
-
167
- // server/config.ts
168
- var SERVER_PORT = process.env.SERVER_PORT ? parseInt(process.env.SERVER_PORT, 10) : 6274;
169
- var SERVER_HOSTNAME = process.env.ENVIRONMENT === "dev" ? "localhost" : "127.0.0.1";
170
- var LOCAL_SERVER_ADDR = `http://localhost:${SERVER_PORT}`;
171
- var HOSTED_MODE = process.env.VITE_MCPJAM_HOSTED_MODE === "true";
172
- var LOCAL_BROWSER_ENABLED = !HOSTED_MODE && process.env.MCPJAM_LOCAL_BROWSER_ENABLED !== "false";
173
- var LOCAL_COMPUTER_ENABLED = !HOSTED_MODE && process.env.MCPJAM_LOCAL_COMPUTER_ENABLED !== "false";
174
- var LOCAL_HARNESS_ENABLED = !HOSTED_MODE && process.env.MCPJAM_LOCAL_HARNESS_ENABLED === "true";
175
- var SCHEDULED_EVALS_WRITE_ENABLED = process.env.MCPJAM_SCHEDULED_EVALS_WRITE_ENABLED === "true";
176
- var WEBMCP_INSPECTOR_ENABLED = process.env.MCPJAM_WEBMCP_INSPECTOR_ENABLED !== "false";
177
- function webmcpInspectorHostedEnabled(env = process.env) {
178
- return HOSTED_MODE && env.MCPJAM_WEBMCP_INSPECTOR_HOSTED_ENABLED === "1";
179
- }
180
- function webmcpInspectorReachable(env = process.env) {
181
- if (!WEBMCP_INSPECTOR_ENABLED) return false;
182
- return !HOSTED_MODE || webmcpInspectorHostedEnabled(env);
183
- }
184
- function hostedBrowserEnabled(env = process.env) {
185
- return env.HOSTED_BROWSER_TOOLS_ENABLED === "1";
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
- }
193
- function webmcpPageToolsMode(env = process.env) {
194
- return env.MCPJAM_WEBMCP_PAGE_TOOLS === "verbs" ? "verbs" : "first_class";
195
- }
196
- var EVAL_WIDGET_MODEL_CONTEXT = process.env.MCPJAM_EVAL_WIDGET_MODEL_CONTEXT === "true";
197
- var WEB_ALLOWED_ORIGINS = (process.env.WEB_ALLOWED_ORIGINS ?? "").split(",").map((origin) => origin.trim()).filter((origin) => origin.length > 0);
198
- var CLIENT_PORT = process.env.CLIENT_PORT || "5173";
199
- var DEFAULT_CORS_ORIGINS = [
200
- `http://localhost:${CLIENT_PORT}`,
201
- // Vite dev server
202
- "http://localhost:8080",
203
- // Electron renderer dev server
204
- `http://localhost:${SERVER_PORT}`,
205
- // Hono server
206
- `http://127.0.0.1:${SERVER_PORT}`,
207
- // Hono server production
208
- "https://staging.mcpjam.com"
209
- // Hosted deployment
210
- ];
211
- var CORS_ORIGINS = HOSTED_MODE && WEB_ALLOWED_ORIGINS.length > 0 ? WEB_ALLOWED_ORIGINS : Array.from(/* @__PURE__ */ new Set([...DEFAULT_CORS_ORIGINS, ...WEB_ALLOWED_ORIGINS]));
212
- var CORS_OPTIONS = {
213
- origin: CORS_ORIGINS,
214
- credentials: true,
215
- exposeHeaders: ["x-request-id", "x-mcpjam-error-origin"]
216
- };
217
- var ELICITATION_FORM_TTL_MS = 5 * 6e4;
218
- var ELICITATION_URL_CONSENT_TTL_MS = 2 * 6e4;
219
- var ELICITATION_POLL_INTERVAL_MS = 1e3;
220
- var ELICITATION_POLL_JITTER_MS = 250;
221
- var ELICITATION_POLL_MAX_FAILURES = 5;
222
- var ELICITATION_SERVICE_ROUTE_TIMEOUT_MS = 1e4;
223
- var ELICITATION_TIMEOUT_EXTENSION_MS = ELICITATION_FORM_TTL_MS + 3e4;
224
- var MRTR_CONTINUATION_TTL_MS = 10 * 6e4;
225
- var MRTR_CONTINUATION_ROUTE_TIMEOUT_MS = 1e4;
226
- var MRTR_CONTINUATION_LEASE_TTL_MS = 4 * MRTR_CONTINUATION_ROUTE_TIMEOUT_MS + WEB_CALL_TIMEOUT_MS + 6e4;
227
- var MRTR_RESUME_STATE_MAX_BYTES = 128 * 1024;
228
- var MRTR_DISPLAY_FIELD_MAX_BYTES = 16 * 1024;
229
- var MRTR_RESPONSE_CONTENT_MAX_BYTES = 64 * 1024;
230
- var MRTR_TEARDOWN_TIMEOUT_MS = 5e3;
231
- var MCPJAM_HOSTED_ORIGIN = process.env.MCPJAM_HOSTED_ORIGIN?.replace(/\/+$/, "") || "https://app.mcpjam.com";
232
- var MCPJAM_PUBLIC_ORIGIN = process.env.MCPJAM_PUBLIC_ORIGIN?.replace(/\/+$/, "") || null;
233
- function parseAllowedHosts(raw) {
234
- return raw ? raw.split(",").map((h) => h.trim().toLowerCase()).filter((h) => h.length > 0) : [];
235
- }
236
- var ALLOWED_HOSTS = parseAllowedHosts(
237
- process.env.MCPJAM_ALLOWED_HOSTS
238
- );
239
- var CANIUSE_LANDING_HOSTS = new Set(
240
- (process.env.CANIUSE_LANDING_HOSTS ?? "caniuse.dev,www.caniuse.dev").split(",").map((h) => h.trim().toLowerCase()).filter((h) => h.length > 0)
241
- );
242
- var SCORE_LANDING_HOSTS = new Set(
243
- (process.env.SCORE_LANDING_HOSTS ?? "score.mcpjam.com,www.score.mcpjam.com").split(",").map((h) => h.trim().toLowerCase()).filter((h) => h.length > 0)
244
- );
245
- var BARE_HOSTNAME = /^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$/;
246
- function parseSandboxHosts(raw) {
247
- return new Set(
248
- raw.split(",").map((h) => h.trim().toLowerCase()).filter((h) => BARE_HOSTNAME.test(h))
249
- );
250
- }
251
- var SANDBOX_HOSTS = parseSandboxHosts(
252
- process.env.SANDBOX_HOSTS ?? "sandbox.mcpjam.com,sandbox-staging.mcpjam.com"
253
- );
254
- function resolveSandboxIsolation(sandboxHosts = SANDBOX_HOSTS, hostedOrigin = MCPJAM_HOSTED_ORIGIN) {
255
- if (sandboxHosts.size === 0) {
256
- return "unset";
257
- }
258
- let appHost;
259
- try {
260
- appHost = new URL(hostedOrigin).hostname.toLowerCase();
261
- } catch {
262
- return "unset";
263
- }
264
- return sandboxHosts.has(appHost) ? "same-origin" : "ok";
265
- }
266
-
267
133
  // server/utils/inspector-frontend-url.ts
268
134
  function getInspectorFrontendUrl(options = {}) {
269
135
  const explicitFrontendUrl = process.env.MCPJAM_INSPECTOR_FRONTEND_URL?.trim() || process.env.FRONTEND_URL?.trim();
@@ -626,57 +492,10 @@ async function invalidateBrowserConsentLifetimes(current) {
626
492
  }
627
493
 
628
494
  export {
629
- WEB_CONNECT_TIMEOUT_MS,
630
- WEB_CALL_TIMEOUT_MS,
631
- WEB_STREAM_TIMEOUT_MS,
632
- SERVER_PORT,
633
- LOCAL_SERVER_ADDR,
634
- HOSTED_MODE,
635
- LOCAL_BROWSER_ENABLED,
636
- LOCAL_COMPUTER_ENABLED,
637
- LOCAL_HARNESS_ENABLED,
638
- SCHEDULED_EVALS_WRITE_ENABLED,
639
- WEBMCP_INSPECTOR_ENABLED,
640
- webmcpInspectorHostedEnabled,
641
- webmcpInspectorReachable,
642
- hostedBrowserEnabled,
643
- browserShapeRedactionEnabled,
644
- browserSecretPlaceholdersEnabled,
645
- webmcpPageToolsMode,
646
- EVAL_WIDGET_MODEL_CONTEXT,
647
- WEB_ALLOWED_ORIGINS,
648
- CORS_ORIGINS,
649
- CORS_OPTIONS,
650
- ELICITATION_FORM_TTL_MS,
651
- ELICITATION_URL_CONSENT_TTL_MS,
652
- ELICITATION_POLL_INTERVAL_MS,
653
- ELICITATION_POLL_JITTER_MS,
654
- ELICITATION_POLL_MAX_FAILURES,
655
- ELICITATION_SERVICE_ROUTE_TIMEOUT_MS,
656
- ELICITATION_TIMEOUT_EXTENSION_MS,
657
- MRTR_CONTINUATION_TTL_MS,
658
- MRTR_CONTINUATION_ROUTE_TIMEOUT_MS,
659
- MRTR_CONTINUATION_LEASE_TTL_MS,
660
- MRTR_RESUME_STATE_MAX_BYTES,
661
- MRTR_DISPLAY_FIELD_MAX_BYTES,
662
- MRTR_RESPONSE_CONTENT_MAX_BYTES,
663
- MRTR_TEARDOWN_TIMEOUT_MS,
664
- MCPJAM_HOSTED_ORIGIN,
665
- MCPJAM_PUBLIC_ORIGIN,
666
- parseAllowedHosts,
667
- ALLOWED_HOSTS,
668
- CANIUSE_LANDING_HOSTS,
669
- SCORE_LANDING_HOSTS,
670
- SANDBOX_HOSTS,
671
- resolveSandboxIsolation,
672
495
  getInspectorFrontendUrl,
673
496
  registerBrowserController,
674
497
  createLocalBrowserSecurityPolicy,
675
498
  secureDriverContext,
676
- mintCapabilityToken,
677
- capabilityFingerprint,
678
- capabilityMatches,
679
- persistCapabilityState,
680
499
  createDeviceConsent,
681
500
  BROWSER_CONSENT_HEADER,
682
501
  grantLocalBrowserConsent,
@@ -687,4 +506,4 @@ export {
687
506
  createBrowserConsentLifetime,
688
507
  invalidateBrowserConsentLifetimes
689
508
  };
690
- //# sourceMappingURL=chunk-5RE7KJ2M.js.map
509
+ //# sourceMappingURL=chunk-4PYR7GMQ.js.map