@inspectr/mcplab 1.31.0 → 1.32.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.
- package/dist/app/assets/index-CBxKXA35.js +267 -0
- package/dist/app/index.html +1 -1
- package/dist/app-server/evaluation-result-projection.d.ts.map +1 -1
- package/dist/app-server/evaluation-result-projection.js +5 -0
- package/dist/app-server/evaluation-result-projection.js.map +1 -1
- package/dist/app-server/inspectr-routes.d.ts +14 -0
- package/dist/app-server/inspectr-routes.d.ts.map +1 -0
- package/dist/app-server/inspectr-routes.js +35 -0
- package/dist/app-server/inspectr-routes.js.map +1 -0
- package/dist/app-server/inspectr-session-manager.d.ts +33 -34
- package/dist/app-server/inspectr-session-manager.d.ts.map +1 -1
- package/dist/app-server/inspectr-session-manager.js +70 -23
- package/dist/app-server/inspectr-session-manager.js.map +1 -1
- package/dist/app-server/router.d.ts.map +1 -1
- package/dist/app-server/router.js +32 -0
- package/dist/app-server/router.js.map +1 -1
- package/dist/app-server/run-queue-domain.d.ts +2 -0
- package/dist/app-server/run-queue-domain.d.ts.map +1 -1
- package/dist/app-server/run-queue-domain.js +2 -1
- package/dist/app-server/run-queue-domain.js.map +1 -1
- package/dist/app-server/run-queue-executor.d.ts +2 -0
- package/dist/app-server/run-queue-executor.d.ts.map +1 -1
- package/dist/app-server/run-queue-executor.js +67 -0
- package/dist/app-server/run-queue-executor.js.map +1 -1
- package/dist/app-server/runs-routes.d.ts +1 -0
- package/dist/app-server/runs-routes.d.ts.map +1 -1
- package/dist/app-server/runs-routes.js +1 -1
- package/dist/app-server/runs-routes.js.map +1 -1
- package/dist/cli.js +5 -0
- package/dist/cli.js.map +1 -1
- package/package.json +7 -4
- package/dist/app/assets/index-Cwogc_kk.js +0 -267
package/dist/app/index.html
CHANGED
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
<meta name="twitter:card" content="summary_large_image" />
|
|
17
17
|
<meta name="twitter:site" content="@Inspectr" />
|
|
18
18
|
<meta name="twitter:image" content="" />
|
|
19
|
-
<script type="module" crossorigin src="/assets/index-
|
|
19
|
+
<script type="module" crossorigin src="/assets/index-CBxKXA35.js"></script>
|
|
20
20
|
<link rel="stylesheet" crossorigin href="/assets/index-D5OYchKq.css">
|
|
21
21
|
</head>
|
|
22
22
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"evaluation-result-projection.d.ts","sourceRoot":"","sources":["../../src/app-server/evaluation-result-projection.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAc,MAAM,uBAAuB,CAAC;AAErE,yFAAyF;AACzF,wBAAgB,uBAAuB,CAAC,MAAM,EAAE;IAC9C,eAAe,EAAE,MAAM,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,WAAW,EAAE,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B,GAAG,WAAW,
|
|
1
|
+
{"version":3,"file":"evaluation-result-projection.d.ts","sourceRoot":"","sources":["../../src/app-server/evaluation-result-projection.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAc,MAAM,uBAAuB,CAAC;AAErE,yFAAyF;AACzF,wBAAgB,uBAAuB,CAAC,MAAM,EAAE;IAC9C,eAAe,EAAE,MAAM,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,WAAW,EAAE,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B,GAAG,WAAW,CA0Id"}
|
|
@@ -37,6 +37,8 @@ export function projectEvaluationResult(params) {
|
|
|
37
37
|
// Children share evaluation overrides, but Rover snapshots may omit them and
|
|
38
38
|
// MCP snapshots contain only the overrides for their selected scenarios.
|
|
39
39
|
const serverOverrideAll = executions.find((result) => (result.metadata.rerun_server_override_all?.length ?? 0) > 0)?.metadata.rerun_server_override_all;
|
|
40
|
+
// Trace URLs are keyed by per-run request IDs, so merging child executions cannot collide.
|
|
41
|
+
const langsmithTraceUrls = Object.fromEntries(executions.flatMap((result) => Object.entries(result.metadata.langsmith_trace_urls ?? {})));
|
|
40
42
|
const scenarioServerOverrides = Object.fromEntries(executions.flatMap((result) => Object.entries(result.metadata.rerun_scenario_server_overrides ?? {})));
|
|
41
43
|
const executionSources = new Set(executions.map((result) => result.metadata.execution_source).filter(Boolean));
|
|
42
44
|
const executionClients = new Set(executions.map((result) => result.metadata.execution_client).filter(Boolean));
|
|
@@ -85,6 +87,9 @@ export function projectEvaluationResult(params) {
|
|
|
85
87
|
sourceMetadata?.config_name ||
|
|
86
88
|
`Evaluation ${params.evaluationRunId}`,
|
|
87
89
|
...(params.runNote?.trim() ? { run_note: params.runNote.trim() } : {}),
|
|
90
|
+
...(Object.keys(langsmithTraceUrls).length > 0
|
|
91
|
+
? { langsmith_trace_urls: langsmithTraceUrls }
|
|
92
|
+
: {}),
|
|
88
93
|
...(rerunAgents.length > 0 ? { rerun_agents: rerunAgents } : {}),
|
|
89
94
|
...(rerunScenarioIds.length > 0 ? { rerun_scenario_ids: rerunScenarioIds } : {}),
|
|
90
95
|
...(serverOverrideAll ? { rerun_server_override_all: [...serverOverrideAll] } : {}),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"evaluation-result-projection.js","sourceRoot":"","sources":["../../src/app-server/evaluation-result-projection.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"evaluation-result-projection.js","sourceRoot":"","sources":["../../src/app-server/evaluation-result-projection.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { IncomingMessage, ServerResponse } from 'node:http';
|
|
2
|
+
import type { asJson as asJsonResponse, parseBody as parseRequestBody } from './http.js';
|
|
3
|
+
import type { InspectrSessionManager } from './inspectr-session-manager.js';
|
|
4
|
+
export declare function handleInspectrRoutes(params: {
|
|
5
|
+
req: IncomingMessage;
|
|
6
|
+
res: ServerResponse;
|
|
7
|
+
pathname: string;
|
|
8
|
+
method: string;
|
|
9
|
+
runsDir: string;
|
|
10
|
+
inspectrSessionManager: Pick<InspectrSessionManager, 'acquire'>;
|
|
11
|
+
parseBody: typeof parseRequestBody;
|
|
12
|
+
asJson: typeof asJsonResponse;
|
|
13
|
+
}): Promise<boolean>;
|
|
14
|
+
//# sourceMappingURL=inspectr-routes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inspectr-routes.d.ts","sourceRoot":"","sources":["../../src/app-server/inspectr-routes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AACjE,OAAO,KAAK,EAAE,MAAM,IAAI,cAAc,EAAE,SAAS,IAAI,gBAAgB,EAAE,MAAM,WAAW,CAAC;AACzF,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AAI5E,wBAAsB,oBAAoB,CAAC,MAAM,EAAE;IACjD,GAAG,EAAE,eAAe,CAAC;IACrB,GAAG,EAAE,cAAc,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,sBAAsB,EAAE,IAAI,CAAC,sBAAsB,EAAE,SAAS,CAAC,CAAC;IAChE,SAAS,EAAE,OAAO,gBAAgB,CAAC;IACnC,MAAM,EAAE,OAAO,cAAc,CAAC;CAC/B,GAAG,OAAO,CAAC,OAAO,CAAC,CA8BnB"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { getRunResults } from './runs-store.js';
|
|
2
|
+
import { respondWithRunStoreError } from './runs-routes.js';
|
|
3
|
+
export async function handleInspectrRoutes(params) {
|
|
4
|
+
const { req, res, pathname, method, runsDir, inspectrSessionManager, parseBody, asJson } = params;
|
|
5
|
+
const match = pathname.match(/^\/api\/runs\/([^/]+)\/inspectr$/);
|
|
6
|
+
if (!match || method !== 'POST')
|
|
7
|
+
return false;
|
|
8
|
+
let recordedOrigins;
|
|
9
|
+
try {
|
|
10
|
+
const results = getRunResults(decodeURIComponent(match[1]), runsDir);
|
|
11
|
+
recordedOrigins = new Set(results.scenarios.flatMap((scenario) => scenario.inspectr_origins ?? []));
|
|
12
|
+
}
|
|
13
|
+
catch (error) {
|
|
14
|
+
if (!respondWithRunStoreError(res, asJson, error))
|
|
15
|
+
throw error;
|
|
16
|
+
return true;
|
|
17
|
+
}
|
|
18
|
+
// JSON bodies may be `null` or a non-object; treat anything without a string origin as missing.
|
|
19
|
+
const body = (await parseBody(req));
|
|
20
|
+
const origin = typeof body?.origin === 'string' ? body.origin : '';
|
|
21
|
+
// Only origins recorded on the run can be started, never arbitrary URLs from the client.
|
|
22
|
+
if (!recordedOrigins.has(origin)) {
|
|
23
|
+
asJson(res, 400, { error: 'origin was not inspected with Inspectr in this run' });
|
|
24
|
+
return true;
|
|
25
|
+
}
|
|
26
|
+
try {
|
|
27
|
+
const { upstreamOrigin, dashboardUrl } = await inspectrSessionManager.acquire(origin);
|
|
28
|
+
asJson(res, 200, { session: { upstreamOrigin, dashboardUrl } });
|
|
29
|
+
}
|
|
30
|
+
catch (error) {
|
|
31
|
+
asJson(res, 502, { error: error instanceof Error ? error.message : String(error) });
|
|
32
|
+
}
|
|
33
|
+
return true;
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=inspectr-routes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inspectr-routes.js","sourceRoot":"","sources":["../../src/app-server/inspectr-routes.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAC;AAE5D,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,MAS1C;IACC,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,sBAAsB,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC;IAClG,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,kCAAkC,CAAC,CAAC;IACjE,IAAI,CAAC,KAAK,IAAI,MAAM,KAAK,MAAM;QAAE,OAAO,KAAK,CAAC;IAE9C,IAAI,eAA4B,CAAC;IACjC,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,aAAa,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;QACrE,eAAe,GAAG,IAAI,GAAG,CACvB,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,gBAAgB,IAAI,EAAE,CAAC,CACzE,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,CAAC,wBAAwB,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC;YAAE,MAAM,KAAK,CAAC;QAC/D,OAAO,IAAI,CAAC;IACd,CAAC;IACD,gGAAgG;IAChG,MAAM,IAAI,GAAG,CAAC,MAAM,SAAS,CAAC,GAAG,CAAC,CAAgC,CAAC;IACnE,MAAM,MAAM,GAAG,OAAO,IAAI,EAAE,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;IACnE,yFAAyF;IACzF,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;QACjC,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,oDAAoD,EAAE,CAAC,CAAC;QAClF,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,CAAC;QACH,MAAM,EAAE,cAAc,EAAE,YAAY,EAAE,GAAG,MAAM,sBAAsB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACtF,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,OAAO,EAAE,EAAE,cAAc,EAAE,YAAY,EAAE,EAAE,CAAC,CAAC;IAClE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACtF,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -1,45 +1,44 @@
|
|
|
1
1
|
import type { McpRequestHeaderContext } from '@inspectr/mcplab-core';
|
|
2
2
|
export interface InspectrProxySession {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
3
|
+
upstreamOrigin: string;
|
|
4
|
+
proxyOrigin: string;
|
|
5
|
+
dashboardUrl: string;
|
|
6
6
|
}
|
|
7
|
-
export declare function buildInspectrRequestHeaders(
|
|
8
|
-
context: McpRequestHeaderContext
|
|
9
|
-
): Record<string, string>;
|
|
7
|
+
export declare function buildInspectrRequestHeaders(context: McpRequestHeaderContext): Record<string, string>;
|
|
10
8
|
interface InspectrChild {
|
|
11
|
-
|
|
12
|
-
|
|
9
|
+
kill(signal?: NodeJS.Signals): boolean;
|
|
10
|
+
once(event: string, listener: (...args: any[]) => void): this;
|
|
13
11
|
}
|
|
14
12
|
interface InspectrSessionManagerOptions {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
command: string,
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
}
|
|
26
|
-
) => InspectrChild;
|
|
27
|
-
waitForReady?: (session: InspectrProxySession, child: InspectrChild) => Promise<void>;
|
|
13
|
+
storageRoot: string;
|
|
14
|
+
commandPath?: string;
|
|
15
|
+
log?: (message: string) => void;
|
|
16
|
+
/** Returns `count` distinct free local ports. */
|
|
17
|
+
allocatePorts?: (count: number) => Promise<number[]>;
|
|
18
|
+
spawn?: (command: string, args: string[], options: {
|
|
19
|
+
cwd: string;
|
|
20
|
+
stdio: ['ignore', 'ignore', 'ignore'];
|
|
21
|
+
}) => InspectrChild;
|
|
22
|
+
waitForReady?: (session: InspectrProxySession, child: InspectrChild) => Promise<void>;
|
|
28
23
|
}
|
|
29
24
|
export declare class InspectrSessionManager {
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
25
|
+
private readonly storageRoot;
|
|
26
|
+
private commandPath;
|
|
27
|
+
private readonly log;
|
|
28
|
+
private readonly allocatePorts;
|
|
29
|
+
private readonly spawn;
|
|
30
|
+
private readonly waitForReady;
|
|
31
|
+
private readonly sessions;
|
|
32
|
+
private readonly starting;
|
|
33
|
+
/** Every spawned process, including ones still starting, so shutdown can reach all of them. */
|
|
34
|
+
private readonly children;
|
|
35
|
+
constructor(options: InspectrSessionManagerOptions);
|
|
36
|
+
acquire(serverUrl: string): Promise<InspectrProxySession>;
|
|
37
|
+
/** Synchronously signals every running Inspectr process; safe to call from process exit hooks. */
|
|
38
|
+
stopAll(): void;
|
|
39
|
+
closeAll(): Promise<void>;
|
|
40
|
+
private start;
|
|
42
41
|
}
|
|
43
42
|
export declare function rewriteUrlThroughInspectr(serverUrl: string, proxyOrigin: string): string;
|
|
44
43
|
export {};
|
|
45
|
-
//# sourceMappingURL=inspectr-session-manager.d.ts.map
|
|
44
|
+
//# sourceMappingURL=inspectr-session-manager.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"inspectr-session-manager.d.ts","sourceRoot":"","sources":["../../src/app-server/inspectr-session-manager.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAErE,MAAM,WAAW,oBAAoB;IACnC,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,uBAAuB,GAC/B,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAYxB;AAED,UAAU,aAAa;IACrB,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,OAAO,GAAG,OAAO,CAAC;IACvC,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,GAAG,IAAI,CAAC;CAC/D;AAED,UAAU,6BAA6B;IACrC,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,
|
|
1
|
+
{"version":3,"file":"inspectr-session-manager.d.ts","sourceRoot":"","sources":["../../src/app-server/inspectr-session-manager.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAErE,MAAM,WAAW,oBAAoB;IACnC,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,uBAAuB,GAC/B,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAYxB;AAED,UAAU,aAAa;IACrB,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,OAAO,GAAG,OAAO,CAAC;IACvC,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,GAAG,IAAI,CAAC;CAC/D;AAED,UAAU,6BAA6B;IACrC,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,iDAAiD;IACjD,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACrD,KAAK,CAAC,EAAE,CACN,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAA;KAAE,KAC5D,aAAa,CAAC;IACnB,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,oBAAoB,EAAE,KAAK,EAAE,aAAa,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACvF;AAID,qBAAa,sBAAsB;IACjC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,WAAW,CAAqB;IACxC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAA4B;IAChD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAuC;IACrE,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAsD;IAC5E,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA6D;IAC1F,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAqC;IAC9D,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA8C;IACvE,+FAA+F;IAC/F,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA4B;IAErD,YAAY,OAAO,EAAE,6BAA6B,EAQjD;IAEK,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAY9D;IAED,kGAAkG;IAClG,OAAO,IAAI,IAAI,CAKd;IAEK,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAK9B;YAEa,KAAK;CA6DpB;AAiCD,wBAAgB,yBAAyB,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAQxF"}
|
|
@@ -21,17 +21,20 @@ export class InspectrSessionManager {
|
|
|
21
21
|
storageRoot;
|
|
22
22
|
commandPath;
|
|
23
23
|
log;
|
|
24
|
-
|
|
24
|
+
allocatePorts;
|
|
25
25
|
spawn;
|
|
26
26
|
waitForReady;
|
|
27
27
|
sessions = new Map();
|
|
28
28
|
starting = new Map();
|
|
29
|
+
/** Every spawned process, including ones still starting, so shutdown can reach all of them. */
|
|
30
|
+
children = new Set();
|
|
29
31
|
constructor(options) {
|
|
30
32
|
this.storageRoot = options.storageRoot;
|
|
31
|
-
this.commandPath = options.commandPath
|
|
33
|
+
this.commandPath = options.commandPath;
|
|
32
34
|
this.log = options.log ?? console.log;
|
|
33
|
-
this.
|
|
34
|
-
this.spawn =
|
|
35
|
+
this.allocatePorts = options.allocatePorts ?? allocateFreePorts;
|
|
36
|
+
this.spawn =
|
|
37
|
+
options.spawn ?? ((command, args, spawnOptions) => defaultSpawn(command, args, spawnOptions));
|
|
35
38
|
this.waitForReady = options.waitForReady ?? waitForPorts;
|
|
36
39
|
}
|
|
37
40
|
async acquire(serverUrl) {
|
|
@@ -48,6 +51,14 @@ export class InspectrSessionManager {
|
|
|
48
51
|
this.starting.set(upstreamOrigin, promise);
|
|
49
52
|
return promise;
|
|
50
53
|
}
|
|
54
|
+
/** Synchronously signals every running Inspectr process; safe to call from process exit hooks. */
|
|
55
|
+
stopAll() {
|
|
56
|
+
const children = [...this.children];
|
|
57
|
+
this.children.clear();
|
|
58
|
+
this.sessions.clear();
|
|
59
|
+
for (const child of children)
|
|
60
|
+
child.kill('SIGTERM');
|
|
61
|
+
}
|
|
51
62
|
async closeAll() {
|
|
52
63
|
await Promise.allSettled(this.starting.values());
|
|
53
64
|
const sessions = [...this.sessions.values()];
|
|
@@ -55,8 +66,7 @@ export class InspectrSessionManager {
|
|
|
55
66
|
await Promise.all(sessions.map((session) => stopChild(session.child)));
|
|
56
67
|
}
|
|
57
68
|
async start(upstreamOrigin) {
|
|
58
|
-
const proxyPort = await this.
|
|
59
|
-
const dashboardPort = await this.allocatePort();
|
|
69
|
+
const [proxyPort, dashboardPort] = await this.allocatePorts(2);
|
|
60
70
|
const cwd = join(this.storageRoot, originKey(upstreamOrigin));
|
|
61
71
|
mkdirSync(cwd, { recursive: true });
|
|
62
72
|
const channel = `mcplab-${originKey(upstreamOrigin)}`;
|
|
@@ -69,6 +79,8 @@ export class InspectrSessionManager {
|
|
|
69
79
|
proxyOrigin: `http://127.0.0.1:${proxyPort}`,
|
|
70
80
|
dashboardUrl: dashboardUrl.toString()
|
|
71
81
|
};
|
|
82
|
+
// Resolved on first use so the app server starts even when Inspectr is not installed.
|
|
83
|
+
this.commandPath ??= resolveInspectrCommand();
|
|
72
84
|
const child = this.spawn(this.commandPath, [
|
|
73
85
|
`--listen=127.0.0.1:${proxyPort}`,
|
|
74
86
|
`--app-port=${dashboardPort}`,
|
|
@@ -77,11 +89,20 @@ export class InspectrSessionManager {
|
|
|
77
89
|
`--channel-code=${channelCode}`,
|
|
78
90
|
'--print=false'
|
|
79
91
|
], { cwd, stdio: ['ignore', 'ignore', 'ignore'] });
|
|
92
|
+
this.children.add(child);
|
|
93
|
+
child.once('exit', () => this.children.delete(child));
|
|
94
|
+
let spawnError;
|
|
95
|
+
child.once('error', (error) => {
|
|
96
|
+
spawnError = error;
|
|
97
|
+
});
|
|
80
98
|
try {
|
|
81
99
|
await this.waitForReady(session, child);
|
|
82
100
|
}
|
|
83
101
|
catch (error) {
|
|
84
102
|
await stopChild(child);
|
|
103
|
+
if (spawnError?.code === 'ENOENT') {
|
|
104
|
+
throw new Error('Inspectr is not installed. Install it with `npm install -g @inspectr/inspectr` or Homebrew, then try again.');
|
|
105
|
+
}
|
|
85
106
|
throw new Error(`Inspectr failed to start for ${upstreamOrigin}: ${error instanceof Error ? error.message : String(error)}`);
|
|
86
107
|
}
|
|
87
108
|
this.log(`[mcplab-app] Inspectr started for ${session.upstreamOrigin}, proxy: ${session.proxyOrigin}, dashboard: ${session.dashboardUrl}`);
|
|
@@ -98,13 +119,20 @@ export class InspectrSessionManager {
|
|
|
98
119
|
return managed;
|
|
99
120
|
}
|
|
100
121
|
}
|
|
122
|
+
/** Prefers the optional @inspectr/inspectr dependency, else an `inspectr` on PATH. */
|
|
101
123
|
function resolveInspectrCommand() {
|
|
102
124
|
const require = createRequire(import.meta.url);
|
|
103
|
-
|
|
125
|
+
let packageJsonPath;
|
|
126
|
+
try {
|
|
127
|
+
packageJsonPath = require.resolve('@inspectr/inspectr/package.json');
|
|
128
|
+
}
|
|
129
|
+
catch {
|
|
130
|
+
return 'inspectr';
|
|
131
|
+
}
|
|
104
132
|
const manifest = JSON.parse(readFileSync(packageJsonPath, 'utf8'));
|
|
105
133
|
const bin = typeof manifest.bin === 'string' ? manifest.bin : manifest.bin?.inspectr;
|
|
106
134
|
if (!bin)
|
|
107
|
-
|
|
135
|
+
return 'inspectr';
|
|
108
136
|
const packageBin = join(dirname(packageJsonPath), bin);
|
|
109
137
|
return existsSync(packageBin) ? packageBin : 'inspectr';
|
|
110
138
|
}
|
|
@@ -123,26 +151,45 @@ function normalizeOrigin(serverUrl) {
|
|
|
123
151
|
}
|
|
124
152
|
export function rewriteUrlThroughInspectr(serverUrl, proxyOrigin) {
|
|
125
153
|
const original = new URL(serverUrl);
|
|
126
|
-
|
|
154
|
+
// Assign path and query onto the proxy URL: resolving them as a relative reference would treat
|
|
155
|
+
// a `//host/...` path as a new authority and bypass the proxy.
|
|
156
|
+
const proxied = new URL(proxyOrigin);
|
|
157
|
+
proxied.pathname = original.pathname;
|
|
158
|
+
proxied.search = original.search;
|
|
159
|
+
return proxied.toString();
|
|
127
160
|
}
|
|
128
161
|
function originKey(origin) {
|
|
129
162
|
return createHash('sha256').update(origin).digest('hex').slice(0, 16);
|
|
130
163
|
}
|
|
131
164
|
function tagPart(value) {
|
|
132
|
-
|
|
165
|
+
// Header values must be ByteStrings: drop accents, then replace anything that is not printable
|
|
166
|
+
// ASCII (and the tag delimiter) so names like "Claude – prod" or CJK cannot break requests.
|
|
167
|
+
return (value
|
|
168
|
+
.normalize('NFKD')
|
|
169
|
+
.replace(/[\u0300-\u036f]/g, '')
|
|
170
|
+
.replace(/[^\x20-\x7e]+|,+/g, '_')
|
|
171
|
+
.trim()
|
|
172
|
+
.slice(0, 120) || 'unknown');
|
|
133
173
|
}
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
174
|
+
/** Keeps every listener open until all ports are known, so the OS cannot hand out one twice. */
|
|
175
|
+
async function allocateFreePorts(count) {
|
|
176
|
+
const servers = Array.from({ length: count }, () => createServer());
|
|
177
|
+
try {
|
|
178
|
+
return await Promise.all(servers.map((server) => new Promise((resolve, reject) => {
|
|
179
|
+
server.once('error', reject);
|
|
180
|
+
server.listen(0, '127.0.0.1', () => {
|
|
181
|
+
const address = server.address();
|
|
182
|
+
const port = typeof address === 'object' && address ? address.port : 0;
|
|
183
|
+
if (port)
|
|
184
|
+
resolve(port);
|
|
185
|
+
else
|
|
186
|
+
reject(new Error('Could not allocate a local Inspectr port'));
|
|
187
|
+
});
|
|
188
|
+
})));
|
|
189
|
+
}
|
|
190
|
+
finally {
|
|
191
|
+
await Promise.all(servers.map((server) => new Promise((resolve) => server.listening ? server.close(() => resolve()) : resolve())));
|
|
192
|
+
}
|
|
146
193
|
}
|
|
147
194
|
async function waitForPorts(session, child) {
|
|
148
195
|
const ports = [new URL(session.proxyOrigin).port, new URL(session.dashboardUrl).port].map(Number);
|
|
@@ -157,7 +204,7 @@ async function waitForPorts(session, child) {
|
|
|
157
204
|
while (Date.now() < deadline) {
|
|
158
205
|
if (childExited)
|
|
159
206
|
throw new Error('Inspectr process exited during startup');
|
|
160
|
-
if (await Promise.all(ports.map(canConnect))) {
|
|
207
|
+
if ((await Promise.all(ports.map(canConnect))).every(Boolean)) {
|
|
161
208
|
stableChecks += 1;
|
|
162
209
|
if (stableChecks >= 2 && (await hasDashboardConfig(session.dashboardUrl)))
|
|
163
210
|
return;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"inspectr-session-manager.js","sourceRoot":"","sources":["../../src/app-server/inspectr-session-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAC9D,OAAO,EAAE,KAAK,IAAI,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAC1D,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAS5C,MAAM,UAAU,2BAA2B,CACzC,OAAgC;IAEhC,MAAM,IAAI,GAAG;QACX,QAAQ;QACR,cAAc,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;QACtC,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,mBAAmB,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACjF,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,gBAAgB,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5E,iBAAiB,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE;KAC/C,CAAC;IACF,OAAO;QACL,cAAc,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;QAC/B,mBAAmB,EAAE,OAAO,CAAC,SAAS,IAAI,cAAc,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;KACjF,CAAC;AACJ,CAAC;
|
|
1
|
+
{"version":3,"file":"inspectr-session-manager.js","sourceRoot":"","sources":["../../src/app-server/inspectr-session-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../../src/app-server/router.ts"],"names":[],"mappings":"AAmCA,OAAO,KAAK,EAAE,gBAAgB,EAAoC,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../../src/app-server/router.ts"],"names":[],"mappings":"AAmCA,OAAO,KAAK,EAAE,gBAAgB,EAAoC,MAAM,YAAY,CAAC;AAwCrF,OAAO,EAGL,KAAK,eAAe,EACrB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAuB,KAAK,MAAM,EAAsB,MAAM,sBAAsB,CAAC;AA2C5F,OAAO,KAAK,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAYjF,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,IAAI,CAAC,eAAe,EAAE,gBAAgB,CAAC,EAC9C,UAAU,EAAE,eAAe,GAAG,IAAI,EAClC,IAAI,EAAE,CAAC,OAAO,EAAE,kBAAkB,KAAK,OAAO,GAC7C,MAAM,GAAG,IAAI,CAOf;AAED,wBAAgB,0BAA0B,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAE3E;AAED,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,IAAI,CAAC,eAAe,EAAE,gBAAgB,CAAC,EAC9C,UAAU,EAAE,eAAe,GAAG,IAAI,EAClC,IAAI,EAAE,CAAC,OAAO,EAAE,kBAAkB,KAAK,OAAO,EAC9C,WAAW,EAAE,MAAM,GAAG,IAAI,EAC1B,aAAa,EAAE,MAAM,GACpB,MAAM,GAAG,IAAI,CAIf;AAKD,wBAAsB,cAAc,CAAC,OAAO,EAAE,gBAAgB,iBAiwB7D"}
|
|
@@ -25,6 +25,7 @@ import { handleScenarioAssistantRoutes } from './scenario-assistant.js';
|
|
|
25
25
|
import { handleResultAssistantRoutes } from './result-assistant.js';
|
|
26
26
|
import { handleEvalsRoutes } from './evals-routes.js';
|
|
27
27
|
import { handleRunsRoutes } from './runs-routes.js';
|
|
28
|
+
import { handleInspectrRoutes } from './inspectr-routes.js';
|
|
28
29
|
import { createRunQueueService } from './run-queue-domain.js';
|
|
29
30
|
import { createRunQueueState } from './run-queue-state.js';
|
|
30
31
|
import { fetchProviderModels } from './provider-models.js';
|
|
@@ -37,6 +38,7 @@ import { resolveAppDist } from './app-dist.js';
|
|
|
37
38
|
import { startBrowser } from './browser-launch.js';
|
|
38
39
|
import { formatLangSmithStatus, isLangSmithEnabled } from '../cli-branding.js';
|
|
39
40
|
import { getAppServerVersionInfo } from './version-info.js';
|
|
41
|
+
import { InspectrSessionManager } from './inspectr-session-manager.js';
|
|
40
42
|
import { LiveTestService } from './live-tests.js';
|
|
41
43
|
import { handleLiveTestRoutes } from './live-tests-routes.js';
|
|
42
44
|
import { proposeBrowserProviderProfile, sanitizeBrowserProviderLearningTrace, sanitizeBrowserProviderProposalDiagnostics } from './browser-provider-learning.js';
|
|
@@ -100,6 +102,19 @@ export async function startAppServer(options) {
|
|
|
100
102
|
runtimeSessions: oauthRuntimeSessions,
|
|
101
103
|
oauthDebuggerSessions
|
|
102
104
|
});
|
|
105
|
+
const inspectrSessionManager = new InspectrSessionManager({
|
|
106
|
+
storageRoot: join(settings.librariesDir, '.inspectr-sessions')
|
|
107
|
+
});
|
|
108
|
+
// Inspectr runs as child processes; stop them when the app server process goes away, not only on
|
|
109
|
+
// a graceful HTTP close. Signals are re-raised so the default termination still happens.
|
|
110
|
+
const stopInspectr = () => inspectrSessionManager.stopAll();
|
|
111
|
+
const stopInspectrOnSignal = (signal) => {
|
|
112
|
+
stopInspectr();
|
|
113
|
+
process.kill(process.pid, signal);
|
|
114
|
+
};
|
|
115
|
+
process.once('exit', stopInspectr);
|
|
116
|
+
process.once('SIGINT', stopInspectrOnSignal);
|
|
117
|
+
process.once('SIGTERM', stopInspectrOnSignal);
|
|
103
118
|
const assistantSessions = new Map();
|
|
104
119
|
const resultAssistantSessions = new Map();
|
|
105
120
|
const liveTestService = new LiveTestService({
|
|
@@ -172,6 +187,7 @@ export async function startAppServer(options) {
|
|
|
172
187
|
const runQueueService = createRunQueueService({
|
|
173
188
|
settings,
|
|
174
189
|
oauthSessionManager,
|
|
190
|
+
inspectrSessionManager,
|
|
175
191
|
deps: routeDeps,
|
|
176
192
|
jobs: jobs,
|
|
177
193
|
state: runQueueState,
|
|
@@ -313,6 +329,18 @@ export async function startAppServer(options) {
|
|
|
313
329
|
asJson(res, 200, settings);
|
|
314
330
|
return;
|
|
315
331
|
}
|
|
332
|
+
if (await handleInspectrRoutes({
|
|
333
|
+
req,
|
|
334
|
+
res,
|
|
335
|
+
pathname,
|
|
336
|
+
method,
|
|
337
|
+
runsDir: settings.runsDir,
|
|
338
|
+
inspectrSessionManager,
|
|
339
|
+
parseBody,
|
|
340
|
+
asJson
|
|
341
|
+
})) {
|
|
342
|
+
return;
|
|
343
|
+
}
|
|
316
344
|
if (pathname === '/api/rover/status' && method === 'GET') {
|
|
317
345
|
const connection = roverConnection.connection();
|
|
318
346
|
asJson(res, 200, {
|
|
@@ -694,6 +722,10 @@ export async function startAppServer(options) {
|
|
|
694
722
|
runQueueService.closeSubscribers();
|
|
695
723
|
roverConnection.close();
|
|
696
724
|
devMcp?.stop();
|
|
725
|
+
process.off('exit', stopInspectr);
|
|
726
|
+
process.off('SIGINT', stopInspectrOnSignal);
|
|
727
|
+
process.off('SIGTERM', stopInspectrOnSignal);
|
|
728
|
+
void inspectrSessionManager.closeAll();
|
|
697
729
|
});
|
|
698
730
|
const url = `http://${options.host}:${options.port}`;
|
|
699
731
|
const logPrefix = '[mcplab-app]';
|