@stigmer/runner 3.4.0 → 3.5.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/.build-fingerprint +1 -1
- package/dist/activities/attach-session.d.ts +34 -0
- package/dist/activities/attach-session.js +95 -0
- package/dist/activities/attach-session.js.map +1 -0
- package/dist/activities/discover-mcp-server.d.ts +9 -0
- package/dist/activities/discover-mcp-server.js +6 -1
- package/dist/activities/discover-mcp-server.js.map +1 -1
- package/dist/activities/execute-cursor/connect-backfill.d.ts +2 -1
- package/dist/activities/execute-cursor/connect-backfill.js +2 -2
- package/dist/activities/execute-cursor/connect-backfill.js.map +1 -1
- package/dist/activities/execute-cursor/fetch-interceptor.js +31 -0
- package/dist/activities/execute-cursor/fetch-interceptor.js.map +1 -1
- package/dist/activities/execute-cursor/index.js +70 -3
- package/dist/activities/execute-cursor/index.js.map +1 -1
- package/dist/activities/execute-cursor/mcp-resolver.d.ts +7 -1
- package/dist/activities/execute-cursor/mcp-resolver.js +15 -2
- package/dist/activities/execute-cursor/mcp-resolver.js.map +1 -1
- package/dist/activities/execute-cursor/sdk-warmup.d.ts +44 -0
- package/dist/activities/execute-cursor/sdk-warmup.js +61 -0
- package/dist/activities/execute-cursor/sdk-warmup.js.map +1 -0
- package/dist/activities/execute-deep-agent/setup.js +48 -5
- package/dist/activities/execute-deep-agent/setup.js.map +1 -1
- package/dist/activities/execute-deep-agent/subagent-transformer.d.ts +9 -1
- package/dist/activities/execute-deep-agent/subagent-transformer.js +19 -5
- package/dist/activities/execute-deep-agent/subagent-transformer.js.map +1 -1
- package/dist/client/stigmer-client.d.ts +13 -1
- package/dist/client/stigmer-client.js +40 -5
- package/dist/client/stigmer-client.js.map +1 -1
- package/dist/client/token-claims.d.ts +9 -6
- package/dist/client/token-claims.js +22 -6
- package/dist/client/token-claims.js.map +1 -1
- package/dist/main.d.ts +8 -1
- package/dist/main.js +122 -2
- package/dist/main.js.map +1 -1
- package/dist/middleware/index.d.ts +0 -1
- package/dist/middleware/index.js +0 -1
- package/dist/middleware/index.js.map +1 -1
- package/dist/otel-metrics.d.ts +10 -1
- package/dist/otel-metrics.js +22 -1
- package/dist/otel-metrics.js.map +1 -1
- package/dist/pool-member.d.ts +61 -0
- package/dist/pool-member.js +51 -0
- package/dist/pool-member.js.map +1 -0
- package/dist/runner-manager.d.ts +7 -0
- package/dist/runner-manager.js +39 -1
- package/dist/runner-manager.js.map +1 -1
- package/dist/runner.js +15 -1
- package/dist/runner.js.map +1 -1
- package/dist/shared/cold-start-timing.d.ts +89 -0
- package/dist/shared/cold-start-timing.js +166 -0
- package/dist/shared/cold-start-timing.js.map +1 -0
- package/dist/shared/connect-backfill.d.ts +2 -1
- package/dist/shared/connect-backfill.js +4 -2
- package/dist/shared/connect-backfill.js.map +1 -1
- package/dist/shared/mcp-manager.d.ts +5 -15
- package/dist/shared/mcp-manager.js +5 -32
- package/dist/shared/mcp-manager.js.map +1 -1
- package/dist/shared/mcp-resolver.d.ts +15 -5
- package/dist/shared/mcp-resolver.js +23 -6
- package/dist/shared/mcp-resolver.js.map +1 -1
- package/dist/shared/mcp-transport-guard.d.ts +53 -0
- package/dist/shared/mcp-transport-guard.js +70 -0
- package/dist/shared/mcp-transport-guard.js.map +1 -0
- package/dist/shared/model-registry.d.ts +4 -6
- package/dist/shared/model-registry.js +4 -6
- package/dist/shared/model-registry.js.map +1 -1
- package/dist/shared/tool-kind.js +6 -0
- package/dist/shared/tool-kind.js.map +1 -1
- package/dist/tools/index.d.ts +27 -0
- package/dist/tools/index.js +27 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/think-tool.js.map +1 -0
- package/dist/tools/url-guard.d.ts +64 -0
- package/dist/tools/url-guard.js +211 -0
- package/dist/tools/url-guard.js.map +1 -0
- package/dist/tools/web-fetch-tool.d.ts +53 -0
- package/dist/tools/web-fetch-tool.js +216 -0
- package/dist/tools/web-fetch-tool.js.map +1 -0
- package/package.json +4 -2
- package/src/__tests__/otel-metrics.test.ts +6 -0
- package/src/__tests__/pool-member.test.ts +76 -0
- package/src/activities/__tests__/attach-session.test.ts +133 -0
- package/src/activities/__tests__/discover-mcp-server.test.ts +34 -11
- package/src/activities/attach-session.ts +112 -0
- package/src/activities/discover-mcp-server.ts +19 -1
- package/src/activities/execute-cursor/__tests__/fetch-interceptor.test.ts +77 -0
- package/src/activities/execute-cursor/__tests__/sdk-warmup.test.ts +45 -0
- package/src/activities/execute-cursor/connect-backfill.ts +3 -0
- package/src/activities/execute-cursor/fetch-interceptor.ts +39 -0
- package/src/activities/execute-cursor/index.ts +72 -3
- package/src/activities/execute-cursor/mcp-resolver.ts +21 -2
- package/src/activities/execute-cursor/sdk-warmup.ts +68 -0
- package/src/activities/execute-deep-agent/__tests__/subagent-transformer.test.ts +24 -0
- package/src/activities/execute-deep-agent/setup.ts +48 -7
- package/src/activities/execute-deep-agent/subagent-transformer.ts +27 -2
- package/src/client/__tests__/stigmer-client.test.ts +77 -2
- package/src/client/__tests__/token-claims.test.ts +15 -1
- package/src/client/stigmer-client.ts +51 -6
- package/src/client/token-claims.ts +29 -6
- package/src/main.ts +139 -2
- package/src/middleware/index.ts +0 -1
- package/src/otel-metrics.ts +25 -1
- package/src/pool-member.ts +99 -0
- package/src/runner-manager.ts +52 -0
- package/src/runner.ts +15 -0
- package/src/shared/__tests__/cold-start-timing.test.ts +271 -0
- package/src/shared/__tests__/connect-backfill.test.ts +11 -11
- package/src/shared/__tests__/mcp-manager.test.ts +2 -73
- package/src/shared/__tests__/mcp-resolver.test.ts +108 -0
- package/src/shared/__tests__/mcp-transport-guard.test.ts +71 -0
- package/src/shared/__tests__/model-registry.test.ts +6 -4
- package/src/shared/cold-start-timing.ts +197 -0
- package/src/shared/connect-backfill.ts +5 -1
- package/src/shared/mcp-manager.ts +4 -41
- package/src/shared/mcp-resolver.ts +29 -6
- package/src/shared/mcp-transport-guard.ts +81 -0
- package/src/shared/model-registry.ts +4 -6
- package/src/shared/tool-kind.ts +6 -0
- package/src/tools/__tests__/url-guard.test.ts +137 -0
- package/src/tools/__tests__/web-fetch-tool.test.ts +193 -0
- package/src/tools/index.ts +28 -0
- package/src/tools/url-guard.ts +232 -0
- package/src/tools/web-fetch-tool.ts +275 -0
- package/dist/middleware/think-tool.js.map +0 -1
- /package/dist/{middleware → tools}/think-tool.d.ts +0 -0
- /package/dist/{middleware → tools}/think-tool.js +0 -0
- /package/src/{middleware → tools}/__tests__/think-tool.test.ts +0 -0
- /package/src/{middleware → tools}/think-tool.ts +0 -0
|
@@ -4,9 +4,12 @@
|
|
|
4
4
|
* Wraps @langchain/mcp-adapters MultiServerMCPClient with:
|
|
5
5
|
* - Conversion from ResolvedMcpServer[] to the SDK's Connection config
|
|
6
6
|
* - Proper async cleanup via close()
|
|
7
|
-
* - Cloud compatibility validation (warn on non-installable stdio commands)
|
|
8
7
|
* - Tool filtering based on discovered capabilities
|
|
9
8
|
*
|
|
9
|
+
* Transport policy (stdio is local-runner-only) is enforced upstream at
|
|
10
|
+
* resolution time by shared/mcp-transport-guard.ts — servers reaching
|
|
11
|
+
* this manager have already passed it.
|
|
12
|
+
*
|
|
10
13
|
* The Cursor execution path does NOT use this manager — it passes MCP
|
|
11
14
|
* configs directly to the Cursor SDK via toCursorMcpConfig(). This
|
|
12
15
|
* manager is exclusively for LangGraph-based deep agent executions.
|
|
@@ -15,17 +18,6 @@ import { MultiServerMCPClient } from "@langchain/mcp-adapters";
|
|
|
15
18
|
import type { Connection } from "@langchain/mcp-adapters";
|
|
16
19
|
import type { DynamicStructuredTool } from "@langchain/core/tools";
|
|
17
20
|
import type { ResolvedMcpServer } from "./mcp-resolver.js";
|
|
18
|
-
/**
|
|
19
|
-
* Classifies a stdio command's compatibility with cloud execution.
|
|
20
|
-
* Returns true for commands that are installable/available in typical
|
|
21
|
-
* cloud environments (npx, node, uvx, python).
|
|
22
|
-
*/
|
|
23
|
-
export declare function isCloudCompatibleCommand(command: string): boolean;
|
|
24
|
-
/**
|
|
25
|
-
* Log warnings for MCP servers that may not work in cloud mode.
|
|
26
|
-
* Does not filter or reject — just provides operator visibility.
|
|
27
|
-
*/
|
|
28
|
-
export declare function warnCloudIncompatibleServers(servers: ResolvedMcpServer[], isCloudMode: boolean): void;
|
|
29
21
|
/**
|
|
30
22
|
* Convert harness-agnostic ResolvedMcpServer[] into the
|
|
31
23
|
* MultiServerMCPClient connection config format.
|
|
@@ -42,6 +34,4 @@ export interface McpConnectionResult {
|
|
|
42
34
|
* The caller is responsible for calling result.client.close() when
|
|
43
35
|
* done — typically in a finally block or via a cleanup handler.
|
|
44
36
|
*/
|
|
45
|
-
export declare function connectMcpServers(servers: ResolvedMcpServer[]
|
|
46
|
-
isCloudMode?: boolean;
|
|
47
|
-
}): Promise<McpConnectionResult>;
|
|
37
|
+
export declare function connectMcpServers(servers: ResolvedMcpServer[]): Promise<McpConnectionResult>;
|
|
@@ -4,41 +4,17 @@
|
|
|
4
4
|
* Wraps @langchain/mcp-adapters MultiServerMCPClient with:
|
|
5
5
|
* - Conversion from ResolvedMcpServer[] to the SDK's Connection config
|
|
6
6
|
* - Proper async cleanup via close()
|
|
7
|
-
* - Cloud compatibility validation (warn on non-installable stdio commands)
|
|
8
7
|
* - Tool filtering based on discovered capabilities
|
|
9
8
|
*
|
|
9
|
+
* Transport policy (stdio is local-runner-only) is enforced upstream at
|
|
10
|
+
* resolution time by shared/mcp-transport-guard.ts — servers reaching
|
|
11
|
+
* this manager have already passed it.
|
|
12
|
+
*
|
|
10
13
|
* The Cursor execution path does NOT use this manager — it passes MCP
|
|
11
14
|
* configs directly to the Cursor SDK via toCursorMcpConfig(). This
|
|
12
15
|
* manager is exclusively for LangGraph-based deep agent executions.
|
|
13
16
|
*/
|
|
14
17
|
import { MultiServerMCPClient } from "@langchain/mcp-adapters";
|
|
15
|
-
const CLOUD_SAFE_COMMANDS = new Set(["npx", "node", "uvx", "python", "python3"]);
|
|
16
|
-
/**
|
|
17
|
-
* Classifies a stdio command's compatibility with cloud execution.
|
|
18
|
-
* Returns true for commands that are installable/available in typical
|
|
19
|
-
* cloud environments (npx, node, uvx, python).
|
|
20
|
-
*/
|
|
21
|
-
export function isCloudCompatibleCommand(command) {
|
|
22
|
-
const base = command.split("/").pop() ?? command;
|
|
23
|
-
return CLOUD_SAFE_COMMANDS.has(base);
|
|
24
|
-
}
|
|
25
|
-
/**
|
|
26
|
-
* Log warnings for MCP servers that may not work in cloud mode.
|
|
27
|
-
* Does not filter or reject — just provides operator visibility.
|
|
28
|
-
*/
|
|
29
|
-
export function warnCloudIncompatibleServers(servers, isCloudMode) {
|
|
30
|
-
if (!isCloudMode)
|
|
31
|
-
return;
|
|
32
|
-
for (const server of servers) {
|
|
33
|
-
if (server.connectionType === "stdio" && server.command) {
|
|
34
|
-
if (!isCloudCompatibleCommand(server.command)) {
|
|
35
|
-
console.warn(`[MCP] Server '${server.slug}' uses stdio command '${server.command}' ` +
|
|
36
|
-
`which may not be available in cloud execution environments. ` +
|
|
37
|
-
`Consider using an HTTP MCP server or an npx-installable package.`);
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
18
|
/**
|
|
43
19
|
* Convert harness-agnostic ResolvedMcpServer[] into the
|
|
44
20
|
* MultiServerMCPClient connection config format.
|
|
@@ -75,10 +51,7 @@ export function toMcpClientConfig(servers) {
|
|
|
75
51
|
* The caller is responsible for calling result.client.close() when
|
|
76
52
|
* done — typically in a finally block or via a cleanup handler.
|
|
77
53
|
*/
|
|
78
|
-
export async function connectMcpServers(servers
|
|
79
|
-
if (options?.isCloudMode) {
|
|
80
|
-
warnCloudIncompatibleServers(servers, true);
|
|
81
|
-
}
|
|
54
|
+
export async function connectMcpServers(servers) {
|
|
82
55
|
const connectionConfig = toMcpClientConfig(servers);
|
|
83
56
|
if (Object.keys(connectionConfig).length === 0) {
|
|
84
57
|
const client = new MultiServerMCPClient({});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-manager.js","sourceRoot":"","sources":["../../src/shared/mcp-manager.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"mcp-manager.js","sourceRoot":"","sources":["../../src/shared/mcp-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,15 +1,20 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Resolves Stigmer McpServerUsage references into an intermediate
|
|
3
|
-
* ResolvedMcpServer format
|
|
3
|
+
* ResolvedMcpServer format.
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
5
|
+
* Consumers: the deep-agent harness (execute-deep-agent/setup.ts), the
|
|
6
|
+
* connect backfill (shared/connect-backfill.ts), and the discovery
|
|
7
|
+
* activity (activities/discover-mcp-server.ts, via mcpServerToResolved).
|
|
8
|
+
* NOTE: the Cursor harness does NOT use this module — it has its own
|
|
9
|
+
* near-duplicate resolver at activities/execute-cursor/mcp-resolver.ts.
|
|
10
|
+
* A behavioral change here (like the transport guard) must be mirrored
|
|
11
|
+
* there until the two are consolidated.
|
|
8
12
|
*/
|
|
9
13
|
import type { McpServerUsage } from "@stigmer/protos/ai/stigmer/agentic/agent/v1/spec_pb";
|
|
10
14
|
import type { McpServer } from "@stigmer/protos/ai/stigmer/agentic/mcpserver/v1/api_pb";
|
|
11
15
|
import type { ToolApprovalPolicy } from "@stigmer/protos/ai/stigmer/agentic/mcpserver/v1/spec_pb";
|
|
12
16
|
import type { StigmerClient } from "../client/stigmer-client.js";
|
|
17
|
+
import { type McpTransportPosture } from "./mcp-transport-guard.js";
|
|
13
18
|
/**
|
|
14
19
|
* Harness-agnostic intermediate representation of a resolved MCP server.
|
|
15
20
|
* Contains connection info and approval policies. Each harness maps this
|
|
@@ -34,8 +39,13 @@ export interface McpResolutionResult {
|
|
|
34
39
|
}
|
|
35
40
|
/**
|
|
36
41
|
* Fetch McpServer resources and resolve into intermediate format.
|
|
42
|
+
*
|
|
43
|
+
* @param transportPosture Whether stdio servers may run here (derive via
|
|
44
|
+
* resolveMcpTransportPosture(config.mode)). A stdio server under a
|
|
45
|
+
* forbidding posture throws {@link McpTransportError} and fails the
|
|
46
|
+
* whole resolution — never degraded to a skipped server.
|
|
37
47
|
*/
|
|
38
|
-
export declare function resolveMcpServers(client: StigmerClient, usages: McpServerUsage[], envVars
|
|
48
|
+
export declare function resolveMcpServers(client: StigmerClient, usages: McpServerUsage[], envVars: Record<string, string>, transportPosture: McpTransportPosture): Promise<McpResolutionResult>;
|
|
39
49
|
export declare function mcpServerToResolved(server: McpServer, slug: string, envVars: Record<string, string>): ResolvedMcpServer | null;
|
|
40
50
|
export declare function extractMcpServerSlugs(usages: McpServerUsage[]): string[];
|
|
41
51
|
export { PlaceholderResolutionError } from "./placeholder-resolver.js";
|
|
@@ -1,16 +1,26 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Resolves Stigmer McpServerUsage references into an intermediate
|
|
3
|
-
* ResolvedMcpServer format
|
|
3
|
+
* ResolvedMcpServer format.
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
5
|
+
* Consumers: the deep-agent harness (execute-deep-agent/setup.ts), the
|
|
6
|
+
* connect backfill (shared/connect-backfill.ts), and the discovery
|
|
7
|
+
* activity (activities/discover-mcp-server.ts, via mcpServerToResolved).
|
|
8
|
+
* NOTE: the Cursor harness does NOT use this module — it has its own
|
|
9
|
+
* near-duplicate resolver at activities/execute-cursor/mcp-resolver.ts.
|
|
10
|
+
* A behavioral change here (like the transport guard) must be mirrored
|
|
11
|
+
* there until the two are consolidated.
|
|
8
12
|
*/
|
|
13
|
+
import { assertTransportAllowed, McpTransportError, } from "./mcp-transport-guard.js";
|
|
9
14
|
import { resolveHeaders, resolvePlaceholders, filterEnvToDeclaredKeys, PlaceholderResolutionError, } from "./placeholder-resolver.js";
|
|
10
15
|
/**
|
|
11
16
|
* Fetch McpServer resources and resolve into intermediate format.
|
|
17
|
+
*
|
|
18
|
+
* @param transportPosture Whether stdio servers may run here (derive via
|
|
19
|
+
* resolveMcpTransportPosture(config.mode)). A stdio server under a
|
|
20
|
+
* forbidding posture throws {@link McpTransportError} and fails the
|
|
21
|
+
* whole resolution — never degraded to a skipped server.
|
|
12
22
|
*/
|
|
13
|
-
export async function resolveMcpServers(client, usages, envVars
|
|
23
|
+
export async function resolveMcpServers(client, usages, envVars, transportPosture) {
|
|
14
24
|
const resolved = [];
|
|
15
25
|
for (const usage of usages) {
|
|
16
26
|
const ref = usage.mcpServerRef;
|
|
@@ -20,10 +30,17 @@ export async function resolveMcpServers(client, usages, envVars = {}) {
|
|
|
20
30
|
const mcpServer = await client.getMcpServerByReference(ref);
|
|
21
31
|
const serverEnv = filterEnvToDeclaredKeys(mcpServer.spec?.env, envVars, ref.slug);
|
|
22
32
|
const server = mcpServerToResolved(mcpServer, ref.slug, serverEnv);
|
|
23
|
-
if (server)
|
|
33
|
+
if (server) {
|
|
34
|
+
assertTransportAllowed(server.slug, server.connectionType, transportPosture);
|
|
24
35
|
resolved.push(server);
|
|
36
|
+
}
|
|
25
37
|
}
|
|
26
38
|
catch (err) {
|
|
39
|
+
if (err instanceof McpTransportError) {
|
|
40
|
+
// Policy rejection, not a resolution hiccup: swallowing it here
|
|
41
|
+
// would mean the agent silently loses tools. Fail the execution.
|
|
42
|
+
throw err;
|
|
43
|
+
}
|
|
27
44
|
if (err instanceof PlaceholderResolutionError) {
|
|
28
45
|
console.error(`MCP server ${ref.org}/${ref.slug}: ${err.message}`);
|
|
29
46
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-resolver.js","sourceRoot":"","sources":["../../src/shared/mcp-resolver.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"mcp-resolver.js","sourceRoot":"","sources":["../../src/shared/mcp-resolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Transport guard for MCP servers — stdio is local-runner-only.
|
|
3
|
+
*
|
|
4
|
+
* Why this is load-bearing: a stdio MCP server means "download a package
|
|
5
|
+
* from a public registry at session start and run it as a subprocess with
|
|
6
|
+
* the execution's secrets in its environment". On a local runner that
|
|
7
|
+
* machine belongs to the user — their trust decision. On a managed cloud
|
|
8
|
+
* runner it is a supply-chain exposure the platform owns, so hosted
|
|
9
|
+
* execution is HTTP-only. The control plane refuses such executions at
|
|
10
|
+
* create time (stigmer-cloud's McpTransportPolicy); this guard is the
|
|
11
|
+
* defense-in-depth backstop at the moment a subprocess would actually be
|
|
12
|
+
* spawned — it must hold even if a stdio usage reaches a cloud runner
|
|
13
|
+
* through a path the control plane did not see.
|
|
14
|
+
*
|
|
15
|
+
* The posture derives from Config.mode ("cloud" → forbid stdio), NOT from
|
|
16
|
+
* cloudModeEnabled — that is the Cursor cloud-agent feature flag and says
|
|
17
|
+
* nothing about where this process runs. STIGMER_MCP_ALLOW_STDIO exists as
|
|
18
|
+
* an explicit override so operators can roll the policy back without a
|
|
19
|
+
* redeploy (the runner-side counterpart of the control plane's
|
|
20
|
+
* stigmer.mcp.stdio-cloud-block kill-switch). Managed cloud deployments
|
|
21
|
+
* never set it.
|
|
22
|
+
*
|
|
23
|
+
* A rejection is thrown as {@link McpTransportError} and must FAIL the
|
|
24
|
+
* execution loudly: the resolvers' per-server catch blocks swallow
|
|
25
|
+
* resolution failures into console.warn and continue, which would turn a
|
|
26
|
+
* policy rejection into an agent silently losing tools. Both resolvers
|
|
27
|
+
* rethrow this error type for exactly that reason.
|
|
28
|
+
*
|
|
29
|
+
* Mirrors the posture/override/error shape of tools/url-guard.ts (the
|
|
30
|
+
* web_fetch SSRF boundary), the runner's established idiom for
|
|
31
|
+
* mode-keyed guards.
|
|
32
|
+
*/
|
|
33
|
+
export type McpTransportPosture = "stdio-allowed" | "stdio-forbidden";
|
|
34
|
+
/** Thrown for every guard rejection; message is safe to surface to the user. */
|
|
35
|
+
export declare class McpTransportError extends Error {
|
|
36
|
+
constructor(message: string);
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Derive the transport posture from runner mode plus the explicit override.
|
|
40
|
+
*
|
|
41
|
+
* @param mode Config.mode — "cloud" means a managed runner on shared infrastructure.
|
|
42
|
+
* @param env Environment to read STIGMER_MCP_ALLOW_STDIO from.
|
|
43
|
+
*/
|
|
44
|
+
export declare function resolveMcpTransportPosture(mode: "local" | "cloud", env?: NodeJS.ProcessEnv): McpTransportPosture;
|
|
45
|
+
/**
|
|
46
|
+
* Assert that a resolved MCP server's transport is allowed under the given
|
|
47
|
+
* posture. Applies only to user-defined McpServer resources flowing through
|
|
48
|
+
* the resolvers — the internal datastore attachment is synthesized
|
|
49
|
+
* separately and is already HTTP in cloud mode.
|
|
50
|
+
*
|
|
51
|
+
* @throws McpTransportError when the posture forbids stdio and the server uses it
|
|
52
|
+
*/
|
|
53
|
+
export declare function assertTransportAllowed(slug: string, connectionType: "stdio" | "http" | "sse", posture: McpTransportPosture): void;
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Transport guard for MCP servers — stdio is local-runner-only.
|
|
3
|
+
*
|
|
4
|
+
* Why this is load-bearing: a stdio MCP server means "download a package
|
|
5
|
+
* from a public registry at session start and run it as a subprocess with
|
|
6
|
+
* the execution's secrets in its environment". On a local runner that
|
|
7
|
+
* machine belongs to the user — their trust decision. On a managed cloud
|
|
8
|
+
* runner it is a supply-chain exposure the platform owns, so hosted
|
|
9
|
+
* execution is HTTP-only. The control plane refuses such executions at
|
|
10
|
+
* create time (stigmer-cloud's McpTransportPolicy); this guard is the
|
|
11
|
+
* defense-in-depth backstop at the moment a subprocess would actually be
|
|
12
|
+
* spawned — it must hold even if a stdio usage reaches a cloud runner
|
|
13
|
+
* through a path the control plane did not see.
|
|
14
|
+
*
|
|
15
|
+
* The posture derives from Config.mode ("cloud" → forbid stdio), NOT from
|
|
16
|
+
* cloudModeEnabled — that is the Cursor cloud-agent feature flag and says
|
|
17
|
+
* nothing about where this process runs. STIGMER_MCP_ALLOW_STDIO exists as
|
|
18
|
+
* an explicit override so operators can roll the policy back without a
|
|
19
|
+
* redeploy (the runner-side counterpart of the control plane's
|
|
20
|
+
* stigmer.mcp.stdio-cloud-block kill-switch). Managed cloud deployments
|
|
21
|
+
* never set it.
|
|
22
|
+
*
|
|
23
|
+
* A rejection is thrown as {@link McpTransportError} and must FAIL the
|
|
24
|
+
* execution loudly: the resolvers' per-server catch blocks swallow
|
|
25
|
+
* resolution failures into console.warn and continue, which would turn a
|
|
26
|
+
* policy rejection into an agent silently losing tools. Both resolvers
|
|
27
|
+
* rethrow this error type for exactly that reason.
|
|
28
|
+
*
|
|
29
|
+
* Mirrors the posture/override/error shape of tools/url-guard.ts (the
|
|
30
|
+
* web_fetch SSRF boundary), the runner's established idiom for
|
|
31
|
+
* mode-keyed guards.
|
|
32
|
+
*/
|
|
33
|
+
/** Thrown for every guard rejection; message is safe to surface to the user. */
|
|
34
|
+
export class McpTransportError extends Error {
|
|
35
|
+
constructor(message) {
|
|
36
|
+
super(message);
|
|
37
|
+
this.name = "McpTransportError";
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Derive the transport posture from runner mode plus the explicit override.
|
|
42
|
+
*
|
|
43
|
+
* @param mode Config.mode — "cloud" means a managed runner on shared infrastructure.
|
|
44
|
+
* @param env Environment to read STIGMER_MCP_ALLOW_STDIO from.
|
|
45
|
+
*/
|
|
46
|
+
export function resolveMcpTransportPosture(mode, env = process.env) {
|
|
47
|
+
const override = env.STIGMER_MCP_ALLOW_STDIO;
|
|
48
|
+
if (override === "true")
|
|
49
|
+
return "stdio-allowed";
|
|
50
|
+
if (override === "false")
|
|
51
|
+
return "stdio-forbidden";
|
|
52
|
+
return mode === "cloud" ? "stdio-forbidden" : "stdio-allowed";
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Assert that a resolved MCP server's transport is allowed under the given
|
|
56
|
+
* posture. Applies only to user-defined McpServer resources flowing through
|
|
57
|
+
* the resolvers — the internal datastore attachment is synthesized
|
|
58
|
+
* separately and is already HTTP in cloud mode.
|
|
59
|
+
*
|
|
60
|
+
* @throws McpTransportError when the posture forbids stdio and the server uses it
|
|
61
|
+
*/
|
|
62
|
+
export function assertTransportAllowed(slug, connectionType, posture) {
|
|
63
|
+
if (posture === "stdio-forbidden" && connectionType === "stdio") {
|
|
64
|
+
throw new McpTransportError(`MCP server '${slug}' uses the stdio transport, which runs only on local ` +
|
|
65
|
+
`runners — this cloud runner refuses to spawn it. Run the session on a ` +
|
|
66
|
+
`local runner (session execution_target: local), or replace '${slug}' ` +
|
|
67
|
+
`with a remote (HTTP) MCP server.`);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=mcp-transport-guard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-transport-guard.js","sourceRoot":"","sources":["../../src/shared/mcp-transport-guard.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAIH,gFAAgF;AAChF,MAAM,OAAO,iBAAkB,SAAQ,KAAK;IAC1C,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;IAClC,CAAC;CACF;AAED;;;;;GAKG;AACH,MAAM,UAAU,0BAA0B,CACxC,IAAuB,EACvB,MAAyB,OAAO,CAAC,GAAG;IAEpC,MAAM,QAAQ,GAAG,GAAG,CAAC,uBAAuB,CAAC;IAC7C,IAAI,QAAQ,KAAK,MAAM;QAAE,OAAO,eAAe,CAAC;IAChD,IAAI,QAAQ,KAAK,OAAO;QAAE,OAAO,iBAAiB,CAAC;IACnD,OAAO,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,eAAe,CAAC;AAChE,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,sBAAsB,CACpC,IAAY,EACZ,cAAwC,EACxC,OAA4B;IAE5B,IAAI,OAAO,KAAK,iBAAiB,IAAI,cAAc,KAAK,OAAO,EAAE,CAAC;QAChE,MAAM,IAAI,iBAAiB,CACzB,eAAe,IAAI,uDAAuD;YAC1E,wEAAwE;YACxE,+DAA+D,IAAI,IAAI;YACvE,kCAAkC,CACnC,CAAC;IACJ,CAAC;AACH,CAAC"}
|
|
@@ -16,12 +16,10 @@
|
|
|
16
16
|
export declare function isModelRegistered(modelId: string): Promise<boolean>;
|
|
17
17
|
/**
|
|
18
18
|
* Derive the recommended economy-tier model for summarization/classification
|
|
19
|
-
* tasks, given a primary model name.
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
* 2. Map provider → economy model (anthropic→claude-haiku-4.5, openai→gpt-4o-mini)
|
|
24
|
-
* 3. Fall back to the primary model itself if provider is unknown or unmapped
|
|
19
|
+
* tasks, given a primary model name. Thin alias over getEconomyModel — the
|
|
20
|
+
* registry (costTier=economy, harness=native, same provider preferred) drives
|
|
21
|
+
* the choice; no model names are hardcoded here. See getEconomyModel for the
|
|
22
|
+
* resolution order.
|
|
25
23
|
*/
|
|
26
24
|
export declare function getSummarizationModel(primaryModel: string): Promise<string>;
|
|
27
25
|
/**
|
|
@@ -78,12 +78,10 @@ export async function isModelRegistered(modelId) {
|
|
|
78
78
|
}
|
|
79
79
|
/**
|
|
80
80
|
* Derive the recommended economy-tier model for summarization/classification
|
|
81
|
-
* tasks, given a primary model name.
|
|
82
|
-
*
|
|
83
|
-
*
|
|
84
|
-
*
|
|
85
|
-
* 2. Map provider → economy model (anthropic→claude-haiku-4.5, openai→gpt-4o-mini)
|
|
86
|
-
* 3. Fall back to the primary model itself if provider is unknown or unmapped
|
|
81
|
+
* tasks, given a primary model name. Thin alias over getEconomyModel — the
|
|
82
|
+
* registry (costTier=economy, harness=native, same provider preferred) drives
|
|
83
|
+
* the choice; no model names are hardcoded here. See getEconomyModel for the
|
|
84
|
+
* resolution order.
|
|
87
85
|
*/
|
|
88
86
|
export async function getSummarizationModel(primaryModel) {
|
|
89
87
|
return getEconomyModel(primaryModel);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model-registry.js","sourceRoot":"","sources":["../../src/shared/model-registry.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"model-registry.js","sourceRoot":"","sources":["../../src/shared/model-registry.ts"],"names":[],"mappings":"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"}
|
package/dist/shared/tool-kind.js
CHANGED
|
@@ -50,6 +50,7 @@ const TOOL_NAME_TO_KIND = new Map([
|
|
|
50
50
|
["SemanticSearch", ToolKind.SEARCH],
|
|
51
51
|
["ls", ToolKind.LIST],
|
|
52
52
|
["list_directory", ToolKind.LIST],
|
|
53
|
+
["web_fetch", ToolKind.FETCH],
|
|
53
54
|
["WebFetch", ToolKind.FETCH],
|
|
54
55
|
["WebSearch", ToolKind.WEB_SEARCH],
|
|
55
56
|
["think", ToolKind.THINK],
|
|
@@ -85,6 +86,11 @@ export function toolApprovalCategory(name) {
|
|
|
85
86
|
return "delete";
|
|
86
87
|
case ToolKind.SHELL:
|
|
87
88
|
return "shell";
|
|
89
|
+
// FETCH is deliberately uncategorized — i.e. auto-approved. This mirrors
|
|
90
|
+
// the Cursor harness (WebFetch is never gated) and is what makes the
|
|
91
|
+
// native web_fetch usable in unattended runs, where a gated tool is
|
|
92
|
+
// silently skipped. The safety boundary for web_fetch is its URL guard
|
|
93
|
+
// (tools/url-guard.ts), not the approval gate.
|
|
88
94
|
default:
|
|
89
95
|
return undefined;
|
|
90
96
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool-kind.js","sourceRoot":"","sources":["../../src/shared/tool-kind.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"tool-kind.js","sourceRoot":"","sources":["../../src/shared/tool-kind.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Native built-in tools for the deep-agent harness.
|
|
3
|
+
*
|
|
4
|
+
* These are Stigmer-authored capabilities appended to the agent's tool list
|
|
5
|
+
* in execute-deep-agent/setup.ts (and mirrored for sub-agents in
|
|
6
|
+
* subagent-transformer.ts) — distinct from deepagents' backend tools
|
|
7
|
+
* (ls/read_file/execute/…) and from MCP tools, which arrive via the
|
|
8
|
+
* connection layer.
|
|
9
|
+
*
|
|
10
|
+
* Contract for adding a native tool (what keeps the two harnesses at parity):
|
|
11
|
+
*
|
|
12
|
+
* 1. Name it in snake_case (`web_fetch`, not `WebFetch` — PascalCase names
|
|
13
|
+
* belong to the Cursor harness).
|
|
14
|
+
* 2. Register the name in shared/tool-kind.ts `TOOL_NAME_TO_KIND` and its
|
|
15
|
+
* lockstep mirrors (test/fixtures/tool-view/classification.json, the SDK
|
|
16
|
+
* fallback resolver), and extend the ToolKind enum comment in
|
|
17
|
+
* agentexecution/v1/enum.proto with a `Native:` clause.
|
|
18
|
+
* 3. Name the primary argument to match the SDK's presentation `primaryField`
|
|
19
|
+
* for the tool's kind (sdk/react tool-categories.ts) so both harnesses
|
|
20
|
+
* render identically.
|
|
21
|
+
* 4. Decide the approval posture explicitly: unless the tool's kind maps to
|
|
22
|
+
* an approval category in `toolApprovalCategory`, it is auto-approved.
|
|
23
|
+
*/
|
|
24
|
+
export { createThinkTool } from "./think-tool.js";
|
|
25
|
+
export { createWebFetchTool } from "./web-fetch-tool.js";
|
|
26
|
+
export { validateFetchUrl, resolveGuardPosture, UrlGuardError } from "./url-guard.js";
|
|
27
|
+
export type { GuardPosture } from "./url-guard.js";
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Native built-in tools for the deep-agent harness.
|
|
3
|
+
*
|
|
4
|
+
* These are Stigmer-authored capabilities appended to the agent's tool list
|
|
5
|
+
* in execute-deep-agent/setup.ts (and mirrored for sub-agents in
|
|
6
|
+
* subagent-transformer.ts) — distinct from deepagents' backend tools
|
|
7
|
+
* (ls/read_file/execute/…) and from MCP tools, which arrive via the
|
|
8
|
+
* connection layer.
|
|
9
|
+
*
|
|
10
|
+
* Contract for adding a native tool (what keeps the two harnesses at parity):
|
|
11
|
+
*
|
|
12
|
+
* 1. Name it in snake_case (`web_fetch`, not `WebFetch` — PascalCase names
|
|
13
|
+
* belong to the Cursor harness).
|
|
14
|
+
* 2. Register the name in shared/tool-kind.ts `TOOL_NAME_TO_KIND` and its
|
|
15
|
+
* lockstep mirrors (test/fixtures/tool-view/classification.json, the SDK
|
|
16
|
+
* fallback resolver), and extend the ToolKind enum comment in
|
|
17
|
+
* agentexecution/v1/enum.proto with a `Native:` clause.
|
|
18
|
+
* 3. Name the primary argument to match the SDK's presentation `primaryField`
|
|
19
|
+
* for the tool's kind (sdk/react tool-categories.ts) so both harnesses
|
|
20
|
+
* render identically.
|
|
21
|
+
* 4. Decide the approval posture explicitly: unless the tool's kind maps to
|
|
22
|
+
* an approval category in `toolApprovalCategory`, it is auto-approved.
|
|
23
|
+
*/
|
|
24
|
+
export { createThinkTool } from "./think-tool.js";
|
|
25
|
+
export { createWebFetchTool } from "./web-fetch-tool.js";
|
|
26
|
+
export { validateFetchUrl, resolveGuardPosture, UrlGuardError } from "./url-guard.js";
|
|
27
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"think-tool.js","sourceRoot":"","sources":["../../src/tools/think-tool.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,uBAAuB,CAAC;AAC7C,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,UAAU,eAAe;IAC7B,OAAO,IAAI,CACT,KAAK,EAAE,MAA2B,EAAE,EAAE,CAAC,IAAI,EAC3C;QACE,IAAI,EAAE,OAAO;QACb,WAAW,EACT,yDAAyD;YACzD,8EAA8E;YAC9E,4EAA4E;YAC5E,kCAAkC;YAClC,4BAA4B;YAC5B,qEAAqE;YACrE,qEAAqE;YACrE,iEAAiE;YACjE,mEAAmE;YACnE,kEAAkE;YAClE,yDAAyD;QAC3D,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;YACf,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,oCAAoC,CAAC;SACnE,CAAC;KACH,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* URL guard for the native `web_fetch` tool — the SSRF boundary.
|
|
3
|
+
*
|
|
4
|
+
* Why this is load-bearing: `web_fetch` is deliberately auto-approved (see
|
|
5
|
+
* shared/tool-kind.ts `toolApprovalCategory`), so in unattended runs it is
|
|
6
|
+
* the only ungated network path an agent has. On managed cloud runners the
|
|
7
|
+
* fetch executes inside the runner process, which sits on infrastructure
|
|
8
|
+
* with network reach to internal services and the cloud metadata endpoint —
|
|
9
|
+
* without this guard, "fetch a URL" becomes "read my pod's credentials".
|
|
10
|
+
*
|
|
11
|
+
* Posture is mode-aware because locality differs, not trust:
|
|
12
|
+
*
|
|
13
|
+
* - "strict" (managed cloud runners): loopback, RFC 1918 private,
|
|
14
|
+
* link-local, and their IPv6 equivalents are all rejected.
|
|
15
|
+
* - "relaxed" (self-hosted / local runners): the machine belongs to the
|
|
16
|
+
* user, and fetching their own dev server (http://localhost:3000) is a
|
|
17
|
+
* legitimate ask — only the link-local range (which contains the cloud
|
|
18
|
+
* metadata endpoint 169.254.169.254) stays blocked, as costless
|
|
19
|
+
* defense-in-depth.
|
|
20
|
+
*
|
|
21
|
+
* The default posture derives from Config.mode ("cloud" → strict), NOT from
|
|
22
|
+
* cloudModeEnabled — that is the Cursor cloud-agent feature flag and says
|
|
23
|
+
* nothing about where this process runs. Config.mode tracks credential
|
|
24
|
+
* transport rather than physical locality (a desktop runner proxies traffic
|
|
25
|
+
* while executing on the user's machine), so STIGMER_WEB_FETCH_ALLOW_PRIVATE
|
|
26
|
+
* exists as an explicit override for embedders that know better. Managed
|
|
27
|
+
* cloud deployments never set it.
|
|
28
|
+
*
|
|
29
|
+
* Validation runs on the addresses DNS resolves to immediately before the
|
|
30
|
+
* request is dispatched, and the caller re-validates every redirect hop.
|
|
31
|
+
* Accepted limitation: a DNS-rebinding window remains between our lookup
|
|
32
|
+
* and the socket connect — Node's fetch (undici) offers no lookup pinning
|
|
33
|
+
* without replacing the dispatcher, and the strict posture's range blocks
|
|
34
|
+
* make the rebinding payoff (an internal address) unreachable anyway.
|
|
35
|
+
*/
|
|
36
|
+
export type GuardPosture = "strict" | "relaxed";
|
|
37
|
+
/** Thrown for every guard rejection; message is safe to surface to the model. */
|
|
38
|
+
export declare class UrlGuardError extends Error {
|
|
39
|
+
constructor(message: string);
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Derive the guard posture from runner mode plus the explicit override.
|
|
43
|
+
*
|
|
44
|
+
* @param mode Config.mode — "cloud" means a managed runner on shared infrastructure.
|
|
45
|
+
* @param env Environment to read STIGMER_WEB_FETCH_ALLOW_PRIVATE from.
|
|
46
|
+
*/
|
|
47
|
+
export declare function resolveGuardPosture(mode: "local" | "cloud", env?: NodeJS.ProcessEnv): GuardPosture;
|
|
48
|
+
/**
|
|
49
|
+
* Validate a URL for fetching under the given posture.
|
|
50
|
+
*
|
|
51
|
+
* Checks the scheme, then resolves the hostname and checks EVERY address it
|
|
52
|
+
* resolves to (a hostname with one public and one private A record must be
|
|
53
|
+
* rejected, or the private record becomes the bypass).
|
|
54
|
+
*
|
|
55
|
+
* @returns the parsed URL on success.
|
|
56
|
+
* @throws UrlGuardError with a model-readable reason on rejection.
|
|
57
|
+
*/
|
|
58
|
+
export declare function validateFetchUrl(rawUrl: string, posture: GuardPosture): Promise<URL>;
|
|
59
|
+
/**
|
|
60
|
+
* Classify an IP address against the posture's blocked ranges.
|
|
61
|
+
*
|
|
62
|
+
* @returns a human-readable range name when blocked, or null when allowed.
|
|
63
|
+
*/
|
|
64
|
+
export declare function blockedReason(address: string, posture: GuardPosture): string | null;
|