@provos/ironcurtain 0.7.2 → 0.9.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/README.md +29 -100
- package/dist/auth/auth-command.d.ts +15 -0
- package/dist/auth/auth-command.js +424 -0
- package/dist/auth/auth-command.js.map +1 -0
- package/dist/auth/oauth-flow.d.ts +46 -0
- package/dist/auth/oauth-flow.js +279 -0
- package/dist/auth/oauth-flow.js.map +1 -0
- package/dist/auth/oauth-provider.d.ts +55 -0
- package/dist/auth/oauth-provider.js +73 -0
- package/dist/auth/oauth-provider.js.map +1 -0
- package/dist/auth/oauth-registry.d.ts +34 -0
- package/dist/auth/oauth-registry.js +69 -0
- package/dist/auth/oauth-registry.js.map +1 -0
- package/dist/auth/oauth-token-provider.d.ts +52 -0
- package/dist/auth/oauth-token-provider.js +159 -0
- package/dist/auth/oauth-token-provider.js.map +1 -0
- package/dist/auth/oauth-token-store.d.ts +30 -0
- package/dist/auth/oauth-token-store.js +93 -0
- package/dist/auth/oauth-token-store.js.map +1 -0
- package/dist/auth/providers/google-scopes.d.ts +35 -0
- package/dist/auth/providers/google-scopes.js +183 -0
- package/dist/auth/providers/google-scopes.js.map +1 -0
- package/dist/auth/providers/google.d.ts +2 -0
- package/dist/auth/providers/google.js +28 -0
- package/dist/auth/providers/google.js.map +1 -0
- package/dist/cli.js +6 -0
- package/dist/cli.js.map +1 -1
- package/dist/config/config-command.js +39 -1
- package/dist/config/config-command.js.map +1 -1
- package/dist/config/constitution-readonly.md +14 -11
- package/dist/config/constitution-user-base.md +15 -0
- package/dist/config/first-start.js +4 -1
- package/dist/config/first-start.js.map +1 -1
- package/dist/config/generated/test-scenarios.json +1 -1
- package/dist/config/generated/tool-annotations.json +10617 -296
- package/dist/config/generated-readonly/compiled-policy.json +787 -244
- package/dist/config/index.d.ts +2 -2
- package/dist/config/index.js +8 -0
- package/dist/config/index.js.map +1 -1
- package/dist/config/mcp-servers.json +31 -2
- package/dist/config/paths.d.ts +20 -0
- package/dist/config/paths.js +43 -0
- package/dist/config/paths.js.map +1 -1
- package/dist/config/types.d.ts +8 -0
- package/dist/config/user-config.d.ts +29 -0
- package/dist/config/user-config.js +30 -0
- package/dist/config/user-config.js.map +1 -1
- package/dist/cron/constitution-generator.d.ts +2 -1
- package/dist/cron/constitution-generator.js +35 -36
- package/dist/cron/constitution-generator.js.map +1 -1
- package/dist/cron/headless-transport.d.ts +4 -0
- package/dist/cron/headless-transport.js +1 -1
- package/dist/cron/headless-transport.js.map +1 -1
- package/dist/daemon/ironcurtain-daemon.js +7 -1
- package/dist/daemon/ironcurtain-daemon.js.map +1 -1
- package/dist/docker/adapters/claude-code.js +32 -5
- package/dist/docker/adapters/claude-code.js.map +1 -1
- package/dist/docker/agent-adapter.d.ts +40 -0
- package/dist/docker/claude-md-seed.d.ts +27 -0
- package/dist/docker/claude-md-seed.js +42 -0
- package/dist/docker/claude-md-seed.js.map +1 -0
- package/dist/docker/docker-agent-session.d.ts +3 -1
- package/dist/docker/docker-agent-session.js +51 -28
- package/dist/docker/docker-agent-session.js.map +1 -1
- package/dist/docker/docker-infrastructure.d.ts +15 -1
- package/dist/docker/docker-infrastructure.js +105 -9
- package/dist/docker/docker-infrastructure.js.map +1 -1
- package/dist/docker/docker-manager.d.ts +2 -0
- package/dist/docker/docker-manager.js +9 -1
- package/dist/docker/docker-manager.js.map +1 -1
- package/dist/docker/mitm-proxy.d.ts +65 -0
- package/dist/docker/mitm-proxy.js +288 -31
- package/dist/docker/mitm-proxy.js.map +1 -1
- package/dist/docker/package-types.d.ts +127 -0
- package/dist/docker/package-types.js +8 -0
- package/dist/docker/package-types.js.map +1 -0
- package/dist/docker/package-validator.d.ts +41 -0
- package/dist/docker/package-validator.js +90 -0
- package/dist/docker/package-validator.js.map +1 -0
- package/dist/docker/platform.d.ts +6 -6
- package/dist/docker/platform.js +8 -6
- package/dist/docker/platform.js.map +1 -1
- package/dist/docker/proxy-tools.d.ts +80 -0
- package/dist/docker/proxy-tools.js +248 -0
- package/dist/docker/proxy-tools.js.map +1 -0
- package/dist/docker/pty-session.d.ts +15 -0
- package/dist/docker/pty-session.js +253 -73
- package/dist/docker/pty-session.js.map +1 -1
- package/dist/docker/pty-types.d.ts +28 -0
- package/dist/docker/pty-types.js +2 -0
- package/dist/docker/pty-types.js.map +1 -1
- package/dist/docker/registry-proxy.d.ts +142 -0
- package/dist/docker/registry-proxy.js +856 -0
- package/dist/docker/registry-proxy.js.map +1 -0
- package/dist/escalation/escalation-watcher.d.ts +3 -1
- package/dist/escalation/escalation-watcher.js +6 -2
- package/dist/escalation/escalation-watcher.js.map +1 -1
- package/dist/escalation/listener-command.js +24 -10
- package/dist/escalation/listener-command.js.map +1 -1
- package/dist/escalation/listener-lock.d.ts +5 -0
- package/dist/escalation/listener-lock.js +14 -0
- package/dist/escalation/listener-lock.js.map +1 -1
- package/dist/index.js +16 -3
- package/dist/index.js.map +1 -1
- package/dist/memory/auto-save.d.ts +25 -0
- package/dist/memory/auto-save.js +89 -0
- package/dist/memory/auto-save.js.map +1 -0
- package/dist/memory/memory-annotations.d.ts +47 -0
- package/dist/memory/memory-annotations.js +87 -0
- package/dist/memory/memory-annotations.js.map +1 -0
- package/dist/memory/memory-prompt.d.ts +12 -0
- package/dist/memory/memory-prompt.js +20 -0
- package/dist/memory/memory-prompt.js.map +1 -0
- package/dist/memory/resolve-memory-path.d.ts +20 -0
- package/dist/memory/resolve-memory-path.js +30 -0
- package/dist/memory/resolve-memory-path.js.map +1 -0
- package/dist/mux/mux-app.d.ts +4 -0
- package/dist/mux/mux-app.js +246 -28
- package/dist/mux/mux-app.js.map +1 -1
- package/dist/mux/mux-command.d.ts +2 -2
- package/dist/mux/mux-command.js +14 -22
- package/dist/mux/mux-command.js.map +1 -1
- package/dist/mux/mux-escalation-manager.d.ts +9 -3
- package/dist/mux/mux-escalation-manager.js +69 -19
- package/dist/mux/mux-escalation-manager.js.map +1 -1
- package/dist/mux/mux-input-handler.d.ts +59 -3
- package/dist/mux/mux-input-handler.js +270 -32
- package/dist/mux/mux-input-handler.js.map +1 -1
- package/dist/mux/mux-renderer.d.ts +19 -1
- package/dist/mux/mux-renderer.js +466 -11
- package/dist/mux/mux-renderer.js.map +1 -1
- package/dist/mux/persona-scanner.d.ts +19 -0
- package/dist/mux/persona-scanner.js +53 -0
- package/dist/mux/persona-scanner.js.map +1 -0
- package/dist/mux/pty-bridge.d.ts +8 -0
- package/dist/mux/pty-bridge.js +19 -1
- package/dist/mux/pty-bridge.js.map +1 -1
- package/dist/mux/session-scanner.d.ts +18 -0
- package/dist/mux/session-scanner.js +65 -0
- package/dist/mux/session-scanner.js.map +1 -0
- package/dist/mux/types.d.ts +36 -1
- package/dist/mux/types.js +14 -1
- package/dist/mux/types.js.map +1 -1
- package/dist/persona/persona-command.js +130 -93
- package/dist/persona/persona-command.js.map +1 -1
- package/dist/persona/persona-prompt.d.ts +7 -7
- package/dist/persona/persona-prompt.js +14 -29
- package/dist/persona/persona-prompt.js.map +1 -1
- package/dist/persona/resolve.js +5 -2
- package/dist/persona/resolve.js.map +1 -1
- package/dist/pipeline/annotate.js +1 -7
- package/dist/pipeline/annotate.js.map +1 -1
- package/dist/pipeline/compile.d.ts +5 -2
- package/dist/pipeline/compile.js +23 -11
- package/dist/pipeline/compile.js.map +1 -1
- package/dist/pipeline/constitution-compiler.d.ts +302 -3
- package/dist/pipeline/constitution-compiler.js +285 -23
- package/dist/pipeline/constitution-compiler.js.map +1 -1
- package/dist/pipeline/generate-with-repair.d.ts +2 -2
- package/dist/pipeline/generate-with-repair.js +2 -2
- package/dist/pipeline/handwritten-scenarios.d.ts +20 -7
- package/dist/pipeline/handwritten-scenarios.js +20 -41
- package/dist/pipeline/handwritten-scenarios.js.map +1 -1
- package/dist/pipeline/list-resolver.d.ts +18 -20
- package/dist/pipeline/list-resolver.js +28 -36
- package/dist/pipeline/list-resolver.js.map +1 -1
- package/dist/pipeline/pipeline-runner.d.ts +102 -13
- package/dist/pipeline/pipeline-runner.js +497 -237
- package/dist/pipeline/pipeline-runner.js.map +1 -1
- package/dist/pipeline/pipeline-shared.d.ts +7 -9
- package/dist/pipeline/pipeline-shared.js +8 -18
- package/dist/pipeline/pipeline-shared.js.map +1 -1
- package/dist/pipeline/policy-verifier.d.ts +32 -5
- package/dist/pipeline/policy-verifier.js +137 -8
- package/dist/pipeline/policy-verifier.js.map +1 -1
- package/dist/pipeline/proxy-mcp-connections.d.ts +25 -0
- package/dist/pipeline/proxy-mcp-connections.js +121 -0
- package/dist/pipeline/proxy-mcp-connections.js.map +1 -0
- package/dist/pipeline/refresh-lists.js +21 -13
- package/dist/pipeline/refresh-lists.js.map +1 -1
- package/dist/pipeline/scenario-generator.d.ts +29 -49
- package/dist/pipeline/scenario-generator.js +180 -143
- package/dist/pipeline/scenario-generator.js.map +1 -1
- package/dist/pipeline/scenario-schema-validator.d.ts +51 -0
- package/dist/pipeline/scenario-schema-validator.js +132 -0
- package/dist/pipeline/scenario-schema-validator.js.map +1 -0
- package/dist/pipeline/tool-annotator.d.ts +9 -8
- package/dist/pipeline/tool-annotator.js +48 -95
- package/dist/pipeline/tool-annotator.js.map +1 -1
- package/dist/pipeline/types.d.ts +31 -24
- package/dist/sandbox/index.d.ts +26 -10
- package/dist/sandbox/index.js +151 -40
- package/dist/sandbox/index.js.map +1 -1
- package/dist/servers/fetch-server.js +10 -5
- package/dist/servers/fetch-server.js.map +1 -1
- package/dist/session/agent-session.d.ts +8 -20
- package/dist/session/agent-session.js +22 -70
- package/dist/session/agent-session.js.map +1 -1
- package/dist/session/base-transport.d.ts +17 -1
- package/dist/session/base-transport.js +25 -1
- package/dist/session/base-transport.js.map +1 -1
- package/dist/session/cli-transport.d.ts +5 -0
- package/dist/session/cli-transport.js +48 -25
- package/dist/session/cli-transport.js.map +1 -1
- package/dist/session/index.d.ts +25 -1
- package/dist/session/index.js +57 -8
- package/dist/session/index.js.map +1 -1
- package/dist/session/prompts.js +8 -9
- package/dist/session/prompts.js.map +1 -1
- package/dist/session/session-manager.d.ts +6 -0
- package/dist/session/session-manager.js +12 -0
- package/dist/session/session-manager.js.map +1 -1
- package/dist/session/types.d.ts +11 -1
- package/dist/session/types.js.map +1 -1
- package/dist/session/workspace-validation.js +37 -6
- package/dist/session/workspace-validation.js.map +1 -1
- package/dist/signal/signal-bot-daemon.js +24 -8
- package/dist/signal/signal-bot-daemon.js.map +1 -1
- package/dist/signal/signal-transport.d.ts +5 -2
- package/dist/signal/signal-transport.js +3 -3
- package/dist/signal/signal-transport.js.map +1 -1
- package/dist/trusted-process/approval-whitelist.d.ts +117 -0
- package/dist/trusted-process/approval-whitelist.js +237 -0
- package/dist/trusted-process/approval-whitelist.js.map +1 -0
- package/dist/trusted-process/gworkspace-credentials.d.ts +40 -0
- package/dist/trusted-process/gworkspace-credentials.js +45 -0
- package/dist/trusted-process/gworkspace-credentials.js.map +1 -0
- package/dist/trusted-process/index.d.ts +11 -1
- package/dist/trusted-process/index.js +83 -53
- package/dist/trusted-process/index.js.map +1 -1
- package/dist/trusted-process/mcp-proxy-server.d.ts +23 -0
- package/dist/trusted-process/mcp-proxy-server.js +409 -94
- package/dist/trusted-process/mcp-proxy-server.js.map +1 -1
- package/dist/trusted-process/policy-engine.d.ts +12 -3
- package/dist/trusted-process/policy-engine.js +33 -23
- package/dist/trusted-process/policy-engine.js.map +1 -1
- package/dist/trusted-process/policy-types.d.ts +17 -0
- package/dist/trusted-process/sandbox-integration.d.ts +23 -0
- package/dist/trusted-process/sandbox-integration.js +115 -3
- package/dist/trusted-process/sandbox-integration.js.map +1 -1
- package/dist/trusted-process/token-file-refresher.d.ts +69 -0
- package/dist/trusted-process/token-file-refresher.js +120 -0
- package/dist/trusted-process/token-file-refresher.js.map +1 -0
- package/dist/types/argument-roles.d.ts +7 -1
- package/dist/types/argument-roles.js +50 -0
- package/dist/types/argument-roles.js.map +1 -1
- package/dist/types/audit.d.ts +11 -0
- package/docker/Dockerfile.base +22 -0
- package/docker/Dockerfile.base.arm64 +44 -4
- package/docker/Dockerfile.claude-code +2 -2
- package/docker/entrypoint-claude-code.sh +24 -6
- package/package.json +8 -2
- package/src/config/constitution-user-base.md +15 -0
- package/src/config/generated/test-scenarios.json +1 -1
- package/src/config/generated/tool-annotations.json +10617 -296
- package/src/config/mcp-servers.json +31 -2
- package/dist/pipeline/mcp-connections.d.ts +0 -16
- package/dist/pipeline/mcp-connections.js +0 -61
- package/dist/pipeline/mcp-connections.js.map +0 -1
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Proxy-based MCP connections for dynamic list resolution.
|
|
3
|
+
*
|
|
4
|
+
* Spawns the MCP proxy server as a child process configured with the
|
|
5
|
+
* read-only policy. The proxy handles OAuth credentials, policy mediation,
|
|
6
|
+
* token refresh, and sandbox containment internally -- the caller gets
|
|
7
|
+
* a simple MCP client with pre-filtered tools.
|
|
8
|
+
*/
|
|
9
|
+
import type { Tool } from '@modelcontextprotocol/sdk/types.js';
|
|
10
|
+
import { Client } from '@modelcontextprotocol/sdk/client/index.js';
|
|
11
|
+
import type { MCPServerConfig } from '../config/types.js';
|
|
12
|
+
import type { ListDefinition } from './types.js';
|
|
13
|
+
export interface ProxyConnection {
|
|
14
|
+
readonly client: Client;
|
|
15
|
+
readonly tools: Tool[];
|
|
16
|
+
readonly shutdown: () => Promise<void>;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Spawns the MCP proxy server as a child process and connects to it
|
|
20
|
+
* as an MCP client. The proxy loads the read-only policy and mediates
|
|
21
|
+
* all tool calls through the policy engine.
|
|
22
|
+
*
|
|
23
|
+
* Returns a connected client, its available tools, and a shutdown function.
|
|
24
|
+
*/
|
|
25
|
+
export declare function connectViaProxy(definitions: ListDefinition[], mcpServers: Record<string, MCPServerConfig>, toolAnnotationsDir: string): Promise<ProxyConnection>;
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Proxy-based MCP connections for dynamic list resolution.
|
|
3
|
+
*
|
|
4
|
+
* Spawns the MCP proxy server as a child process configured with the
|
|
5
|
+
* read-only policy. The proxy handles OAuth credentials, policy mediation,
|
|
6
|
+
* token refresh, and sandbox containment internally -- the caller gets
|
|
7
|
+
* a simple MCP client with pre-filtered tools.
|
|
8
|
+
*/
|
|
9
|
+
import { dirname, resolve } from 'node:path';
|
|
10
|
+
import { fileURLToPath } from 'node:url';
|
|
11
|
+
import { Client } from '@modelcontextprotocol/sdk/client/index.js';
|
|
12
|
+
import { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js';
|
|
13
|
+
import { permissiveJsonSchemaValidator } from '../trusted-process/permissive-output-validator.js';
|
|
14
|
+
import { resolveNodeModulesBin } from '../trusted-process/sandbox-integration.js';
|
|
15
|
+
import { getReadOnlyPolicyDir } from '../config/paths.js';
|
|
16
|
+
import { loadUserConfig } from '../config/user-config.js';
|
|
17
|
+
import { VERSION } from '../version.js';
|
|
18
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
19
|
+
const __dirname = dirname(__filename);
|
|
20
|
+
const isCompiled = __filename.endsWith('.js');
|
|
21
|
+
const proxyServerPath = resolve(__dirname, `../trusted-process/mcp-proxy-server.${isCompiled ? 'js' : 'ts'}`);
|
|
22
|
+
const tsxBin = resolveNodeModulesBin('tsx', resolve(__dirname, '..', '..'));
|
|
23
|
+
const PROXY_COMMAND = isCompiled ? 'node' : tsxBin;
|
|
24
|
+
/**
|
|
25
|
+
* Determines which MCP servers are needed by the list definitions.
|
|
26
|
+
* Returns a filtered server config containing only the needed servers.
|
|
27
|
+
*/
|
|
28
|
+
function selectNeededServers(definitions, mcpServers) {
|
|
29
|
+
const mcpDefs = definitions.filter((d) => d.requiresMcp);
|
|
30
|
+
if (mcpDefs.length === 0)
|
|
31
|
+
return {};
|
|
32
|
+
const hasUnhintedLists = mcpDefs.some((d) => !d.mcpServerHint);
|
|
33
|
+
const neededNames = hasUnhintedLists
|
|
34
|
+
? new Set(Object.keys(mcpServers))
|
|
35
|
+
: new Set(mcpDefs
|
|
36
|
+
.filter((d) => d.mcpServerHint != null)
|
|
37
|
+
.map((d) => d.mcpServerHint));
|
|
38
|
+
const filtered = {};
|
|
39
|
+
for (const name of neededNames) {
|
|
40
|
+
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- name may come from mcpServerHint and not exist in mcpServers
|
|
41
|
+
if (mcpServers[name]) {
|
|
42
|
+
filtered[name] = mcpServers[name];
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
console.error(` Warning: mcpServerHint "${name}" does not match any configured MCP server`);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return filtered;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Builds the environment variables for the proxy child process.
|
|
52
|
+
*/
|
|
53
|
+
function buildProxyEnv(neededServers, toolAnnotationsDir) {
|
|
54
|
+
const userConfig = loadUserConfig();
|
|
55
|
+
// Flatten per-server credentials for all needed servers into a single object.
|
|
56
|
+
// The proxy receives all of them and applies per-server via SERVER_FILTER internally
|
|
57
|
+
// (but since we're not using SERVER_FILTER here, all are available).
|
|
58
|
+
const flatCredentials = {};
|
|
59
|
+
for (const serverName of Object.keys(neededServers)) {
|
|
60
|
+
const creds = userConfig.serverCredentials[serverName];
|
|
61
|
+
if (creds) {
|
|
62
|
+
Object.assign(flatCredentials, creds);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
const env = {
|
|
66
|
+
// Inherit the parent process environment
|
|
67
|
+
...process.env,
|
|
68
|
+
// Required proxy env vars
|
|
69
|
+
GENERATED_DIR: getReadOnlyPolicyDir(),
|
|
70
|
+
TOOL_ANNOTATIONS_DIR: toolAnnotationsDir,
|
|
71
|
+
MCP_SERVERS_CONFIG: JSON.stringify(neededServers),
|
|
72
|
+
PROTECTED_PATHS: JSON.stringify([]),
|
|
73
|
+
AUDIT_LOG_PATH: '/dev/null',
|
|
74
|
+
SANDBOX_POLICY: 'warn',
|
|
75
|
+
// Pass server credentials
|
|
76
|
+
SERVER_CREDENTIALS: JSON.stringify(flatCredentials),
|
|
77
|
+
};
|
|
78
|
+
// Do NOT set ESCALATION_DIR -- single-shot mode auto-denies escalations
|
|
79
|
+
// Note: proxy falls back to getPackageGeneratedDir() for annotations, ignoring toolAnnotationsFallbackDir
|
|
80
|
+
return env;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Spawns the MCP proxy server as a child process and connects to it
|
|
84
|
+
* as an MCP client. The proxy loads the read-only policy and mediates
|
|
85
|
+
* all tool calls through the policy engine.
|
|
86
|
+
*
|
|
87
|
+
* Returns a connected client, its available tools, and a shutdown function.
|
|
88
|
+
*/
|
|
89
|
+
export async function connectViaProxy(definitions, mcpServers, toolAnnotationsDir) {
|
|
90
|
+
const neededServers = selectNeededServers(definitions, mcpServers);
|
|
91
|
+
const env = buildProxyEnv(neededServers, toolAnnotationsDir);
|
|
92
|
+
const transport = new StdioClientTransport({
|
|
93
|
+
command: PROXY_COMMAND,
|
|
94
|
+
args: [proxyServerPath],
|
|
95
|
+
env,
|
|
96
|
+
stderr: 'pipe',
|
|
97
|
+
});
|
|
98
|
+
// Drain piped stderr to prevent backpressure
|
|
99
|
+
if (transport.stderr) {
|
|
100
|
+
transport.stderr.on('data', () => { });
|
|
101
|
+
}
|
|
102
|
+
const client = new Client({ name: 'ironcurtain-list-resolver-proxy', version: VERSION }, { jsonSchemaValidator: permissiveJsonSchemaValidator });
|
|
103
|
+
const shutdown = async () => {
|
|
104
|
+
try {
|
|
105
|
+
await client.close();
|
|
106
|
+
}
|
|
107
|
+
catch {
|
|
108
|
+
// Ignore cleanup errors
|
|
109
|
+
}
|
|
110
|
+
};
|
|
111
|
+
try {
|
|
112
|
+
await client.connect(transport);
|
|
113
|
+
const toolsResult = await client.listTools();
|
|
114
|
+
return { client, tools: toolsResult.tools, shutdown };
|
|
115
|
+
}
|
|
116
|
+
catch (err) {
|
|
117
|
+
await shutdown();
|
|
118
|
+
throw err;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=proxy-mcp-connections.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proxy-mcp-connections.js","sourceRoot":"","sources":["../../src/pipeline/proxy-mcp-connections.ts"],"names":[],"mappings":"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"}
|
|
@@ -14,7 +14,7 @@ import { parseArgs } from 'node:util';
|
|
|
14
14
|
import chalk from 'chalk';
|
|
15
15
|
import { checkHelp } from '../cli-help.js';
|
|
16
16
|
import { resolveAllLists } from './list-resolver.js';
|
|
17
|
-
import {
|
|
17
|
+
import { connectViaProxy } from './proxy-mcp-connections.js';
|
|
18
18
|
import { createPipelineLlm, loadExistingArtifact, loadPipelineConfig, writeArtifact, withSpinner, } from './pipeline-shared.js';
|
|
19
19
|
// ---------------------------------------------------------------------------
|
|
20
20
|
// Help + Argument Parsing
|
|
@@ -25,12 +25,16 @@ const refreshListsSpec = {
|
|
|
25
25
|
usage: ['ironcurtain refresh-lists [options]'],
|
|
26
26
|
options: [
|
|
27
27
|
{ flag: 'list', description: 'Refresh only the named list', placeholder: '<name>' },
|
|
28
|
-
{
|
|
28
|
+
{
|
|
29
|
+
flag: 'with-mcp',
|
|
30
|
+
description: 'Connect to MCP servers for data-backed lists (default; kept for backward compatibility)',
|
|
31
|
+
},
|
|
32
|
+
{ flag: 'no-mcp', description: 'Skip MCP server connections' },
|
|
29
33
|
],
|
|
30
34
|
examples: [
|
|
31
|
-
'ironcurtain refresh-lists # Refresh all
|
|
35
|
+
'ironcurtain refresh-lists # Refresh all lists (including MCP-backed)',
|
|
32
36
|
'ironcurtain refresh-lists --list major-news # Refresh a single list',
|
|
33
|
-
'ironcurtain refresh-lists --
|
|
37
|
+
'ironcurtain refresh-lists --no-mcp # Skip MCP-backed lists',
|
|
34
38
|
],
|
|
35
39
|
};
|
|
36
40
|
function parseRefreshArgs(args) {
|
|
@@ -40,6 +44,7 @@ function parseRefreshArgs(args) {
|
|
|
40
44
|
help: { type: 'boolean', short: 'h' },
|
|
41
45
|
list: { type: 'string' },
|
|
42
46
|
'with-mcp': { type: 'boolean' },
|
|
47
|
+
'no-mcp': { type: 'boolean' },
|
|
43
48
|
},
|
|
44
49
|
allowPositionals: true,
|
|
45
50
|
strict: false,
|
|
@@ -48,7 +53,7 @@ function parseRefreshArgs(args) {
|
|
|
48
53
|
return null;
|
|
49
54
|
return {
|
|
50
55
|
listName: values.list,
|
|
51
|
-
withMcp: values['
|
|
56
|
+
withMcp: values['no-mcp'] ? false : true,
|
|
52
57
|
};
|
|
53
58
|
}
|
|
54
59
|
// ---------------------------------------------------------------------------
|
|
@@ -70,10 +75,10 @@ function selectListsToRefresh(definitions, options) {
|
|
|
70
75
|
process.exit(1);
|
|
71
76
|
}
|
|
72
77
|
}
|
|
73
|
-
//
|
|
78
|
+
// With --no-mcp, skip data-backed lists
|
|
74
79
|
if (!options.withMcp) {
|
|
75
80
|
for (const def of selected.filter((d) => d.requiresMcp)) {
|
|
76
|
-
console.error(` ${chalk.yellow('Skipping:')} @${def.name} (requires MCP —
|
|
81
|
+
console.error(` ${chalk.yellow('Skipping:')} @${def.name} (requires MCP — omit --no-mcp to include)`);
|
|
77
82
|
}
|
|
78
83
|
selected = selected.filter((d) => !d.requiresMcp);
|
|
79
84
|
}
|
|
@@ -111,15 +116,18 @@ export async function main(args = []) {
|
|
|
111
116
|
const { model: llm, logPath } = await createPipelineLlm(config.generatedDir, 'refresh-lists');
|
|
112
117
|
// Load existing dynamic-lists.json for manual overrides and non-refreshed lists
|
|
113
118
|
const existingLists = loadExistingArtifact(config.generatedDir, 'dynamic-lists.json', config.packageGeneratedDir);
|
|
114
|
-
// Connect to MCP servers if needed
|
|
119
|
+
// Connect to MCP servers via proxy if needed
|
|
115
120
|
const needsMcp = options.withMcp && definitionsToRefresh.some((d) => d.requiresMcp);
|
|
116
|
-
let
|
|
121
|
+
let proxy;
|
|
117
122
|
if (needsMcp) {
|
|
118
|
-
|
|
123
|
+
proxy = await connectViaProxy(definitionsToRefresh, config.mcpServers, config.generatedDir);
|
|
119
124
|
}
|
|
120
125
|
try {
|
|
121
126
|
const stepText = 'Refreshing dynamic lists';
|
|
122
|
-
const { result: refreshedLists } = await withSpinner(stepText, async (spinner) => resolveAllLists(definitionsToRefresh, {
|
|
127
|
+
const { result: refreshedLists } = await withSpinner(stepText, async (spinner) => resolveAllLists(definitionsToRefresh, {
|
|
128
|
+
model: llm,
|
|
129
|
+
proxyConnection: proxy ? { client: proxy.client, tools: proxy.tools } : undefined,
|
|
130
|
+
}, existingLists, (msg) => {
|
|
123
131
|
spinner.text = `${stepText} — ${msg}`;
|
|
124
132
|
}, true), (result, elapsed) => {
|
|
125
133
|
const count = Object.keys(result.lists).length;
|
|
@@ -142,8 +150,8 @@ export async function main(args = []) {
|
|
|
142
150
|
console.error(chalk.green.bold('List refresh successful!'));
|
|
143
151
|
}
|
|
144
152
|
finally {
|
|
145
|
-
if (
|
|
146
|
-
await
|
|
153
|
+
if (proxy) {
|
|
154
|
+
await proxy.shutdown();
|
|
147
155
|
}
|
|
148
156
|
}
|
|
149
157
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"refresh-lists.js","sourceRoot":"","sources":["../../src/pipeline/refresh-lists.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,SAAS,EAAoB,MAAM,gBAAgB,CAAC;AAC7D,OAAO,EAAE,eAAe,
|
|
1
|
+
{"version":3,"file":"refresh-lists.js","sourceRoot":"","sources":["../../src/pipeline/refresh-lists.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,69 +4,49 @@
|
|
|
4
4
|
* Generates concrete test scenarios (tool call + expected decision) from
|
|
5
5
|
* the constitution and tool annotations. Always includes mandatory
|
|
6
6
|
* handwritten scenarios alongside LLM-generated ones.
|
|
7
|
+
*
|
|
8
|
+
* Large servers (100+ tools) are handled via batching: annotations are
|
|
9
|
+
* split into batches of SCENARIO_BATCH_SIZE, each batch gets its own
|
|
10
|
+
* scoped system prompt and Zod schema, and results are deduplicated
|
|
11
|
+
* across batches.
|
|
7
12
|
*/
|
|
8
13
|
import type { LanguageModel, SystemModelMessage } from 'ai';
|
|
9
|
-
import type { DynamicListsFile,
|
|
14
|
+
import type { ConditionalRoles, DynamicListsFile, StoredToolAnnotation, ToolAnnotation, TestScenario } from './types.js';
|
|
15
|
+
export declare const SCENARIO_BATCH_SIZE = 25;
|
|
10
16
|
/**
|
|
11
17
|
* Formats a ## Dynamic List Values section for inclusion in prompts.
|
|
12
18
|
* Shows up to {@link MAX_LIST_PREVIEW_VALUES} example values per list.
|
|
13
19
|
* Returns an empty string when no lists are available.
|
|
14
20
|
*/
|
|
15
21
|
export declare function formatDynamicListsSection(dynamicLists?: DynamicListsFile): string;
|
|
22
|
+
/**
|
|
23
|
+
* Formats a single conditional role spec as a human-readable string.
|
|
24
|
+
* Shows the discriminator argument, its valid values, and the role
|
|
25
|
+
* assignments per mode so the LLM knows exact argument names/values.
|
|
26
|
+
*/
|
|
27
|
+
export declare function formatConditionalRoles(argName: string, spec: ConditionalRoles): string;
|
|
16
28
|
/**
|
|
17
29
|
* Builds the stable system prompt portion for the scenario generator.
|
|
18
30
|
* Contains: role preamble, constitution, annotations, system config, and instructions.
|
|
19
31
|
* This is the cacheable part.
|
|
32
|
+
*
|
|
33
|
+
* @param storedAnnotations - Optional raw annotations with conditional role specs.
|
|
34
|
+
* When provided, the prompt includes discriminator argument names and valid values
|
|
35
|
+
* so the LLM generates scenarios with correct argument names for multi-mode tools.
|
|
20
36
|
*/
|
|
21
|
-
export declare function buildGeneratorSystemPrompt(constitutionText: string, annotations: ToolAnnotation[], sandboxDirectory: string, permittedDirectories?: string[], dynamicLists?: DynamicListsFile): string;
|
|
22
|
-
export declare function generateScenarios(constitutionText: string, annotations: ToolAnnotation[], handwrittenScenarios: TestScenario[], sandboxDirectory: string, llm: LanguageModel, permittedDirectories?: string[], onProgress?: (message: string) => void, system?: string | SystemModelMessage, dynamicLists?: DynamicListsFile): Promise<TestScenario[]>;
|
|
37
|
+
export declare function buildGeneratorSystemPrompt(constitutionText: string, annotations: ToolAnnotation[], sandboxDirectory: string, permittedDirectories?: string[], dynamicLists?: DynamicListsFile, storedAnnotations?: StoredToolAnnotation[]): string;
|
|
23
38
|
/**
|
|
24
|
-
*
|
|
25
|
-
*
|
|
39
|
+
* Generates test scenarios by batching annotations into groups of
|
|
40
|
+
* SCENARIO_BATCH_SIZE, running generateObjectWithRepair per batch with
|
|
41
|
+
* scoped system prompts and Zod schemas, then deduplicating results.
|
|
26
42
|
*/
|
|
27
|
-
export declare function
|
|
43
|
+
export declare function generateScenarios(constitutionText: string, annotations: ToolAnnotation[], handwrittenScenarios: TestScenario[], sandboxDirectory: string, llm: LanguageModel, permittedDirectories?: string[], onProgress?: (message: string) => void, dynamicLists?: DynamicListsFile, wrapSystemPrompt?: (prompt: string) => string | SystemModelMessage, storedAnnotations?: StoredToolAnnotation[]): Promise<TestScenario[]>;
|
|
28
44
|
/**
|
|
29
|
-
*
|
|
30
|
-
*
|
|
31
|
-
*
|
|
32
|
-
* loop (corrections, discarded scenarios, probes) can be communicated to
|
|
33
|
-
* the LLM in follow-up turns. The system prompt is fixed at construction
|
|
34
|
-
* and never changes, enabling prompt caching.
|
|
35
|
-
*
|
|
36
|
-
* Lifecycle:
|
|
37
|
-
* 1. Construct with system prompt and config (once per pipeline run)
|
|
38
|
-
* 2. Call generate() for the initial scenario set
|
|
39
|
-
* 3. After verification, call regenerate(feedback) with repair feedback
|
|
40
|
-
* 4. Session is GC'd when the pipeline finishes (no explicit close needed)
|
|
45
|
+
* Generates replacement scenarios for structurally discarded ones.
|
|
46
|
+
* Uses a single-shot generateObjectWithRepair call (no batching needed
|
|
47
|
+
* since the discarded set is typically small).
|
|
41
48
|
*/
|
|
42
|
-
export declare
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
private readonly handwrittenScenarios;
|
|
47
|
-
private readonly history;
|
|
48
|
-
private readonly schemaHint;
|
|
49
|
-
private turns;
|
|
50
|
-
constructor(options: {
|
|
51
|
-
system: string | SystemModelMessage;
|
|
52
|
-
model: LanguageModel;
|
|
53
|
-
annotations: ToolAnnotation[];
|
|
54
|
-
handwrittenScenarios: TestScenario[];
|
|
55
|
-
});
|
|
56
|
-
/**
|
|
57
|
-
* Initial generation: sends the first user message and returns scenarios.
|
|
58
|
-
* Semantically equivalent to the existing single-shot generateScenarios().
|
|
59
|
-
*/
|
|
60
|
-
generate(onProgress?: (message: string) => void): Promise<TestScenario[]>;
|
|
61
|
-
/**
|
|
62
|
-
* Follow-up generation: feeds back corrections and requests replacement
|
|
63
|
-
* scenarios for the ones that were wrong.
|
|
64
|
-
*
|
|
65
|
-
* Returns ONLY the new/replacement scenarios (not handwritten, not
|
|
66
|
-
* previously-generated-and-still-valid ones). The caller is responsible
|
|
67
|
-
* for merging these into the full scenario set.
|
|
68
|
-
*/
|
|
69
|
-
regenerate(feedback: ScenarioFeedback, onProgress?: (message: string) => void): Promise<TestScenario[]>;
|
|
70
|
-
/** Returns the number of turns completed so far. */
|
|
71
|
-
get turnCount(): number;
|
|
72
|
-
}
|
|
49
|
+
export declare function repairScenarios(discardedScenarios: {
|
|
50
|
+
scenario: TestScenario;
|
|
51
|
+
feedback: string;
|
|
52
|
+
}[], constitutionText: string, annotations: ToolAnnotation[], sandboxDirectory: string, llm: LanguageModel, permittedDirectories?: string[], dynamicLists?: DynamicListsFile, onProgress?: (message: string) => void, storedAnnotations?: StoredToolAnnotation[]): Promise<TestScenario[]>;
|