@mcpjam/inspector 3.12.3 → 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.
- package/README.md +29 -21
- package/bin/access-link.mjs +53 -0
- package/bin/start.js +47 -14
- package/dist/client/assets/OAuthDesktopReturnNotice-B_x9xTE-.css +2 -0
- package/dist/client/assets/OAuthDesktopReturnNotice-LlC451lX.js +11 -0
- package/dist/client/assets/{app-bootstrap-C1Jn01kP.js → app-bootstrap-2jatN7gw.js} +376 -374
- package/dist/client/assets/{button-RD2Dghjp.js → button-B2OH2ei2.js} +2 -2
- package/dist/client/assets/{chunk-YOKDWASO-DTTU1wSE.js → chunk-YOKDWASO-uJ3KOQV7.js} +5 -5
- package/dist/client/assets/{dead-clicks-autocapture-CDkbT21a.js → dead-clicks-autocapture-D055GjVp.js} +2 -2
- package/dist/client/assets/{error-reporting-Dg5b1JwS.js → error-reporting-DGP36KLx.js} +57 -57
- package/dist/client/assets/{error-reporting-_SEhX6IL.js → error-reporting-FWZKbZxG.js} +1 -1
- package/dist/client/assets/{exception-autocapture-CtxHwPtn.js → exception-autocapture-103gdJjL.js} +2 -2
- package/dist/client/assets/{failed-request-tracker-kUaJ-sVM.js → failed-request-tracker-Cp9_VFMm.js} +2 -2
- package/dist/client/assets/{highlighted-body-KPVGNVTW-CBC2hHHb.js → highlighted-body-KPVGNVTW-Dx70h1nm.js} +2 -2
- package/dist/client/assets/index-rskHnM3O.js +4 -0
- package/dist/client/assets/{jszip.min-B3Qii_az.js → jszip.min-CwJyI5tb.js} +2 -2
- package/dist/client/assets/{mermaid-HWGCJPDP-BzT3-9sO.js → mermaid-HWGCJPDP-Ck3prJKl.js} +1 -1
- package/dist/client/assets/{posthog-recorder-B06ULcLl.js → posthog-recorder-tKuMFijV.js} +2 -2
- package/dist/client/assets/{preload-helper-DvWwGI6x.js → preload-helper-DrcoTQ49.js} +2 -2
- package/dist/client/assets/{rolldown-runtime-DVMSi0Yr.js → rolldown-runtime-7FnpGOz6.js} +1 -1
- package/dist/client/assets/{surveys-D941hgn3.js → surveys-BsZYxM6N.js} +2 -2
- package/dist/client/assets/{trace-timeline-Bk3hAXNq.js → trace-timeline-BOZvHcOG.js} +1 -1
- package/dist/client/assets/{trace-timeline-DVZqlQSW.js → trace-timeline-Bf9Oai70.js} +8 -8
- package/dist/client/assets/{web-vitals-DZUBt4dL.js → web-vitals-DdzaVN3H.js} +2 -2
- package/dist/client/index.html +7 -7
- package/dist/server/chunk-3EDQFXTF.js +4801 -0
- package/dist/server/{chunk-5RE7KJ2M.js → chunk-4PYR7GMQ.js} +16 -197
- package/dist/server/{chunk-WGJHSGJP.js → chunk-QA6VJT6A.js} +961 -963
- package/dist/server/chunk-SH24KJBI.js +194 -0
- package/dist/server/{consent-lifetime-PTGAZQSU.js → consent-lifetime-M7PS6RUU.js} +3 -2
- package/dist/server/harness-install-cli.js +1 -1
- package/dist/server/index.js +15110 -16012
- package/dist/server/local-turn-XXOSZHMT.js +12 -0
- package/package.json +14 -11
- package/dist/client/assets/OAuthDesktopReturnNotice-C5D90OSm.js +0 -11
- package/dist/client/assets/OAuthDesktopReturnNotice-C95FI7VH.css +0 -2
- package/dist/client/assets/index-yOjxp36p.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
|
|
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
|
-
|
|
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
|
|
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-
|
|
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-
|
|
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-
|
|
509
|
+
//# sourceMappingURL=chunk-4PYR7GMQ.js.map
|