@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.
Files changed (128) hide show
  1. package/dist/.build-fingerprint +1 -1
  2. package/dist/activities/attach-session.d.ts +34 -0
  3. package/dist/activities/attach-session.js +95 -0
  4. package/dist/activities/attach-session.js.map +1 -0
  5. package/dist/activities/discover-mcp-server.d.ts +9 -0
  6. package/dist/activities/discover-mcp-server.js +6 -1
  7. package/dist/activities/discover-mcp-server.js.map +1 -1
  8. package/dist/activities/execute-cursor/connect-backfill.d.ts +2 -1
  9. package/dist/activities/execute-cursor/connect-backfill.js +2 -2
  10. package/dist/activities/execute-cursor/connect-backfill.js.map +1 -1
  11. package/dist/activities/execute-cursor/fetch-interceptor.js +31 -0
  12. package/dist/activities/execute-cursor/fetch-interceptor.js.map +1 -1
  13. package/dist/activities/execute-cursor/index.js +70 -3
  14. package/dist/activities/execute-cursor/index.js.map +1 -1
  15. package/dist/activities/execute-cursor/mcp-resolver.d.ts +7 -1
  16. package/dist/activities/execute-cursor/mcp-resolver.js +15 -2
  17. package/dist/activities/execute-cursor/mcp-resolver.js.map +1 -1
  18. package/dist/activities/execute-cursor/sdk-warmup.d.ts +44 -0
  19. package/dist/activities/execute-cursor/sdk-warmup.js +61 -0
  20. package/dist/activities/execute-cursor/sdk-warmup.js.map +1 -0
  21. package/dist/activities/execute-deep-agent/setup.js +48 -5
  22. package/dist/activities/execute-deep-agent/setup.js.map +1 -1
  23. package/dist/activities/execute-deep-agent/subagent-transformer.d.ts +9 -1
  24. package/dist/activities/execute-deep-agent/subagent-transformer.js +19 -5
  25. package/dist/activities/execute-deep-agent/subagent-transformer.js.map +1 -1
  26. package/dist/client/stigmer-client.d.ts +13 -1
  27. package/dist/client/stigmer-client.js +40 -5
  28. package/dist/client/stigmer-client.js.map +1 -1
  29. package/dist/client/token-claims.d.ts +9 -6
  30. package/dist/client/token-claims.js +22 -6
  31. package/dist/client/token-claims.js.map +1 -1
  32. package/dist/main.d.ts +8 -1
  33. package/dist/main.js +122 -2
  34. package/dist/main.js.map +1 -1
  35. package/dist/middleware/index.d.ts +0 -1
  36. package/dist/middleware/index.js +0 -1
  37. package/dist/middleware/index.js.map +1 -1
  38. package/dist/otel-metrics.d.ts +10 -1
  39. package/dist/otel-metrics.js +22 -1
  40. package/dist/otel-metrics.js.map +1 -1
  41. package/dist/pool-member.d.ts +61 -0
  42. package/dist/pool-member.js +51 -0
  43. package/dist/pool-member.js.map +1 -0
  44. package/dist/runner-manager.d.ts +7 -0
  45. package/dist/runner-manager.js +39 -1
  46. package/dist/runner-manager.js.map +1 -1
  47. package/dist/runner.js +15 -1
  48. package/dist/runner.js.map +1 -1
  49. package/dist/shared/cold-start-timing.d.ts +89 -0
  50. package/dist/shared/cold-start-timing.js +166 -0
  51. package/dist/shared/cold-start-timing.js.map +1 -0
  52. package/dist/shared/connect-backfill.d.ts +2 -1
  53. package/dist/shared/connect-backfill.js +4 -2
  54. package/dist/shared/connect-backfill.js.map +1 -1
  55. package/dist/shared/mcp-manager.d.ts +5 -15
  56. package/dist/shared/mcp-manager.js +5 -32
  57. package/dist/shared/mcp-manager.js.map +1 -1
  58. package/dist/shared/mcp-resolver.d.ts +15 -5
  59. package/dist/shared/mcp-resolver.js +23 -6
  60. package/dist/shared/mcp-resolver.js.map +1 -1
  61. package/dist/shared/mcp-transport-guard.d.ts +53 -0
  62. package/dist/shared/mcp-transport-guard.js +70 -0
  63. package/dist/shared/mcp-transport-guard.js.map +1 -0
  64. package/dist/shared/model-registry.d.ts +4 -6
  65. package/dist/shared/model-registry.js +4 -6
  66. package/dist/shared/model-registry.js.map +1 -1
  67. package/dist/shared/tool-kind.js +6 -0
  68. package/dist/shared/tool-kind.js.map +1 -1
  69. package/dist/tools/index.d.ts +27 -0
  70. package/dist/tools/index.js +27 -0
  71. package/dist/tools/index.js.map +1 -0
  72. package/dist/tools/think-tool.js.map +1 -0
  73. package/dist/tools/url-guard.d.ts +64 -0
  74. package/dist/tools/url-guard.js +211 -0
  75. package/dist/tools/url-guard.js.map +1 -0
  76. package/dist/tools/web-fetch-tool.d.ts +53 -0
  77. package/dist/tools/web-fetch-tool.js +216 -0
  78. package/dist/tools/web-fetch-tool.js.map +1 -0
  79. package/package.json +4 -2
  80. package/src/__tests__/otel-metrics.test.ts +6 -0
  81. package/src/__tests__/pool-member.test.ts +76 -0
  82. package/src/activities/__tests__/attach-session.test.ts +133 -0
  83. package/src/activities/__tests__/discover-mcp-server.test.ts +34 -11
  84. package/src/activities/attach-session.ts +112 -0
  85. package/src/activities/discover-mcp-server.ts +19 -1
  86. package/src/activities/execute-cursor/__tests__/fetch-interceptor.test.ts +77 -0
  87. package/src/activities/execute-cursor/__tests__/sdk-warmup.test.ts +45 -0
  88. package/src/activities/execute-cursor/connect-backfill.ts +3 -0
  89. package/src/activities/execute-cursor/fetch-interceptor.ts +39 -0
  90. package/src/activities/execute-cursor/index.ts +72 -3
  91. package/src/activities/execute-cursor/mcp-resolver.ts +21 -2
  92. package/src/activities/execute-cursor/sdk-warmup.ts +68 -0
  93. package/src/activities/execute-deep-agent/__tests__/subagent-transformer.test.ts +24 -0
  94. package/src/activities/execute-deep-agent/setup.ts +48 -7
  95. package/src/activities/execute-deep-agent/subagent-transformer.ts +27 -2
  96. package/src/client/__tests__/stigmer-client.test.ts +77 -2
  97. package/src/client/__tests__/token-claims.test.ts +15 -1
  98. package/src/client/stigmer-client.ts +51 -6
  99. package/src/client/token-claims.ts +29 -6
  100. package/src/main.ts +139 -2
  101. package/src/middleware/index.ts +0 -1
  102. package/src/otel-metrics.ts +25 -1
  103. package/src/pool-member.ts +99 -0
  104. package/src/runner-manager.ts +52 -0
  105. package/src/runner.ts +15 -0
  106. package/src/shared/__tests__/cold-start-timing.test.ts +271 -0
  107. package/src/shared/__tests__/connect-backfill.test.ts +11 -11
  108. package/src/shared/__tests__/mcp-manager.test.ts +2 -73
  109. package/src/shared/__tests__/mcp-resolver.test.ts +108 -0
  110. package/src/shared/__tests__/mcp-transport-guard.test.ts +71 -0
  111. package/src/shared/__tests__/model-registry.test.ts +6 -4
  112. package/src/shared/cold-start-timing.ts +197 -0
  113. package/src/shared/connect-backfill.ts +5 -1
  114. package/src/shared/mcp-manager.ts +4 -41
  115. package/src/shared/mcp-resolver.ts +29 -6
  116. package/src/shared/mcp-transport-guard.ts +81 -0
  117. package/src/shared/model-registry.ts +4 -6
  118. package/src/shared/tool-kind.ts +6 -0
  119. package/src/tools/__tests__/url-guard.test.ts +137 -0
  120. package/src/tools/__tests__/web-fetch-tool.test.ts +193 -0
  121. package/src/tools/index.ts +28 -0
  122. package/src/tools/url-guard.ts +232 -0
  123. package/src/tools/web-fetch-tool.ts +275 -0
  124. package/dist/middleware/think-tool.js.map +0 -1
  125. /package/dist/{middleware → tools}/think-tool.d.ts +0 -0
  126. /package/dist/{middleware → tools}/think-tool.js +0 -0
  127. /package/src/{middleware → tools}/__tests__/think-tool.test.ts +0 -0
  128. /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[], options?: {
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, options) {
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":"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"}
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 that is harness-agnostic.
3
+ * ResolvedMcpServer format.
4
4
  *
5
- * Both ExecuteCursor and ExecuteDeepAgent need MCP server connection info
6
- * and tool approval policies. This module provides the common resolution
7
- * logic; each harness maps ResolvedMcpServer into its SDK-specific format.
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?: Record<string, string>): Promise<McpResolutionResult>;
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 that is harness-agnostic.
3
+ * ResolvedMcpServer format.
4
4
  *
5
- * Both ExecuteCursor and ExecuteDeepAgent need MCP server connection info
6
- * and tool approval policies. This module provides the common resolution
7
- * logic; each harness maps ResolvedMcpServer into its SDK-specific format.
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;;;;;;;GAOG;AAMH,OAAO,EACL,cAAc,EACd,mBAAmB,EACnB,uBAAuB,EACvB,0BAA0B,GAC3B,MAAM,2BAA2B,CAAC;AA0BnC;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,MAAqB,EACrB,MAAwB,EACxB,UAAkC,EAAE;IAEpC,MAAM,QAAQ,GAAwB,EAAE,CAAC;IAEzC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,GAAG,GAAG,KAAK,CAAC,YAAY,CAAC;QAC/B,IAAI,CAAC,GAAG,EAAE,IAAI;YAAE,SAAS;QAEzB,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,uBAAuB,CAAC,GAAG,CAAC,CAAC;YAC5D,MAAM,SAAS,GAAG,uBAAuB,CACvC,SAAS,CAAC,IAAI,EAAE,GAAG,EACnB,OAAO,EACP,GAAG,CAAC,IAAI,CACT,CAAC;YACF,MAAM,MAAM,GAAG,mBAAmB,CAAC,SAAS,EAAE,GAAG,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;YACnE,IAAI,MAAM;gBAAE,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACpC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,GAAG,YAAY,0BAA0B,EAAE,CAAC;gBAC9C,OAAO,CAAC,KAAK,CACX,cAAc,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC,OAAO,EAAE,CACpD,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,IAAI,CACV,gCAAgC,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,KAAK,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,CACnG,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,mBAAmB,CACjC,MAAiB,EACjB,IAAY,EACZ,OAA+B;IAE/B,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;IACzB,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IAEvB,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;IAC7B,MAAM,aAAa,GAAG,MAAM,EAAE,aAAa,IAAI,EAAE,CAAC;IAClD,MAAM,mBAAmB,GAAG,IAAI,CAAC,mBAAmB,IAAI,EAAE,CAAC;IAC3D,MAAM,2BAA2B,GAAG,CAAC,MAAM,EAAE,sBAAsB;WAC9D,CAAC,MAAM,CAAC,sBAAsB,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC;eAC/C,MAAM,CAAC,sBAAsB,CAAC,iBAAiB,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC;IAErE,MAAM,IAAI,GAAG;QACX,aAAa;QACb,mBAAmB;QACnB,2BAA2B;KAC5B,CAAC;IAEF,QAAQ,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;QAC7B,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC;YACpC,IAAI,CAAC,KAAK,CAAC,OAAO;gBAAE,OAAO,IAAI,CAAC;YAChC,MAAM,YAAY,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC;gBACxC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CACxB,mBAAmB,CAAC,GAAG,EAAE,OAAO,EAAE,aAAa,CAAC,GAAG,CAAC,CACrD;gBACH,CAAC,CAAC,SAAS,CAAC;YACd,OAAO;gBACL,IAAI;gBACJ,cAAc,EAAE,OAAO;gBACvB,OAAO,EAAE,KAAK,CAAC,OAAO;gBACtB,IAAI,EAAE,YAAY;gBAClB,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC,CAAC,SAAS;gBACjE,GAAG,EAAE,KAAK,CAAC,UAAU,IAAI,SAAS;gBAClC,GAAG,IAAI;aACR,CAAC;QACJ,CAAC;QACD,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC;YACnC,IAAI,CAAC,IAAI,CAAC,GAAG;gBAAE,OAAO,IAAI,CAAC;YAC3B,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;YACnF,MAAM,QAAQ,GAAG,UAAU;gBACzB,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,EAAE,OAAO,CAAC;gBACzE,CAAC,CAAC,SAAS,CAAC;YACd,OAAO;gBACL,IAAI;gBACJ,cAAc,EAAE,MAAM;gBACtB,GAAG,EAAE,IAAI,CAAC,GAAG;gBACb,OAAO,EAAE,QAAQ;gBACjB,GAAG,IAAI;aACR,CAAC;QACJ,CAAC;QACD;YACE,OAAO,IAAI,CAAC;IAChB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,MAAwB;IAC5D,OAAO,MAAM;SACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,EAAE,IAAI,CAAC;SAChC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACrC,CAAC;AAED,OAAO,EAAE,0BAA0B,EAAE,MAAM,2BAA2B,CAAC"}
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
- * Resolution:
22
- * 1. Look up the primary model's provider in the registry
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
- * Resolution:
84
- * 1. Look up the primary model's provider in the registry
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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"}
@@ -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;