@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.
Files changed (259) hide show
  1. package/README.md +29 -100
  2. package/dist/auth/auth-command.d.ts +15 -0
  3. package/dist/auth/auth-command.js +424 -0
  4. package/dist/auth/auth-command.js.map +1 -0
  5. package/dist/auth/oauth-flow.d.ts +46 -0
  6. package/dist/auth/oauth-flow.js +279 -0
  7. package/dist/auth/oauth-flow.js.map +1 -0
  8. package/dist/auth/oauth-provider.d.ts +55 -0
  9. package/dist/auth/oauth-provider.js +73 -0
  10. package/dist/auth/oauth-provider.js.map +1 -0
  11. package/dist/auth/oauth-registry.d.ts +34 -0
  12. package/dist/auth/oauth-registry.js +69 -0
  13. package/dist/auth/oauth-registry.js.map +1 -0
  14. package/dist/auth/oauth-token-provider.d.ts +52 -0
  15. package/dist/auth/oauth-token-provider.js +159 -0
  16. package/dist/auth/oauth-token-provider.js.map +1 -0
  17. package/dist/auth/oauth-token-store.d.ts +30 -0
  18. package/dist/auth/oauth-token-store.js +93 -0
  19. package/dist/auth/oauth-token-store.js.map +1 -0
  20. package/dist/auth/providers/google-scopes.d.ts +35 -0
  21. package/dist/auth/providers/google-scopes.js +183 -0
  22. package/dist/auth/providers/google-scopes.js.map +1 -0
  23. package/dist/auth/providers/google.d.ts +2 -0
  24. package/dist/auth/providers/google.js +28 -0
  25. package/dist/auth/providers/google.js.map +1 -0
  26. package/dist/cli.js +6 -0
  27. package/dist/cli.js.map +1 -1
  28. package/dist/config/config-command.js +39 -1
  29. package/dist/config/config-command.js.map +1 -1
  30. package/dist/config/constitution-readonly.md +14 -11
  31. package/dist/config/constitution-user-base.md +15 -0
  32. package/dist/config/first-start.js +4 -1
  33. package/dist/config/first-start.js.map +1 -1
  34. package/dist/config/generated/test-scenarios.json +1 -1
  35. package/dist/config/generated/tool-annotations.json +10617 -296
  36. package/dist/config/generated-readonly/compiled-policy.json +787 -244
  37. package/dist/config/index.d.ts +2 -2
  38. package/dist/config/index.js +8 -0
  39. package/dist/config/index.js.map +1 -1
  40. package/dist/config/mcp-servers.json +31 -2
  41. package/dist/config/paths.d.ts +20 -0
  42. package/dist/config/paths.js +43 -0
  43. package/dist/config/paths.js.map +1 -1
  44. package/dist/config/types.d.ts +8 -0
  45. package/dist/config/user-config.d.ts +29 -0
  46. package/dist/config/user-config.js +30 -0
  47. package/dist/config/user-config.js.map +1 -1
  48. package/dist/cron/constitution-generator.d.ts +2 -1
  49. package/dist/cron/constitution-generator.js +35 -36
  50. package/dist/cron/constitution-generator.js.map +1 -1
  51. package/dist/cron/headless-transport.d.ts +4 -0
  52. package/dist/cron/headless-transport.js +1 -1
  53. package/dist/cron/headless-transport.js.map +1 -1
  54. package/dist/daemon/ironcurtain-daemon.js +7 -1
  55. package/dist/daemon/ironcurtain-daemon.js.map +1 -1
  56. package/dist/docker/adapters/claude-code.js +32 -5
  57. package/dist/docker/adapters/claude-code.js.map +1 -1
  58. package/dist/docker/agent-adapter.d.ts +40 -0
  59. package/dist/docker/claude-md-seed.d.ts +27 -0
  60. package/dist/docker/claude-md-seed.js +42 -0
  61. package/dist/docker/claude-md-seed.js.map +1 -0
  62. package/dist/docker/docker-agent-session.d.ts +3 -1
  63. package/dist/docker/docker-agent-session.js +51 -28
  64. package/dist/docker/docker-agent-session.js.map +1 -1
  65. package/dist/docker/docker-infrastructure.d.ts +15 -1
  66. package/dist/docker/docker-infrastructure.js +105 -9
  67. package/dist/docker/docker-infrastructure.js.map +1 -1
  68. package/dist/docker/docker-manager.d.ts +2 -0
  69. package/dist/docker/docker-manager.js +9 -1
  70. package/dist/docker/docker-manager.js.map +1 -1
  71. package/dist/docker/mitm-proxy.d.ts +65 -0
  72. package/dist/docker/mitm-proxy.js +288 -31
  73. package/dist/docker/mitm-proxy.js.map +1 -1
  74. package/dist/docker/package-types.d.ts +127 -0
  75. package/dist/docker/package-types.js +8 -0
  76. package/dist/docker/package-types.js.map +1 -0
  77. package/dist/docker/package-validator.d.ts +41 -0
  78. package/dist/docker/package-validator.js +90 -0
  79. package/dist/docker/package-validator.js.map +1 -0
  80. package/dist/docker/platform.d.ts +6 -6
  81. package/dist/docker/platform.js +8 -6
  82. package/dist/docker/platform.js.map +1 -1
  83. package/dist/docker/proxy-tools.d.ts +80 -0
  84. package/dist/docker/proxy-tools.js +248 -0
  85. package/dist/docker/proxy-tools.js.map +1 -0
  86. package/dist/docker/pty-session.d.ts +15 -0
  87. package/dist/docker/pty-session.js +253 -73
  88. package/dist/docker/pty-session.js.map +1 -1
  89. package/dist/docker/pty-types.d.ts +28 -0
  90. package/dist/docker/pty-types.js +2 -0
  91. package/dist/docker/pty-types.js.map +1 -1
  92. package/dist/docker/registry-proxy.d.ts +142 -0
  93. package/dist/docker/registry-proxy.js +856 -0
  94. package/dist/docker/registry-proxy.js.map +1 -0
  95. package/dist/escalation/escalation-watcher.d.ts +3 -1
  96. package/dist/escalation/escalation-watcher.js +6 -2
  97. package/dist/escalation/escalation-watcher.js.map +1 -1
  98. package/dist/escalation/listener-command.js +24 -10
  99. package/dist/escalation/listener-command.js.map +1 -1
  100. package/dist/escalation/listener-lock.d.ts +5 -0
  101. package/dist/escalation/listener-lock.js +14 -0
  102. package/dist/escalation/listener-lock.js.map +1 -1
  103. package/dist/index.js +16 -3
  104. package/dist/index.js.map +1 -1
  105. package/dist/memory/auto-save.d.ts +25 -0
  106. package/dist/memory/auto-save.js +89 -0
  107. package/dist/memory/auto-save.js.map +1 -0
  108. package/dist/memory/memory-annotations.d.ts +47 -0
  109. package/dist/memory/memory-annotations.js +87 -0
  110. package/dist/memory/memory-annotations.js.map +1 -0
  111. package/dist/memory/memory-prompt.d.ts +12 -0
  112. package/dist/memory/memory-prompt.js +20 -0
  113. package/dist/memory/memory-prompt.js.map +1 -0
  114. package/dist/memory/resolve-memory-path.d.ts +20 -0
  115. package/dist/memory/resolve-memory-path.js +30 -0
  116. package/dist/memory/resolve-memory-path.js.map +1 -0
  117. package/dist/mux/mux-app.d.ts +4 -0
  118. package/dist/mux/mux-app.js +246 -28
  119. package/dist/mux/mux-app.js.map +1 -1
  120. package/dist/mux/mux-command.d.ts +2 -2
  121. package/dist/mux/mux-command.js +14 -22
  122. package/dist/mux/mux-command.js.map +1 -1
  123. package/dist/mux/mux-escalation-manager.d.ts +9 -3
  124. package/dist/mux/mux-escalation-manager.js +69 -19
  125. package/dist/mux/mux-escalation-manager.js.map +1 -1
  126. package/dist/mux/mux-input-handler.d.ts +59 -3
  127. package/dist/mux/mux-input-handler.js +270 -32
  128. package/dist/mux/mux-input-handler.js.map +1 -1
  129. package/dist/mux/mux-renderer.d.ts +19 -1
  130. package/dist/mux/mux-renderer.js +466 -11
  131. package/dist/mux/mux-renderer.js.map +1 -1
  132. package/dist/mux/persona-scanner.d.ts +19 -0
  133. package/dist/mux/persona-scanner.js +53 -0
  134. package/dist/mux/persona-scanner.js.map +1 -0
  135. package/dist/mux/pty-bridge.d.ts +8 -0
  136. package/dist/mux/pty-bridge.js +19 -1
  137. package/dist/mux/pty-bridge.js.map +1 -1
  138. package/dist/mux/session-scanner.d.ts +18 -0
  139. package/dist/mux/session-scanner.js +65 -0
  140. package/dist/mux/session-scanner.js.map +1 -0
  141. package/dist/mux/types.d.ts +36 -1
  142. package/dist/mux/types.js +14 -1
  143. package/dist/mux/types.js.map +1 -1
  144. package/dist/persona/persona-command.js +130 -93
  145. package/dist/persona/persona-command.js.map +1 -1
  146. package/dist/persona/persona-prompt.d.ts +7 -7
  147. package/dist/persona/persona-prompt.js +14 -29
  148. package/dist/persona/persona-prompt.js.map +1 -1
  149. package/dist/persona/resolve.js +5 -2
  150. package/dist/persona/resolve.js.map +1 -1
  151. package/dist/pipeline/annotate.js +1 -7
  152. package/dist/pipeline/annotate.js.map +1 -1
  153. package/dist/pipeline/compile.d.ts +5 -2
  154. package/dist/pipeline/compile.js +23 -11
  155. package/dist/pipeline/compile.js.map +1 -1
  156. package/dist/pipeline/constitution-compiler.d.ts +302 -3
  157. package/dist/pipeline/constitution-compiler.js +285 -23
  158. package/dist/pipeline/constitution-compiler.js.map +1 -1
  159. package/dist/pipeline/generate-with-repair.d.ts +2 -2
  160. package/dist/pipeline/generate-with-repair.js +2 -2
  161. package/dist/pipeline/handwritten-scenarios.d.ts +20 -7
  162. package/dist/pipeline/handwritten-scenarios.js +20 -41
  163. package/dist/pipeline/handwritten-scenarios.js.map +1 -1
  164. package/dist/pipeline/list-resolver.d.ts +18 -20
  165. package/dist/pipeline/list-resolver.js +28 -36
  166. package/dist/pipeline/list-resolver.js.map +1 -1
  167. package/dist/pipeline/pipeline-runner.d.ts +102 -13
  168. package/dist/pipeline/pipeline-runner.js +497 -237
  169. package/dist/pipeline/pipeline-runner.js.map +1 -1
  170. package/dist/pipeline/pipeline-shared.d.ts +7 -9
  171. package/dist/pipeline/pipeline-shared.js +8 -18
  172. package/dist/pipeline/pipeline-shared.js.map +1 -1
  173. package/dist/pipeline/policy-verifier.d.ts +32 -5
  174. package/dist/pipeline/policy-verifier.js +137 -8
  175. package/dist/pipeline/policy-verifier.js.map +1 -1
  176. package/dist/pipeline/proxy-mcp-connections.d.ts +25 -0
  177. package/dist/pipeline/proxy-mcp-connections.js +121 -0
  178. package/dist/pipeline/proxy-mcp-connections.js.map +1 -0
  179. package/dist/pipeline/refresh-lists.js +21 -13
  180. package/dist/pipeline/refresh-lists.js.map +1 -1
  181. package/dist/pipeline/scenario-generator.d.ts +29 -49
  182. package/dist/pipeline/scenario-generator.js +180 -143
  183. package/dist/pipeline/scenario-generator.js.map +1 -1
  184. package/dist/pipeline/scenario-schema-validator.d.ts +51 -0
  185. package/dist/pipeline/scenario-schema-validator.js +132 -0
  186. package/dist/pipeline/scenario-schema-validator.js.map +1 -0
  187. package/dist/pipeline/tool-annotator.d.ts +9 -8
  188. package/dist/pipeline/tool-annotator.js +48 -95
  189. package/dist/pipeline/tool-annotator.js.map +1 -1
  190. package/dist/pipeline/types.d.ts +31 -24
  191. package/dist/sandbox/index.d.ts +26 -10
  192. package/dist/sandbox/index.js +151 -40
  193. package/dist/sandbox/index.js.map +1 -1
  194. package/dist/servers/fetch-server.js +10 -5
  195. package/dist/servers/fetch-server.js.map +1 -1
  196. package/dist/session/agent-session.d.ts +8 -20
  197. package/dist/session/agent-session.js +22 -70
  198. package/dist/session/agent-session.js.map +1 -1
  199. package/dist/session/base-transport.d.ts +17 -1
  200. package/dist/session/base-transport.js +25 -1
  201. package/dist/session/base-transport.js.map +1 -1
  202. package/dist/session/cli-transport.d.ts +5 -0
  203. package/dist/session/cli-transport.js +48 -25
  204. package/dist/session/cli-transport.js.map +1 -1
  205. package/dist/session/index.d.ts +25 -1
  206. package/dist/session/index.js +57 -8
  207. package/dist/session/index.js.map +1 -1
  208. package/dist/session/prompts.js +8 -9
  209. package/dist/session/prompts.js.map +1 -1
  210. package/dist/session/session-manager.d.ts +6 -0
  211. package/dist/session/session-manager.js +12 -0
  212. package/dist/session/session-manager.js.map +1 -1
  213. package/dist/session/types.d.ts +11 -1
  214. package/dist/session/types.js.map +1 -1
  215. package/dist/session/workspace-validation.js +37 -6
  216. package/dist/session/workspace-validation.js.map +1 -1
  217. package/dist/signal/signal-bot-daemon.js +24 -8
  218. package/dist/signal/signal-bot-daemon.js.map +1 -1
  219. package/dist/signal/signal-transport.d.ts +5 -2
  220. package/dist/signal/signal-transport.js +3 -3
  221. package/dist/signal/signal-transport.js.map +1 -1
  222. package/dist/trusted-process/approval-whitelist.d.ts +117 -0
  223. package/dist/trusted-process/approval-whitelist.js +237 -0
  224. package/dist/trusted-process/approval-whitelist.js.map +1 -0
  225. package/dist/trusted-process/gworkspace-credentials.d.ts +40 -0
  226. package/dist/trusted-process/gworkspace-credentials.js +45 -0
  227. package/dist/trusted-process/gworkspace-credentials.js.map +1 -0
  228. package/dist/trusted-process/index.d.ts +11 -1
  229. package/dist/trusted-process/index.js +83 -53
  230. package/dist/trusted-process/index.js.map +1 -1
  231. package/dist/trusted-process/mcp-proxy-server.d.ts +23 -0
  232. package/dist/trusted-process/mcp-proxy-server.js +409 -94
  233. package/dist/trusted-process/mcp-proxy-server.js.map +1 -1
  234. package/dist/trusted-process/policy-engine.d.ts +12 -3
  235. package/dist/trusted-process/policy-engine.js +33 -23
  236. package/dist/trusted-process/policy-engine.js.map +1 -1
  237. package/dist/trusted-process/policy-types.d.ts +17 -0
  238. package/dist/trusted-process/sandbox-integration.d.ts +23 -0
  239. package/dist/trusted-process/sandbox-integration.js +115 -3
  240. package/dist/trusted-process/sandbox-integration.js.map +1 -1
  241. package/dist/trusted-process/token-file-refresher.d.ts +69 -0
  242. package/dist/trusted-process/token-file-refresher.js +120 -0
  243. package/dist/trusted-process/token-file-refresher.js.map +1 -0
  244. package/dist/types/argument-roles.d.ts +7 -1
  245. package/dist/types/argument-roles.js +50 -0
  246. package/dist/types/argument-roles.js.map +1 -1
  247. package/dist/types/audit.d.ts +11 -0
  248. package/docker/Dockerfile.base +22 -0
  249. package/docker/Dockerfile.base.arm64 +44 -4
  250. package/docker/Dockerfile.claude-code +2 -2
  251. package/docker/entrypoint-claude-code.sh +24 -6
  252. package/package.json +8 -2
  253. package/src/config/constitution-user-base.md +15 -0
  254. package/src/config/generated/test-scenarios.json +1 -1
  255. package/src/config/generated/tool-annotations.json +10617 -296
  256. package/src/config/mcp-servers.json +31 -2
  257. package/dist/pipeline/mcp-connections.d.ts +0 -16
  258. package/dist/pipeline/mcp-connections.js +0 -61
  259. 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 { connectMcpServersForLists, disconnectMcpServers } from './mcp-connections.js';
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
- { flag: 'with-mcp', description: 'Connect to MCP servers for data-backed lists' },
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 knowledge-based lists',
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 --with-mcp # Include MCP-backed 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['with-mcp'] ?? false,
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
- // Without --with-mcp, skip data-backed lists
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 — use --with-mcp to include)`);
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 mcpConnections;
121
+ let proxy;
117
122
  if (needsMcp) {
118
- mcpConnections = await connectMcpServersForLists(definitionsToRefresh, config.mcpServers);
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, { model: llm, mcpConnections }, existingLists, (msg) => {
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 (mcpConnections) {
146
- await disconnectMcpServers(mcpConnections);
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":"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"}
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, ScenarioFeedback, ToolAnnotation, TestScenario } from './types.js';
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
- * Formats feedback from the verify-repair loop into a user message
25
- * for the next turn of the scenario generator conversation.
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 formatFeedbackMessage(feedback: ScenarioFeedback): string;
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
- * A stateful multi-turn wrapper around the scenario generator.
30
- *
31
- * Maintains a conversation history so that feedback from the verify-repair
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 class ScenarioGeneratorSession {
43
- private readonly systemPrompt;
44
- private readonly model;
45
- private readonly schema;
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[]>;